@esfaenza/extensions 15.2.9 → 15.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/services/extensions.exports.service.mjs +96 -5
- package/fesm2015/esfaenza-extensions.mjs +349 -258
- package/fesm2015/esfaenza-extensions.mjs.map +1 -1
- package/fesm2020/esfaenza-extensions.mjs +348 -258
- package/fesm2020/esfaenza-extensions.mjs.map +1 -1
- package/lib/services/extensions.exports.service.d.ts +17 -1
- package/package.json +4 -2
|
@@ -6,7 +6,8 @@ import { Deserialize } from "cerialize";
|
|
|
6
6
|
import { exportList, csvFormatPrefix, csvHdrPrefix, csvOrdPrefix, csvValueNavigator, csvVisPrefix, dictionaryCsvHdrPrefix, dictionaryCsvValPrefix, listCsvHdrPrefix, listCsvValFormat, listCsvValPrefix, csvPropKey, locProperty } from "../models/ExportConsts";
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "./extensions.dates.service";
|
|
9
|
-
import * as i2 from "
|
|
9
|
+
import * as i2 from "./extensions.utilities.service";
|
|
10
|
+
import * as i3 from "@esfaenza/localizations";
|
|
10
11
|
/**
|
|
11
12
|
* Decoratore che fornisce la classe di localizzazione per tutte le proprietà esportate con @Export e qualsiasi altro tag che richieda localizzazioni.
|
|
12
13
|
*
|
|
@@ -177,8 +178,9 @@ export class ExportService {
|
|
|
177
178
|
*
|
|
178
179
|
* @ignore
|
|
179
180
|
*/
|
|
180
|
-
constructor(dates, lc) {
|
|
181
|
+
constructor(dates, utiExts, lc) {
|
|
181
182
|
this.dates = dates;
|
|
183
|
+
this.utiExts = utiExts;
|
|
182
184
|
this.lc = lc;
|
|
183
185
|
}
|
|
184
186
|
/**
|
|
@@ -526,11 +528,100 @@ export class ExportService {
|
|
|
526
528
|
deserializeForExport(items, type) {
|
|
527
529
|
return Deserialize(items, type);
|
|
528
530
|
}
|
|
531
|
+
/**
|
|
532
|
+
* Effettua l'esportazione in file CSV
|
|
533
|
+
*/
|
|
534
|
+
exportCSV(fn, headers, data) {
|
|
535
|
+
let csvData = '', row = '', sep = ';';
|
|
536
|
+
for (let i = 0; i < headers.length; i++) {
|
|
537
|
+
let h = headers[i];
|
|
538
|
+
row += `${row != '' ? sep : ''}"${h.label}"`;
|
|
539
|
+
}
|
|
540
|
+
csvData += row + '\r\n';
|
|
541
|
+
for (let i = 0; i < data.length; i++) {
|
|
542
|
+
row = '';
|
|
543
|
+
let item = data[i];
|
|
544
|
+
for (let j = 0; j < headers.length; j++) {
|
|
545
|
+
let val = item[headers[j].key];
|
|
546
|
+
row += `${row != '' ? sep : ''}"${val}"`;
|
|
547
|
+
}
|
|
548
|
+
csvData += row + '\r\n';
|
|
549
|
+
}
|
|
550
|
+
var blob = new Blob([csvData], { type: 'text/csv' });
|
|
551
|
+
var objectUrl = window.URL.createObjectURL(blob);
|
|
552
|
+
this.utiExts.fileDownload(objectUrl, fn.endsWith('.xlsx') ? fn.replace('.xlsx', '.csv') : fn.endsWith('.csv') ? fn : fn + ".csv");
|
|
553
|
+
}
|
|
554
|
+
/** Effettua l'esportazione del file Excel basandosi sul modulo **ExcelJS**, sugli header **headers** e sui dati **data** */
|
|
555
|
+
async exportExcel(fn, headers, data) {
|
|
556
|
+
try {
|
|
557
|
+
this.ExcelJS = this.ExcelJS || await import("exceljs");
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
throw "Impossibile caricare la libreria per l'esportazione in Excel";
|
|
561
|
+
}
|
|
562
|
+
let iFix = 1;
|
|
563
|
+
let workbook = new this.ExcelJS.Workbook();
|
|
564
|
+
workbook.creator = "Ema's big Es-Table";
|
|
565
|
+
workbook.created = new Date();
|
|
566
|
+
let sheet = workbook.addWorksheet('Data');
|
|
567
|
+
let header = sheet.getRow(1);
|
|
568
|
+
header.font = { bold: true };
|
|
569
|
+
headers = headers.sort((a, b) => a.order - b.order);
|
|
570
|
+
for (let i = 0; i < headers.length; i++) {
|
|
571
|
+
let h = headers[i];
|
|
572
|
+
header.getCell(i + iFix).value = h.label;
|
|
573
|
+
}
|
|
574
|
+
for (let i = 0; i < data.length; i++) {
|
|
575
|
+
let row = sheet.getRow(i + iFix + 1);
|
|
576
|
+
let item = data[i];
|
|
577
|
+
for (let i = 0; i < headers.length; i++) {
|
|
578
|
+
let h = headers[i];
|
|
579
|
+
let cell = row.getCell(i + 1);
|
|
580
|
+
let val = item[h.key];
|
|
581
|
+
if (!val) {
|
|
582
|
+
cell.value = "";
|
|
583
|
+
continue;
|
|
584
|
+
}
|
|
585
|
+
switch (h.type) {
|
|
586
|
+
case 'date':
|
|
587
|
+
// ExcelJS va di default in UTC quindi rischierebbe di tirare giù 2 ore ad ogni esportazione
|
|
588
|
+
// Bisogna aggiungere l'utc offset alla data attuale
|
|
589
|
+
let date = this.dates.getDateConvertion(val);
|
|
590
|
+
if (date) {
|
|
591
|
+
let correctedDate = date.add(date.utcOffset(), 'minute');
|
|
592
|
+
cell.value = correctedDate.toDate();
|
|
593
|
+
cell.numFmt = val.length > 10 ? 'dd/mm/yyyy h:m:s' : '';
|
|
594
|
+
}
|
|
595
|
+
break;
|
|
596
|
+
case 'number':
|
|
597
|
+
let converted = parseFloat(val.replace(',', '.'));
|
|
598
|
+
cell.value = isNaN(converted) ? "" : converted;
|
|
599
|
+
break;
|
|
600
|
+
default:
|
|
601
|
+
cell.value = val;
|
|
602
|
+
break;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
let buffer = await workbook.xlsx.writeBuffer();
|
|
607
|
+
let blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;" });
|
|
608
|
+
let objectUrl = window.URL.createObjectURL(blob);
|
|
609
|
+
this.utiExts.fileDownload(objectUrl, fn.endsWith('.csv') ? fn.replace('.csv', '.xlsx') : fn.endsWith('.xlsx') ? fn : fn + ".xlsx");
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Metodo che effettivamente genera gli header e i dati per l'esportazione con **ngx-csv**
|
|
613
|
+
*
|
|
614
|
+
* @param {any[]} items Oggetti da esportare
|
|
615
|
+
*/
|
|
616
|
+
export(items, format, fileName, columnsFilter, genericHeaders) {
|
|
617
|
+
let headers = genericHeaders ? this.setupForGenericExport(items, genericHeaders) : this.setupForExport(items, columnsFilter);
|
|
618
|
+
(format == "CSV" ? this.exportCSV : this.exportExcel)(fileName, headers, items);
|
|
619
|
+
}
|
|
529
620
|
}
|
|
530
|
-
ExportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExportService, deps: [{ token: i1.DateService }, { token: i2.LocalizationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
621
|
+
ExportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExportService, deps: [{ token: i1.DateService }, { token: i2.UtilityService }, { token: i3.LocalizationService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
531
622
|
ExportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExportService, providedIn: "root" });
|
|
532
623
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ExportService, decorators: [{
|
|
533
624
|
type: Injectable,
|
|
534
625
|
args: [{ providedIn: "root" }]
|
|
535
|
-
}], ctorParameters: function () { return [{ type: i1.DateService }, { type: i2.LocalizationService }]; } });
|
|
536
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU87QUFDUCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBS3hDLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFRalE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQThCO0lBQy9ELE9BQU8sU0FBUyxZQUFZLENBQXlDLFdBQWM7UUFDakYsT0FBTyxLQUFNLFNBQVEsV0FBVztZQUF6Qjs7Z0JBQTRCLFlBQU8sR0FBRyxHQUFHLENBQUM7WUFBQyxDQUFDO1NBQUEsQ0FBQztJQUN0RCxDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsU0FBaUIsSUFBSSxFQUFFLFVBQWtCLElBQUksRUFBRSxFQUFFLENBQ3JHLENBQUMsTUFBYyxFQUFFLFdBQW1CLEVBQUUsRUFBRTtJQUN0QyxJQUFJLE1BQU07UUFDUixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsZUFBZSxFQUFF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LENBQUM7Z0JBQzlDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFFbkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzlELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4SSxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksb0JBQW9CLENBQUMsS0FBWSxFQUFFLElBQVM7UUFDakQsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7OzBHQTVZVSxhQUFhOzhHQUFiLGFBQWEsY0FERCxNQUFNOzJGQUNsQixhQUFhO2tCQUR6QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gTGlic1xyXG5pbXBvcnQgeyBEZXNlcmlhbGl6ZSB9IGZyb20gXCJjZXJpYWxpemVcIjtcclxuXHJcbi8vIEVzZmFlbnphXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcblxyXG5pbXBvcnQgeyBleHBvcnRMaXN0LCBjc3ZGb3JtYXRQcmVmaXgsIGNzdkhkclByZWZpeCwgY3N2T3JkUHJlZml4LCBjc3ZWYWx1ZU5hdmlnYXRvciwgY3N2VmlzUHJlZml4LCBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4LCBsaXN0Q3N2SGRyUHJlZml4LCBsaXN0Q3N2VmFsRm9ybWF0LCBsaXN0Q3N2VmFsUHJlZml4LCBjc3ZQcm9wS2V5LCBsb2NQcm9wZXJ0eSB9IGZyb20gXCIuLi9tb2RlbHMvRXhwb3J0Q29uc3RzXCI7XHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLmRhdGVzLnNlcnZpY2UnO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBDc3ZIZWFkZXJzIH0gZnJvbSBcIi4uL21vZGVscy9Dc3ZIZWFkZXJzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9HZW5lcmljSXRlbVwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGNoZSBmb3JuaXNjZSBsYSBjbGFzc2UgZGkgbG9jYWxpenphemlvbmUgcGVyIHR1dHRlIGxlIHByb3ByaWV0w6AgZXNwb3J0YXRlIGNvbiBARXhwb3J0IGUgcXVhbHNpYXNpIGFsdHJvIHRhZyBjaGUgcmljaGllZGEgbG9jYWxpenphemlvbmkuXHJcbiAqIFxyXG4gKiBTb3N0YW56aWxhbWVudGUgYWdnaXVuZ2UgbGEgcHJvcHJpZXTDoCAqKl9fbG9jX18qKiBhbGwnb2dnZXR0byBjcmVhdG8gZGFsbGEgY2xhc3NlIGNvcnJlbnRlIGFzc2VnbmFuZG9nbGkgY29tZSB2YWxvcmUgaWwgdGlwbyBkZWwgTG9jYWxpemF0aW9uU2VydmljZSBkYSB1c2FyZSBwZXIgbGEgdHJhZHV6aW9uZVxyXG4gKiBcclxuICogQHBhcmFtIHtUeXBlPExvY2FsaXphdGlvblNlcnZpY2U+fSBsb2MgVGlwbyBlcmVkaXRhdG8gZGFsIExvY2FsaXphdGlvblNlcnZpY2UgY2hlIHB1w7IgZXNzZXJlIGNyZWF0byBhIHJ1bnRpbWUgc290dG8gY29udGVzdG8gZGVsbGEgREkgZGkgQW5ndWxhclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydExvY2FsaXphdGlvbihsb2M6IFR5cGU8TG9jYWxpemF0aW9uU2VydmljZT4pIHtcclxuICByZXR1cm4gZnVuY3Rpb24gaW50ZWdyYXRlTG9jPFQgZXh0ZW5kcyB7IG5ldyAoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgIHtcclxuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHsgX19sb2NfXyA9IGxvYzsgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIHByb3ByaWV0w6Agc2luZ29sYS4gXHJcbiAqIFZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIGNpYW86IHN0cmluZztcclxuICogY2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCJcclxuICogYGBgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXIgVGl0b2xvIGRlbGxhIGNvbG9ubmEgbmVsIGZpbGUgQ1NWIGVzcG9ydGF0b1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IEZvcm1hdG8gZGkgZXNwb3J0YXppb25lLiBQdcOyIGVzc2VyZSB1biBmb3JtYXRvIGRhdGEgcGVyIGkgY2FtcGkgZGF0YSBvICdGJyBwZXIgaSBjYW1waSBmbG9hdGluZyBwb2ludFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXI6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSBudWxsLCB0YWJsZWlkOiBzdHJpbmcgPSBudWxsKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGZvcm1hdClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogISFoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIGlmKHRhYmxlaWQpXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2UHJvcEtleSwgeyB2YWx1ZTogdGFibGVpZCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XS5wdXNoKHByb3BlcnR5S2V5ICsgY3N2VmlzUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgY3N2VmlzUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIG9nZ2V0dG8uIFxyXG4gKiBQZXIgb2duaSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byB2ZXJyYW5ubyBnZW5lcmF0ZSAzIHByb3ByaWV0w6AgY2hlIGdlc3RpcmFubm8gbCdlc3BvcnRhemlvbmU6IChwcm9wLCBwcm9wX2NzdnZpcywgcHJvcF9jc3ZoZHIpLiBcclxuICogUGVyIGVzc2VyZSBlc3BvcnRhdGUsIGxlIHByb3ByaWV0w6AgZGVsbCdvZ2dldHRvIGRldm9ubyBlc3NlcmUgbWFyY2F0ZSBjb24gaSBEZWNvcmF0b3JpIGRpIGVzcG9ydGF6aW9uZVxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIE15T2JqIHtcclxuICogICAgIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiAgICAgY2lhbzogc3RyaW5nO1xyXG4gKiB9XHJcbiAqIFxyXG4gKiBARXhwb3J0T2JqZWN0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogdGVzdDogTXlPYmo7IFxyXG4gKiBgYGBcclxuICogXHJcbiAqIE5hc2NlcmFubm8gbGUgc2VndWVudGkgcHJvcHJpZXTDoCBuZWxsJ29nZ2V0dG8gZXNwb3J0YWJpbGU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogdGVzdGNpYW86IHN0cmluZzsgPT4gVmFsb3JlIGRpIE15T2JqLmNpYW9cclxuICogdGVzdGNpYW9fY3N2dmlzOiBzdHJpbmc7ID0+IHRydWVcclxuICogdGVzdGNpYW9fY3N2aGRyOiBzdHJpbmcgPT4gXCJNeUhlYWRlclwiIFxyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge2FueX0gdHlwZSBUaXBvIGRhIGVzcG9ydGFyZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydEFzID0gKG9yZGVyOiBudW1iZXIsIHR5cGU6IGFueSwgcHJlZml4Pzogc3RyaW5nKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgdmFyIHQgPSBuZXcgdHlwZSgpO1xyXG4gICAgdmFyIHByb3BzID0gdFtleHBvcnRMaXN0XTtcclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgIGxldCBwcm9wID0gcHJvcHNbaV0ucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgaWYgKHR5cGVvZiB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdDogYm9vbGVhbiA9IHRbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICAgICAgdmFyIGxibCA9IHRbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICAgICAgdmFyIG9yZGVyUHJvcCA9IHRbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICAgICAgaWYgKGZvcm1hdClcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkZvcm1hdFByZWZpeCwgeyB2YWx1ZTogZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXJQcm9wICsgb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogdG9FbWl0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiAocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgbGJsLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1bmEgbGlzdGEsIFxyXG4gKiBzaSB1dGlsaXp6YW5vIDIgbmF2aWdhdG9yIHJpc3BldHRpdmFtZW50ZSBwZXIgbGEgdmFsb3JpenphemlvbmUgZGVsbCdIZWFkZXIgZSBkZWwgVmFsb3JlIGUgXHJcbiAqIHBlciBvZ25pIGVsZW1lbnRvIGRlbGwnYXJyYXkgdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKVxyXG4gKiBcclxuICogQVRURU5aSU9ORTogR2xpIG9nZ2V0dGkgZXNwb3J0YXRpIGluIHF1ZXN0YSBtb2RhbGl0w6Agbm9uIGRldm9ubyBwcmVzZW50YXJlIGFsdHJpIHRhZyBkaSB0aXBvIEBFeHBvcnR7Li4ufSBhbGwnaW50ZXJuby4gRmEgdHV0dG8gcXVlc3RvIGRlY29yYXRvcmVcclxuICogXHJcbiAqIEkgbmF2aWdhdG9yIGhhbm5vIHF1ZXN0YSBjb252ZW56aW9uZTpcclxuICogXHJcbiAqIC4gLS0+IGRpdmlkZSBkdWUgcHJvcHJpZXTDoCBkYSByaWNoaWFtYXJlIGNvbnNlY3V0aXZhbWVudGU6IFwiYS5iXCIgcmljaGlhbWVyw6AgXCJvYmouYS5iXCI7XHJcbiAqIFxyXG4gKiB8IC0tPiBkaXZpZGUgcGnDuSBwcm9wcmlldMOgIHBlciBsZSBjb25jYXRlbmF6aW9uaSBjb24gdW5vIHNwYXppbyBmcmEgdW5hIGUgbCdhbHRyYTogXCJyZWdkZXNjfHNsaWNlLnNsaWNlbmFtZVwiIGRpdmVudGVyw6Agb2JqLnJlZ2Rlc2MgKyBcIiBcIiArIG9iai5zbGljZS5zbGljZW5hbWVcclxuICogXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcm5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdGl0b2xvIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZW5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdmFsb3JlIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZWZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZSBwZXIgaSB2YWxvcmkgc2VsZXppb25hdGkgZGFsICoqdmFsdWVuYXZpZ2F0b3IqKi4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRMaXN0ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZWZvcm1hdDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2VmFsUHJlZml4LCB7IHZhbHVlOiB2YWx1ZW5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXJuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbEZvcm1hdCwgeyB2YWx1ZTogdmFsdWVmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGxpc3RDc3ZIZHJQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIGRpemlvbmFyaW8uIFNlIGFkIGVzZW1waW8gc2kgdm9nbGlvbm8gZ2VuZXJhcmUgbGUgY29sb25uZVxyXG4gKiBcclxuICogVmFsb3JlIEEgPSAxXHJcbiAqIFxyXG4gKiBWYWxvcmUgQiA9IDJcclxuICogXHJcbiAqIFZhbG9yZSBDID0gM1xyXG4gKiBcclxuICogcGFydGVuZG8gZGEgdW4gb2dnZXR0byBpbml6aWFsZSB7IFZhbG9yZSB7IEE6IDEsIEI6IDIsIEM6IDMgfSB9XHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydERpY3Rpb25hcnkgPSAob3JkZXI6IG51bWJlciwgaGVhZGVybmF2aWdhdG9yOiBzdHJpbmcsIHZhbHVlbmF2aWdhdG9yOiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIHNpIG9jY3VwYSBkZWxsJ2VzcG9ydGF6aW9uZSBkZWdsaSBvZ2dldHRpIG1hcmNhdGkgZGFpIERlY29yYXRvcmkgKipFeHBvcnREaWN0aW9uYXJ5KiosICoqRXhwb3J0TGlzdCoqLCAqKkV4cG9ydEFzKiogbyAqKkV4cG9ydCoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogXCJyb290XCJ9KVxyXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvc3RydXR0b3JlXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVzOiBEYXRlU2VydmljZSwgcHJpdmF0ZSBsYzogTG9jYWxpemF0aW9uU2VydmljZSkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmpzIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwdWJsaWMgc2V0dXBGb3JFeHBvcnQob2JqczogYW55W10sIGNvbHVtbnM6IHN0cmluZ1tdID0gW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgbGV0IGhlYWRlcnNDYWNoZSA9IHt9O1xyXG5cclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICAvLyBHbGkgaGVhZGVyIGxpIHJhY2NvbGdvIHR1dHRpIHBvaSBmYWNjaW8gdWFuIGRpc3RpbmN0IGluIG1vZG8gZGEgZXNwb3J0YXJlIHR1dHRlIGxlIHByb3ByaWV0w6AgcGVyIGJlbmVcclxuICAgIGxldCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9ID0ge307XHJcblxyXG4gICAgaWYgKGNvbHVtbnM/Lmxlbmd0aCA+IDApXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucz8ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgY29sdW1uU2VsZWN0aW9uRGljdGlvbmFyeVtjb2x1bW5zW2ldXSA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoZHMgPSB0aGlzLnBhcnNlQW5kR2V0SGVhZGVycyhvYmpzW2ldLCBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5KTtcclxuICAgICAgLy8gQWdnaXVuZ28gZ2xpIGhlYWRlciBmYWNlbmRvIGluIG1vZG8gZGkgbm9uIGFnZ2l1bmdlcm5lIG1haSBkdWUgdWd1YWxpIHBlciBub24gZG92ZXIgZmFyZSB1bmEgZGlzdGluY3QgZG9wb1xyXG4gICAgICAvLyBjaGUgY29zdGVyZWJiZSBjb211bnF1ZSByaXNvcnNlLiBVdGlsaXp6byB1biBkaXppb25hcmlvIGQnYXBwb2dnaW8gcGVyIGxvb2t1cCBpc3RhbnRhbmVpXHJcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGRzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzQ2FjaGVbaGRzW2tdLmtleV0pIHtcclxuICAgICAgICAgIGhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSA9IHRydWU7XHJcbiAgICAgICAgICBoZWFkZXJzLnB1c2goaGRzW2tdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuIGhlYWRlcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFNlIG1pIGFycml2YSBsYSBsaXN0YSBkaSBjb2xvbm5lIG5vbiBtaSBkw6Agc29sbyBsYSB2aXNpYmlsaXTDoCwgbWEgYW5jaGUgbCdvcmRpbmFtZW50b1xyXG4gICAgICAvLyBsZSBlc3BvcnRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICAgIGxldCBvcmRlcmVkSGVhZGVycyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdGhpc0lkID0gY29sdW1uc1tpXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWFkZXJzW2ldLnByb3BLZXkgPT0gdGhpc0lkKSB7XHJcbiAgICAgICAgICAgIG9yZGVyZWRIZWFkZXJzLnB1c2goaGVhZGVyc1tpXSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb3JkZXJlZEhlYWRlcnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHVuYSBsaXN0YSBkaSBvZ2dldHRpIGdlbmVyaWNpIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGludGVncmEgb2duaSBvZ2dldHRvIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbVtdfSBvYmpzIE9nZ2V0dGkgZ2VuZXJpY2kgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzW119IGNvbHVtbnMgQ29sb25uZSByaWNoaWVzdGUgZGFsbCdlc3BvcnRhemlvbmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckdlbmVyaWNFeHBvcnQob2JqczogR2VuZXJpY0l0ZW1bXSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGxldCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuICAgIGlmICghb2JqcyB8fCBvYmpzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuXHJcbiAgICAvLyBEZXZvIHBlciBmb3J6YSBmYXJsbyBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgZGF0byBjaGUgZGV2byBlc3BvcnJlIGxlIHByb3ByaWV0w6AgY2hlIG1pIHNlcnZvbm8gZGEgZXNwb3J0YXJlXHJcbiAgICBvYmpzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IDApXHJcbiAgICAgICAgaGVhZGVycyA9IHRoaXMucGFyc2VBbmRHZXRHZW5lcmljSGVhZGVycyhvYmosIGNvbHVtbnMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmljbyBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yR2VuZXJpY0V4cG9ydCoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtHZW5lcmljSXRlbX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZDb2x1bW5bXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iajogR2VuZXJpY0l0ZW0sIGNvbHVtbnM6IENzdkhlYWRlcnNbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBpZiAoIW9iai5wcm9wZXJ0aWVzKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy9NaXJhY2xlIGluY29taW5nXHJcbiAgICBjb2x1bW5zLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBvYmoucHJvcGVydGllc1t0LmtleV07XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHQua2V5ICsgXCJfZXhwXCIsIHsgdmFsdWU6IHByb3BWYWx1ZSwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbDogdC5sYWJlbCwga2V5OiB0LmtleSArIFwiX2V4cFwiLCBvcmRlcjogdC5vcmRlciwgdHlwZTogdC50eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9UaXJhdGkgZnVvcmkgdHV0dGkgZ2xpIGhlYWRlciBmYWNjaW8gc29ydCBzdWxsJ29yZGluYW1lbnRvXHJcbiAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiBhLm9yZGVyIC0gYi5vcmRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gb2dnZXR0byBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBsbyBpbnRlZ3JhIGNvbiBsZSBwcm9wcmlldMOgIGVzcG9ydGFiaWxpIGRhbGxhIGxpYnJlcmlhICoqQGN0cmwvbmd4LWNzdioqXHJcbiAgICogXHJcbiAgICogTWV0b2RvIGludGVybm8gcmljaGlhbWF0byBkYSAqKnNldHVwRm9yRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZ2VuZXJpY28gZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0SGVhZGVycyhvYmo6IGFueSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgdmFyIGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG5cclxuICAgIC8vIE1pcmFjbGUgaW5jb21pbmdcclxuICAgIGxldCBleHBvcnRQcm9wcyA9IG9ialtleHBvcnRMaXN0XSB8fCBbXTtcclxuICAgIGxldCBsb2MgPSB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUob2JqW2xvY1Byb3BlcnR5XSk7XHJcblxyXG4gICAgaWYgKGV4cG9ydFByb3BzLmxlbmd0aCA9PSAwKVxyXG4gICAgICBjb25zb2xlLndhcm4oXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIE5lc3N1bmEgY29sb25uYSBjb25maWd1cmF0YSBkYSBlc3BvcnRhcmUhXCIpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwb3J0UHJvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHByb3AgPSBleHBvcnRQcm9wc1tpXTtcclxuICAgICAgbGV0IHByb3BCYXNlID0gXCJcIjtcclxuICAgICAgbGV0IHRvQ2FsbDogRnVuY3Rpb247XHJcbiAgICAgIGlmIChwcm9wLmVuZHNXaXRoKGxpc3RDc3ZIZHJQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UobGlzdENzdkhkclByZWZpeCwgJycpO1xyXG4gICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VMaXN0LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocHJvcC5lbmRzV2l0aChkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlRGljdGlvbmFyeS5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHByb3AuZW5kc1dpdGgoY3N2VmlzUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGNzdlZpc1ByZWZpeCwgJycpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW3Byb3BCYXNlICsgY3N2VmFsdWVOYXZpZ2F0b3JdICE9PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZU9iamVjdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VQcm9wZXJ0eS5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9DYWxsKVxyXG4gICAgICAgIHRvQ2FsbChvYmosIHByb3BCYXNlLCBoZWFkZXJzLCBjb2x1bW5zU2VsZWN0aW9uLCBsb2MpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AuIFxyXG4gICAqIFZpZW5lIGdlbmVyYXRvIGwnaGVhZGVyIGUgbGEgcHJvcHJpZXTDoCByZWxhdGl2YSBhbCB2YWxvcmUgZm9ybWF0dGF0byBvIG5vXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZSBcclxuICAgKiBAcGFyYW0ge0xvY2FsaXphdGlvblNlcnZpY2V9IGxvYyBTZXJ2aXppbyBkaSBsb2NhbGl6emF6aW9uZSBjaGUgdHJhZHVjZSB0dXR0aSBpIG5vbWkgY2hlIHB1w7JcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlUHJvcGVydHkob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IHRvRW1pdDogYm9vbGVhbiA9IG9ialtwcm9wICsgY3N2VmlzUHJlZml4XTtcclxuICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IG9ialtwcm9wICsgY3N2Rm9ybWF0UHJlZml4XTtcclxuICAgIGxldCBwcm9wS2V5ID0gb2JqW3Byb3AgKyBjc3ZQcm9wS2V5XTtcclxuXHJcbiAgICBpZiAocHJvcEtleSAmJiAhY29sdW1uc1NlbGVjdGlvbltwcm9wS2V5XSAmJiBPYmplY3Qua2V5cyhjb2x1bW5zU2VsZWN0aW9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBDb2xvbm5hIGRhIG5vbiBlc3BvcnRhcmU6IFwiICsgcHJvcEtleSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGV4dCA9IG9ialtwcm9wICsgY3N2SGRyUHJlZml4XTtcclxuICAgIGxldCBsYWJlbCA9IGxvYyAmJiB0ZXh0ID8gbG9jLmxvYyh0ZXh0KSA6IHRleHQgfHwgXCJcIjtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICBpZiAoIXRvRW1pdClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNlIG5vbiBobyB1biBmb3JtYXRvIGVzcG9ydG8gZGlyZXR0YW1lbnRlXHJcbiAgICBpZiAoIWZvcm1hdCkge1xyXG4gICAgICAvLyBTZSDDqCB1biBmb3JtYXRvIGRhdGEgbWkgYXNzaWN1cm8gZGkgbm9uIHN0YW1wYXJlIG1haSB1bmEgZGF0YSAwMDowMDowMCBhbHRyaW1lbnRpIGluIGVzcG9ydGF6aW9uZSB2aWVuZSB1bm8gc2NoaWZvXHJcbiAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF0gPyB0aGlzLmRhdGVzLnRyaW1TZWNvbmRzKG9ialtwcm9wXS50b1N0cmluZygpKSA6IFwiXCI7XHJcbiAgICAgIGxldCBrZXkgPSBwcm9wICsgXCJfbm9mbXRcIjtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWwsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwic3RyaW5nXCIsIHByb3BLZXkgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQga2V5ID0gcHJvcCArIFwiX2ZtdFwiO1xyXG5cclxuICAgICAgLy8gQ2FzbyBmb3JtYXRvIG51bWVyaWNvXHJcbiAgICAgIGlmIChmb3JtYXQgPT0gXCJGXCIpIHtcclxuICAgICAgICAvLyBDaGVjayBjb25zaWRlcmFuZG8gbGEgcG9zc2liaWxpdMOgIGRpIHplcmlcclxuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdICE9IG51bGwgPyBvYmpbcHJvcF0udG9TdHJpbmcoKSA6IFwiXCI7XHJcbiAgICAgICAgLy8gRWxpbWlubyB0dXR0ZSBsZSB2aXJnb2xlIChpbmRpY2F0b3JpIGRpIG1pZ2xpYWlhIHBlciBsYSBjdWx0dXJlIGRlZmF1bHQgZW4tVVMpXHJcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgICAvLyBJbCBzaW5nb2xvIHB1bnRvIGNoZSBjJ8OoLCBzZSBwcmVzZW50ZSAoc2VwYXJhdG9yZSBkZWNpbWFsaSkgbG8gdHJhc2Zvcm1vIGluIHZpcmdvbGFcclxuICAgICAgICBsZXQgdmFsQ29udmVydGVkID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWxDb252ZXJ0ZWQsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJudW1iZXJcIiwgcHJvcEtleSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBTZSBobyB1biBmb3JtYXRvIGRhdGEgdHJhc2Zvcm1vIGluIGRheWpzLCBmb3JtYXR0byBlZCBlc3BvcnRvXHJcbiAgICAgICAgLy8gUGVyIGxhIHRyYXNmb3JtYXppb25lIGluIGRheWpzIHByb3ZvIHByaW1hIGEgcGFzc2FyZ2xpIGxhIHN0cmluZ2EgZGkgbmV0dG8sIHNwZXJhbmRvIGxhIHJpY29ub3NjYVxyXG4gICAgICAgIC8vIFNlIG5vbiBmdW56aW9uYSBwcm92byBhIGRlZmluaXJnbGkgbGEgZm9ybWF0dGF6aW9uZSBzdGFuZGFyZCBkZWwgbWV0ZXJpbmcgcGVyIHF1ZWwgbGluZ3VhZ2dpb1xyXG4gICAgICAgIGxldCB2YWwgPSB0aGlzLmRhdGVzLmdldEZvcm1hdHRlZChvYmpbcHJvcF0sIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWwgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcImRhdGVcIiwgcHJvcEtleSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBzaW5nb2xhIHByb3ByaWV0w6AgZGEgdW4gb2dnZXR0by4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm8uIFxyXG4gICAqIFxyXG4gICAqIFBlciBvdHRlbmVyZSBpbCB2YWxvcmUgZSBsJ2hlYWRlciBkZWxsYSBwcm9wcmlldMOgIHZlbmdvbm8gdXRpbGl6emF0aSBpIG5hdmlnYXRvcmkgYXV0by1nZW5lcmF0aSBuZWwgZGVjb3JhdG9yZSAqKkV4cG9ydEFzKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VPYmplY3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICAvL3NlIHF1ZXN0YSBwcm9wcmlldMOgIGhhIHVuIG5hdmlnYXRvciBzaWduaWZpY2EgY2hlIGRlcml2YSBkYSB1biBvZ2dldHRvIGludGVybm8sIHJlY3VwZXJvIGlsIHZhbG9yZSBpbiBxdWVzdGEgZmFzZSBkYXRvIGNoZSBwcmltYSBub24gY2UgbCdob1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBjc3ZWYWx1ZU5hdmlnYXRvcl07XHJcblxyXG4gICAgLy9Fcy4gZGkgdmFsdWVuYXZpZ2F0b3Igb2JqLnN1Ym9iai5zdWJzdWJvYmoucHJvcGVydHlcclxuICAgIGxldCBqbXBzID0gdmFsdWVuYXZpZ2F0b3Iuc3BsaXQoXCIuXCIpO1xyXG4gICAgLy9NaSBjbG9ubyBsJ29nZ2V0dG8gb3JpZ2luYWxlIHBlciBub24gdWNjaWRlcmdsaSBpIHJpZmVyaW1lbnRpXHJcbiAgICBsZXQgY2xvbmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xyXG4gICAgLy9TYWx0byByaWNvcnNpdmFtZW50ZSBzdSBtZSBzdGVzc28gcGVyIGFycml2YXJlIGFsbGEgcHJvcHJpZXTDoFxyXG4gICAgLy9TYWx0byAxID4gZGl2ZW50YSBvYmpcclxuICAgIC8vU2FsdG8gMiA+IGRpdmVudGEgb2JqLnN1Ym9ialxyXG4gICAgLy9lY2MuLi5cclxuICAgIGptcHMuZm9yRWFjaChwcCA9PiB7IGNsb25lID0gY2xvbmVbcHBdOyB9KTtcclxuXHJcbiAgICAvL1ZhbG9yZSBmaW5hbGUgOkRcclxuICAgIGxldCB2YWx1ZSA9IGNsb25lO1xyXG5cclxuICAgIGxldCB0ZXh0ID0gb2JqW3Byb3AgKyBjc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IGxhYmVsID0gbG9jICYmIHRleHQgPyBsb2MubG9jKHRleHQpIDogdGV4dCB8fCBcIlwiO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIC8vU2UgcGVyIHF1ZXN0YSBwcm9wcmlldMOgIGhvIHVuIGZvcm1hdG8gbG8gYXBwbGljb1xyXG4gICAgbGV0IGZvcm1hdDogc3RyaW5nID0gb2JqW3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgbGV0IHR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnZGF0ZScgPSBcInN0cmluZ1wiO1xyXG4gICAgaWYgKGZvcm1hdCA9PSBcIkZcIikge1xyXG4gICAgICBsZXQgdmFsID0gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgdmFsdWUgPSB2YWwucmVwbGFjZShcIi5cIiwgXCIsXCIpO1xyXG4gICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvcm1hdCkge1xyXG4gICAgICB2YWx1ZSA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKHZhbHVlLCBmb3JtYXQubGVuZ3RoIDw9IDEwLCBmb3JtYXQubGVuZ3RoID4gMTYpO1xyXG4gICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgeyB2YWx1ZTogdmFsdWUgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleTogcHJvcCwgb3JkZXIsIHR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIGxpc3RhIGRpIHZhbG9yaSBwaXZvdHRhdGkgZGluYW1pY2FtZW50ZTpcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBpbCB2YWxvcmUgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gbCdoZWFkZXIgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gQ29uIGlsIHZhbG9yZSBjaSBjcmVvIGxhIHByb3BlcnR5XHJcbiAgICogXHJcbiAgICogPT4gQ29uIGwnaGVhZGVyIGUgaWwgcmlmZXJpbWVudG8gYWxsYSBwcm9wZXJ0eSBhcHBlbmEgY3JlYXRhIGNyZW8gdW4gcmVjb3JkIG5lZ2xpIGhlYWRlciBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VMaXN0KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IGhlYWRlcm5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdkhkclByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxQcmVmaXhdO1xyXG4gICAgbGV0IHZhbHVlZm9ybWF0ID0gb2JqW3Byb3AgKyBsaXN0Q3N2VmFsRm9ybWF0XTtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICB2YXIganVtcHM6IHN0cmluZ1tdLCB0bXBSZXM6IGFueTtcclxuICAgIHZhciBvYmpzOiBhbnlbXSA9IG9ialtwcm9wXTtcclxuXHJcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBvYmpzLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgbGV0IGxpc3RpdGVtID0gb2Jqc1tpZHhdO1xyXG5cclxuICAgICAgdmFyIGhlYWRlcnNwbGl0ID0gaGVhZGVybmF2aWdhdG9yLnNwbGl0KFwiIFwiKTtcclxuICAgICAgdmFyIGxhYmVsID0gXCJcIjtcclxuXHJcbiAgICAgIC8vIFBlciBsJ2hlYWRlciBzaSBjb25zaWRlcmEgYSBzZSBzdGFudGUgb2duaSBwZXp6byBzZXBhcmF0byBkYSBzcGF6aW8gcGVyIGZhcmUgbGUgY29uY2F0ZW5hemlvbmlcclxuICAgICAgaGVhZGVyc3BsaXQuZm9yRWFjaChwciA9PiB7XHJcbiAgICAgICAganVtcHMgPSBwci5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICAgIGp1bXBzLmZvckVhY2gocHAgPT4geyB0bXBSZXMgPSB0bXBSZXNbcHBdOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFsYWJlbCkgbGFiZWwgPSAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgICBlbHNlIGxhYmVsICs9IFwiIFwiICsgISFsb2MgPyBsb2MubG9jKHRtcFJlcykgOiB0bXBSZXM7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAganVtcHMgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIi5cIik7XHJcbiAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG4gICAgICBsZXQgdmFsdWUgPSB0bXBSZXM7XHJcblxyXG4gICAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICAgIGlmICh2YWx1ZWZvcm1hdCA9PSBcIkZcIikge1xyXG4gICAgICAgIGxldCB2YWwgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IFwiXCI7XHJcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgICAgdHlwZSA9IFwibnVtYmVyXCI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodmFsdWVmb3JtYXQpIHtcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKG9ialtwcm9wXSwgdmFsdWVmb3JtYXQubGVuZ3RoIDw9IDEwLCB2YWx1ZWZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgICAgdHlwZSA9IFwiZGF0ZVwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wICsgaWR4LCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXk6IHByb3AgKyBpZHgsIG9yZGVyOiBvcmRlciArIGlkeCwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmVcclxuICAgKiBAcGFyYW0ge0xvY2FsaXphdGlvblNlcnZpY2V9IGxvYyBTZXJ2aXppbyBkaSBsb2NhbGl6emF6aW9uZSBjaGUgdHJhZHVjZSB0dXR0aSBpIG5vbWkgY2hlIHB1w7JcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlRGljdGlvbmFyeShvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIGxldCBoZWFkZXJuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4XTtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICB2YXIganVtcHM6IHN0cmluZ1tdLCB0bXBSZXM6IGFueTtcclxuICAgIHZhciBvYmpzOiBhbnlbXSA9IG9ialtwcm9wXTtcclxuXHJcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBvYmpzLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgbGV0IGxpc3RpdGVtID0gb2Jqc1tpZHhdO1xyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgaGVhZGVyc3BsaXQuZm9yRWFjaChwciA9PiB7XHJcbiAgICAgICAganVtcHMgPSBwci5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICAgIGp1bXBzLmZvckVhY2gocHAgPT4geyB0bXBSZXMgPSB0bXBSZXNbcHBdOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFsYWJlbCkgbGFiZWwgPSAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgICBlbHNlIGxhYmVsICs9IFwiIFwiICsgISFsb2MgPyBsb2MubG9jKHRtcFJlcykgOiB0bXBSZXM7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdmFyIHZhbHVlc3BsaXQgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIixcIik7XHJcbiAgICAgIHZhbHVlc3BsaXQuZm9yRWFjaCgodCwgaWR4aW50ZXJuYWwpID0+IHtcclxuICAgICAgICB2YXIgbmF2aWcgPSB0LnNwbGl0KFwiLVwiKVsxXTtcclxuICAgICAgICB2YXIgZGVzYyA9IHQuc3BsaXQoXCItXCIpWzBdO1xyXG5cclxuICAgICAgICBqdW1wcyA9IG5hdmlnLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgICAgbGV0IHByb3BuYW1lID0gcHJvcCArIGlkeC50b1N0cmluZygpICsgaWR4aW50ZXJuYWwudG9TdHJpbmcoKTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wbmFtZSwgeyB2YWx1ZTogdmFsdWUgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiBsYWJlbCArIFwiIFwiICsgISFsb2MgPyBsb2MubG9jKGRlc2MpIDogZGVzYywga2V5OiBwcm9wbmFtZSwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlOiAnc3RyaW5nJywgcHJvcEtleTogbnVsbCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkZWxsYSBkZXNlcmlhbGl6emF6aW9uZSBkZWdsaSBvZ2dldHRpIGRhIGVzcG9ydGFyZS4gTWVzc28gYSBsaXZlbGxvIGRpIGxpYnJlcmlhIGluIG1vZG8gY2hlIHF1YWxvcmEgY2kgZm9zc2UgZGEgY2FtYmlhcmUgbGlicmVyaWEgXHJcbiAgICogdHV0dGUgbGUgbWFudXRlbnppb25pIHNpYW5vIGNvbmNlbnRyYXRlIHF1aVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGEgZGVzZXJpYWxpenphcmVcclxuICAgKiBAcGFyYW0ge2FueX0gdHlwZSBUaXBvIGRhIHVzYXJlIGNvbWUgcHJvdG90aXBvIHBlciBsYSBkZXNlcmlhbGl6emF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHthbnl9IE9nZ2V0dGkgZGVzZXJpYWxpenphdGlcclxuICAgKi9cclxuICBwdWJsaWMgZGVzZXJpYWxpemVGb3JFeHBvcnQoaXRlbXM6IGFueVtdLCB0eXBlOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIERlc2VyaWFsaXplKGl0ZW1zLCB0eXBlKTtcclxuICB9XHJcbn0iXX0=
|
|
626
|
+
}], ctorParameters: function () { return [{ type: i1.DateService }, { type: i2.UtilityService }, { type: i3.LocalizationService }]; } });
|
|
627
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU87QUFDUCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBS3hDLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBUWpROzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUE4QjtJQUMvRCxPQUFPLFNBQVMsWUFBWSxDQUF3QyxXQUFjO1FBQ2hGLE9BQU8sS0FBTSxTQUFRLFdBQVc7WUFBekI7O2dCQUE0QixZQUFPLEdBQUcsR0FBRyxDQUFDO1lBQUMsQ0FBQztTQUFBLENBQUM7SUFDdEQsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQWlCLElBQUksRUFBRSxVQUFrQixJQUFJLEVBQUUsRUFBRSxDQUNyRyxDQUFDLE1BQWMsRUFBRSxXQUFtQixFQUFFLEVBQUU7SUFDdEMsSUFBSSxNQUFNO1FBQ1IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLGVBQWUsRUFB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QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEtBQVksRUFBRSxNQUFzQixFQUFFLFFBQWdCLEVBQUUsYUFBdUIsRUFBRSxjQUE2QjtRQUMxSCxJQUFJLE9BQU8sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzdILENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEYsQ0FBQzs7MEdBdmZVLGFBQWE7OEdBQWIsYUFBYSxjQURBLE1BQU07MkZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBMaWJzXHJcbmltcG9ydCB7IERlc2VyaWFsaXplIH0gZnJvbSBcImNlcmlhbGl6ZVwiO1xyXG5cclxuLy8gRXNmYWVuemFcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuXHJcbmltcG9ydCB7IGV4cG9ydExpc3QsIGNzdkZvcm1hdFByZWZpeCwgY3N2SGRyUHJlZml4LCBjc3ZPcmRQcmVmaXgsIGNzdlZhbHVlTmF2aWdhdG9yLCBjc3ZWaXNQcmVmaXgsIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgsIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXgsIGxpc3RDc3ZIZHJQcmVmaXgsIGxpc3RDc3ZWYWxGb3JtYXQsIGxpc3RDc3ZWYWxQcmVmaXgsIGNzdlByb3BLZXksIGxvY1Byb3BlcnR5IH0gZnJvbSBcIi4uL21vZGVscy9FeHBvcnRDb25zdHNcIjtcclxuaW1wb3J0IHsgRGF0ZVNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbnMuZGF0ZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIi4vZXh0ZW5zaW9ucy51dGlsaXRpZXMuc2VydmljZVwiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBDc3ZIZWFkZXJzIH0gZnJvbSBcIi4uL21vZGVscy9Dc3ZIZWFkZXJzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9HZW5lcmljSXRlbVwiO1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgY2hlIGZvcm5pc2NlIGxhIGNsYXNzZSBkaSBsb2NhbGl6emF6aW9uZSBwZXIgdHV0dGUgbGUgcHJvcHJpZXTDoCBlc3BvcnRhdGUgY29uIEBFeHBvcnQgZSBxdWFsc2lhc2kgYWx0cm8gdGFnIGNoZSByaWNoaWVkYSBsb2NhbGl6emF6aW9uaS5cclxuICogXHJcbiAqIFNvc3RhbnppbGFtZW50ZSBhZ2dpdW5nZSBsYSBwcm9wcmlldMOgICoqX19sb2NfXyoqIGFsbCdvZ2dldHRvIGNyZWF0byBkYWxsYSBjbGFzc2UgY29ycmVudGUgYXNzZWduYW5kb2dsaSBjb21lIHZhbG9yZSBpbCB0aXBvIGRlbCBMb2NhbGl6YXRpb25TZXJ2aWNlIGRhIHVzYXJlIHBlciBsYSB0cmFkdXppb25lXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1R5cGU8TG9jYWxpemF0aW9uU2VydmljZT59IGxvYyBUaXBvIGVyZWRpdGF0byBkYWwgTG9jYWxpemF0aW9uU2VydmljZSBjaGUgcHXDsiBlc3NlcmUgY3JlYXRvIGEgcnVudGltZSBzb3R0byBjb250ZXN0byBkZWxsYSBESSBkaSBBbmd1bGFyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0TG9jYWxpemF0aW9uKGxvYzogVHlwZTxMb2NhbGl6YXRpb25TZXJ2aWNlPikge1xyXG4gIHJldHVybiBmdW5jdGlvbiBpbnRlZ3JhdGVMb2M8VCBleHRlbmRzIHsgbmV3KC4uLmFyZ3M6IGFueVtdKToge30gfT4oY29uc3RydWN0b3I6IFQpIHtcclxuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHsgX19sb2NfXyA9IGxvYzsgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIHByb3ByaWV0w6Agc2luZ29sYS4gXHJcbiAqIFZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIGNpYW86IHN0cmluZztcclxuICogY2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCJcclxuICogYGBgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXIgVGl0b2xvIGRlbGxhIGNvbG9ubmEgbmVsIGZpbGUgQ1NWIGVzcG9ydGF0b1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IEZvcm1hdG8gZGkgZXNwb3J0YXppb25lLiBQdcOyIGVzc2VyZSB1biBmb3JtYXRvIGRhdGEgcGVyIGkgY2FtcGkgZGF0YSBvICdGJyBwZXIgaSBjYW1waSBmbG9hdGluZyBwb2ludFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXI6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSBudWxsLCB0YWJsZWlkOiBzdHJpbmcgPSBudWxsKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGZvcm1hdClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogISFoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIGlmICh0YWJsZWlkKVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlByb3BLZXksIHsgdmFsdWU6IHRhYmxlaWQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1biBvZ2dldHRvLiBcclxuICogUGVyIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKS4gXHJcbiAqIFBlciBlc3NlcmUgZXNwb3J0YXRlLCBsZSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byBkZXZvbm8gZXNzZXJlIG1hcmNhdGUgY29uIGkgRGVjb3JhdG9yaSBkaSBlc3BvcnRhemlvbmVcclxuICogXHJcbiAqIEFkIGVzZW1waW8sIGRhIHF1ZXN0YSBjb25maWd1cmF6aW9uZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBNeU9iaiB7XHJcbiAqICAgICBARXhwb3J0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogICAgIGNpYW86IHN0cmluZztcclxuICogfVxyXG4gKiBcclxuICogQEV4cG9ydE9iamVjdCh0cnVlLCBcIk15SGVhZGVyXCIpXHJcbiAqIHRlc3Q6IE15T2JqOyBcclxuICogYGBgXHJcbiAqIFxyXG4gKiBOYXNjZXJhbm5vIGxlIHNlZ3VlbnRpIHByb3ByaWV0w6AgbmVsbCdvZ2dldHRvIGVzcG9ydGFiaWxlOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIHRlc3RjaWFvOiBzdHJpbmc7ID0+IFZhbG9yZSBkaSBNeU9iai5jaWFvXHJcbiAqIHRlc3RjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIHRlc3RjaWFvX2Nzdmhkcjogc3RyaW5nID0+IFwiTXlIZWFkZXJcIiBcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHthbnl9IHR5cGUgVGlwbyBkYSBlc3BvcnRhcmVcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRBcyA9IChvcmRlcjogbnVtYmVyLCB0eXBlOiBhbnksIHByZWZpeD86IHN0cmluZykgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIHZhciB0ID0gbmV3IHR5cGUoKTtcclxuICAgIHZhciBwcm9wcyA9IHRbZXhwb3J0TGlzdF07XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wID0gcHJvcHNbaV0ucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgaWYgKHR5cGVvZiB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdDogYm9vbGVhbiA9IHRbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICAgICAgdmFyIGxibCA9IHRbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICAgICAgdmFyIG9yZGVyUHJvcCA9IHRbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICAgICAgaWYgKGZvcm1hdClcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkZvcm1hdFByZWZpeCwgeyB2YWx1ZTogZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXJQcm9wICsgb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogdG9FbWl0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiAocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgbGJsLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1bmEgbGlzdGEsIFxyXG4gKiBzaSB1dGlsaXp6YW5vIDIgbmF2aWdhdG9yIHJpc3BldHRpdmFtZW50ZSBwZXIgbGEgdmFsb3JpenphemlvbmUgZGVsbCdIZWFkZXIgZSBkZWwgVmFsb3JlIGUgXHJcbiAqIHBlciBvZ25pIGVsZW1lbnRvIGRlbGwnYXJyYXkgdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKVxyXG4gKiBcclxuICogQVRURU5aSU9ORTogR2xpIG9nZ2V0dGkgZXNwb3J0YXRpIGluIHF1ZXN0YSBtb2RhbGl0w6Agbm9uIGRldm9ubyBwcmVzZW50YXJlIGFsdHJpIHRhZyBkaSB0aXBvIEBFeHBvcnR7Li4ufSBhbGwnaW50ZXJuby4gRmEgdHV0dG8gcXVlc3RvIGRlY29yYXRvcmVcclxuICogXHJcbiAqIEkgbmF2aWdhdG9yIGhhbm5vIHF1ZXN0YSBjb252ZW56aW9uZTpcclxuICogXHJcbiAqIC4gLS0+IGRpdmlkZSBkdWUgcHJvcHJpZXTDoCBkYSByaWNoaWFtYXJlIGNvbnNlY3V0aXZhbWVudGU6IFwiYS5iXCIgcmljaGlhbWVyw6AgXCJvYmouYS5iXCI7XHJcbiAqIFxyXG4gKiB8IC0tPiBkaXZpZGUgcGnDuSBwcm9wcmlldMOgIHBlciBsZSBjb25jYXRlbmF6aW9uaSBjb24gdW5vIHNwYXppbyBmcmEgdW5hIGUgbCdhbHRyYTogXCJyZWdkZXNjfHNsaWNlLnNsaWNlbmFtZVwiIGRpdmVudGVyw6Agb2JqLnJlZ2Rlc2MgKyBcIiBcIiArIG9iai5zbGljZS5zbGljZW5hbWVcclxuICogXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcm5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdGl0b2xvIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZW5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdmFsb3JlIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZWZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZSBwZXIgaSB2YWxvcmkgc2VsZXppb25hdGkgZGFsICoqdmFsdWVuYXZpZ2F0b3IqKi4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRMaXN0ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZWZvcm1hdDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2VmFsUHJlZml4LCB7IHZhbHVlOiB2YWx1ZW5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXJuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbEZvcm1hdCwgeyB2YWx1ZTogdmFsdWVmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGxpc3RDc3ZIZHJQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIGRpemlvbmFyaW8uIFNlIGFkIGVzZW1waW8gc2kgdm9nbGlvbm8gZ2VuZXJhcmUgbGUgY29sb25uZVxyXG4gKiBcclxuICogVmFsb3JlIEEgPSAxXHJcbiAqIFxyXG4gKiBWYWxvcmUgQiA9IDJcclxuICogXHJcbiAqIFZhbG9yZSBDID0gM1xyXG4gKiBcclxuICogcGFydGVuZG8gZGEgdW4gb2dnZXR0byBpbml6aWFsZSB7IFZhbG9yZSB7IEE6IDEsIEI6IDIsIEM6IDMgfSB9XHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydERpY3Rpb25hcnkgPSAob3JkZXI6IG51bWJlciwgaGVhZGVybmF2aWdhdG9yOiBzdHJpbmcsIHZhbHVlbmF2aWdhdG9yOiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIHNpIG9jY3VwYSBkZWxsJ2VzcG9ydGF6aW9uZSBkZWdsaSBvZ2dldHRpIG1hcmNhdGkgZGFpIERlY29yYXRvcmkgKipFeHBvcnREaWN0aW9uYXJ5KiosICoqRXhwb3J0TGlzdCoqLCAqKkV4cG9ydEFzKiogbyAqKkV4cG9ydCoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29zdHJ1dHRvcmVcclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZXM6IERhdGVTZXJ2aWNlLCBwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSB1bmEgbGlzdGEgZGkgb2dnZXR0aSBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBpbnRlZ3JhIG9nbmkgb2dnZXR0byBjb24gbGUgcHJvcHJpZXTDoCBlc3BvcnRhYmlsaSBkYWxsYSBsaWJyZXJpYSAqKkBjdHJsL25neC1jc3YqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55W119IG9ianMgT2dnZXR0aSBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckV4cG9ydChvYmpzOiBhbnlbXSwgY29sdW1uczogc3RyaW5nW10gPSBbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBsZXQgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcbiAgICBsZXQgaGVhZGVyc0NhY2hlID0ge307XHJcblxyXG4gICAgaWYgKCFvYmpzIHx8IG9ianMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG5cclxuICAgIC8vIERldm8gcGVyIGZvcnphIGZhcmxvIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBkYXRvIGNoZSBkZXZvIGVzcG9ycmUgbGUgcHJvcHJpZXTDoCBjaGUgbWkgc2Vydm9ubyBkYSBlc3BvcnRhcmVcclxuICAgIC8vIEdsaSBoZWFkZXIgbGkgcmFjY29sZ28gdHV0dGkgcG9pIGZhY2NpbyB1YW4gZGlzdGluY3QgaW4gbW9kbyBkYSBlc3BvcnRhcmUgdHV0dGUgbGUgcHJvcHJpZXTDoCBwZXIgYmVuZVxyXG4gICAgbGV0IGNvbHVtblNlbGVjdGlvbkRpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0gPSB7fTtcclxuXHJcbiAgICBpZiAoY29sdW1ucz8ubGVuZ3RoID4gMClcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zPy5sZW5ndGg7IGkrKylcclxuICAgICAgICBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5W2NvbHVtbnNbaV1dID0gdHJ1ZTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGhkcyA9IHRoaXMucGFyc2VBbmRHZXRIZWFkZXJzKG9ianNbaV0sIGNvbHVtblNlbGVjdGlvbkRpY3Rpb25hcnkpO1xyXG4gICAgICAvLyBBZ2dpdW5nbyBnbGkgaGVhZGVyIGZhY2VuZG8gaW4gbW9kbyBkaSBub24gYWdnaXVuZ2VybmUgbWFpIGR1ZSB1Z3VhbGkgcGVyIG5vbiBkb3ZlciBmYXJlIHVuYSBkaXN0aW5jdCBkb3BvXHJcbiAgICAgIC8vIGNoZSBjb3N0ZXJlYmJlIGNvbXVucXVlIHJpc29yc2UuIFV0aWxpenpvIHVuIGRpemlvbmFyaW8gZCdhcHBvZ2dpbyBwZXIgbG9va3VwIGlzdGFudGFuZWlcclxuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHMubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSkge1xyXG4gICAgICAgICAgaGVhZGVyc0NhY2hlW2hkc1trXS5rZXldID0gdHJ1ZTtcclxuICAgICAgICAgIGhlYWRlcnMucHVzaChoZHNba10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gU2UgbWkgYXJyaXZhIGxhIGxpc3RhIGRpIGNvbG9ubmUgbm9uIG1pIGTDoCBzb2xvIGxhIHZpc2liaWxpdMOgLCBtYSBhbmNoZSBsJ29yZGluYW1lbnRvXHJcbiAgICAgIC8vIGxlIGVzcG9ydG8gZGkgY29uc2VndWVuemFcclxuICAgICAgbGV0IG9yZGVyZWRIZWFkZXJzID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCB0aGlzSWQgPSBjb2x1bW5zW2ldO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlYWRlcnNbaV0ucHJvcEtleSA9PSB0aGlzSWQpIHtcclxuICAgICAgICAgICAgb3JkZXJlZEhlYWRlcnMucHVzaChoZWFkZXJzW2ldKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvcmRlcmVkSGVhZGVycztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJpY2kgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0dlbmVyaWNJdGVtW119IG9ianMgT2dnZXR0aSBnZW5lcmljaSBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnNbXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHVibGljIHNldHVwRm9yR2VuZXJpY0V4cG9ydChvYmpzOiBHZW5lcmljSXRlbVtdLCBjb2x1bW5zOiBDc3ZIZWFkZXJzW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgaWYgKCFvYmpzIHx8IG9ianMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG5cclxuICAgIC8vIERldm8gcGVyIGZvcnphIGZhcmxvIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBkYXRvIGNoZSBkZXZvIGVzcG9ycmUgbGUgcHJvcHJpZXTDoCBjaGUgbWkgc2Vydm9ubyBkYSBlc3BvcnRhcmVcclxuICAgIG9ianMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoaW5kZXggPT0gMClcclxuICAgICAgICBoZWFkZXJzID0gdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnBhcnNlQW5kR2V0R2VuZXJpY0hlYWRlcnMob2JqLCBjb2x1bW5zKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBvZ2dldHRvIGdlbmVyaWNvIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGxvIGludGVncmEgY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBNZXRvZG8gaW50ZXJubyByaWNoaWFtYXRvIGRhICoqc2V0dXBGb3JHZW5lcmljRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0dlbmVyaWNJdGVtfSBvYmogT2dnZXR0byBnZW5lcmljbyBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkNvbHVtbltdfSBjb2x1bW5zIENvbG9ubmUgcmljaGllc3RlIGRhbGwnZXNwb3J0YXppb25lXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0R2VuZXJpY0hlYWRlcnMob2JqOiBHZW5lcmljSXRlbSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGlmICghb2JqLnByb3BlcnRpZXMpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHZhciBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuXHJcbiAgICAvL01pcmFjbGUgaW5jb21pbmdcclxuICAgIGNvbHVtbnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgdmFyIHByb3BWYWx1ZSA9IG9iai5wcm9wZXJ0aWVzW3Qua2V5XTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdC5rZXkgKyBcIl9leHBcIiwgeyB2YWx1ZTogcHJvcFZhbHVlLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiB0LmxhYmVsLCBrZXk6IHQua2V5ICsgXCJfZXhwXCIsIG9yZGVyOiB0Lm9yZGVyLCB0eXBlOiB0LnR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL1RpcmF0aSBmdW9yaSB0dXR0aSBnbGkgaGVhZGVyIGZhY2NpbyBzb3J0IHN1bGwnb3JkaW5hbWVudG9cclxuICAgIHJldHVybiBoZWFkZXJzLnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBvZ2dldHRvIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGxvIGludGVncmEgY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBNZXRvZG8gaW50ZXJubyByaWNoaWFtYXRvIGRhICoqc2V0dXBGb3JFeHBvcnQqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBnZW5lcmljbyBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VBbmRHZXRIZWFkZXJzKG9iajogYW55LCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy8gTWlyYWNsZSBpbmNvbWluZ1xyXG4gICAgbGV0IGV4cG9ydFByb3BzID0gb2JqW2V4cG9ydExpc3RdIHx8IFtdO1xyXG4gICAgbGV0IGxvYyA9IHRoaXMubGMuZ2VuZXJhdGVGcm9tVHlwZShvYmpbbG9jUHJvcGVydHldKTtcclxuXHJcbiAgICBpZiAoZXhwb3J0UHJvcHMubGVuZ3RoID09IDApXHJcbiAgICAgIGNvbnNvbGUud2FybihcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gTmVzc3VuYSBjb2xvbm5hIGNvbmZpZ3VyYXRhIGRhIGVzcG9ydGFyZSFcIik7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBvcnRQcm9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcHJvcCA9IGV4cG9ydFByb3BzW2ldO1xyXG4gICAgICBsZXQgcHJvcEJhc2UgPSBcIlwiO1xyXG4gICAgICBsZXQgdG9DYWxsOiBGdW5jdGlvbjtcclxuICAgICAgaWYgKHByb3AuZW5kc1dpdGgobGlzdENzdkhkclByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShsaXN0Q3N2SGRyUHJlZml4LCAnJyk7XHJcbiAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZUxpc3QuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChwcm9wLmVuZHNXaXRoKGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UoZGljdGlvbmFyeUNzdkhkclByZWZpeCwgJycpO1xyXG4gICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VEaWN0aW9uYXJ5LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocHJvcC5lbmRzV2l0aChjc3ZWaXNQcmVmaXgpKSB7XHJcbiAgICAgICAgcHJvcEJhc2UgPSBwcm9wLnJlcGxhY2UoY3N2VmlzUHJlZml4LCAnJyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpbcHJvcEJhc2UgKyBjc3ZWYWx1ZU5hdmlnYXRvcl0gIT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlT2JqZWN0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZVByb3BlcnR5LmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0b0NhbGwpXHJcbiAgICAgICAgdG9DYWxsKG9iaiwgcHJvcEJhc2UsIGhlYWRlcnMsIGNvbHVtbnNTZWxlY3Rpb24sIGxvYyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIHNpbmdvbGEgcHJvcHJpZXTDoC4gXHJcbiAgICogVmllbmUgZ2VuZXJhdG8gbCdoZWFkZXIgZSBsYSBwcm9wcmlldMOgIHJlbGF0aXZhIGFsIHZhbG9yZSBmb3JtYXR0YXRvIG8gbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VQcm9wZXJ0eShvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGNvbHVtbnNTZWxlY3Rpb24/OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9LCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgdG9FbWl0OiBib29sZWFuID0gb2JqW3Byb3AgKyBjc3ZWaXNQcmVmaXhdO1xyXG4gICAgbGV0IGZvcm1hdDogc3RyaW5nID0gb2JqW3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgbGV0IHByb3BLZXkgPSBvYmpbcHJvcCArIGNzdlByb3BLZXldO1xyXG5cclxuICAgIGlmIChwcm9wS2V5ICYmICFjb2x1bW5zU2VsZWN0aW9uW3Byb3BLZXldICYmIE9iamVjdC5rZXlzKGNvbHVtbnNTZWxlY3Rpb24pLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc29sZS5sb2coXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIENvbG9ubmEgZGEgbm9uIGVzcG9ydGFyZTogXCIgKyBwcm9wS2V5KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0ZXh0ID0gb2JqW3Byb3AgKyBjc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IGxhYmVsID0gbG9jICYmIHRleHQgPyBsb2MubG9jKHRleHQpIDogdGV4dCB8fCBcIlwiO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIGlmICghdG9FbWl0KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gU2Ugbm9uIGhvIHVuIGZvcm1hdG8gZXNwb3J0byBkaXJldHRhbWVudGVcclxuICAgIGlmICghZm9ybWF0KSB7XHJcbiAgICAgIC8vIFNlIMOoIHVuIGZvcm1hdG8gZGF0YSBtaSBhc3NpY3VybyBkaSBub24gc3RhbXBhcmUgbWFpIHVuYSBkYXRhIDAwOjAwOjAwIGFsdHJpbWVudGkgaW4gZXNwb3J0YXppb25lIHZpZW5lIHVubyBzY2hpZm9cclxuICAgICAgbGV0IHZhbCA9IG9ialtwcm9wXSA/IHRoaXMuZGF0ZXMudHJpbVNlY29uZHMob2JqW3Byb3BdLnRvU3RyaW5nKCkpIDogXCJcIjtcclxuICAgICAgbGV0IGtleSA9IHByb3AgKyBcIl9ub2ZtdFwiO1xyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbCwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJzdHJpbmdcIiwgcHJvcEtleSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBrZXkgPSBwcm9wICsgXCJfZm10XCI7XHJcblxyXG4gICAgICAvLyBDYXNvIGZvcm1hdG8gbnVtZXJpY29cclxuICAgICAgaWYgKGZvcm1hdCA9PSBcIkZcIikge1xyXG4gICAgICAgIC8vIENoZWNrIGNvbnNpZGVyYW5kbyBsYSBwb3NzaWJpbGl0w6AgZGkgemVyaVxyXG4gICAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF0gIT0gbnVsbCA/IG9ialtwcm9wXS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICAvLyBFbGltaW5vIHR1dHRlIGxlIHZpcmdvbGUgKGluZGljYXRvcmkgZGkgbWlnbGlhaWEgcGVyIGxhIGN1bHR1cmUgZGVmYXVsdCBlbi1VUylcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIC8vIElsIHNpbmdvbG8gcHVudG8gY2hlIGMnw6gsIHNlIHByZXNlbnRlIChzZXBhcmF0b3JlIGRlY2ltYWxpKSBsbyB0cmFzZm9ybW8gaW4gdmlyZ29sYVxyXG4gICAgICAgIGxldCB2YWxDb252ZXJ0ZWQgPSB2YWwucmVwbGFjZShcIi5cIiwgXCIsXCIpO1xyXG5cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbENvbnZlcnRlZCwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcIm51bWJlclwiLCBwcm9wS2V5IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFNlIGhvIHVuIGZvcm1hdG8gZGF0YSB0cmFzZm9ybW8gaW4gZGF5anMsIGZvcm1hdHRvIGVkIGVzcG9ydG9cclxuICAgICAgICAvLyBQZXIgbGEgdHJhc2Zvcm1hemlvbmUgaW4gZGF5anMgcHJvdm8gcHJpbWEgYSBwYXNzYXJnbGkgbGEgc3RyaW5nYSBkaSBuZXR0bywgc3BlcmFuZG8gbGEgcmljb25vc2NhXHJcbiAgICAgICAgLy8gU2Ugbm9uIGZ1bnppb25hIHByb3ZvIGEgZGVmaW5pcmdsaSBsYSBmb3JtYXR0YXppb25lIHN0YW5kYXJkIGRlbCBtZXRlcmluZyBwZXIgcXVlbCBsaW5ndWFnZ2lvXHJcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKG9ialtwcm9wXSwgZm9ybWF0Lmxlbmd0aCA8PSAxMCwgZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbCA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwiZGF0ZVwiLCBwcm9wS2V5IH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIHNpbmdvbGEgcHJvcHJpZXTDoCBkYSB1biBvZ2dldHRvLiBcclxuICAgKiBWaWVuZSBnZW5lcmF0byBsJ2hlYWRlciBlIGxhIHByb3ByaWV0w6AgcmVsYXRpdmEgYWwgdmFsb3JlIGZvcm1hdHRhdG8gbyBuby4gXHJcbiAgICogXHJcbiAgICogUGVyIG90dGVuZXJlIGlsIHZhbG9yZSBlIGwnaGVhZGVyIGRlbGxhIHByb3ByaWV0w6AgdmVuZ29ubyB1dGlsaXp6YXRpIGkgbmF2aWdhdG9yaSBhdXRvLWdlbmVyYXRpIG5lbCBkZWNvcmF0b3JlICoqRXhwb3J0QXMqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZU9iamVjdChvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIC8vc2UgcXVlc3RhIHByb3ByaWV0w6AgaGEgdW4gbmF2aWdhdG9yIHNpZ25pZmljYSBjaGUgZGVyaXZhIGRhIHVuIG9nZ2V0dG8gaW50ZXJubywgcmVjdXBlcm8gaWwgdmFsb3JlIGluIHF1ZXN0YSBmYXNlIGRhdG8gY2hlIHByaW1hIG5vbiBjZSBsJ2hvXHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yXTtcclxuXHJcbiAgICAvL0VzLiBkaSB2YWx1ZW5hdmlnYXRvciBvYmouc3Vib2JqLnN1YnN1Ym9iai5wcm9wZXJ0eVxyXG4gICAgbGV0IGptcHMgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIi5cIik7XHJcbiAgICAvL01pIGNsb25vIGwnb2dnZXR0byBvcmlnaW5hbGUgcGVyIG5vbiB1Y2NpZGVyZ2xpIGkgcmlmZXJpbWVudGlcclxuICAgIGxldCBjbG9uZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgICAvL1NhbHRvIHJpY29yc2l2YW1lbnRlIHN1IG1lIHN0ZXNzbyBwZXIgYXJyaXZhcmUgYWxsYSBwcm9wcmlldMOgXHJcbiAgICAvL1NhbHRvIDEgPiBkaXZlbnRhIG9ialxyXG4gICAgLy9TYWx0byAyID4gZGl2ZW50YSBvYmouc3Vib2JqXHJcbiAgICAvL2VjYy4uLlxyXG4gICAgam1wcy5mb3JFYWNoKHBwID0+IHsgY2xvbmUgPSBjbG9uZVtwcF07IH0pO1xyXG5cclxuICAgIC8vVmFsb3JlIGZpbmFsZSA6RFxyXG4gICAgbGV0IHZhbHVlID0gY2xvbmU7XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgLy9TZSBwZXIgcXVlc3RhIHByb3ByaWV0w6AgaG8gdW4gZm9ybWF0byBsbyBhcHBsaWNvXHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgIGxldCB2YWwgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgIHR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQodmFsdWUsIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgIHR5cGUgPSBcImRhdGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5OiBwcm9wLCBvcmRlciwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUxpc3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgaGVhZGVybmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVmb3JtYXQgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxGb3JtYXRdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcblxyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUGVyIGwnaGVhZGVyIHNpIGNvbnNpZGVyYSBhIHNlIHN0YW50ZSBvZ25pIHBlenpvIHNlcGFyYXRvIGRhIHNwYXppbyBwZXIgZmFyZSBsZSBjb25jYXRlbmF6aW9uaVxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBqdW1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgIGxldCB0eXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnID0gXCJzdHJpbmdcIjtcclxuICAgICAgaWYgKHZhbHVlZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogXCJcIjtcclxuICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICAgIHZhbHVlID0gdmFsLnJlcGxhY2UoXCIuXCIsIFwiLFwiKTtcclxuICAgICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh2YWx1ZWZvcm1hdCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCB2YWx1ZWZvcm1hdC5sZW5ndGggPD0gMTAsIHZhbHVlZm9ybWF0Lmxlbmd0aCA+IDE2KTtcclxuICAgICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AgKyBpZHgsIHsgdmFsdWU6IHZhbHVlID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleTogcHJvcCArIGlkeCwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgcGVyIGwnZXNwb3J0YXppb25lIGRpIHVuYSBsaXN0YSBkaSB2YWxvcmkgcGl2b3R0YXRpIGRpbmFtaWNhbWVudGU6XHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gaWwgdmFsb3JlIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGwnaGVhZGVyIHV0aWxpenphbmRvIGkgbmF2aWdhdG9yaVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBpbCB2YWxvcmUgY2kgY3JlbyBsYSBwcm9wZXJ0eVxyXG4gICAqIFxyXG4gICAqID0+IENvbiBsJ2hlYWRlciBlIGlsIHJpZmVyaW1lbnRvIGFsbGEgcHJvcGVydHkgYXBwZW5hIGNyZWF0YSBjcmVvIHVuIHJlY29yZCBuZWdsaSBoZWFkZXIgZGEgZXNwb3J0YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZVxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VEaWN0aW9uYXJ5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgbGV0IGhlYWRlcm5hdmlnYXRvciA9IG9ialtwcm9wICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZWYWxQcmVmaXhdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcbiAgICAgIHZhciBoZWFkZXJzcGxpdCA9IGhlYWRlcm5hdmlnYXRvci5zcGxpdChcIiBcIik7XHJcbiAgICAgIHZhciBsYWJlbCA9IFwiXCI7XHJcblxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9ICEhbG9jID8gbG9jLmxvYyh0bXBSZXMpIDogdG1wUmVzO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgdmFsdWVzcGxpdCA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgdmFsdWVzcGxpdC5mb3JFYWNoKCh0LCBpZHhpbnRlcm5hbCkgPT4ge1xyXG4gICAgICAgIHZhciBuYXZpZyA9IHQuc3BsaXQoXCItXCIpWzFdO1xyXG4gICAgICAgIHZhciBkZXNjID0gdC5zcGxpdChcIi1cIilbMF07XHJcblxyXG4gICAgICAgIGp1bXBzID0gbmF2aWcuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdG1wUmVzO1xyXG5cclxuICAgICAgICBsZXQgcHJvcG5hbWUgPSBwcm9wICsgaWR4LnRvU3RyaW5nKCkgKyBpZHhpbnRlcm5hbC50b1N0cmluZygpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BuYW1lLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWw6IGxhYmVsICsgXCIgXCIgKyAhIWxvYyA/IGxvYy5sb2MoZGVzYykgOiBkZXNjLCBrZXk6IHByb3BuYW1lLCBvcmRlcjogb3JkZXIgKyBpZHgsIHR5cGU6ICdzdHJpbmcnLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRlbGxhIGRlc2VyaWFsaXp6YXppb25lIGRlZ2xpIG9nZ2V0dGkgZGEgZXNwb3J0YXJlLiBNZXNzbyBhIGxpdmVsbG8gZGkgbGlicmVyaWEgaW4gbW9kbyBjaGUgcXVhbG9yYSBjaSBmb3NzZSBkYSBjYW1iaWFyZSBsaWJyZXJpYSBcclxuICAgKiB0dXR0ZSBsZSBtYW51dGVuemlvbmkgc2lhbm8gY29uY2VudHJhdGUgcXVpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBkZXNlcmlhbGl6emFyZVxyXG4gICAqIEBwYXJhbSB7YW55fSB0eXBlIFRpcG8gZGEgdXNhcmUgY29tZSBwcm90b3RpcG8gcGVyIGxhIGRlc2VyaWFsaXp6YXppb25lXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2FueX0gT2dnZXR0aSBkZXNlcmlhbGl6emF0aVxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZUZvckV4cG9ydChpdGVtczogYW55W10sIHR5cGU6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gRGVzZXJpYWxpemUoaXRlbXMsIHR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIEVmZmV0dHVhIGwnZXNwb3J0YXppb25lIGluIGZpbGUgQ1NWIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZXhwb3J0Q1NWKGZuOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgZGF0YTogYW55W10pIHtcclxuICAgIGxldCBjc3ZEYXRhID0gJycsIHJvdyA9ICcnLCBzZXAgPSAnOyc7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoID0gaGVhZGVyc1tpXTtcclxuICAgICAgcm93ICs9IGAke3JvdyAhPSAnJyA/IHNlcCA6ICcnfVwiJHtoLmxhYmVsfVwiYDtcclxuICAgIH1cclxuICAgIGNzdkRhdGEgKz0gcm93ICsgJ1xcclxcbic7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJvdyA9ICcnO1xyXG4gICAgICBsZXQgaXRlbSA9IGRhdGFbaV07XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVhZGVycy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGxldCB2YWwgPSBpdGVtW2hlYWRlcnNbal0ua2V5XTtcclxuICAgICAgICByb3cgKz0gYCR7cm93ICE9ICcnID8gc2VwIDogJyd9XCIke3ZhbH1cImA7XHJcbiAgICAgIH1cclxuICAgICAgY3N2RGF0YSArPSByb3cgKyAnXFxyXFxuJztcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3ZEYXRhXSwgeyB0eXBlOiAndGV4dC9jc3YnIH0pO1xyXG4gICAgdmFyIG9iamVjdFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgdGhpcy51dGlFeHRzLmZpbGVEb3dubG9hZChvYmplY3RVcmwsIGZuLmVuZHNXaXRoKCcueGxzeCcpID8gZm4ucmVwbGFjZSgnLnhsc3gnLCAnLmNzdicpIDogZm4uZW5kc1dpdGgoJy5jc3YnKSA/IGZuIDogZm4gKyBcIi5jc3ZcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIENhY2hlIGRlbCBtb2R1bG8gcGVyIGwnZXNwb3J0YXppb25lIEV4Y2VsICovXHJcbiAgcHJpdmF0ZSBFeGNlbEpTOiBhbnk7XHJcblxyXG4gIC8qKiBFZmZldHR1YSBsJ2VzcG9ydGF6aW9uZSBkZWwgZmlsZSBFeGNlbCBiYXNhbmRvc2kgc3VsIG1vZHVsbyAqKkV4Y2VsSlMqKiwgc3VnbGkgaGVhZGVyICoqaGVhZGVycyoqIGUgc3VpIGRhdGkgKipkYXRhKiogKi9cclxuICBwcml2YXRlIGFzeW5jIGV4cG9ydEV4Y2VsKGZuOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgZGF0YTogYW55W10pIHtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLkV4Y2VsSlMgPSB0aGlzLkV4Y2VsSlMgfHwgYXdhaXQgaW1wb3J0KFwiZXhjZWxqc1wiKTtcclxuICAgIH1cclxuICAgIGNhdGNoIHtcclxuICAgICAgdGhyb3cgXCJJbXBvc3NpYmlsZSBjYXJpY2FyZSBsYSBsaWJyZXJpYSBwZXIgbCdlc3BvcnRhemlvbmUgaW4gRXhjZWxcIjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaUZpeCA9IDE7XHJcbiAgICBsZXQgd29ya2Jvb2sgPSBuZXcgdGhpcy5FeGNlbEpTLldvcmtib29rKCk7XHJcbiAgICB3b3JrYm9vay5jcmVhdG9yID0gXCJFbWEncyBiaWcgRXMtVGFibGVcIjtcclxuICAgIHdvcmtib29rLmNyZWF0ZWQgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGxldCBzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldCgnRGF0YScpO1xyXG4gICAgbGV0IGhlYWRlciA9IHNoZWV0LmdldFJvdygxKTtcclxuICAgIGhlYWRlci5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5zb3J0KChhOiBDc3ZIZWFkZXJzLCBiOiBDc3ZIZWFkZXJzKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoID0gaGVhZGVyc1tpXTtcclxuICAgICAgaGVhZGVyLmdldENlbGwoaSArIGlGaXgpLnZhbHVlID0gaC5sYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHJvdyA9IHNoZWV0LmdldFJvdyhpICsgaUZpeCArIDEpO1xyXG4gICAgICBsZXQgaXRlbSA9IGRhdGFbaV07XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBoID0gaGVhZGVyc1tpXTtcclxuICAgICAgICBsZXQgY2VsbCA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICBsZXQgdmFsID0gaXRlbVtoLmtleV07XHJcblxyXG4gICAgICAgIGlmICghdmFsKSB7XHJcbiAgICAgICAgICBjZWxsLnZhbHVlID0gXCJcIjtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3dpdGNoIChoLnR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgICAvLyBFeGNlbEpTIHZhIGRpIGRlZmF1bHQgaW4gVVRDIHF1aW5kaSByaXNjaGllcmViYmUgZGkgdGlyYXJlIGdpw7kgMiBvcmUgYWQgb2duaSBlc3BvcnRhemlvbmVcclxuICAgICAgICAgICAgLy8gQmlzb2duYSBhZ2dpdW5nZXJlIGwndXRjIG9mZnNldCBhbGxhIGRhdGEgYXR0dWFsZVxyXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IHRoaXMuZGF0ZXMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsKTtcclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBsZXQgY29ycmVjdGVkRGF0ZSA9IGRhdGUuYWRkKGRhdGUudXRjT2Zmc2V0KCksICdtaW51dGUnKTtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gY29ycmVjdGVkRGF0ZS50b0RhdGUoKTtcclxuICAgICAgICAgICAgICBjZWxsLm51bUZtdCA9IHZhbC5sZW5ndGggPiAxMCA/ICdkZC9tbS95eXl5IGg6bTpzJyA6ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICAgICAgbGV0IGNvbnZlcnRlZCA9IHBhcnNlRmxvYXQodmFsLnJlcGxhY2UoJywnLCAnLicpKTtcclxuICAgICAgICAgICAgY2VsbC52YWx1ZSA9IGlzTmFOKGNvbnZlcnRlZCkgPyBcIlwiIDogY29udmVydGVkO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBidWZmZXIgPSBhd2FpdCB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCk7XHJcbiAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7XCIgfSk7XHJcbiAgICBsZXQgb2JqZWN0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICB0aGlzLnV0aUV4dHMuZmlsZURvd25sb2FkKG9iamVjdFVybCwgZm4uZW5kc1dpdGgoJy5jc3YnKSA/IGZuLnJlcGxhY2UoJy5jc3YnLCAnLnhsc3gnKSA6IGZuLmVuZHNXaXRoKCcueGxzeCcpID8gZm4gOiBmbiArIFwiLnhsc3hcIik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gY2hlIGVmZmV0dGl2YW1lbnRlIGdlbmVyYSBnbGkgaGVhZGVyIGUgaSBkYXRpIHBlciBsJ2VzcG9ydGF6aW9uZSBjb24gKipuZ3gtY3N2KipcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICovXHJcbiAgcHVibGljIGV4cG9ydChpdGVtczogYW55W10sIGZvcm1hdDogJ0NTVicgfCAnWExTWCcsIGZpbGVOYW1lOiBzdHJpbmcsIGNvbHVtbnNGaWx0ZXI6IHN0cmluZ1tdLCBnZW5lcmljSGVhZGVycz86IENzdkhlYWRlcnNbXSkge1xyXG4gICAgbGV0IGhlYWRlcnMgPSBnZW5lcmljSGVhZGVycyA/IHRoaXMuc2V0dXBGb3JHZW5lcmljRXhwb3J0KGl0ZW1zLCBnZW5lcmljSGVhZGVycykgOiB0aGlzLnNldHVwRm9yRXhwb3J0KGl0ZW1zLCBjb2x1bW5zRmlsdGVyKTtcclxuICAgIChmb3JtYXQgPT0gXCJDU1ZcIiA/IHRoaXMuZXhwb3J0Q1NWIDogdGhpcy5leHBvcnRFeGNlbCkoZmlsZU5hbWUsIGhlYWRlcnMsIGl0ZW1zKTtcclxuICB9XHJcbn0iXX0=
|