tango-app-ui-analyse-report 3.7.1-alpha.21 → 3.7.1-alpha.23
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/esm2022/lib/components/custom-report-builder/custom-report-builder.component.mjs +20 -10
- package/esm2022/lib/components/custom-report-view/custom-report-view.component.mjs +54 -7
- package/esm2022/lib/components/user-report/user-report.component.mjs +60 -4
- package/esm2022/lib/interfaces/custom-report.interface.mjs +1 -1
- package/fesm2022/tango-app-ui-analyse-report.mjs +137 -24
- package/fesm2022/tango-app-ui-analyse-report.mjs.map +1 -1
- package/lib/components/custom-report-view/custom-report-view.component.d.ts +11 -0
- package/lib/components/user-report/user-report.component.d.ts +5 -0
- package/lib/interfaces/custom-report.interface.d.ts +3 -1
- package/package.json +1 -1
|
@@ -17,10 +17,20 @@ const COMPARISON_TO_PAIR = {
|
|
|
17
17
|
none: { rollup: 'None', previousPeriod: false },
|
|
18
18
|
wtd: { rollup: 'WTD', previousPeriod: false },
|
|
19
19
|
mtd: { rollup: 'MTD', previousPeriod: false },
|
|
20
|
-
wow: { rollup: '
|
|
21
|
-
mom: { rollup: '
|
|
20
|
+
wow: { rollup: 'WoW', previousPeriod: true },
|
|
21
|
+
mom: { rollup: 'MoM', previousPeriod: true },
|
|
22
22
|
};
|
|
23
23
|
function pairToComparison(pair) {
|
|
24
|
+
// Templates saved before WoW/MoM became their own rollup values encoded them
|
|
25
|
+
// as WTD/MTD + previousPeriod:true — keep reading that as the same choice.
|
|
26
|
+
if (pair.previousPeriod) {
|
|
27
|
+
if (pair.rollup === 'WTD') {
|
|
28
|
+
return 'wow';
|
|
29
|
+
}
|
|
30
|
+
if (pair.rollup === 'MTD') {
|
|
31
|
+
return 'mom';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
24
34
|
const match = Object.keys(COMPARISON_TO_PAIR).find((key) => {
|
|
25
35
|
const candidate = COMPARISON_TO_PAIR[key];
|
|
26
36
|
return candidate.rollup === pair.rollup && candidate.previousPeriod === pair.previousPeriod;
|
|
@@ -76,9 +86,8 @@ export class CustomReportBuilderComponent {
|
|
|
76
86
|
return this.timeFilter === 'hour' && this.metrics.some((m) => m.value === 'nob' && m.checked);
|
|
77
87
|
}
|
|
78
88
|
get canNext() {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
89
|
+
// The Metrics step needs no selection: Footfall is always included (the
|
|
90
|
+
// locked default row), so a footfall-only report is valid.
|
|
82
91
|
if (this.activeStep === 2 && this.nobHourConflict) {
|
|
83
92
|
return false;
|
|
84
93
|
}
|
|
@@ -108,7 +117,8 @@ export class CustomReportBuilderComponent {
|
|
|
108
117
|
? ['Show Average', ...this.otherIncludeColumns]
|
|
109
118
|
: [...this.otherIncludeColumns];
|
|
110
119
|
return {
|
|
111
|
-
|
|
120
|
+
// 'Footfall' is the locked default metric — always present, always first.
|
|
121
|
+
metrics: ['Footfall', ...this.metrics.filter((m) => m.checked).map((m) => m.value).filter((v) => v !== 'Footfall')],
|
|
112
122
|
comparison: COMPARISON_TO_PAIR[this.comparisonChoice],
|
|
113
123
|
timeFilter: this.timeFilter,
|
|
114
124
|
storeInfoColumns: this.storeInfoOptions.filter((o) => o.checked).map((o) => o.value),
|
|
@@ -116,16 +126,16 @@ export class CustomReportBuilderComponent {
|
|
|
116
126
|
};
|
|
117
127
|
}
|
|
118
128
|
onView() {
|
|
119
|
-
if (
|
|
129
|
+
if (!this.nobHourConflict) {
|
|
120
130
|
this.view.emit(this.currentSelections());
|
|
121
131
|
}
|
|
122
132
|
}
|
|
123
133
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
124
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportBuilderComponent, selector: "lib-custom-report-builder", inputs: { metricsCatalog: "metricsCatalog", template: "template" }, outputs: { view: "view" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer
|
|
134
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportBuilderComponent, selector: "lib-custom-report-builder", inputs: { metricsCatalog: "metricsCatalog", template: "template" }, outputs: { view: "view" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer step-tab\" *ngFor=\"let step of steps; let i = index\"\n [class.active]=\"activeStep === i\" (click)=\"setStep(i)\">{{ step }}</span>\n </div>\n\n <div class=\"overflow-auto\" style=\"height: auto\">\n <!-- Metrics -->\n <div *ngIf=\"activeStep === 0\">\n <!-- Footfall is a base column the report always returns (never part of the\n metrics payload) \u2014 shown locked, same idiom as Store Name/Store ID. -->\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"metric-footfall\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"metric-footfall\">Footfall</label>\n </div>\n <div *ngFor=\"let metric of metrics; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"metric.checked\" id=\"metric-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"metric-{{ i }}\">{{ metric.name }}</label>\n </div>\n </div>\n\n <!-- Comparison -->\n <div *ngIf=\"activeStep === 1\">\n <div *ngFor=\"let option of comparisonOptions\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-start\" (click)=\"setComparisonChoice(option.value)\">\n <input [checked]=\"comparisonChoice === option.value\" type=\"radio\" class=\"radio mt-1\" />\n <span class=\"ms-5\">\n <span class=\"standard fs-4\">{{ option.label }}<span *ngIf=\"option.suffix\" class=\"comparison-suffix ms-1\">{{ option.suffix }}</span></span>\n <span *ngIf=\"option.secondLine\" class=\"comparison-suffix d-block\">{{ option.secondLine }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Time Filter -->\n <div *ngIf=\"activeStep === 2\">\n <div *ngFor=\"let filter of timeFilters\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-center\" (click)=\"setTimeFilter(filter)\">\n <input [checked]=\"timeFilter === filter\" type=\"radio\" class=\"radio\" />\n <span class=\"ms-5 standard fs-4\">{{ filter === 'hour' ? 'By Hour' : 'By Date' }}</span>\n </div>\n </div>\n <div *ngIf=\"nobHourConflict\" class=\"nob-hour-warning mt-5\">NoB cannot be displayed by hour</div>\n </div>\n\n <!-- Store info -->\n <div *ngIf=\"activeStep === 3\">\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-name\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-name\">Store Name</label>\n </div>\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-id\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-id\">Store ID</label>\n </div>\n <div *ngFor=\"let option of storeInfoOptions; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"option.checked\" id=\"store-info-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"store-info-{{ i }}\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 mt-5\">\n <button class=\"btn btn-default btn-outline w-50 me-3 mb-3\"\n [ngClass]=\"activeStep === 0 ? 'hidden' : ''\" (click)=\"back()\">Previous</button>\n <button *ngIf=\"!isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"!canNext\" (click)=\"next()\">Next</button>\n <button *ngIf=\"isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"nobHourConflict\" (click)=\"onView()\">View</button>\n </div>\n</div>", styles: [".card-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.standard{color:var(--Gray-700, #344054);font-size:16px;font-weight:500;line-height:24px}.radio{width:16px!important;height:16px!important}.btnheader{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--Gray-50, #F9FAFB)}.hidden{visibility:hidden}.comparison-suffix{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.nob-hour-warning{color:var(--Error-600, #D92D20);font-size:13px;font-weight:500;line-height:18px}.step-tabs{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:thin}.step-tabs::-webkit-scrollbar{height:4px}.step-tabs::-webkit-scrollbar-thumb{background:var(--Gray-200, #E4E7EC);border-radius:4px}.step-tabs::-webkit-scrollbar-track{background:transparent}.step-tab{flex:1 0 auto;text-align:center;white-space:nowrap;padding:6px 10px;border-radius:6px}.step-tab.active{background:#fff;color:var(--Gray-700, #344054);box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
125
135
|
}
|
|
126
136
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportBuilderComponent, decorators: [{
|
|
127
137
|
type: Component,
|
|
128
|
-
args: [{ selector: 'lib-custom-report-builder', template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer
|
|
138
|
+
args: [{ selector: 'lib-custom-report-builder', template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer step-tab\" *ngFor=\"let step of steps; let i = index\"\n [class.active]=\"activeStep === i\" (click)=\"setStep(i)\">{{ step }}</span>\n </div>\n\n <div class=\"overflow-auto\" style=\"height: auto\">\n <!-- Metrics -->\n <div *ngIf=\"activeStep === 0\">\n <!-- Footfall is a base column the report always returns (never part of the\n metrics payload) \u2014 shown locked, same idiom as Store Name/Store ID. -->\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"metric-footfall\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"metric-footfall\">Footfall</label>\n </div>\n <div *ngFor=\"let metric of metrics; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"metric.checked\" id=\"metric-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"metric-{{ i }}\">{{ metric.name }}</label>\n </div>\n </div>\n\n <!-- Comparison -->\n <div *ngIf=\"activeStep === 1\">\n <div *ngFor=\"let option of comparisonOptions\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-start\" (click)=\"setComparisonChoice(option.value)\">\n <input [checked]=\"comparisonChoice === option.value\" type=\"radio\" class=\"radio mt-1\" />\n <span class=\"ms-5\">\n <span class=\"standard fs-4\">{{ option.label }}<span *ngIf=\"option.suffix\" class=\"comparison-suffix ms-1\">{{ option.suffix }}</span></span>\n <span *ngIf=\"option.secondLine\" class=\"comparison-suffix d-block\">{{ option.secondLine }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Time Filter -->\n <div *ngIf=\"activeStep === 2\">\n <div *ngFor=\"let filter of timeFilters\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-center\" (click)=\"setTimeFilter(filter)\">\n <input [checked]=\"timeFilter === filter\" type=\"radio\" class=\"radio\" />\n <span class=\"ms-5 standard fs-4\">{{ filter === 'hour' ? 'By Hour' : 'By Date' }}</span>\n </div>\n </div>\n <div *ngIf=\"nobHourConflict\" class=\"nob-hour-warning mt-5\">NoB cannot be displayed by hour</div>\n </div>\n\n <!-- Store info -->\n <div *ngIf=\"activeStep === 3\">\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-name\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-name\">Store Name</label>\n </div>\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-id\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-id\">Store ID</label>\n </div>\n <div *ngFor=\"let option of storeInfoOptions; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"option.checked\" id=\"store-info-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"store-info-{{ i }}\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 mt-5\">\n <button class=\"btn btn-default btn-outline w-50 me-3 mb-3\"\n [ngClass]=\"activeStep === 0 ? 'hidden' : ''\" (click)=\"back()\">Previous</button>\n <button *ngIf=\"!isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"!canNext\" (click)=\"next()\">Next</button>\n <button *ngIf=\"isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"nobHourConflict\" (click)=\"onView()\">View</button>\n </div>\n</div>", styles: [".card-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.standard{color:var(--Gray-700, #344054);font-size:16px;font-weight:500;line-height:24px}.radio{width:16px!important;height:16px!important}.btnheader{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--Gray-50, #F9FAFB)}.hidden{visibility:hidden}.comparison-suffix{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.nob-hour-warning{color:var(--Error-600, #D92D20);font-size:13px;font-weight:500;line-height:18px}.step-tabs{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:thin}.step-tabs::-webkit-scrollbar{height:4px}.step-tabs::-webkit-scrollbar-thumb{background:var(--Gray-200, #E4E7EC);border-radius:4px}.step-tabs::-webkit-scrollbar-track{background:transparent}.step-tab{flex:1 0 auto;text-align:center;white-space:nowrap;padding:6px 10px;border-radius:6px}.step-tab.active{background:#fff;color:var(--Gray-700, #344054);box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}\n"] }]
|
|
129
139
|
}], propDecorators: { metricsCatalog: [{
|
|
130
140
|
type: Input
|
|
131
141
|
}], template: [{
|
|
@@ -133,4 +143,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
133
143
|
}], view: [{
|
|
134
144
|
type: Output
|
|
135
145
|
}] } });
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFLTCxxQkFBcUIsRUFDckIsa0JBQWtCLEdBR25CLE1BQU0sMENBQTBDLENBQUM7Ozs7QUFJbEQ7MkZBQzJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQXVGO0lBQzdHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDeEQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtJQUN6RCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDMUQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0lBQzVELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSx5Q0FBeUMsRUFBRTtDQUNqRyxD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Q2xDLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbEUsVUFBVSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQXdCLENBQUM7WUFDdkcsWUFBWSxFQUFFLEVBQUUsY0FBYyxFQUFFO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7d0dBMUdVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLHFMQzlDekMsbThIQXlFTTs7NEZEM0JPLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSwyQkFBMkI7OEJBSzVCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxJQUFJO3NCQUFiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXN0b21SZXBvcnRDb21wYXJpc29uLFxuICBDdXN0b21SZXBvcnRTZWxlY3Rpb25zLFxuICBDdXN0b21SZXBvcnRUZW1wbGF0ZSxcbiAgTWV0cmljT3B0aW9uLFxuICBub3JtYWxpemVUYWJsZU9wdGlvbnMsXG4gIFNUT1JFX0lORk9fT1BUSU9OUyxcbiAgU3RvcmVJbmZvQ29sdW1uLFxuICBUaW1lRmlsdGVyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2N1c3RvbS1yZXBvcnQuaW50ZXJmYWNlJztcblxudHlwZSBDb21wYXJpc29uQ2hvaWNlID0gJ25vbmUnIHwgJ3d0ZCcgfCAnbXRkJyB8ICd3b3cnIHwgJ21vbSc7XG5cbi8qKiBgc2Vjb25kTGluZWAgcmVuZGVycyBhcyBpdHMgb3duIG11dGVkIGxpbmUgYmVsb3cgdGhlIGxhYmVsIChwZXIgdGhlIFwiTm8gQ29tcGFyaXNvblwiIG1vY2t1cCk7XG4gKiAgYHN1ZmZpeGAgcmVuZGVycyBpbmxpbmUgbmV4dCB0byB0aGUgbGFiZWwgKHRoZSBzaG9ydCBXVEQvTVREL1dvVy9Nb00gYWJicmV2aWF0aW9ucykuICovXG5jb25zdCBDT01QQVJJU09OX09QVElPTlM6IHsgdmFsdWU6IENvbXBhcmlzb25DaG9pY2U7IGxhYmVsOiBzdHJpbmc7IHN1ZmZpeD86IHN0cmluZzsgc2Vjb25kTGluZT86IHN0cmluZyB9W10gPSBbXG4gIHsgdmFsdWU6ICd3dGQnLCBsYWJlbDogJ1dlZWsgdG8gRGF0ZScsIHN1ZmZpeDogJyhXVEQpJyB9LFxuICB7IHZhbHVlOiAnbXRkJywgbGFiZWw6ICdNb250aCB0byBEYXRlJywgc3VmZml4OiAnKE1URCknIH0sXG4gIHsgdmFsdWU6ICd3b3cnLCBsYWJlbDogJ1dlZWsgb3ZlciBXZWVrJywgc3VmZml4OiAnKFdvVyknIH0sXG4gIHsgdmFsdWU6ICdtb20nLCBsYWJlbDogJ01vbnRoIG92ZXIgTW9udGgnLCBzdWZmaXg6ICcoTW9NKScgfSxcbiAgeyB2YWx1ZTogJ25vbmUnLCBsYWJlbDogJ05vIENvbXBhcmlzb24nLCBzZWNvbmRMaW5lOiAnKERhdGEgRGlzcGxheWVkIGJhc2VkIG9uIFNlbGVjdGVkIERhdGUpJyB9LFxuXTtcblxuLyoqIEJpamVjdGl2ZSBtYXBwaW5nIGJldHdlZW4gdGhlIHdpemFyZCdzIHNpbmdsZSByYWRpbyBjaG9pY2UgYW5kIHRoZSBwZXJzaXN0ZWQgeyByb2xsdXAsIHByZXZpb3VzUGVyaW9kIH0gcGFpci4gKi9cbmNvbnN0IENPTVBBUklTT05fVE9fUEFJUjogUmVjb3JkPENvbXBhcmlzb25DaG9pY2UsIEN1c3RvbVJlcG9ydENvbXBhcmlzb24+ID0ge1xuICBub25lOiB7IHJvbGx1cDogJ05vbmUnLCBwcmV2aW91c1BlcmlvZDogZmFsc2UgfSxcbiAgd3RkOiB7IHJvbGx1cDogJ1dURCcsIHByZXZpb3VzUGVyaW9kOiBmYWxzZSB9LFxuICBtdGQ6IHsgcm9sbHVwOiAnTVREJywgcHJldmlvdXNQZXJpb2Q6IGZhbHNlIH0sXG4gIHdvdzogeyByb2xsdXA6ICdXVEQnLCBwcmV2aW91c1BlcmlvZDogdHJ1ZSB9LFxuICBtb206IHsgcm9sbHVwOiAnTVREJywgcHJldmlvdXNQZXJpb2Q6IHRydWUgfSxcbn07XG5cbmZ1bmN0aW9uIHBhaXJUb0NvbXBhcmlzb24ocGFpcjogQ3VzdG9tUmVwb3J0Q29tcGFyaXNvbik6IENvbXBhcmlzb25DaG9pY2Uge1xuICBjb25zdCBtYXRjaCA9IChPYmplY3Qua2V5cyhDT01QQVJJU09OX1RPX1BBSVIpIGFzIENvbXBhcmlzb25DaG9pY2VbXSkuZmluZCgoa2V5KSA9PiB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gQ09NUEFSSVNPTl9UT19QQUlSW2tleV07XG4gICAgcmV0dXJuIGNhbmRpZGF0ZS5yb2xsdXAgPT09IHBhaXIucm9sbHVwICYmIGNhbmRpZGF0ZS5wcmV2aW91c1BlcmlvZCA9PT0gcGFpci5wcmV2aW91c1BlcmlvZDtcbiAgfSk7XG4gIHJldHVybiBtYXRjaCA/PyAnbm9uZSc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtYnVpbGRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlcG9ydEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBtZXRyaWNzQ2F0YWxvZzogTWV0cmljT3B0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgdGVtcGxhdGU6IEN1c3RvbVJlcG9ydFRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSB2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21SZXBvcnRTZWxlY3Rpb25zPigpO1xuXG4gIHJlYWRvbmx5IHN0ZXBzID0gWydNZXRyaWNzJywgJ0NvbXBhcmlzb24nLCAnVGltZSBGaWx0ZXInLCAnU3RvcmUgaW5mbyddO1xuICBhY3RpdmVTdGVwID0gMDtcblxuICBtZXRyaWNzOiBNZXRyaWNPcHRpb25bXSA9IFtdO1xuICByZWFkb25seSBjb21wYXJpc29uT3B0aW9ucyA9IENPTVBBUklTT05fT1BUSU9OUztcbiAgY29tcGFyaXNvbkNob2ljZTogQ29tcGFyaXNvbkNob2ljZSA9ICdub25lJztcbiAgcmVhZG9ubHkgdGltZUZpbHRlcnM6IFRpbWVGaWx0ZXJbXSA9IFsnZGF5JywgJ2hvdXInXTtcbiAgdGltZUZpbHRlcjogVGltZUZpbHRlciA9ICdkYXknO1xuICBzdG9yZUluZm9PcHRpb25zID0gU1RPUkVfSU5GT19PUFRJT05TLm1hcCgobykgPT4gKHsgLi4ubywgY2hlY2tlZDogZmFsc2UgfSkpO1xuICBzaG93QXZlcmFnZSA9IGZhbHNlO1xuICAvKiogTm9uLSdTaG93IEF2ZXJhZ2UnIGluY2x1ZGVDb2x1bW5zIGNhcnJpZWQgdGhyb3VnaCBmcm9tIGFuIGFwcGxpZWQgdGVtcGxhdGUgKHRoZSB3aXphcmQgaGFzIG5vIFVJIGZvciB0aGVzZSB5ZXQpLiAqL1xuICBwcml2YXRlIG90aGVySW5jbHVkZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtZXRyaWNzQ2F0YWxvZyddKSB7XG4gICAgICB0aGlzLm1ldHJpY3MgPSB0aGlzLm1ldHJpY3NDYXRhbG9nLm1hcCgobSkgPT4gKHsgLi4ubSwgY2hlY2tlZDogZmFsc2UgfSkpO1xuICAgICAgdGhpcy5hcHBseVRlbXBsYXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZSddKSB7XG4gICAgICB0aGlzLmFwcGx5VGVtcGxhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VGVtcGxhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWV0cmljcyA9IHRoaXMubWV0cmljcy5tYXAoKG0pID0+ICh7IC4uLm0sIGNoZWNrZWQ6IHRoaXMudGVtcGxhdGUhLm1ldHJpY3MuaW5jbHVkZXMobS52YWx1ZSkgfSkpO1xuICAgIHRoaXMuY29tcGFyaXNvbkNob2ljZSA9IHBhaXJUb0NvbXBhcmlzb24odGhpcy50ZW1wbGF0ZS5jb21wYXJpc29uKTtcbiAgICB0aGlzLnRpbWVGaWx0ZXIgPSB0aGlzLnRlbXBsYXRlLnRpbWVGaWx0ZXI7XG4gICAgdGhpcy5zdG9yZUluZm9PcHRpb25zID0gdGhpcy5zdG9yZUluZm9PcHRpb25zLm1hcCgobykgPT4gKHtcbiAgICAgIC4uLm8sXG4gICAgICBjaGVja2VkOiB0aGlzLnRlbXBsYXRlIS5zdG9yZUluZm9Db2x1bW5zLmluY2x1ZGVzKG8udmFsdWUpLFxuICAgIH0pKTtcbiAgICBub3JtYWxpemVUYWJsZU9wdGlvbnModGhpcy50ZW1wbGF0ZS50YWJsZU9wdGlvbnMpO1xuICAgIGNvbnN0IGluY2x1ZGVDb2x1bW5zID0gdGhpcy50ZW1wbGF0ZS50YWJsZU9wdGlvbnMuaW5jbHVkZUNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5zaG93QXZlcmFnZSA9IGluY2x1ZGVDb2x1bW5zLmluY2x1ZGVzKCdTaG93IEF2ZXJhZ2UnKTtcbiAgICB0aGlzLm90aGVySW5jbHVkZUNvbHVtbnMgPSBpbmNsdWRlQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMgIT09ICdTaG93IEF2ZXJhZ2UnKTtcbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAwO1xuICB9XG5cbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlU3RlcCA9PT0gdGhpcy5zdGVwcy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqIE5PQiAoaG91cmx5IGZvb3RmYWxsIGJyZWFrZG93bikgaGFzIG5vIGhvdXJseSBkYXRhIHNvdXJjZSDigJQgYmxvY2sgd2hlbmV2ZXIgYm90aCBob2xkLCByZWdhcmRsZXNzIG9mIHNlbGVjdGlvbiBvcmRlci4gKi9cbiAgZ2V0IG5vYkhvdXJDb25mbGljdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lRmlsdGVyID09PSAnaG91cicgJiYgdGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0udmFsdWUgPT09ICdub2InICYmIG0uY2hlY2tlZCk7XG4gIH1cblxuICBnZXQgY2FuTmV4dCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdGVwID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0uY2hlY2tlZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGl2ZVN0ZXAgPT09IDIgJiYgdGhpcy5ub2JIb3VyQ29uZmxpY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRTdGVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSBpbmRleDtcbiAgfVxuXG4gIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGFzdFN0ZXAgJiYgdGhpcy5jYW5OZXh0KSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0ZXArKztcbiAgICB9XG4gIH1cblxuICBiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZVN0ZXAgPiAwKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0ZXAtLTtcbiAgICB9XG4gIH1cblxuICBzZXRDb21wYXJpc29uQ2hvaWNlKGNob2ljZTogQ29tcGFyaXNvbkNob2ljZSk6IHZvaWQge1xuICAgIHRoaXMuY29tcGFyaXNvbkNob2ljZSA9IGNob2ljZTtcbiAgfVxuXG4gIHNldFRpbWVGaWx0ZXIoZmlsdGVyOiBUaW1lRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy50aW1lRmlsdGVyID0gZmlsdGVyO1xuICB9XG5cbiAgY3VycmVudFNlbGVjdGlvbnMoKTogQ3VzdG9tUmVwb3J0U2VsZWN0aW9ucyB7XG4gICAgY29uc3QgaW5jbHVkZUNvbHVtbnMgPSB0aGlzLnNob3dBdmVyYWdlXG4gICAgICA/IFsnU2hvdyBBdmVyYWdlJywgLi4udGhpcy5vdGhlckluY2x1ZGVDb2x1bW5zXVxuICAgICAgOiBbLi4udGhpcy5vdGhlckluY2x1ZGVDb2x1bW5zXTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljczogdGhpcy5tZXRyaWNzLmZpbHRlcigobSkgPT4gbS5jaGVja2VkKS5tYXAoKG0pID0+IG0udmFsdWUpLFxuICAgICAgY29tcGFyaXNvbjogQ09NUEFSSVNPTl9UT19QQUlSW3RoaXMuY29tcGFyaXNvbkNob2ljZV0sXG4gICAgICB0aW1lRmlsdGVyOiB0aGlzLnRpbWVGaWx0ZXIsXG4gICAgICBzdG9yZUluZm9Db2x1bW5zOiB0aGlzLnN0b3JlSW5mb09wdGlvbnMuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpLm1hcCgobykgPT4gby52YWx1ZSBhcyBTdG9yZUluZm9Db2x1bW4pLFxuICAgICAgdGFibGVPcHRpb25zOiB7IGluY2x1ZGVDb2x1bW5zIH0sXG4gICAgfTtcbiAgfVxuXG4gIG9uVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0uY2hlY2tlZCkgJiYgIXRoaXMubm9iSG91ckNvbmZsaWN0KSB7XG4gICAgICB0aGlzLnZpZXcuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3Rpb25zKCkpO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgaC0xMDBweCBwLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj5QbGVhc2Ugc2VsZWN0IHlvdXIgZGF0YSBwb2ludHMgdG8gYWRkIGludG8gdGhlIHJlcG9ydHM8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ0bmhlYWRlciBzdGVwLXRhYnMgdy0xMDAgcC0yIG10LTVcIj5cbiAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHB4LTIgc3RlcC10YWJcIiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlU3RlcCA9PT0gaSA/ICdidG4gJyA6ICcnXCIgKGNsaWNrKT1cInNldFN0ZXAoaSlcIj57eyBzdGVwIH19PC9zcGFuPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwib3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwiaGVpZ2h0OiBhdXRvXCI+XG4gICAgPCEtLSBNZXRyaWNzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVTdGVwID09PSAwXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtZXRyaWMgb2YgbWV0cmljczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibXQtNSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWRcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJtZXRyaWMuY2hlY2tlZFwiIGlkPVwibWV0cmljLXt7IGkgfX1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00IGN1cnNvci1wb2ludGVyXCIgZm9yPVwibWV0cmljLXt7IGkgfX1cIj57eyBtZXRyaWMubmFtZSB9fTwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ29tcGFyaXNvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlU3RlcCA9PT0gMVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbXBhcmlzb25PcHRpb25zXCIgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtc3RhcnRcIiAoY2xpY2spPVwic2V0Q29tcGFyaXNvbkNob2ljZShvcHRpb24udmFsdWUpXCI+XG4gICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImNvbXBhcmlzb25DaG9pY2UgPT09IG9wdGlvbi52YWx1ZVwiIHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwicmFkaW8gbXQtMVwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy01XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YW5kYXJkIGZzLTRcIj57eyBvcHRpb24ubGFiZWwgfX08c3BhbiAqbmdJZj1cIm9wdGlvbi5zdWZmaXhcIiBjbGFzcz1cImNvbXBhcmlzb24tc3VmZml4IG1zLTFcIj57eyBvcHRpb24uc3VmZml4IH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9uLnNlY29uZExpbmVcIiBjbGFzcz1cImNvbXBhcmlzb24tc3VmZml4IGQtYmxvY2tcIj57eyBvcHRpb24uc2Vjb25kTGluZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRpbWUgRmlsdGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVTdGVwID09PSAyXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgdGltZUZpbHRlcnNcIiBjbGFzcz1cIm10LTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwic2V0VGltZUZpbHRlcihmaWx0ZXIpXCI+XG4gICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cInRpbWVGaWx0ZXIgPT09IGZpbHRlclwiIHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwicmFkaW9cIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00XCI+e3sgZmlsdGVyID09PSAnaG91cicgPyAnQnkgSG91cicgOiAnQnkgRGF0ZScgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwibm9iSG91ckNvbmZsaWN0XCIgY2xhc3M9XCJub2ItaG91ci13YXJuaW5nIG10LTVcIj5Ob0IgY2Fubm90IGJlIGRpc3BsYXllZCBieSBob3VyPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0b3JlIGluZm8gLS0+XG4gICAgPGRpdiAqbmdJZj1cImFjdGl2ZVN0ZXAgPT09IDNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1jdXN0b20gZm9ybS1jaGVjay1zb2xpZFwiPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkIGRpc2FibGVkIGlkPVwic3RvcmUtaW5mby1uYW1lXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiIGZvcj1cInN0b3JlLWluZm8tbmFtZVwiPlN0b3JlIE5hbWU8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtNSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWRcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZCBkaXNhYmxlZCBpZD1cInN0b3JlLWluZm8taWRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00XCIgZm9yPVwic3RvcmUtaW5mby1pZFwiPlN0b3JlIElEPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN0b3JlSW5mb09wdGlvbnM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm10LTUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwib3B0aW9uLmNoZWNrZWRcIiBpZD1cInN0b3JlLWluZm8te3sgaSB9fVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy01IHN0YW5kYXJkIGZzLTQgY3Vyc29yLXBvaW50ZXJcIiBmb3I9XCJzdG9yZS1pbmZvLXt7IGkgfX1cIj57eyBvcHRpb24ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgbXQtNVwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLW91dGxpbmUgdy01MCBtZS0zIG1iLTNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlU3RlcCA9PT0gMCA/ICdoaWRkZW4nIDogJydcIiAoY2xpY2spPVwiYmFjaygpXCI+UHJldmlvdXM8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiIWlzTGFzdFN0ZXBcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tcHJpbWFyeSB3LTUwIG1zLTMgbWItM1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbk5leHRcIiAoY2xpY2spPVwibmV4dCgpXCI+TmV4dDwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJpc0xhc3RTdGVwXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXByaW1hcnkgdy01MCBtcy0zIG1iLTNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5vYkhvdXJDb25mbGljdFwiIChjbGljayk9XCJvblZpZXcoKVwiPlZpZXc8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFLTCxxQkFBcUIsRUFDckIsa0JBQWtCLEdBR25CLE1BQU0sMENBQTBDLENBQUM7Ozs7QUFJbEQ7MkZBQzJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQXVGO0lBQzdHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDeEQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtJQUN6RCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDMUQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0lBQzVELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSx5Q0FBeUMsRUFBRTtDQUNqRyxD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c0JBQWIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEN1c3RvbVJlcG9ydENvbXBhcmlzb24sXG4gIEN1c3RvbVJlcG9ydFNlbGVjdGlvbnMsXG4gIEN1c3RvbVJlcG9ydFRlbXBsYXRlLFxuICBNZXRyaWNPcHRpb24sXG4gIG5vcm1hbGl6ZVRhYmxlT3B0aW9ucyxcbiAgU1RPUkVfSU5GT19PUFRJT05TLFxuICBTdG9yZUluZm9Db2x1bW4sXG4gIFRpbWVGaWx0ZXIsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY3VzdG9tLXJlcG9ydC5pbnRlcmZhY2UnO1xuXG50eXBlIENvbXBhcmlzb25DaG9pY2UgPSAnbm9uZScgfCAnd3RkJyB8ICdtdGQnIHwgJ3dvdycgfCAnbW9tJztcblxuLyoqIGBzZWNvbmRMaW5lYCByZW5kZXJzIGFzIGl0cyBvd24gbXV0ZWQgbGluZSBiZWxvdyB0aGUgbGFiZWwgKHBlciB0aGUgXCJObyBDb21wYXJpc29uXCIgbW9ja3VwKTtcbiAqICBgc3VmZml4YCByZW5kZXJzIGlubGluZSBuZXh0IHRvIHRoZSBsYWJlbCAodGhlIHNob3J0IFdURC9NVEQvV29XL01vTSBhYmJyZXZpYXRpb25zKS4gKi9cbmNvbnN0IENPTVBBUklTT05fT1BUSU9OUzogeyB2YWx1ZTogQ29tcGFyaXNvbkNob2ljZTsgbGFiZWw6IHN0cmluZzsgc3VmZml4Pzogc3RyaW5nOyBzZWNvbmRMaW5lPzogc3RyaW5nIH1bXSA9IFtcbiAgeyB2YWx1ZTogJ3d0ZCcsIGxhYmVsOiAnV2VlayB0byBEYXRlJywgc3VmZml4OiAnKFdURCknIH0sXG4gIHsgdmFsdWU6ICdtdGQnLCBsYWJlbDogJ01vbnRoIHRvIERhdGUnLCBzdWZmaXg6ICcoTVREKScgfSxcbiAgeyB2YWx1ZTogJ3dvdycsIGxhYmVsOiAnV2VlayBvdmVyIFdlZWsnLCBzdWZmaXg6ICcoV29XKScgfSxcbiAgeyB2YWx1ZTogJ21vbScsIGxhYmVsOiAnTW9udGggb3ZlciBNb250aCcsIHN1ZmZpeDogJyhNb00pJyB9LFxuICB7IHZhbHVlOiAnbm9uZScsIGxhYmVsOiAnTm8gQ29tcGFyaXNvbicsIHNlY29uZExpbmU6ICcoRGF0YSBEaXNwbGF5ZWQgYmFzZWQgb24gU2VsZWN0ZWQgRGF0ZSknIH0sXG5dO1xuXG4vKiogQmlqZWN0aXZlIG1hcHBpbmcgYmV0d2VlbiB0aGUgd2l6YXJkJ3Mgc2luZ2xlIHJhZGlvIGNob2ljZSBhbmQgdGhlIHBlcnNpc3RlZCB7IHJvbGx1cCwgcHJldmlvdXNQZXJpb2QgfSBwYWlyLiAqL1xuY29uc3QgQ09NUEFSSVNPTl9UT19QQUlSOiBSZWNvcmQ8Q29tcGFyaXNvbkNob2ljZSwgQ3VzdG9tUmVwb3J0Q29tcGFyaXNvbj4gPSB7XG4gIG5vbmU6IHsgcm9sbHVwOiAnTm9uZScsIHByZXZpb3VzUGVyaW9kOiBmYWxzZSB9LFxuICB3dGQ6IHsgcm9sbHVwOiAnV1REJywgcHJldmlvdXNQZXJpb2Q6IGZhbHNlIH0sXG4gIG10ZDogeyByb2xsdXA6ICdNVEQnLCBwcmV2aW91c1BlcmlvZDogZmFsc2UgfSxcbiAgd293OiB7IHJvbGx1cDogJ1dvVycsIHByZXZpb3VzUGVyaW9kOiB0cnVlIH0sXG4gIG1vbTogeyByb2xsdXA6ICdNb00nLCBwcmV2aW91c1BlcmlvZDogdHJ1ZSB9LFxufTtcblxuZnVuY3Rpb24gcGFpclRvQ29tcGFyaXNvbihwYWlyOiBDdXN0b21SZXBvcnRDb21wYXJpc29uKTogQ29tcGFyaXNvbkNob2ljZSB7XG4gIC8vIFRlbXBsYXRlcyBzYXZlZCBiZWZvcmUgV29XL01vTSBiZWNhbWUgdGhlaXIgb3duIHJvbGx1cCB2YWx1ZXMgZW5jb2RlZCB0aGVtXG4gIC8vIGFzIFdURC9NVEQgKyBwcmV2aW91c1BlcmlvZDp0cnVlIOKAlCBrZWVwIHJlYWRpbmcgdGhhdCBhcyB0aGUgc2FtZSBjaG9pY2UuXG4gIGlmIChwYWlyLnByZXZpb3VzUGVyaW9kKSB7XG4gICAgaWYgKHBhaXIucm9sbHVwID09PSAnV1REJykgeyByZXR1cm4gJ3dvdyc7IH1cbiAgICBpZiAocGFpci5yb2xsdXAgPT09ICdNVEQnKSB7IHJldHVybiAnbW9tJzsgfVxuICB9XG4gIGNvbnN0IG1hdGNoID0gKE9iamVjdC5rZXlzKENPTVBBUklTT05fVE9fUEFJUikgYXMgQ29tcGFyaXNvbkNob2ljZVtdKS5maW5kKChrZXkpID0+IHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBDT01QQVJJU09OX1RPX1BBSVJba2V5XTtcbiAgICByZXR1cm4gY2FuZGlkYXRlLnJvbGx1cCA9PT0gcGFpci5yb2xsdXAgJiYgY2FuZGlkYXRlLnByZXZpb3VzUGVyaW9kID09PSBwYWlyLnByZXZpb3VzUGVyaW9kO1xuICB9KTtcbiAgcmV0dXJuIG1hdGNoID8/ICdub25lJztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWN1c3RvbS1yZXBvcnQtYnVpbGRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tcmVwb3J0LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0QnVpbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIG1ldHJpY3NDYXRhbG9nOiBNZXRyaWNPcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogQ3VzdG9tUmVwb3J0VGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIHZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbVJlcG9ydFNlbGVjdGlvbnM+KCk7XG5cbiAgcmVhZG9ubHkgc3RlcHMgPSBbJ01ldHJpY3MnLCAnQ29tcGFyaXNvbicsICdUaW1lIEZpbHRlcicsICdTdG9yZSBpbmZvJ107XG4gIGFjdGl2ZVN0ZXAgPSAwO1xuXG4gIG1ldHJpY3M6IE1ldHJpY09wdGlvbltdID0gW107XG4gIHJlYWRvbmx5IGNvbXBhcmlzb25PcHRpb25zID0gQ09NUEFSSVNPTl9PUFRJT05TO1xuICBjb21wYXJpc29uQ2hvaWNlOiBDb21wYXJpc29uQ2hvaWNlID0gJ25vbmUnO1xuICByZWFkb25seSB0aW1lRmlsdGVyczogVGltZUZpbHRlcltdID0gWydkYXknLCAnaG91ciddO1xuICB0aW1lRmlsdGVyOiBUaW1lRmlsdGVyID0gJ2RheSc7XG4gIHN0b3JlSW5mb09wdGlvbnMgPSBTVE9SRV9JTkZPX09QVElPTlMubWFwKChvKSA9PiAoeyAuLi5vLCBjaGVja2VkOiBmYWxzZSB9KSk7XG4gIHNob3dBdmVyYWdlID0gZmFsc2U7XG4gIC8qKiBOb24tJ1Nob3cgQXZlcmFnZScgaW5jbHVkZUNvbHVtbnMgY2FycmllZCB0aHJvdWdoIGZyb20gYW4gYXBwbGllZCB0ZW1wbGF0ZSAodGhlIHdpemFyZCBoYXMgbm8gVUkgZm9yIHRoZXNlIHlldCkuICovXG4gIHByaXZhdGUgb3RoZXJJbmNsdWRlQ29sdW1uczogc3RyaW5nW10gPSBbXTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21ldHJpY3NDYXRhbG9nJ10pIHtcbiAgICAgIHRoaXMubWV0cmljcyA9IHRoaXMubWV0cmljc0NhdGFsb2cubWFwKChtKSA9PiAoeyAuLi5tLCBjaGVja2VkOiBmYWxzZSB9KSk7XG4gICAgICB0aGlzLmFwcGx5VGVtcGxhdGUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlUZW1wbGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tZXRyaWNzID0gdGhpcy5tZXRyaWNzLm1hcCgobSkgPT4gKHsgLi4ubSwgY2hlY2tlZDogdGhpcy50ZW1wbGF0ZSEubWV0cmljcy5pbmNsdWRlcyhtLnZhbHVlKSB9KSk7XG4gICAgdGhpcy5jb21wYXJpc29uQ2hvaWNlID0gcGFpclRvQ29tcGFyaXNvbih0aGlzLnRlbXBsYXRlLmNvbXBhcmlzb24pO1xuICAgIHRoaXMudGltZUZpbHRlciA9IHRoaXMudGVtcGxhdGUudGltZUZpbHRlcjtcbiAgICB0aGlzLnN0b3JlSW5mb09wdGlvbnMgPSB0aGlzLnN0b3JlSW5mb09wdGlvbnMubWFwKChvKSA9PiAoe1xuICAgICAgLi4ubyxcbiAgICAgIGNoZWNrZWQ6IHRoaXMudGVtcGxhdGUhLnN0b3JlSW5mb0NvbHVtbnMuaW5jbHVkZXMoby52YWx1ZSksXG4gICAgfSkpO1xuICAgIG5vcm1hbGl6ZVRhYmxlT3B0aW9ucyh0aGlzLnRlbXBsYXRlLnRhYmxlT3B0aW9ucyk7XG4gICAgY29uc3QgaW5jbHVkZUNvbHVtbnMgPSB0aGlzLnRlbXBsYXRlLnRhYmxlT3B0aW9ucy5pbmNsdWRlQ29sdW1ucyA/PyBbXTtcbiAgICB0aGlzLnNob3dBdmVyYWdlID0gaW5jbHVkZUNvbHVtbnMuaW5jbHVkZXMoJ1Nob3cgQXZlcmFnZScpO1xuICAgIHRoaXMub3RoZXJJbmNsdWRlQ29sdW1ucyA9IGluY2x1ZGVDb2x1bW5zLmZpbHRlcigoYykgPT4gYyAhPT0gJ1Nob3cgQXZlcmFnZScpO1xuICAgIHRoaXMuYWN0aXZlU3RlcCA9IDA7XG4gIH1cblxuICBnZXQgaXNMYXN0U3RlcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVTdGVwID09PSB0aGlzLnN0ZXBzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKiogTk9CIChob3VybHkgZm9vdGZhbGwgYnJlYWtkb3duKSBoYXMgbm8gaG91cmx5IGRhdGEgc291cmNlIOKAlCBibG9jayB3aGVuZXZlciBib3RoIGhvbGQsIHJlZ2FyZGxlc3Mgb2Ygc2VsZWN0aW9uIG9yZGVyLiAqL1xuICBnZXQgbm9iSG91ckNvbmZsaWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRpbWVGaWx0ZXIgPT09ICdob3VyJyAmJiB0aGlzLm1ldHJpY3Muc29tZSgobSkgPT4gbS52YWx1ZSA9PT0gJ25vYicgJiYgbS5jaGVja2VkKTtcbiAgfVxuXG4gIGdldCBjYW5OZXh0KCk6IGJvb2xlYW4ge1xuICAgIC8vIFRoZSBNZXRyaWNzIHN0ZXAgbmVlZHMgbm8gc2VsZWN0aW9uOiBGb290ZmFsbCBpcyBhbHdheXMgaW5jbHVkZWQgKHRoZVxuICAgIC8vIGxvY2tlZCBkZWZhdWx0IHJvdyksIHNvIGEgZm9vdGZhbGwtb25seSByZXBvcnQgaXMgdmFsaWQuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RlcCA9PT0gMiAmJiB0aGlzLm5vYkhvdXJDb25mbGljdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNldFN0ZXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlU3RlcCA9IGluZGV4O1xuICB9XG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNMYXN0U3RlcCAmJiB0aGlzLmNhbk5leHQpIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RlcCsrO1xuICAgIH1cbiAgfVxuXG4gIGJhY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlU3RlcCA+IDApIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RlcC0tO1xuICAgIH1cbiAgfVxuXG4gIHNldENvbXBhcmlzb25DaG9pY2UoY2hvaWNlOiBDb21wYXJpc29uQ2hvaWNlKTogdm9pZCB7XG4gICAgdGhpcy5jb21wYXJpc29uQ2hvaWNlID0gY2hvaWNlO1xuICB9XG5cbiAgc2V0VGltZUZpbHRlcihmaWx0ZXI6IFRpbWVGaWx0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVGaWx0ZXIgPSBmaWx0ZXI7XG4gIH1cblxuICBjdXJyZW50U2VsZWN0aW9ucygpOiBDdXN0b21SZXBvcnRTZWxlY3Rpb25zIHtcbiAgICBjb25zdCBpbmNsdWRlQ29sdW1ucyA9IHRoaXMuc2hvd0F2ZXJhZ2VcbiAgICAgID8gWydTaG93IEF2ZXJhZ2UnLCAuLi50aGlzLm90aGVySW5jbHVkZUNvbHVtbnNdXG4gICAgICA6IFsuLi50aGlzLm90aGVySW5jbHVkZUNvbHVtbnNdO1xuICAgIHJldHVybiB7XG4gICAgICAvLyAnRm9vdGZhbGwnIGlzIHRoZSBsb2NrZWQgZGVmYXVsdCBtZXRyaWMg4oCUIGFsd2F5cyBwcmVzZW50LCBhbHdheXMgZmlyc3QuXG4gICAgICBtZXRyaWNzOiBbJ0Zvb3RmYWxsJywgLi4udGhpcy5tZXRyaWNzLmZpbHRlcigobSkgPT4gbS5jaGVja2VkKS5tYXAoKG0pID0+IG0udmFsdWUpLmZpbHRlcigodikgPT4gdiAhPT0gJ0Zvb3RmYWxsJyldLFxuICAgICAgY29tcGFyaXNvbjogQ09NUEFSSVNPTl9UT19QQUlSW3RoaXMuY29tcGFyaXNvbkNob2ljZV0sXG4gICAgICB0aW1lRmlsdGVyOiB0aGlzLnRpbWVGaWx0ZXIsXG4gICAgICBzdG9yZUluZm9Db2x1bW5zOiB0aGlzLnN0b3JlSW5mb09wdGlvbnMuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpLm1hcCgobykgPT4gby52YWx1ZSBhcyBTdG9yZUluZm9Db2x1bW4pLFxuICAgICAgdGFibGVPcHRpb25zOiB7IGluY2x1ZGVDb2x1bW5zIH0sXG4gICAgfTtcbiAgfVxuXG4gIG9uVmlldygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubm9iSG91ckNvbmZsaWN0KSB7XG4gICAgICB0aGlzLnZpZXcuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3Rpb25zKCkpO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgaC0xMDBweCBwLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj5QbGVhc2Ugc2VsZWN0IHlvdXIgZGF0YSBwb2ludHMgdG8gYWRkIGludG8gdGhlIHJlcG9ydHM8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ0bmhlYWRlciBzdGVwLXRhYnMgdy0xMDAgcC0yIG10LTVcIj5cbiAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHN0ZXAtdGFiXCIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU3RlcCA9PT0gaVwiIChjbGljayk9XCJzZXRTdGVwKGkpXCI+e3sgc3RlcCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm92ZXJmbG93LWF1dG9cIiBzdHlsZT1cImhlaWdodDogYXV0b1wiPlxuICAgIDwhLS0gTWV0cmljcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlU3RlcCA9PT0gMFwiPlxuICAgICAgPCEtLSBGb290ZmFsbCBpcyBhIGJhc2UgY29sdW1uIHRoZSByZXBvcnQgYWx3YXlzIHJldHVybnMgKG5ldmVyIHBhcnQgb2YgdGhlXG4gICAgICAgICAgIG1ldHJpY3MgcGF5bG9hZCkg4oCUIHNob3duIGxvY2tlZCwgc2FtZSBpZGlvbSBhcyBTdG9yZSBOYW1lL1N0b3JlIElELiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1jdXN0b20gZm9ybS1jaGVjay1zb2xpZFwiPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkIGRpc2FibGVkIGlkPVwibWV0cmljLWZvb3RmYWxsXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiIGZvcj1cIm1ldHJpYy1mb290ZmFsbFwiPkZvb3RmYWxsPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIG1ldHJpY3M7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm10LTUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibWV0cmljLmNoZWNrZWRcIiBpZD1cIm1ldHJpYy17eyBpIH19XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNCBjdXJzb3ItcG9pbnRlclwiIGZvcj1cIm1ldHJpYy17eyBpIH19XCI+e3sgbWV0cmljLm5hbWUgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbXBhcmlzb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImFjdGl2ZVN0ZXAgPT09IDFcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wYXJpc29uT3B0aW9uc1wiIGNsYXNzPVwibXQtNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0XCIgKGNsaWNrKT1cInNldENvbXBhcmlzb25DaG9pY2Uob3B0aW9uLnZhbHVlKVwiPlxuICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJjb21wYXJpc29uQ2hvaWNlID09PSBvcHRpb24udmFsdWVcIiB0eXBlPVwicmFkaW9cIiBjbGFzcz1cInJhZGlvIG10LTFcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtNVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGFuZGFyZCBmcy00XCI+e3sgb3B0aW9uLmxhYmVsIH19PHNwYW4gKm5nSWY9XCJvcHRpb24uc3VmZml4XCIgY2xhc3M9XCJjb21wYXJpc29uLXN1ZmZpeCBtcy0xXCI+e3sgb3B0aW9uLnN1ZmZpeCB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm9wdGlvbi5zZWNvbmRMaW5lXCIgY2xhc3M9XCJjb21wYXJpc29uLXN1ZmZpeCBkLWJsb2NrXCI+e3sgb3B0aW9uLnNlY29uZExpbmUgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUaW1lIEZpbHRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlU3RlcCA9PT0gMlwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIHRpbWVGaWx0ZXJzXCIgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cInNldFRpbWVGaWx0ZXIoZmlsdGVyKVwiPlxuICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJ0aW1lRmlsdGVyID09PSBmaWx0ZXJcIiB0eXBlPVwicmFkaW9cIiBjbGFzcz1cInJhZGlvXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiPnt7IGZpbHRlciA9PT0gJ2hvdXInID8gJ0J5IEhvdXInIDogJ0J5IERhdGUnIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIm5vYkhvdXJDb25mbGljdFwiIGNsYXNzPVwibm9iLWhvdXItd2FybmluZyBtdC01XCI+Tm9CIGNhbm5vdCBiZSBkaXNwbGF5ZWQgYnkgaG91cjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdG9yZSBpbmZvIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVTdGVwID09PSAzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtNSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWRcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZCBkaXNhYmxlZCBpZD1cInN0b3JlLWluZm8tbmFtZVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy01IHN0YW5kYXJkIGZzLTRcIiBmb3I9XCJzdG9yZS1pbmZvLW5hbWVcIj5TdG9yZSBOYW1lPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGNoZWNrZWQgZGlzYWJsZWQgaWQ9XCJzdG9yZS1pbmZvLWlkXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiIGZvcj1cInN0b3JlLWluZm8taWRcIj5TdG9yZSBJRDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzdG9yZUluZm9PcHRpb25zOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1jdXN0b20gZm9ybS1jaGVjay1zb2xpZFwiPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbi5jaGVja2VkXCIgaWQ9XCJzdG9yZS1pbmZvLXt7IGkgfX1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00IGN1cnNvci1wb2ludGVyXCIgZm9yPVwic3RvcmUtaW5mby17eyBpIH19XCI+e3sgb3B0aW9uLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIG10LTVcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lIHctNTAgbWUtMyBtYi0zXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZVN0ZXAgPT09IDAgPyAnaGlkZGVuJyA6ICcnXCIgKGNsaWNrKT1cImJhY2soKVwiPlByZXZpb3VzPC9idXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cIiFpc0xhc3RTdGVwXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXByaW1hcnkgdy01MCBtcy0zIG1iLTNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5OZXh0XCIgKGNsaWNrKT1cIm5leHQoKVwiPk5leHQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaXNMYXN0U3RlcFwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1wcmltYXJ5IHctNTAgbXMtMyBtYi0zXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJub2JIb3VyQ29uZmxpY3RcIiAoY2xpY2spPVwib25WaWV3KClcIj5WaWV3PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|