@senior-gestao-empresarial/erpx-components 4.11.0 → 4.12.1-develop-774d30bd
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/bundles/senior-gestao-empresarial-erpx-components.umd.js +54 -38
- package/bundles/senior-gestao-empresarial-erpx-components.umd.js.map +1 -1
- package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js +1 -1
- package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js.map +1 -1
- package/components/rateio-editor/erp-rateio-editor.component.d.ts +3 -11
- package/esm2015/components/rateio-editor/erp-rateio-editor.component.js +27 -34
- package/esm2015/locale/fallback.js +28 -2
- package/esm5/components/rateio-editor/erp-rateio-editor.component.js +28 -38
- package/esm5/locale/fallback.js +28 -2
- package/fesm2015/senior-gestao-empresarial-erpx-components.js +53 -34
- package/fesm2015/senior-gestao-empresarial-erpx-components.js.map +1 -1
- package/fesm5/senior-gestao-empresarial-erpx-components.js +54 -38
- package/fesm5/senior-gestao-empresarial-erpx-components.js.map +1 -1
- package/locale/fallback.d.ts +26 -0
- package/package.json +1 -1
- package/senior-gestao-empresarial-erpx-components.metadata.json +1 -1
|
@@ -84,20 +84,6 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
84
84
|
enumerable: true,
|
|
85
85
|
configurable: true
|
|
86
86
|
});
|
|
87
|
-
Object.defineProperty(ErpRateioEditorComponent.prototype, "requiresCentroCusto", {
|
|
88
|
-
/**
|
|
89
|
-
* Indica se o critério de rateio exige distribuição por centro de custo.
|
|
90
|
-
* O critério 'V5' (Nenhum) não distribui por C. Custos; os demais exigem
|
|
91
|
-
* ao menos um centro de custo por conta financeira.
|
|
92
|
-
*/
|
|
93
|
-
get: function () {
|
|
94
|
-
var _a, _b;
|
|
95
|
-
var criterio = (_b = (_a = this.loadedContext) === null || _a === void 0 ? void 0 : _a.criRat) !== null && _b !== void 0 ? _b : this.criRat;
|
|
96
|
-
return criterio !== ErpRateioEditorComponent_1.CRITERIO_SEM_CENTRO_CUSTO;
|
|
97
|
-
},
|
|
98
|
-
enumerable: true,
|
|
99
|
-
configurable: true
|
|
100
|
-
});
|
|
101
87
|
Object.defineProperty(ErpRateioEditorComponent.prototype, "valorBase", {
|
|
102
88
|
get: function () {
|
|
103
89
|
var _a, _b;
|
|
@@ -127,15 +113,12 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
127
113
|
Object.defineProperty(ErpRateioEditorComponent.prototype, "valorRestanteDisplay", {
|
|
128
114
|
/**
|
|
129
115
|
* Valor restante a ser exibido nos cards de resumo.
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
116
|
+
* Considera o total já distribuído nos centros de custo de todas as contas
|
|
117
|
+
* (e não o total das contas financeiras), refletindo a distribuição real
|
|
118
|
+
* ponta-a-ponta — centro de custo é sempre obrigatório.
|
|
133
119
|
*/
|
|
134
120
|
get: function () {
|
|
135
121
|
var _a;
|
|
136
|
-
if (!this.requiresCentroCusto) {
|
|
137
|
-
return this.valorRestante;
|
|
138
|
-
}
|
|
139
122
|
var totalCC = this.contasDataSource.reduce(function (acc, conta) { return acc + (conta.rateiosCCusto || []).reduce(function (ccAcc, cc) { return ccAcc + (cc.valor || 0); }, 0); }, 0);
|
|
140
123
|
return +(this.valorBase - totalCC).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2);
|
|
141
124
|
},
|
|
@@ -149,9 +132,6 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
149
132
|
*/
|
|
150
133
|
get: function () {
|
|
151
134
|
var _a;
|
|
152
|
-
if (!this.requiresCentroCusto) {
|
|
153
|
-
return this.percentualRestante;
|
|
154
|
-
}
|
|
155
135
|
if (!this.valorBase) {
|
|
156
136
|
return 0;
|
|
157
137
|
}
|
|
@@ -239,7 +219,7 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
239
219
|
if (this.effectiveReadOnly) {
|
|
240
220
|
return;
|
|
241
221
|
}
|
|
242
|
-
if (this.
|
|
222
|
+
if (this.hasContaSemCentroCusto()) {
|
|
243
223
|
var message = this.translate.instant('erpx.rateio_editor.erro_centro_custo_obrigatorio');
|
|
244
224
|
this.messageService.add({
|
|
245
225
|
severity: 'error',
|
|
@@ -389,8 +369,8 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
389
369
|
this.selectedConta = contaValue;
|
|
390
370
|
this.contaDialogFormGroup = this.fb.group({
|
|
391
371
|
contaFinanceira: [{ value: contaValue, disabled: this.editingContaIndex != null }, Validators.required],
|
|
392
|
-
percentual: [{ value: percentualValue, disabled: false }, Validators.required],
|
|
393
|
-
valor: [{ value: valorValue, disabled: false }, [Validators.required, Validators.max(
|
|
372
|
+
percentual: [{ value: percentualValue, disabled: false }, [Validators.required, Validators.max(remainingPct)]],
|
|
373
|
+
valor: [{ value: valorValue, disabled: false }, [Validators.required, Validators.max(remainingValor)]]
|
|
394
374
|
});
|
|
395
375
|
this.contaDialogFormGroup.get('contaFinanceira').valueChanges
|
|
396
376
|
.pipe(takeUntil(this.ngUnsubscribe))
|
|
@@ -401,7 +381,7 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
401
381
|
};
|
|
402
382
|
ErpRateioEditorComponent.prototype.onSaveContaDialog = function () {
|
|
403
383
|
var _this = this;
|
|
404
|
-
var _a, _b, _c;
|
|
384
|
+
var _a, _b, _c, _d, _e;
|
|
405
385
|
if (this.contaDialogFormGroup.invalid) {
|
|
406
386
|
return;
|
|
407
387
|
}
|
|
@@ -426,6 +406,12 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
426
406
|
var conta = this.contasDataSource[this.editingContaIndex];
|
|
427
407
|
conta.percentual = percentual;
|
|
428
408
|
conta.valorRateadoConta = valor;
|
|
409
|
+
// Recalcula os valores dos CCs proporcionalmente ao novo valor da conta,
|
|
410
|
+
// mantendo os percentuais intactos.
|
|
411
|
+
if ((_d = conta.rateiosCCusto) === null || _d === void 0 ? void 0 : _d.length) {
|
|
412
|
+
var currencyScale_1 = (_e = this.config.currencyScale) !== null && _e !== void 0 ? _e : 2;
|
|
413
|
+
conta.rateiosCCusto = conta.rateiosCCusto.map(function (cc) { return (__assign(__assign({}, cc), { valor: +((cc.percentual / 100) * valor).toFixed(currencyScale_1) })); });
|
|
414
|
+
}
|
|
429
415
|
this.contasDataSource = __spread(this.contasDataSource);
|
|
430
416
|
}
|
|
431
417
|
else {
|
|
@@ -590,6 +576,9 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
590
576
|
this.empresaId = (_c = (_b = (_a = this.initialContext) === null || _a === void 0 ? void 0 : _a.e070fil) === null || _b === void 0 ? void 0 : _b.e070emp) === null || _c === void 0 ? void 0 : _c.id;
|
|
591
577
|
}
|
|
592
578
|
this.gridColumns = this.getGridColumns();
|
|
579
|
+
// Emite o estado de validade já na carga inicial (sem marcar como "sujo"),
|
|
580
|
+
// permitindo que o host conheça o isValid mesmo sem o usuário editar.
|
|
581
|
+
this.emitChange(false);
|
|
593
582
|
};
|
|
594
583
|
ErpRateioEditorComponent.prototype.carregarRateio = function () {
|
|
595
584
|
var _this = this;
|
|
@@ -604,6 +593,8 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
604
593
|
_this.empresaId = output.e070fil.e070emp.id;
|
|
605
594
|
}
|
|
606
595
|
_this.gridColumns = _this.getGridColumns();
|
|
596
|
+
// Emite o estado de validade do rateio carregado (sem marcar como "sujo").
|
|
597
|
+
_this.emitChange(false);
|
|
607
598
|
}, function (err) { var _a; return _this.error.emit({ operacao: 'load', message: ((_a = err === null || err === void 0 ? void 0 : err.error) === null || _a === void 0 ? void 0 : _a.message) || (err === null || err === void 0 ? void 0 : err.message) || _this.translate.instant('erpx.rateio_editor.erro_carregar'), originalError: err }); });
|
|
608
599
|
};
|
|
609
600
|
ErpRateioEditorComponent.prototype.popularComRateios = function (rateios) {
|
|
@@ -643,8 +634,8 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
643
634
|
var _a, _b;
|
|
644
635
|
var ccs = conta.rateiosCCusto || [];
|
|
645
636
|
if (ccs.length === 0) {
|
|
646
|
-
//
|
|
647
|
-
return
|
|
637
|
+
// Centro de custo é sempre obrigatório: conta sem nenhum CC nunca é completa.
|
|
638
|
+
return false;
|
|
648
639
|
}
|
|
649
640
|
var somaPct = ccs.reduce(function (acc, cc) { return acc + (cc.percentual || 0); }, 0);
|
|
650
641
|
var somaValor = ccs.reduce(function (acc, cc) { return acc + (cc.valor || 0); }, 0);
|
|
@@ -761,14 +752,15 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
761
752
|
};
|
|
762
753
|
ErpRateioEditorComponent.prototype.getGridColumns = function () {
|
|
763
754
|
return [
|
|
764
|
-
{ field: 'contaFinanceira', header:
|
|
765
|
-
{ field: 'percentual', header:
|
|
766
|
-
{ field: 'valorRateadoConta', header:
|
|
755
|
+
{ field: 'contaFinanceira', header: 'erpx.rateio_editor.conta_financeira' },
|
|
756
|
+
{ field: 'percentual', header: 'erpx.rateio_editor.percentual' },
|
|
757
|
+
{ field: 'valorRateadoConta', header: 'erpx.rateio_editor.valor' }
|
|
767
758
|
];
|
|
768
759
|
};
|
|
769
|
-
ErpRateioEditorComponent.prototype.emitChange = function () {
|
|
760
|
+
ErpRateioEditorComponent.prototype.emitChange = function (isDirty) {
|
|
761
|
+
if (isDirty === void 0) { isDirty = true; }
|
|
770
762
|
this.change.emit({
|
|
771
|
-
isDirty:
|
|
763
|
+
isDirty: isDirty,
|
|
772
764
|
isValid: this.isDistribuicaoCompleta(),
|
|
773
765
|
rateios: this.contasDataSource
|
|
774
766
|
});
|
|
@@ -776,8 +768,6 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
776
768
|
var ErpRateioEditorComponent_1;
|
|
777
769
|
/** Valor de anaSin que indica registro sintético (não analítico). */
|
|
778
770
|
ErpRateioEditorComponent.ANA_SIN_SINTETICO = 'VS';
|
|
779
|
-
/** Critério de rateio que não distribui por centro de custo (Nenhum). */
|
|
780
|
-
ErpRateioEditorComponent.CRITERIO_SEM_CENTRO_CUSTO = 'V5';
|
|
781
771
|
ErpRateioEditorComponent.ctorParameters = function () { return [
|
|
782
772
|
{ type: FormBuilder },
|
|
783
773
|
{ type: ErpRateioEditorService },
|
|
@@ -861,11 +851,11 @@ var ErpRateioEditorComponent = /** @class */ (function () {
|
|
|
861
851
|
ErpRateioEditorComponent = ErpRateioEditorComponent_1 = __decorate([
|
|
862
852
|
Component({
|
|
863
853
|
selector: 'erp-rateio-editor',
|
|
864
|
-
template: "<s-loading-state [loading]=\"loading\" [blockWindow]=\"true\">\n <!-- Se\u00E7\u00E3o 1: Informa\u00E7\u00F5es do movimento -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.titulo' | translate }}\n </div>\n\n <div class=\"ui-g custom-stats\" *ngIf=\"isReady\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_base' | translate\"\n [value]=\"valorBase | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-percent\"\n [label]=\"'erpx.rateio_editor.percentual_restante' | translate\"\n [value]=\"percentualRestanteDisplay + '%'\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n [color]=\"distribuicaoCompleta ? '#0C9348' : '#C13018'\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_restante' | translate\"\n [value]=\"valorRestanteDisplay | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n </div>\n\n <!-- Se\u00E7\u00E3o 2: Tabela de rateios -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.lista_rateios' | translate }}\n </div>\n\n <s-empty-state\n *ngIf=\"isReady && contasDataSource?.length === 0\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"'erpx.rateio_editor.sem_rateios_titulo' | translate\"\n [description]=\"'erpx.rateio_editor.sem_rateios_descricao' | translate\"\n [showPrimaryAction]=\"!effectiveReadOnly\"\n [primaryActionLabel]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n (primaryAction)=\"openContaDialog()\"\n [showSecondaryAction]=\"!effectiveReadOnly && showSugestaoButton\"\n [secondaryActionLabel]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n (secondaryAction)=\"onSugerir()\"\n ></s-empty-state>\n\n <div class=\"ui-g\" *ngIf=\"isReady && contasDataSource?.length > 0\">\n <div class=\"ui-g-12\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openContaDialog()\"\n ></s-button>\n <s-button\n *ngIf=\"showSugestaoButton\"\n [label]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n iconClass=\"fa fa-magic\"\n (onClick)=\"onSugerir()\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_conta' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelected()\"\n [disabled]=\"!selection.length\"\n ></s-button>\n </div>\n\n <div class=\"ui-g-12\">\n <p-table\n #tableRateio\n [value]=\"contasDataSource\"\n [columns]=\"gridColumns\"\n dataKey=\"idContaFinanceira\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"contasDataSource.length\"\n [(selection)]=\"selection\"\n [paginator]=\"false\"\n [rows]=\"10\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th scope=\"col\" style=\"width: 3em\"></th>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" scope=\"col\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n </div>\n </th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ 'erpx.rateio_editor.acoes' | translate }}</span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\">\n <tr>\n <td style=\"width: 3em; text-align: center\">\n <a *ngIf=\"rowData.rateiosCCusto?.length || (!effectiveReadOnly && requiresCentroCusto)\" [pRowToggler]=\"rowData\" role=\"button\" tabindex=\"0\">\n <i [class]=\"expanded ? 'fa fa-minus' : 'fa fa-plus'\"></i>\n </a>\n </td>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td>{{ rowData.contaFinanceira || rowData.idContaFinanceira }}</td>\n <td style=\"text-align: right\">{{ rowData.percentual }}</td>\n <td style=\"text-align: right\">{{ rowData.valorRateadoConta | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openContaDialog(getContaIndex(rowData))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-rowData let-rowIndex=\"rowIndex\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? gridColumns.length + 2 : gridColumns.length + 3\">\n <div class=\"ui-g\" style=\"padding: 8px 16px\">\n <div class=\"ui-g-12 rateio-cc-toolbar\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openCCDialog(getContaIndex(rowData))\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_centro_custo' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelectedCC(rowData)\"\n [disabled]=\"!(ccSelection[rowData.idContaFinanceira]?.length)\"\n ></s-button>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n [value]=\"rowData.rateiosCCusto\"\n dataKey=\"idCentroCusto\"\n [(selection)]=\"ccSelection[rowData.idContaFinanceira]\"\n [responsive]=\"true\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.centro_custo' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.percentual' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.valor' | translate }}</th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">{{ 'erpx.rateio_editor.acoes' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-cc let-ccIndex=\"rowIndex\">\n <tr>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"cc\"></p-tableCheckbox>\n </td>\n <td>{{ cc.descCCusto || cc.idCentroCusto }}</td>\n <td style=\"text-align: right\">{{ cc.percentual }}</td>\n <td style=\"text-align: right\">{{ cc.valor | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openCCDialog(getContaIndex(rowData), getCCIndex(rowData, cc))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? 3 : 5\">\n {{ 'erpx.rateio_editor.sem_centros_custo' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <!-- Bot\u00F5es de a\u00E7\u00E3o -->\n <div *ngIf=\"isReady\" class=\"ui-g rateio-editor-actions\">\n <div class=\"ui-g-12\">\n <s-button\n *ngIf=\"!effectiveReadOnly && !isStandalone\"\n priority=\"primary\"\n iconClass=\"fa fa-check\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSalvar()\"\n ></s-button>\n </div>\n </div>\n</s-loading-state>\n\n<!-- Modal: Adicionar/Editar Conta Financeira -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayContaDialog\"\n (onHide)=\"onHideContaDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"contaDialogFormGroup\" [formGroup]=\"contaDialogFormGroup\" (ngSubmit)=\"onSaveContaDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"contaDialogFields\"\n [form]=\"contaDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.conta_duplicada' | translate),\n contaSintetica: ('erpx.rateio_editor.erro_conta_sintetica' | translate),\n max: ('erpx.rateio_editor.erro_valor_maximo_conta' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-conta-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveContaDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-conta-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideContaDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n\n<!-- Modal: Adicionar/Editar Centro de Custo -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayCCDialog\"\n (onHide)=\"onHideCCDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"ccDialogFormGroup\" [formGroup]=\"ccDialogFormGroup\" (ngSubmit)=\"onSaveCCDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"ccDialogFields\"\n [form]=\"ccDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.centro_custo_duplicado' | translate),\n centroCustoInvalido: ('erpx.rateio_editor.erro_centro_custo_invalido' | translate),\n max: ('erpx.rateio_editor.erro_maximo_centro_custo' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-cc-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveCCDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-cc-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideCCDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n",
|
|
854
|
+
template: "<s-loading-state [loading]=\"loading\" [blockWindow]=\"true\">\n <!-- Se\u00E7\u00E3o 1: Informa\u00E7\u00F5es do movimento -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.titulo' | translate }}\n </div>\n\n <div class=\"ui-g custom-stats\" *ngIf=\"isReady\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_base' | translate\"\n [value]=\"valorBase | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-percent\"\n [label]=\"'erpx.rateio_editor.percentual_restante' | translate\"\n [value]=\"percentualRestanteDisplay + '%'\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n [color]=\"distribuicaoCompleta ? '#0C9348' : '#C13018'\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_restante' | translate\"\n [value]=\"valorRestanteDisplay | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n </div>\n\n <!-- Se\u00E7\u00E3o 2: Tabela de rateios -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.lista_rateios' | translate }}\n </div>\n\n <s-empty-state\n *ngIf=\"isReady && contasDataSource?.length === 0\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"'erpx.rateio_editor.sem_rateios_titulo' | translate\"\n [description]=\"'erpx.rateio_editor.sem_rateios_descricao' | translate\"\n [showPrimaryAction]=\"!effectiveReadOnly\"\n [primaryActionLabel]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n (primaryAction)=\"openContaDialog()\"\n [showSecondaryAction]=\"!effectiveReadOnly && showSugestaoButton\"\n [secondaryActionLabel]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n (secondaryAction)=\"onSugerir()\"\n ></s-empty-state>\n\n <div class=\"ui-g\" *ngIf=\"isReady && contasDataSource?.length > 0\">\n <div class=\"ui-g-12\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openContaDialog()\"\n ></s-button>\n <s-button\n *ngIf=\"showSugestaoButton\"\n [label]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n iconClass=\"fa fa-magic\"\n (onClick)=\"onSugerir()\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_conta' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelected()\"\n [disabled]=\"!selection.length\"\n ></s-button>\n </div>\n\n <div class=\"ui-g-12\">\n <p-table\n #tableRateio\n [value]=\"contasDataSource\"\n [columns]=\"gridColumns\"\n dataKey=\"idContaFinanceira\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"contasDataSource.length\"\n [(selection)]=\"selection\"\n [paginator]=\"false\"\n [rows]=\"10\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th scope=\"col\" style=\"width: 3em\"></th>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" scope=\"col\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header | translate }}</span>\n </div>\n </th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ 'erpx.rateio_editor.acoes' | translate }}</span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\">\n <tr>\n <td style=\"width: 3em; text-align: center\">\n <a *ngIf=\"rowData.rateiosCCusto?.length || !effectiveReadOnly\" [pRowToggler]=\"rowData\" role=\"button\" tabindex=\"0\">\n <i [class]=\"expanded ? 'fa fa-minus' : 'fa fa-plus'\"></i>\n </a>\n </td>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td>{{ rowData.contaFinanceira || rowData.idContaFinanceira }}</td>\n <td style=\"text-align: right\">{{ rowData.percentual }}</td>\n <td style=\"text-align: right\">{{ rowData.valorRateadoConta | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openContaDialog(getContaIndex(rowData))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-rowData let-rowIndex=\"rowIndex\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? gridColumns.length + 2 : gridColumns.length + 3\">\n <div class=\"ui-g\" style=\"padding: 8px 16px\">\n <div class=\"ui-g-12 rateio-cc-toolbar\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openCCDialog(getContaIndex(rowData))\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_centro_custo' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelectedCC(rowData)\"\n [disabled]=\"!(ccSelection[rowData.idContaFinanceira]?.length)\"\n ></s-button>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n [value]=\"rowData.rateiosCCusto\"\n dataKey=\"idCentroCusto\"\n [(selection)]=\"ccSelection[rowData.idContaFinanceira]\"\n [responsive]=\"true\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.centro_custo' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.percentual' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.valor' | translate }}</th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">{{ 'erpx.rateio_editor.acoes' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-cc let-ccIndex=\"rowIndex\">\n <tr>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"cc\"></p-tableCheckbox>\n </td>\n <td>{{ cc.descCCusto || cc.idCentroCusto }}</td>\n <td style=\"text-align: right\">{{ cc.percentual }}</td>\n <td style=\"text-align: right\">{{ cc.valor | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openCCDialog(getContaIndex(rowData), getCCIndex(rowData, cc))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? 3 : 5\">\n {{ 'erpx.rateio_editor.sem_centros_custo' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <!-- Bot\u00F5es de a\u00E7\u00E3o -->\n <div *ngIf=\"isReady\" class=\"ui-g rateio-editor-actions\">\n <div class=\"ui-g-12\">\n <s-button\n *ngIf=\"!effectiveReadOnly && !isStandalone\"\n priority=\"primary\"\n iconClass=\"fa fa-check\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSalvar()\"\n ></s-button>\n </div>\n </div>\n</s-loading-state>\n\n<!-- Modal: Adicionar/Editar Conta Financeira -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayContaDialog\"\n (onHide)=\"onHideContaDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"contaDialogFormGroup\" [formGroup]=\"contaDialogFormGroup\" (ngSubmit)=\"onSaveContaDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"contaDialogFields\"\n [form]=\"contaDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.conta_duplicada' | translate),\n contaSintetica: ('erpx.rateio_editor.erro_conta_sintetica' | translate),\n max: ('erpx.rateio_editor.erro_valor_maximo_conta' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-conta-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveContaDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-conta-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideContaDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n\n<!-- Modal: Adicionar/Editar Centro de Custo -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayCCDialog\"\n (onHide)=\"onHideCCDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"ccDialogFormGroup\" [formGroup]=\"ccDialogFormGroup\" (ngSubmit)=\"onSaveCCDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"ccDialogFields\"\n [form]=\"ccDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.centro_custo_duplicado' | translate),\n centroCustoInvalido: ('erpx.rateio_editor.erro_centro_custo_invalido' | translate),\n max: ('erpx.rateio_editor.erro_maximo_centro_custo' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-cc-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveCCDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-cc-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideCCDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n",
|
|
865
855
|
styles: [":host ::ng-deep .rateio-cc-toolbar .s-button-text{overflow:visible;-ms-flex-pack:start;justify-content:flex-start}"]
|
|
866
856
|
})
|
|
867
857
|
], ErpRateioEditorComponent);
|
|
868
858
|
return ErpRateioEditorComponent;
|
|
869
859
|
}());
|
|
870
860
|
export { ErpRateioEditorComponent };
|
|
871
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLXJhdGVpby1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvZXJweC1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9yYXRlaW8tZWRpdG9yL2VycC1yYXRlaW8tZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsSCxPQUFPLEVBQ0gsY0FBYyxFQUNkLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNaLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBa0JyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBT3pDO0lBNk9JLGtDQUNxQixFQUFlLEVBQ2YsT0FBK0IsRUFDL0IsU0FBMkIsRUFDM0IsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsY0FBOEI7UUFMOUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGtC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RUFBcUI7SUFLcEI7UUFBUixLQUFLLEVBQUU7K0RBQW1CO0lBTWxCO1FBQVIsS0FBSyxFQUFFO29FQUF3QjtJQU12QjtRQUFSLEtBQUssRUFBRTtrRUFBc0I7SUFHcEI7UUFBVCxNQUFNLEVBQUU7MERBQTRDO0lBQzNDO1FBQVQsTUFBTSxFQUFFOzREQUFtQztJQUNsQztRQUFULE1BQU0sRUFBRTs0REFBZ0Q7SUFDL0M7UUFBVCxNQUFNLEVBQUU7MkRBQThDO0lBRzdCO1FBQXpCLFNBQVMsQ0FBQyxhQUFhLENBQUM7MkRBQXVCO0lBM0d2Qyx3QkFBd0I7UUFMcEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixnbmZBQWlEOztTQUVwRCxDQUFDO09BQ1csd0JBQXdCLENBbTJCcEM7SUFBRCwrQkFBQztDQUFBLEFBbjJCRCxJQW0yQkM7U0FuMkJZLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBFMDQ0Q2N1TG9va3VwLCBFMDkxUGxmTG9va3VwLCBFbnVtTG9naWNhbE9wZXJhdG9yIH0gZnJvbSAnQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gICAgQnV0dG9uUHJpb3JpdHksXG4gICAgQnV0dG9uU2l6ZSxcbiAgICBGaWVsZFR5cGUsXG4gICAgRm9ybUZpZWxkXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFcnBSYXRlaW9FZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi9lcnAtcmF0ZWlvLWVkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgR3JhdmFyUmF0ZWlvTWFudWFsSW5wdXQsXG4gICAgSW50ZWdyYWNhb0NvbnRyb2xhZG9yaWEsXG4gICAgUmF0ZWlvQ2hhbmdlRXZlbnQsXG4gICAgUmF0ZWlvQ29udGEsXG4gICAgUmF0ZWlvQ0N1c3RvLFxuICAgIFJhdGVpb0VkaXRvckNvbmZpZyxcbiAgICBSYXRlaW9FcnJvckV2ZW50LFxuICAgIFJhdGVpb1NhdmVFdmVudCxcbiAgICBSZXRvcm5hclJhdGVpb091dHB1dCxcbiAgICBTdWdlcmlyUmF0ZWlvSW5wdXQsXG4gICAgU3VnZXJpclJhdGVpb1BhcmFtZXRybyxcbiAgICBUaXBvTW92aW1lbnRvLFxuICAgIENyaXRlcmlvUmF0ZWlvLFxuICAgIENvbnRhRmluYW5jZWlyYUxvb2t1cCxcbiAgICBDZW50cm9DdXN0b0xvb2t1cFxufSBmcm9tICcuL2VycC1yYXRlaW8tZWRpdG9yLnR5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZXJwLXJhdGVpby1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lcnAtcmF0ZWlvLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZXJwLXJhdGVpby1lZGl0b3IuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFcnBSYXRlaW9FZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgICAvKiogVmFsb3IgZGUgYW5hU2luIHF1ZSBpbmRpY2EgcmVnaXN0cm8gc2ludMOpdGljbyAobsOjbyBhbmFsw610aWNvKS4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBTkFfU0lOX1NJTlRFVElDTyA9ICdWUyc7XG5cbiAgICAvKiogQ3JpdMOpcmlvIGRlIHJhdGVpbyBxdWUgbsOjbyBkaXN0cmlidWkgcG9yIGNlbnRybyBkZSBjdXN0byAoTmVuaHVtKS4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDUklURVJJT19TRU1fQ0VOVFJPX0NVU1RPOiBDcml0ZXJpb1JhdGVpbyA9ICdWNSc7XG5cbiAgICAvLyA9PT0gSU5QVVRTID09PVxuICAgIEBJbnB1dCgpIGlkTW92aW1lbnRvOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGlwb01vdmltZW50bzogVGlwb01vdmltZW50bztcbiAgICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNob3dTdWdlc3Rhb0J1dHRvbiA9IHRydWU7XG4gICAgQElucHV0KCkgY29uZmlnOiBSYXRlaW9FZGl0b3JDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBDb250ZXh0byBpbmljaWFsIHVzYWRvIHF1YW5kbyBvIGNvbXBvbmVudGUgw6kgYWxpbWVudGFkbyBwb3IgaW5wdXRzIGVtIHZleiBkYSBBUEkuXG4gICAgICogQXBsaWNhLXNlIGFvIG1vZG8gc3RhbmRhbG9uZSAoc2VtIGlkTW92aW1lbnRvKSBlIGFvIG1vZG8gY29uZWN0YWRvIGNvbVxuICAgICAqIGxvYWRGcm9tQXBpID0gZmFsc2UuIEZvcm5lY2UgdmFsb3JCYXNlLCBmaWxpYWwsIGNyaXTDqXJpbywgYWdydXBhZG9ySWQsIGRhdGFzLCBldGMuXG4gICAgICogRW0gbW9kbyBjb25lY3RhZG8gc2VtIGNhcmdhIHZpYSBBUEksIMOpIGRlc3RlIGNvbnRleHRvIHF1ZSBhIGdyYXZhw6fDo29cbiAgICAgKiAoZ3JhdmFyUmF0ZWlvTWFudWFsKSBvYnTDqW0gZTA3MGZpbCwgY3JpUmF0LCBkYXRhQmFzZSwgZGF0YU1vdmltZW50byBlIGFncnVwYWRvcklkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGluaXRpYWxDb250ZXh0PzogUGFydGlhbDxSZXRvcm5hclJhdGVpb091dHB1dD47XG5cbiAgICAvKiogUmF0ZWlvcyBpbmljaWFpcyBwYXJhIHBvcHVsYXIgYSBncmlkIHF1YW5kbyBhbGltZW50YWRvIHBvciBpbnB1dHMuICovXG4gICAgQElucHV0KCkgaW5pdGlhbFJhdGVpb3M/OiBSYXRlaW9Db250YVtdO1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbGEgc2UgbyByYXRlaW8gZGV2ZSBzZXIgY2FycmVnYWRvIGF1dG9tYXRpY2FtZW50ZSB2aWEgQVBJIHF1YW5kb1xuICAgICAqIGlkTW92aW1lbnRvIGVzdMOhIHByZXNlbnRlIChtb2RvIGNvbmVjdGFkbykuIERlZmF1bHQ6IHRydWUuXG4gICAgICpcbiAgICAgKiBEZWZpbmEgY29tbyBmYWxzZSBwYXJhIHJlc3RhdXJhciB1bSByYXRlaW8gcXVlIG8gdXN1w6FyaW8gasOhIGRpc3RyaWJ1aXUgZSBxdWVcbiAgICAgKiBhaW5kYSBuw6NvIGZvaSBwZXJzaXN0aWRvIG5vIGJhY2tlbmQgZGUgcmF0ZWlvOiBvIGNvbXBvbmVudGUgcG9wdWxhIGEgZ3JpZCBhXG4gICAgICogcGFydGlyIGRlIGluaXRpYWxDb250ZXh0L2luaXRpYWxSYXRlaW9zIGUgbWFudMOpbSBvIGJvdMOjbyBTYWx2YXIgZSBhIGdyYXZhw6fDo29cbiAgICAgKiB2aW5jdWxhZGEgYW8gbW92aW1lbnRvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGxvYWRGcm9tQXBpID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIElEIGRhIGVtcHJlc2EgdXNhZG8gcGFyYSBmaWx0cmFyIG9zIGxvb2t1cHMgZGUgY29udGEgZmluYW5jZWlyYSBlIGNlbnRybyBkZSBjdXN0by5cbiAgICAgKiBRdWFuZG8gaW5mb3JtYWRvLCBzb2JyZXNjcmV2ZSBvIElEIGRlcml2YWRvIGRvIGNvbnRleHRvIGNhcnJlZ2Fkby9pbmljaWFsLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVtcHJlc2FJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgZmlsaWFsIHVzYWRvIHBlbGEgQVBJIGRlIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICogUXVhbmRvIGluZm9ybWFkbywgdGVtIHByaW9yaWRhZGUgc29icmUgbyBJRCBkZXJpdmFkbyBkbyBjb250ZXh0by5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWxpYWxJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ3JpdMOpcmlvIGRlIHJhdGVpbyBwYWRyw6NvIHVzYWRvIHBlbGEgQVBJIGRlIHN1Z2VzdMOjby5cbiAgICAgKiBEZWZhdWx0OiAnVjMnIChEZXNwZXNhcyDigJQgQ29udGEgWCBDLiBDdXN0b3MpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNyaVJhdDogQ3JpdGVyaW9SYXRlaW8gPSAnVjMnO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgY29udGEgZmluYW5jZWlyYSAoZTA5MXBsZikgcGFyYSBmaWx0cmFyIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKiBRdWFuZG8gaW5mb3JtYWRvLCDDqSBlbnZpYWRvIGNvbW8gcGFyw6JtZXRybyBuYSBBUEkgc3VnZXJpclJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlMDkxcGxmSWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRvIGNlbnRybyBkZSBjdXN0byAoZTA0NGNjdSkgcGFyYSBmaWx0cmFyIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKiBRdWFuZG8gaW5mb3JtYWRvLCDDqSBlbnZpYWRvIGNvbW8gcGFyw6JtZXRybyBuYSBBUEkgc3VnZXJpclJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlMDQ0Y2N1SWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRhIHRyYW5zYcOnw6NvIHVzYWRhIHBhcmEgZmlsdHJhciBhIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICovXG4gICAgQElucHV0KCkgaWRUcmFuc2FjYW86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRhIGZhbcOtbGlhIHVzYWRhIHBhcmEgZmlsdHJhciBhIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICovXG4gICAgQElucHV0KCkgaWRGYW1pbGlhOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkYSBkZXJpdmHDp8OjbyB1c2FkYSBwYXJhIGZpbHRyYXIgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGlkRGVyaXZhY2FvOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkbyBzZXJ2acOnbyB1c2FkbyBwYXJhIGZpbHRyYXIgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGlkU2Vydmljbzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVmFsb3IgZXhjZWRlbnRlIGluZm9ybWFkbyBwYXJhIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKiBRdWFuZG8gaW5mb3JtYWRvLCDDqSBlbnZpYWRvIGNvbW8gcGFyw6JtZXRybyBuYSBBUEkgc3VnZXJpclJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSB2YWxvckV4Y2VkZW50ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQ8OzZGlnbyBJU08gZGEgbW9lZGEgcGFyYSBmb3JtYXRhw6fDo28gZGUgdmFsb3JlcyBuYSBncmlkIChleDogJ0JSTCcsICdVU0QnKS5cbiAgICAgKiBTZSBuw6NvIGluZm9ybWFkbywgdXNhIGVzdGlsbyBkZWNpbWFsIHNlbSBzw61tYm9sby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjdXJyZW5jeUNvZGU6IHN0cmluZztcblxuICAgIC8vID09PSBPVVRQVVRTID09PVxuICAgIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxSYXRlaW9TYXZlRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxSYXRlaW9DaGFuZ2VFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPFJhdGVpb0Vycm9yRXZlbnQ+KCk7XG5cbiAgICAvLyA9PT0gUkVGRVLDik5DSUFTIERPIFRFTVBMQVRFID09PVxuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlUmF0ZWlvJykgcmVhZG9ubHkgdGFibGU6IFRhYmxlO1xuXG4gICAgLy8gPT09IENPTlNUQU5URVMgRVhQT1NUQVMgQU8gVEVNUExBVEUgPT09XG4gICAgcmVhZG9ubHkgQnV0dG9uUHJpb3JpdHkgPSBCdXR0b25Qcmlvcml0eTtcbiAgICByZWFkb25seSBCdXR0b25TaXplID0gQnV0dG9uU2l6ZTtcblxuICAgIC8vID09PSBFU1RBRE8gPT09XG4gICAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGxvYWRlZENvbnRleHQ6IFJldG9ybmFyUmF0ZWlvT3V0cHV0O1xuICAgIHB1YmxpYyBzZWxlY3Rpb246IGFueVtdID0gW107XG4gICAgLyoqIFNlbGXDp8OjbyBkZSBjZW50cm9zIGRlIGN1c3RvIHBvciBjb250YSBmaW5hbmNlaXJhIChrZXllZCBwb3IgaWRDb250YUZpbmFuY2VpcmEpLiAqL1xuICAgIHB1YmxpYyBjY1NlbGVjdGlvbjogeyBbaWRDb250YUZpbmFuY2VpcmE6IHN0cmluZ106IFJhdGVpb0NDdXN0b1tdIH0gPSB7fTtcbiAgICBwdWJsaWMgZ3JpZENvbHVtbnM6IGFueVtdO1xuICAgIHB1YmxpYyBjb250YXNEYXRhU291cmNlOiBSYXRlaW9Db250YVtdID0gW107XG4gICAgcHVibGljIGVkaXRpbmdSb3dCYWNrdXA6IFJhdGVpb0NvbnRhIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGVkaXRpbmdDQ0JhY2t1cDogUmF0ZWlvQ0N1c3RvIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiogw5psdGltbyB2YWxvciBzZWxlY2lvbmFkbyBubyBsb29rdXAgZGUgY29udGEgKGNhcnJlZ2EgYW5hU2luIHBhcmEgdmFsaWRhw6fDo28pLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZENvbnRhOiBDb250YUZpbmFuY2VpcmFMb29rdXAgfCBudWxsID0gbnVsbDtcbiAgICAvKiogw5psdGltbyB2YWxvciBzZWxlY2lvbmFkbyBubyBsb29rdXAgZGUgY2VudHJvIGRlIGN1c3RvIChjYXJyZWdhIGFuYVNpbi9hY2VSYXQpLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZENDOiBDZW50cm9DdXN0b0xvb2t1cCB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gPT09IE1PREFMIENPTlRBIEZJTkFOQ0VJUkEgPT09XG4gICAgcHVibGljIGRpc3BsYXlDb250YURpYWxvZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb250YURpYWxvZ0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBjb250YURpYWxvZ0ZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGVkaXRpbmdDb250YUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8vID09PSBNT0RBTCBDRU5UUk8gREUgQ1VTVE8gPT09XG4gICAgcHVibGljIGRpc3BsYXlDQ0RpYWxvZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBjY0RpYWxvZ0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBjY0RpYWxvZ0ZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGVkaXRpbmdDQ0NvbnRhSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBlZGl0aW5nQ0NJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcHVibGljIGdldCBlZmZlY3RpdmVSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaWM6IEludGVncmFjYW9Db250cm9sYWRvcmlhIHwgdW5kZWZpbmVkID0gdGhpcy5sb2FkZWRDb250ZXh0Py5pbnRlZ3JhY2FvQ29udHJvbGFkb3JpYTtcbiAgICAgICAgY29uc3QgaGFzSW50ZWdyYWNhbyA9ICEhaWMgJiYgKFxuICAgICAgICAgICAgaWMuY29udGFiaWxpZGFkZSA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgaWMudHJpYnV0b3MgPT09IHRydWUgfHxcbiAgICAgICAgICAgIGljLnBhdHJpbW9uaW8gPT09IHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE9ubHkgfHwgaGFzSW50ZWdyYWNhbztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRhc0Zvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdjb250YXMnKSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gY3JpdMOpcmlvIGRlIHJhdGVpbyBleGlnZSBkaXN0cmlidWnDp8OjbyBwb3IgY2VudHJvIGRlIGN1c3RvLlxuICAgICAqIE8gY3JpdMOpcmlvICdWNScgKE5lbmh1bSkgbsOjbyBkaXN0cmlidWkgcG9yIEMuIEN1c3Rvczsgb3MgZGVtYWlzIGV4aWdlbVxuICAgICAqIGFvIG1lbm9zIHVtIGNlbnRybyBkZSBjdXN0byBwb3IgY29udGEgZmluYW5jZWlyYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVzQ2VudHJvQ3VzdG8oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNyaXRlcmlvID0gdGhpcy5sb2FkZWRDb250ZXh0Py5jcmlSYXQgPz8gdGhpcy5jcmlSYXQ7XG4gICAgICAgIHJldHVybiBjcml0ZXJpbyAhPT0gRXJwUmF0ZWlvRWRpdG9yQ29tcG9uZW50LkNSSVRFUklPX1NFTV9DRU5UUk9fQ1VTVE87XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxvckJhc2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVkQ29udGV4dD8udmFsb3JCYXNlID8/IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwZXJjZW50dWFsUmVzdGFudGUoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc29tYSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBjb250YSkgPT4gYWNjICsgKGNvbnRhLnBlcmNlbnR1YWwgfHwgMCksIDBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICsoMTAwIC0gc29tYSkudG9GaXhlZCh0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxvclJlc3RhbnRlKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHNvbWEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2UucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgY29udGEpID0+IGFjYyArIChjb250YS52YWxvclJhdGVhZG9Db250YSB8fCAwKSwgMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gKyh0aGlzLnZhbG9yQmFzZSAtIHNvbWEpLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxvciByZXN0YW50ZSBhIHNlciBleGliaWRvIG5vcyBjYXJkcyBkZSByZXN1bW8uXG4gICAgICogUXVhbmRvIG8gY3JpdMOpcmlvIGV4aWdlIGNlbnRybyBkZSBjdXN0bywgY29uc2lkZXJhIG8gdG90YWwgasOhIGRpc3RyaWJ1w61kb1xuICAgICAqIG5vcyBDQ3MgZGUgdG9kYXMgYXMgY29udGFzIGVtIHZleiBkbyB0b3RhbCBkYXMgY29udGFzIGZpbmFuY2VpcmFzLlxuICAgICAqIEFzc2ltIG8gY2FyZCByZWZsZXRlIGEgZGlzdHJpYnVpw6fDo28gcmVhbCBwb250YS1hLXBvbnRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsb3JSZXN0YW50ZURpc3BsYXkoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlcXVpcmVzQ2VudHJvQ3VzdG8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbG9yUmVzdGFudGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxDQyA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBjb250YSkgPT4gYWNjICsgKGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW10pLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoY2NBY2MsIGNjKSA9PiBjY0FjYyArIChjYy52YWxvciB8fCAwKSwgMFxuICAgICAgICAgICAgKSwgMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gKyh0aGlzLnZhbG9yQmFzZSAtIHRvdGFsQ0MpLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJjZW50dWFsIHJlc3RhbnRlIGEgc2VyIGV4aWJpZG8gbm9zIGNhcmRzIGRlIHJlc3Vtby5cbiAgICAgKiBEZXJpdmFkbyBkZSBgdmFsb3JSZXN0YW50ZURpc3BsYXlgIHBhcmEgbWFudGVyIGNvbnNpc3TDqm5jaWEgY29tIG8gdmFsb3IuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwZXJjZW50dWFsUmVzdGFudGVEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5yZXF1aXJlc0NlbnRyb0N1c3RvKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJjZW50dWFsUmVzdGFudGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnZhbG9yQmFzZSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICsodGhpcy52YWxvclJlc3RhbnRlRGlzcGxheSAvIHRoaXMudmFsb3JCYXNlICogMTAwKS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlckZvcm1hdE9wdGlvbnMoKTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVuY3lDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG51bWJlckZvcm1hdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5Q29kZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG51bWJlckZvcm1hdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2RlY2ltYWwnLFxuICAgICAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyLFxuICAgICAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2U6IEVycFJhdGVpb0VkaXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGUwOTFQbGZMb29rdXA6IEUwOTFQbGZMb29rdXAsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZTA0NENjdUxvb2t1cDogRTA0NENjdUxvb2t1cCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGNvbnRhczogdGhpcy5mYi5hcnJheShbXSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW92aW1lbnRvQ2hhbmdlZCA9IGNoYW5nZXMuaWRNb3ZpbWVudG8gfHwgY2hhbmdlcy50aXBvTW92aW1lbnRvO1xuXG4gICAgICAgIGlmIChtb3ZpbWVudG9DaGFuZ2VkICYmIHRoaXMuaWRNb3ZpbWVudG8gJiYgdGhpcy50aXBvTW92aW1lbnRvICYmIHRoaXMubG9hZEZyb21BcGkpIHtcbiAgICAgICAgICAgIC8vIE1vZG8gY29uZWN0YWRvIGNvbSBjYXJnYSB2aWEgQVBJXG4gICAgICAgICAgICB0aGlzLmNhcnJlZ2FyUmF0ZWlvKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0lucHV0RHJpdmVuICYmIChjaGFuZ2VzLmluaXRpYWxDb250ZXh0IHx8IGNoYW5nZXMuaW5pdGlhbFJhdGVpb3MgfHwgY2hhbmdlcy5sb2FkRnJvbUFwaSB8fCBtb3ZpbWVudG9DaGFuZ2VkKSkge1xuICAgICAgICAgICAgLy8gQWxpbWVudGFkbyBwb3IgaW5wdXRzOiBtb2RvIHN0YW5kYWxvbmUgT1UgY29uZWN0YWRvIHNlbSBjYXJnYSB2aWEgQVBJXG4gICAgICAgICAgICB0aGlzLmluaWNpYWxpemFyUG9ySW5wdXRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmV0b3JuYSBvIGNvbnRlw7pkbyBhdHVhbCBkYSBncmlkICh1c28gc3RhbmRhbG9uZSDigJQgcXVlbSBjb25zb21lIGzDqiBvcyByYXRlaW9zIGRhcXVpKS4gKi9cbiAgICBwdWJsaWMgZ2V0IHJhdGVpb3MoKTogUmF0ZWlvQ29udGFbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhc0RhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgLyoqIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZXN0w6Egb3BlcmFuZG8gc2VtIGlkTW92aW1lbnRvIChtb2RvIHN0YW5kYWxvbmUpLiAqL1xuICAgIHB1YmxpYyBnZXQgaXNTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaWRNb3ZpbWVudG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gY29tcG9uZW50ZSDDqSBhbGltZW50YWRvIHBvciBpbnB1dHMgZW0gdmV6IGRhIEFQSTpcbiAgICAgKiBtb2RvIHN0YW5kYWxvbmUgKHNlbSBpZE1vdmltZW50bykgT1UgbW9kbyBjb25lY3RhZG8gY29tIGxvYWRGcm9tQXBpID0gZmFsc2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0lucHV0RHJpdmVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1N0YW5kYWxvbmUgfHwgIXRoaXMubG9hZEZyb21BcGk7XG4gICAgfVxuXG4gICAgLyoqIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZXN0w6EgcHJvbnRvIHBhcmEgZXhpYmlyIFVJIChjYXJyZWdvdSB2aWEgQVBJIE9VIGZvaSBpbmljaWFsaXphZG8gcG9yIGlucHV0cykuICovXG4gICAgcHVibGljIGdldCBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmxvYWRlZENvbnRleHQgfHwgdGhpcy5pc0lucHV0RHJpdmVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLy8gPT09IEHDh8OVRVMgUMOaQkxJQ0FTID09PVxuXG4gICAgcHVibGljIG9uU2FsdmFyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RpdmVSZWFkT25seSkgeyByZXR1cm47IH1cblxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlc0NlbnRyb0N1c3RvICYmIHRoaXMuaGFzQ29udGFTZW1DZW50cm9DdXN0bygpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fY2VudHJvX2N1c3RvX29icmlnYXRvcmlvJyk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNEaXN0cmlidWljYW9Db21wbGV0YSgpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fZGlzdHJpYnVpY2FvX2luY29tcGxldGEnKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb190aXR1bG8nKSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KHsgb3BlcmFjYW86ICdzYXZlJywgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMubG9hZGVkQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHg/LmUwNzBmaWw/LmlkIHx8ICFjdHg/LmNyaVJhdCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX2NvbnRleHRvX2luY29tcGxldG8nKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb190aXR1bG8nKSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KHsgb3BlcmFjYW86ICdzYXZlJywgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0OiBHcmF2YXJSYXRlaW9NYW51YWxJbnB1dCA9IHtcbiAgICAgICAgICAgIGlkTW92aW1lbnRvOiB0aGlzLmlkTW92aW1lbnRvLFxuICAgICAgICAgICAgdGlwb01vdmltZW50bzogdGhpcy50aXBvTW92aW1lbnRvLFxuICAgICAgICAgICAgYWdydXBhZG9ySWQ6IGN0eC5hZ3J1cGFkb3JJZCxcbiAgICAgICAgICAgIGUwNzBmaWxfaWQ6IGN0eC5lMDcwZmlsLmlkLFxuICAgICAgICAgICAgY3JpdGVyaW9SYXRlaW86IGN0eC5jcmlSYXQsXG4gICAgICAgICAgICBkYXRhQmFzZTogY3R4LmRhdGFCYXNlLFxuICAgICAgICAgICAgZGF0YU1vdmltZW50bzogY3R4LmRhdGFNb3ZpbWVudG8sXG4gICAgICAgICAgICByYXRlaW9zOiB0aGlzLmNvbnRhc0RhdGFTb3VyY2VcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZ3JhdmFyUmF0ZWlvTWFudWFsKGlucHV0KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbmFsaXplKCgpID0+ICh0aGlzLmxvYWRpbmcgPSBmYWxzZSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3Iuc2Fsdm9fY29tX3N1Y2Vzc29fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5zYWx2b19jb21fc3VjZXNzb19kZXRhbGhlJylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZS5lbWl0KHsgaWRNb3ZpbWVudG86IHRoaXMuaWRNb3ZpbWVudG8sIHRpcG9Nb3ZpbWVudG86IHRoaXMudGlwb01vdmltZW50bywgcmF0ZWlvczogdGhpcy5jb250YXNEYXRhU291cmNlIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWwgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb19zYWx2YXInKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb190aXR1bG8nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KHsgb3BlcmFjYW86ICdzYXZlJywgbWVzc2FnZTogZGV0YWlsLCBvcmlnaW5hbEVycm9yOiBlcnIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TdWdlcmlyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RpdmVSZWFkT25seSB8fCAhdGhpcy5zaG93U3VnZXN0YW9CdXR0b24pIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5sb2FkZWRDb250ZXh0O1xuICAgICAgICBjb25zdCBlMDcwZmlsX2lkID0gdGhpcy5maWxpYWxJZCB8fCBjdHg/LmUwNzBmaWw/LmlkO1xuICAgICAgICBjb25zdCBjcml0ZXJpbyA9IHRoaXMuY3JpUmF0IHx8IGN0eD8uY3JpUmF0O1xuICAgICAgICBjb25zdCB2YWxvckJhc2UgPSBjdHg/LnZhbG9yQmFzZSA/PyAwO1xuXG4gICAgICAgIGlmICghZTA3MGZpbF9pZCB8fCAhY3JpdGVyaW8pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRybzogU3VnZXJpclJhdGVpb1BhcmFtZXRybyA9IHtcbiAgICAgICAgICAgIGUwNzBmaWxfaWQsXG4gICAgICAgICAgICB2YWxvckJhc2UsXG4gICAgICAgICAgICBjcmlSYXQ6IGNyaXRlcmlvLFxuICAgICAgICAgICAgZGF0YUJhc2U6IGN0eD8uZGF0YUJhc2UsXG4gICAgICAgICAgICBkYXRhTW92aW1lbnRvOiBjdHg/LmRhdGFNb3ZpbWVudG9cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5pZE1vdmltZW50bykge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkTW92aW1lbnRvID0gdGhpcy5pZE1vdmltZW50bztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lMDkxcGxmSWQpIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5lMDkxcGxmX2lkID0gdGhpcy5lMDkxcGxmSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZTA0NGNjdUlkKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8uZTA0NGNjdV9pZCA9IHRoaXMuZTA0NGNjdUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlkVHJhbnNhY2FvKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8uaWRUcmFuc2FjYW8gPSB0aGlzLmlkVHJhbnNhY2FvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlkRmFtaWxpYSkge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkRmFtaWxpYSA9IHRoaXMuaWRGYW1pbGlhO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlkRGVyaXZhY2FvKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8uaWREZXJpdmFjYW8gPSB0aGlzLmlkRGVyaXZhY2FvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlkU2Vydmljbykge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkU2VydmljbyA9IHRoaXMuaWRTZXJ2aWNvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZhbG9yRXhjZWRlbnRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby52YWxvckV4Y2VkZW50ZSA9IHRoaXMudmFsb3JFeGNlZGVudGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dDogU3VnZXJpclJhdGVpb0lucHV0ID0ge1xuICAgICAgICAgICAgdGlwbzogdGhpcy50aXBvTW92aW1lbnRvLFxuICAgICAgICAgICAgcGFyYW1ldHJvczogW3BhcmFtZXRyb11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlcnZpY2Uuc3VnZXJpclJhdGVpbyhpbnB1dClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKHJlc3ApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VnZXN0YW8gPSAocmVzcC5zdWdlc3RhbyB8fCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKHMgPT4gIXRoaXMuaWRNb3ZpbWVudG8gfHwgcy5pZE1vdmltZW50byA9PT0gdGhpcy5pZE1vdmltZW50bylcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXNwLnN1Z2VzdGFvIHx8IFtdKVswXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF0ZWlvID0gc3VnZXN0YW8/LnJhdGVpbztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWdlc3RhbyB8fCAhcmF0ZWlvIHx8IHJhdGVpby5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXJDb21SYXRlaW9zKHJhdGVpbyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycikgPT4gdGhpcy5lcnJvci5lbWl0KHsgb3BlcmFjYW86ICdzdWdnZXN0JywgbWVzc2FnZTogZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fc3VnZXJpcicpLCBvcmlnaW5hbEVycm9yOiBlcnIgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gPT09IE1PREFMIENPTlRBIEZJTkFOQ0VJUkEgPT09XG5cbiAgICBwdWJsaWMgb3BlbkNvbnRhRGlhbG9nKGVkaXRJbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdDb250YUluZGV4ID0gZWRpdEluZGV4ICE9IG51bGwgPyBlZGl0SW5kZXggOiBudWxsO1xuICAgICAgICBjb25zdCByZW1haW5pbmdQY3QgPSB0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5wZXJjZW50dWFsUmVzdGFudGUgKyB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbdGhpcy5lZGl0aW5nQ29udGFJbmRleF0ucGVyY2VudHVhbFxuICAgICAgICAgICAgOiB0aGlzLnBlcmNlbnR1YWxSZXN0YW50ZTtcbiAgICAgICAgLy8gVXNhIG8gdmFsb3IgcmVzdGFudGUgcmVhbCBlbSB2ZXogZGUgcmVjYWxjdWxhciB2aWEgcGVyY2VudHVhbCwgZXZpdGFuZG9cbiAgICAgICAgLy8gZGlmZXJlbsOnYXMgZGUgYXJyZWRvbmRhbWVudG8gYWN1bXVsYWRhcyBuYXMgZW50cmFkYXMgYW50ZXJpb3Jlcy5cbiAgICAgICAgY29uc3QgcmVtYWluaW5nVmFsb3IgPSB0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGxcbiAgICAgICAgICAgID8gKyh0aGlzLnZhbG9yUmVzdGFudGUgKyB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbdGhpcy5lZGl0aW5nQ29udGFJbmRleF0udmFsb3JSYXRlYWRvQ29udGEpLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKVxuICAgICAgICAgICAgOiB0aGlzLnZhbG9yUmVzdGFudGU7XG5cbiAgICAgICAgbGV0IGNvbnRhVmFsdWUgPSBudWxsO1xuICAgICAgICBsZXQgcGVyY2VudHVhbFZhbHVlOiBudW1iZXIgfCBudWxsID0gcmVtYWluaW5nUGN0ID4gMCA/IHJlbWFpbmluZ1BjdCA6IG51bGw7XG4gICAgICAgIGxldCB2YWxvclZhbHVlOiBudW1iZXIgfCBudWxsID0gcGVyY2VudHVhbFZhbHVlICE9IG51bGwgPyByZW1haW5pbmdWYWxvciA6IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZWRpdGluZ0NvbnRhSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbdGhpcy5lZGl0aW5nQ29udGFJbmRleF07XG4gICAgICAgICAgICBjb250YVZhbHVlID0geyBpZDogY29udGEuaWRDb250YUZpbmFuY2VpcmEsIGxhYmVsOiBjb250YS5jb250YUZpbmFuY2VpcmEgfTtcbiAgICAgICAgICAgIHBlcmNlbnR1YWxWYWx1ZSA9IGNvbnRhLnBlcmNlbnR1YWw7XG4gICAgICAgICAgICB2YWxvclZhbHVlID0gY29udGEudmFsb3JSYXRlYWRvQ29udGE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29udGEgPSBjb250YVZhbHVlIGFzIENvbnRhRmluYW5jZWlyYUxvb2t1cCB8IG51bGw7XG4gICAgICAgIHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGNvbnRhRmluYW5jZWlyYTogW3sgdmFsdWU6IGNvbnRhVmFsdWUsIGRpc2FibGVkOiB0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGwgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBwZXJjZW50dWFsOiBbeyB2YWx1ZTogcGVyY2VudHVhbFZhbHVlLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICB2YWxvcjogW3sgdmFsdWU6IHZhbG9yVmFsdWUsIGRpc2FibGVkOiBmYWxzZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgodGhpcy52YWxvckJhc2UpXV1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjb250YUZpbmFuY2VpcmEnKS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IENvbnRhRmluYW5jZWlyYUxvb2t1cCkgPT4gKHRoaXMuc2VsZWN0ZWRDb250YSA9IHZhbHVlIHx8IG51bGwpKTtcbiAgICAgICAgdGhpcy5zZXR1cFBlcmNlbnR1YWxWYWxvclN5bmModGhpcy5jb250YURpYWxvZ0Zvcm1Hcm91cCwgKCkgPT4gdGhpcy52YWxvckJhc2UpO1xuICAgICAgICB0aGlzLmNvbnRhRGlhbG9nRmllbGRzID0gdGhpcy5nZXRDb250YURpYWxvZ0ZpZWxkcygpO1xuICAgICAgICB0aGlzLmRpc3BsYXlDb250YURpYWxvZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2F2ZUNvbnRhRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YURpYWxvZ0Zvcm1Hcm91cC5pbnZhbGlkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRhQ29udHJvbCA9IHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjb250YUZpbmFuY2VpcmEnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgY29udGFGaW5hbmNlaXJhID0gZGF0YS5jb250YUZpbmFuY2VpcmE7XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWwgPSBOdW1iZXIoZGF0YS5wZXJjZW50dWFsKSB8fCAwO1xuICAgICAgICBjb25zdCB2YWxvciA9ICsoTnVtYmVyKGRhdGEudmFsb3IpIHx8IDApLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICAgICAgY29uc3QgaWRDb250YUZpbmFuY2VpcmEgPSB0aGlzLnNlbGVjdGVkQ29udGE/LmlkIHx8IGNvbnRhRmluYW5jZWlyYT8uaWQgfHwgJyc7XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gYW5hbMOtdGljYTogY29udGEgc2ludMOpdGljYSBuw6NvIHBvZGUgc2VyIHVzYWRhIG5vIHJhdGVpb1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbnRhPy5hbmFTaW4gPT09IEVycFJhdGVpb0VkaXRvckNvbXBvbmVudC5BTkFfU0lOX1NJTlRFVElDTykge1xuICAgICAgICAgICAgY29udGFDb250cm9sLnNldEVycm9ycyh7IGNvbnRhU2ludGV0aWNhOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gZGUgZHVwbGljaWRhZGUgKGFkacOnw6NvIGUgZWRpw6fDo28sIGlnbm9yYW5kbyBvIGl0ZW0gZW0gZWRpw6fDo28pXG4gICAgICAgIGNvbnN0IGR1cGxpY2FkYSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5zb21lKFxuICAgICAgICAgICAgKGMsIGkpID0+IGkgIT09IHRoaXMuZWRpdGluZ0NvbnRhSW5kZXggJiYgYy5pZENvbnRhRmluYW5jZWlyYSA9PT0gaWRDb250YUZpbmFuY2VpcmFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGR1cGxpY2FkYSkge1xuICAgICAgICAgICAgY29udGFDb250cm9sLnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhID0gdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdO1xuICAgICAgICAgICAgY29udGEucGVyY2VudHVhbCA9IHBlcmNlbnR1YWw7XG4gICAgICAgICAgICBjb250YS52YWxvclJhdGVhZG9Db250YSA9IHZhbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbnRhID0gY29udGFGaW5hbmNlaXJhPy5sYWJlbCB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IG5vdmFDb250YTogUmF0ZWlvQ29udGEgPSB7XG4gICAgICAgICAgICAgICAgaWRDb250YUZpbmFuY2VpcmEsXG4gICAgICAgICAgICAgICAgY29udGFGaW5hbmNlaXJhOiBsYWJlbENvbnRhLFxuICAgICAgICAgICAgICAgIHBlcmNlbnR1YWwsXG4gICAgICAgICAgICAgICAgdmFsb3JSYXRlYWRvQ29udGE6IHZhbG9yLFxuICAgICAgICAgICAgICAgIHJhdGVpb3NDQ3VzdG86IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZSwgbm92YUNvbnRhXTtcbiAgICAgICAgICAgIHRoaXMuY2NTZWxlY3Rpb25bbm92YUNvbnRhLmlkQ29udGFGaW5hbmNlaXJhXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwbGF5Q29udGFEaWFsb2cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGlkZUNvbnRhRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXlDb250YURpYWxvZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vID09PSBNT0RBTCBDRU5UUk8gREUgQ1VTVE8gPT09XG5cbiAgICBwdWJsaWMgb3BlbkNDRGlhbG9nKGNvbnRhSW5kZXg6IG51bWJlciwgZWRpdENDSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ0NDb250YUluZGV4ID0gY29udGFJbmRleDtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ0NJbmRleCA9IGVkaXRDQ0luZGV4ICE9IG51bGwgPyBlZGl0Q0NJbmRleCA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbY29udGFJbmRleF07XG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGNvbnN0IHZhbG9yQmFzZUNDID0gY29udGEudmFsb3JSYXRlYWRvQ29udGEgfHwgMDtcblxuICAgICAgICAvLyBDYWxjdWxhIG8gcmVzdGFudGUgZXhjbHVpbmRvIG8gaXRlbSBlbSBlZGnDp8OjbyAocGFyYSBxdWUgZWRpw6fDo28gcG9zc2EgbWFudGVyIG8gcHLDs3ByaW8gdmFsb3IpXG4gICAgICAgIGNvbnN0IHNvbWFDQ1BjdCA9IGNjTGlzdC5yZWR1Y2UoKGFjYywgY2MsIGkpID0+IGFjYyArIChpID09PSB0aGlzLmVkaXRpbmdDQ0luZGV4ID8gMCA6IChjYy5wZXJjZW50dWFsIHx8IDApKSwgMCk7XG4gICAgICAgIGNvbnN0IHNvbWFDQ1ZhbG9yID0gY2NMaXN0LnJlZHVjZSgoYWNjLCBjYywgaSkgPT4gYWNjICsgKGkgPT09IHRoaXMuZWRpdGluZ0NDSW5kZXggPyAwIDogKGNjLnZhbG9yIHx8IDApKSwgMCk7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ1BjdCA9ICsoMTAwIC0gc29tYUNDUGN0KS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nVmFsb3IgPSArKHZhbG9yQmFzZUNDIC0gc29tYUNDVmFsb3IpLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcblxuICAgICAgICBsZXQgY2NWYWx1ZSA9IG51bGw7XG4gICAgICAgIGxldCBwZXJjZW50dWFsVmFsdWU6IG51bWJlciB8IG51bGwgPSByZW1haW5pbmdQY3QgPiAwID8gcmVtYWluaW5nUGN0IDogbnVsbDtcbiAgICAgICAgLy8gVXNhIG8gdmFsb3IgcmVzdGFudGUgcmVhbCAoasOhIGNhbGN1bGFkbyBhY2ltYSkgZW0gdmV6IGRlIHJlY2FsY3VsYXIgdmlhIHBlcmNlbnR1YWwsXG4gICAgICAgIC8vIGV2aXRhbmRvIGRpZmVyZW7Dp2FzIGRlIGFycmVkb25kYW1lbnRvIGFjdW11bGFkYXMgbm9zIENDcyBhbnRlcmlvcmVzLlxuICAgICAgICBsZXQgdmFsb3JWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHBlcmNlbnR1YWxWYWx1ZSAhPSBudWxsID8gcmVtYWluaW5nVmFsb3IgOiBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNjID0gY2NMaXN0W3RoaXMuZWRpdGluZ0NDSW5kZXhdO1xuICAgICAgICAgICAgY2NWYWx1ZSA9IHsgaWQ6IGNjLmlkQ2VudHJvQ3VzdG8sIGxhYmVsOiBjYy5kZXNjQ0N1c3RvIHx8IGNjLmlkQ2VudHJvQ3VzdG8gfTtcbiAgICAgICAgICAgIHBlcmNlbnR1YWxWYWx1ZSA9IGNjLnBlcmNlbnR1YWw7XG4gICAgICAgICAgICB2YWxvclZhbHVlID0gY2MudmFsb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXhQY3Q6IHBlcmNlbnR1YWwgbcOheGltbyBxdWUgZXN0ZSBDQyBwb2RlIHRlciAobsOjbyBwb2RlIHVsdHJhcGFzc2FyIG8gcmVzdGFudGUgZGEgY29udGEpXG4gICAgICAgIGNvbnN0IG1heFBjdCA9IHJlbWFpbmluZ1BjdDtcbiAgICAgICAgLy8gbWF4VmFsb3I6IHZhbG9yIG3DoXhpbW8gcXVlIGVzdGUgQ0MgcG9kZSB0ZXIgKG7Do28gcG9kZSB1bHRyYXBhc3NhciBvIHJlc3RhbnRlIGVtIGRpbmhlaXJvKVxuICAgICAgICBjb25zdCBtYXhWYWxvciA9IHJlbWFpbmluZ1ZhbG9yO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQyA9IGNjVmFsdWUgYXMgQ2VudHJvQ3VzdG9Mb29rdXAgfCBudWxsO1xuICAgICAgICB0aGlzLmNjRGlhbG9nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBjZW50cm9DdXN0bzogW3sgdmFsdWU6IGNjVmFsdWUsIGRpc2FibGVkOiB0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBwZXJjZW50dWFsOiBbeyB2YWx1ZTogcGVyY2VudHVhbFZhbHVlLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4KG1heFBjdCldXSxcbiAgICAgICAgICAgIHZhbG9yOiBbeyB2YWx1ZTogdmFsb3JWYWx1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heChtYXhWYWxvcildXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5nZXQoJ2NlbnRyb0N1c3RvJykudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBDZW50cm9DdXN0b0xvb2t1cCkgPT4gKHRoaXMuc2VsZWN0ZWRDQyA9IHZhbHVlIHx8IG51bGwpKTtcbiAgICAgICAgdGhpcy5zZXR1cFBlcmNlbnR1YWxWYWxvclN5bmModGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cCwgKCkgPT4gdmFsb3JCYXNlQ0MpO1xuICAgICAgICB0aGlzLmNjRGlhbG9nRmllbGRzID0gdGhpcy5nZXRDQ0RpYWxvZ0ZpZWxkcygpO1xuICAgICAgICB0aGlzLmRpc3BsYXlDQ0RpYWxvZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2F2ZUNDRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5pbnZhbGlkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGNjQ29udHJvbCA9IHRoaXMuY2NEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjZW50cm9DdXN0bycpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICBjb25zdCBjZW50cm9DdXN0byA9IGRhdGEuY2VudHJvQ3VzdG87XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWwgPSBOdW1iZXIoZGF0YS5wZXJjZW50dWFsKSB8fCAwO1xuICAgICAgICBjb25zdCB2YWxvciA9ICsoTnVtYmVyKGRhdGEudmFsb3IpIHx8IDApLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbdGhpcy5lZGl0aW5nQ0NDb250YUluZGV4XTtcbiAgICAgICAgY29uc3QgaWRDZW50cm9DdXN0byA9IHRoaXMuc2VsZWN0ZWRDQz8uaWQgfHwgY2VudHJvQ3VzdG8/LmlkIHx8ICcnO1xuXG4gICAgICAgIC8vIFZhbGlkYcOnw6NvIGFuYWzDrXRpY2E6IENDIHNpbnTDqXRpY28gb3UgcXVlIG7Do28gYWNlaXRhIHJhdGVpbyDDqSBpbnbDoWxpZG9cbiAgICAgICAgY29uc3QgY2NJbnZhbGlkbyA9IHRoaXMuc2VsZWN0ZWRDQz8uYWNlUmF0ID09PSBmYWxzZVxuICAgICAgICAgICAgfHwgdGhpcy5zZWxlY3RlZENDPy5hbmFTaW4gPT09IEVycFJhdGVpb0VkaXRvckNvbXBvbmVudC5BTkFfU0lOX1NJTlRFVElDTztcbiAgICAgICAgaWYgKGNjSW52YWxpZG8pIHtcbiAgICAgICAgICAgIGNjQ29udHJvbC5zZXRFcnJvcnMoeyBjZW50cm9DdXN0b0ludmFsaWRvOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gZGUgZHVwbGljaWRhZGUgbmEgbWVzbWEgY29udGEgKGFkacOnw6NvIGUgZWRpw6fDo28sIGlnbm9yYW5kbyBvIGl0ZW0gZW0gZWRpw6fDo28pXG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGNvbnN0IGR1cGxpY2FkbyA9IGNjTGlzdC5zb21lKFxuICAgICAgICAgICAgKGNjLCBpKSA9PiBpICE9PSB0aGlzLmVkaXRpbmdDQ0luZGV4ICYmIGNjLmlkQ2VudHJvQ3VzdG8gPT09IGlkQ2VudHJvQ3VzdG9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGR1cGxpY2Fkbykge1xuICAgICAgICAgICAgY2NDb250cm9sLnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNjID0gY29udGEucmF0ZWlvc0NDdXN0b1t0aGlzLmVkaXRpbmdDQ0luZGV4XTtcbiAgICAgICAgICAgIGNjLnBlcmNlbnR1YWwgPSBwZXJjZW50dWFsO1xuICAgICAgICAgICAgY2MudmFsb3IgPSB2YWxvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ0N1c3RvID0gY2VudHJvQ3VzdG8/LmxhYmVsIHx8ICcnO1xuICAgICAgICAgICAgY29udGEucmF0ZWlvc0NDdXN0byA9IFsuLi5jY0xpc3QsIHsgaWRDZW50cm9DdXN0bywgZGVzY0NDdXN0bzogbGFiZWxDQ3VzdG8sIHBlcmNlbnR1YWwsIHZhbG9yIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIHRoaXMuZGlzcGxheUNDRGlhbG9nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkhpZGVDQ0RpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5Q0NEaWFsb2cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA9PT0gQcOHw5VFUyBEQSBUQUJFTEEgPT09XG5cbiAgICBwdWJsaWMgb25EZWxldGVTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5sZW5ndGgpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IGlkc1RvUmVtb3ZlID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvbi5tYXAocyA9PiBzLmlkQ29udGFGaW5hbmNlaXJhKSk7XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5maWx0ZXIoYyA9PiAhaWRzVG9SZW1vdmUuaGFzKGMuaWRDb250YUZpbmFuY2VpcmEpKTtcbiAgICAgICAgaWRzVG9SZW1vdmUuZm9yRWFjaChpZCA9PiBkZWxldGUgdGhpcy5jY1NlbGVjdGlvbltpZF0pO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogUmVtb3ZlIG9zIGNlbnRyb3MgZGUgY3VzdG8gc2VsZWNpb25hZG9zIGRlIHVtYSBjb250YSBmaW5hbmNlaXJhLiAqL1xuICAgIHB1YmxpYyBvbkRlbGV0ZVNlbGVjdGVkQ0MoY29udGE6IFJhdGVpb0NvbnRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjaW9uYWRvcyA9IHRoaXMuY2NTZWxlY3Rpb25bY29udGEuaWRDb250YUZpbmFuY2VpcmFdIHx8IFtdO1xuICAgICAgICBpZiAoIXNlbGVjaW9uYWRvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLm5lbmh1bV9jZW50cm9fY3VzdG9fc2VsZWNpb25hZG8nKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRzVG9SZW1vdmUgPSBuZXcgU2V0KHNlbGVjaW9uYWRvcy5tYXAoY2MgPT4gY2MuaWRDZW50cm9DdXN0bykpO1xuICAgICAgICBjb250YS5yYXRlaW9zQ0N1c3RvID0gY29udGEucmF0ZWlvc0NDdXN0by5maWx0ZXIoY2MgPT4gIWlkc1RvUmVtb3ZlLmhhcyhjYy5pZENlbnRyb0N1c3RvKSk7XG4gICAgICAgIHRoaXMuY2NTZWxlY3Rpb25bY29udGEuaWRDb250YUZpbmFuY2VpcmFdID0gW107XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IFsuLi50aGlzLmNvbnRhc0RhdGFTb3VyY2VdO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlckNvbnRhKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZpZGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbaW5kZXhdO1xuICAgICAgICBpZiAocmVtb3ZpZGEpIHsgZGVsZXRlIHRoaXMuY2NTZWxlY3Rpb25bcmVtb3ZpZGEuaWRDb250YUZpbmFuY2VpcmFdOyB9XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZXJDZW50cm9DdXN0byhjb250YUluZGV4OiBudW1iZXIsIGNjSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250YSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZVtjb250YUluZGV4XTtcbiAgICAgICAgY29udGEucmF0ZWlvc0NDdXN0byA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8uZmlsdGVyKChfLCBpKSA9PiBpICE9PSBjY0luZGV4KTtcbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldENvbnRhSW5kZXgocm93RGF0YTogUmF0ZWlvQ29udGEpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLmluZGV4T2Yocm93RGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENDSW5kZXgoY29udGE6IFJhdGVpb0NvbnRhLCBjYzogUmF0ZWlvQ0N1c3RvKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIChjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdKS5pbmRleE9mKGNjKTtcbiAgICB9XG5cbiAgICAvLyA9PT0gUFJJVkFET1MgPT09XG5cbiAgICAvKiogSW5pY2lhbGl6YSBvIGNvbXBvbmVudGUgYSBwYXJ0aXIgZG9zIGlucHV0cyAoc2VtIGNoYW1hZGEgw6AgQVBJIGRlIGNhcmdhKS4gKi9cbiAgICBwcml2YXRlIGluaWNpYWxpemFyUG9ySW5wdXRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRlZENvbnRleHQgPSAodGhpcy5pbml0aWFsQ29udGV4dCB8fCB7fSkgYXMgUmV0b3JuYXJSYXRlaW9PdXRwdXQ7XG4gICAgICAgIHRoaXMucG9wdWxhckNvbVJhdGVpb3ModGhpcy5pbml0aWFsUmF0ZWlvcyB8fCBbXSk7XG4gICAgICAgIGlmICghdGhpcy5lbXByZXNhSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1wcmVzYUlkID0gdGhpcy5pbml0aWFsQ29udGV4dD8uZTA3MGZpbD8uZTA3MGVtcD8uaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkQ29sdW1ucyA9IHRoaXMuZ2V0R3JpZENvbHVtbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhcnJlZ2FyUmF0ZWlvKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlcnZpY2VcbiAgICAgICAgICAgIC5yZXRvcm5hclJhdGVpbyh7IGlkTW92aW1lbnRvOiB0aGlzLmlkTW92aW1lbnRvLCB0aXBvTW92aW1lbnRvOiB0aGlzLnRpcG9Nb3ZpbWVudG8gfSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKG91dHB1dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZENvbnRleHQgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhckNvbVJhdGVpb3Mob3V0cHV0LnJhdGVpbyB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbXByZXNhSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1wcmVzYUlkID0gb3V0cHV0LmUwNzBmaWwuZTA3MGVtcC5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRDb2x1bW5zID0gdGhpcy5nZXRHcmlkQ29sdW1ucygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycikgPT4gdGhpcy5lcnJvci5lbWl0KHsgb3BlcmFjYW86ICdsb2FkJywgbWVzc2FnZTogZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fY2FycmVnYXInKSwgb3JpZ2luYWxFcnJvcjogZXJyIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9wdWxhckNvbVJhdGVpb3MocmF0ZWlvczogUmF0ZWlvQ29udGFbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhc0RhdGFTb3VyY2UgPSBbLi4ucmF0ZWlvc107XG4gICAgICAgIHRoaXMuY2NTZWxlY3Rpb24gPSB7fTtcbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlLmZvckVhY2goY29udGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5jY1NlbGVjdGlvbltjb250YS5pZENvbnRhRmluYW5jZWlyYV0gPSBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzdHJpYnVpw6fDo28gY29tcGxldGE6IHJlc3RhbnRlcyBnbG9iYWlzIGUgZGUgY2FkYSBjb250YSBpZ3VhaXMgYSB6ZXJvLlxuICAgICAqIEV4cG9zdG8gcHVibGljYW1lbnRlIHBhcmEgcXVlIG8gdGVtcGxhdGUgcG9zc2EgcmVhZ2lyIGFvIGVzdGFkbyByZWFsIGRlXG4gICAgICogY29tcGxldHVkZSAoY29udGFzICsgY2VudHJvcyBkZSBjdXN0bykuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXN0cmlidWljYW9Db21wbGV0YSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMucGVyY2VudHVhbFJlc3RhbnRlICE9PSAwIHx8IHRoaXMudmFsb3JSZXN0YW50ZSAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFzRGF0YVNvdXJjZS5ldmVyeShjb250YSA9PiB0aGlzLmlzQ29udGFDQ0NvbXBsZXRhKGNvbnRhKSk7XG4gICAgfVxuXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzYXIgbyBnZXR0ZXIgYGRpc3RyaWJ1aWNhb0NvbXBsZXRhYC4gTWFudGlkbyBwYXJhIGNvbXBhdGliaWxpZGFkZSBpbnRlcm5hLiAqL1xuICAgIHByaXZhdGUgaXNEaXN0cmlidWljYW9Db21wbGV0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzdHJpYnVpY2FvQ29tcGxldGE7XG4gICAgfVxuXG4gICAgLyoqIEluZGljYSBzZSBow6EgYW8gbWVub3MgdW1hIGNvbnRhIGZpbmFuY2VpcmEgc2VtIG5lbmh1bSBjZW50cm8gZGUgY3VzdG8gdmluY3VsYWRvLiAqL1xuICAgIHByaXZhdGUgaGFzQ29udGFTZW1DZW50cm9DdXN0bygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFzRGF0YVNvdXJjZS5zb21lKGNvbnRhID0+IChjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdKS5sZW5ndGggPT09IDApO1xuICAgIH1cblxuICAgIC8qKiBSZXN0YW50ZSBkZSAlIGUgZGUgdmFsb3IgZG9zIGNlbnRyb3MgZGUgY3VzdG8gZGUgdW1hIGNvbnRhIGlndWFsIGEgemVyby4gKi9cbiAgICBwcml2YXRlIGlzQ29udGFDQ0NvbXBsZXRhKGNvbnRhOiBSYXRlaW9Db250YSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjY3MgPSBjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdO1xuICAgICAgICBpZiAoY2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gU2VtIGNlbnRybyBkZSBjdXN0byBzw7Mgw6kgdsOhbGlkbyBxdWFuZG8gbyBjcml0w6lyaW8gbsOjbyBleGlnZSByYXRlaW8gcG9yIEMuIEN1c3Rvcy5cbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlc0NlbnRyb0N1c3RvO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvbWFQY3QgPSBjY3MucmVkdWNlKChhY2MsIGNjKSA9PiBhY2MgKyAoY2MucGVyY2VudHVhbCB8fCAwKSwgMCk7XG4gICAgICAgIGNvbnN0IHNvbWFWYWxvciA9IGNjcy5yZWR1Y2UoKGFjYywgY2MpID0+IGFjYyArIChjYy52YWxvciB8fCAwKSwgMCk7XG4gICAgICAgIGNvbnN0IHBjdFJlc3RhbnRlID0gKygxMDAgLSBzb21hUGN0KS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICAgICAgY29uc3QgdmFsb3JSZXN0YW50ZSA9ICsoKGNvbnRhLnZhbG9yUmF0ZWFkb0NvbnRhIHx8IDApIC0gc29tYVZhbG9yKS50b0ZpeGVkKHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMik7XG4gICAgICAgIHJldHVybiBwY3RSZXN0YW50ZSA9PT0gMCAmJiB2YWxvclJlc3RhbnRlID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q29udGFEaWFsb2dGaWVsZHMoKTogRm9ybUZpZWxkW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5lMDkxUGxmTG9va3VwLm1vdW50T3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiAnY29udGFGaW5hbmNlaXJhJyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlGaWVsZHM6IFsnYW5hU2luJ10sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdleGNsdWlkbycsIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLCB2YWx1ZXM6IFsnZmFsc2UnXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ3NpdEZpbicsIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLCB2YWx1ZXM6IFsnVkEnXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ2UwNzBlbXAnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbdGhpcy5lbXByZXNhSWRdIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3BlcmNlbnR1YWwnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IucGVyY2VudHVhbCcpLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNiwgbGc6IDYsIHhsOiA2IH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZSxcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IDcsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0LFxuICAgICAgICAgICAgICAgIHJpZ2h0QWRkb246IHsgbGFiZWw6ICclJyB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd2YWxvcicsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci52YWxvcicpLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNiwgbGc6IDYsIHhsOiA2IH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLk1vbmV5LFxuICAgICAgICAgICAgICAgIGN1cnJlbm5jeTogKCkgPT4gdGhpcy5jdXJyZW5jeUNvZGUsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAxOCxcbiAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q0NEaWFsb2dGaWVsZHMoKTogRm9ybUZpZWxkW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5lMDQ0Q2N1TG9va3VwLm1vdW50T3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiAnY2VudHJvQ3VzdG8nLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeUZpZWxkczogWydhbmFTaW4nLCAnYWNlUmF0J10sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdleGNsdWlkbycsIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLCB2YWx1ZXM6IFsnZmFsc2UnXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ3NpdENjdScsIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLCB2YWx1ZXM6IFsnVkEnXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ2UwNzBlbXAnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbdGhpcy5lbXByZXNhSWRdIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3BlcmNlbnR1YWwnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IucGVyY2VudHVhbCcpLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNiwgbGc6IDYsIHhsOiA2IH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZSxcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IDcsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0LFxuICAgICAgICAgICAgICAgIHJpZ2h0QWRkb246IHsgbGFiZWw6ICclJyB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd2YWxvcicsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci52YWxvcicpLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNiwgbGc6IDYsIHhsOiA2IH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLk1vbmV5LFxuICAgICAgICAgICAgICAgIGN1cnJlbm5jeTogKCkgPT4gdGhpcy5jdXJyZW5jeUNvZGUsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAxOCxcbiAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbmNyb25pemEgb3MgY2FtcG9zIHBlcmNlbnR1YWwgZSB2YWxvciBkZSB1bSBGb3JtR3JvdXAgZGUgbW9kYWwuXG4gICAgICogUXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhIHBlcmNlbnR1YWwsIHJlY2FsY3VsYSB2YWxvciAocGVyY2VudHVhbC8xMDAgKiBiYXNlKS5cbiAgICAgKiBRdWFuZG8gbyB1c3XDoXJpbyBhbHRlcmEgdmFsb3IsIHJlY2FsY3VsYSBwZXJjZW50dWFsICh2YWxvci9iYXNlICogMTAwKS5cbiAgICAgKiBPIGFyZ3VtZW50byBnZXRCYXNlIHJldG9ybmEgYSBiYXNlIHVzYWRhIG5vIGPDoWxjdWxvICh2YWxvckJhc2UgZ2xvYmFsIG91IHZhbG9yUmF0ZWFkb0NvbnRhIGRhIGNvbnRhIHBhaSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cFBlcmNlbnR1YWxWYWxvclN5bmMoZm9ybTogRm9ybUdyb3VwLCBnZXRCYXNlOiAoKSA9PiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGVyY2VudHVhbFNjYWxlID0gdGhpcy5jb25maWcucGVyY2VudGFnZVNjYWxlID8/IDQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbmN5U2NhbGUgPSB0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDI7XG5cbiAgICAgICAgZm9ybS5nZXQoJ3BlcmNlbnR1YWwnKS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShwY3QgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBnZXRCYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHBjdCA9PSBudWxsIHx8IGJhc2UgPT0gbnVsbCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3ZvVmFsb3IgPSArKChOdW1iZXIocGN0KSAvIDEwMCkgKiBiYXNlKS50b0ZpeGVkKGN1cnJlbmN5U2NhbGUpO1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoZm9ybS5nZXQoJ3ZhbG9yJykudmFsdWUpICE9PSBub3ZvVmFsb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5nZXQoJ3ZhbG9yJykuc2V0VmFsdWUobm92b1ZhbG9yLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZm9ybS5nZXQoJ3ZhbG9yJykudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gZ2V0QmFzZSgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCAhYmFzZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBjb25zdCBub3ZvUGN0ID0gKygoTnVtYmVyKHZhbCkgLyBiYXNlKSAqIDEwMCkudG9GaXhlZChwZXJjZW50dWFsU2NhbGUpO1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoZm9ybS5nZXQoJ3BlcmNlbnR1YWwnKS52YWx1ZSkgIT09IG5vdm9QY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5nZXQoJ3BlcmNlbnR1YWwnKS5zZXRWYWx1ZShub3ZvUGN0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcmlkQ29sdW1ucygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnY29udGFGaW5hbmNlaXJhJywgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuY29udGFfZmluYW5jZWlyYScpIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAncGVyY2VudHVhbCcsIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnBlcmNlbnR1YWwnKSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ3ZhbG9yUmF0ZWFkb0NvbnRhJywgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IudmFsb3InKSB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0Q2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGlzRGlydHk6IHRydWUsXG4gICAgICAgICAgICBpc1ZhbGlkOiB0aGlzLmlzRGlzdHJpYnVpY2FvQ29tcGxldGEoKSxcbiAgICAgICAgICAgIHJhdGVpb3M6IHRoaXMuY29udGFzRGF0YVNvdXJjZVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
861
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLXJhdGVpby1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvZXJweC1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9yYXRlaW8tZWRpdG9yL2VycC1yYXRlaW8tZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsSCxPQUFPLEVBQ0gsY0FBYyxFQUNkLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNaLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBa0JyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBT3pDO0lBME5JLGtDQUNxQixFQUFlLEVBQ2YsT0FBK0IsRUFDL0IsU0FBMkIsRUFDM0IsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsY0FBOEI7UUFMOUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGtC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K0RBQW1CO0lBS2xCO1FBQVIsS0FBSyxFQUFFO2lFQUFxQjtJQUtwQjtRQUFSLEtBQUssRUFBRTsrREFBbUI7SUFNbEI7UUFBUixLQUFLLEVBQUU7b0VBQXdCO0lBTXZCO1FBQVIsS0FBSyxFQUFFO2tFQUFzQjtJQUdwQjtRQUFULE1BQU0sRUFBRTswREFBNEM7SUFDM0M7UUFBVCxNQUFNLEVBQUU7NERBQW1DO0lBQ2xDO1FBQVQsTUFBTSxFQUFFOzREQUFnRDtJQUMvQztRQUFULE1BQU0sRUFBRTsyREFBOEM7SUFHN0I7UUFBekIsU0FBUyxDQUFDLGFBQWEsQ0FBQzsyREFBdUI7SUF4R3ZDLHdCQUF3QjtRQUxwQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLG1tZkFBaUQ7O1NBRXBELENBQUM7T0FDVyx3QkFBd0IsQ0E4MUJwQztJQUFELCtCQUFDO0NBQUEsQUE5MUJELElBODFCQztTQTkxQlksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEUwNDRDY3VMb29rdXAsIEUwOTFQbGZMb29rdXAsIEVudW1Mb2dpY2FsT3BlcmF0b3IgfSBmcm9tICdAc2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgICBCdXR0b25Qcmlvcml0eSxcbiAgICBCdXR0b25TaXplLFxuICAgIEZpZWxkVHlwZSxcbiAgICBGb3JtRmllbGRcbn0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVycFJhdGVpb0VkaXRvclNlcnZpY2UgfSBmcm9tICcuL2VycC1yYXRlaW8tZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBHcmF2YXJSYXRlaW9NYW51YWxJbnB1dCxcbiAgICBJbnRlZ3JhY2FvQ29udHJvbGFkb3JpYSxcbiAgICBSYXRlaW9DaGFuZ2VFdmVudCxcbiAgICBSYXRlaW9Db250YSxcbiAgICBSYXRlaW9DQ3VzdG8sXG4gICAgUmF0ZWlvRWRpdG9yQ29uZmlnLFxuICAgIFJhdGVpb0Vycm9yRXZlbnQsXG4gICAgUmF0ZWlvU2F2ZUV2ZW50LFxuICAgIFJldG9ybmFyUmF0ZWlvT3V0cHV0LFxuICAgIFN1Z2VyaXJSYXRlaW9JbnB1dCxcbiAgICBTdWdlcmlyUmF0ZWlvUGFyYW1ldHJvLFxuICAgIFRpcG9Nb3ZpbWVudG8sXG4gICAgQ3JpdGVyaW9SYXRlaW8sXG4gICAgQ29udGFGaW5hbmNlaXJhTG9va3VwLFxuICAgIENlbnRyb0N1c3RvTG9va3VwXG59IGZyb20gJy4vZXJwLXJhdGVpby1lZGl0b3IudHlwZXMnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcnAtcmF0ZWlvLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VycC1yYXRlaW8tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9lcnAtcmF0ZWlvLWVkaXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVycFJhdGVpb0VkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAgIC8qKiBWYWxvciBkZSBhbmFTaW4gcXVlIGluZGljYSByZWdpc3RybyBzaW50w6l0aWNvIChuw6NvIGFuYWzDrXRpY28pLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFOQV9TSU5fU0lOVEVUSUNPID0gJ1ZTJztcblxuICAgIC8vID09PSBJTlBVVFMgPT09XG4gICAgQElucHV0KCkgaWRNb3ZpbWVudG86IHN0cmluZztcbiAgICBASW5wdXQoKSB0aXBvTW92aW1lbnRvOiBUaXBvTW92aW1lbnRvO1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgQElucHV0KCkgc2hvd1N1Z2VzdGFvQnV0dG9uID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBjb25maWc6IFJhdGVpb0VkaXRvckNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIENvbnRleHRvIGluaWNpYWwgdXNhZG8gcXVhbmRvIG8gY29tcG9uZW50ZSDDqSBhbGltZW50YWRvIHBvciBpbnB1dHMgZW0gdmV6IGRhIEFQSS5cbiAgICAgKiBBcGxpY2Etc2UgYW8gbW9kbyBzdGFuZGFsb25lIChzZW0gaWRNb3ZpbWVudG8pIGUgYW8gbW9kbyBjb25lY3RhZG8gY29tXG4gICAgICogbG9hZEZyb21BcGkgPSBmYWxzZS4gRm9ybmVjZSB2YWxvckJhc2UsIGZpbGlhbCwgY3JpdMOpcmlvLCBhZ3J1cGFkb3JJZCwgZGF0YXMsIGV0Yy5cbiAgICAgKiBFbSBtb2RvIGNvbmVjdGFkbyBzZW0gY2FyZ2EgdmlhIEFQSSwgw6kgZGVzdGUgY29udGV4dG8gcXVlIGEgZ3JhdmHDp8Ojb1xuICAgICAqIChncmF2YXJSYXRlaW9NYW51YWwpIG9idMOpbSBlMDcwZmlsLCBjcmlSYXQsIGRhdGFCYXNlLCBkYXRhTW92aW1lbnRvIGUgYWdydXBhZG9ySWQuXG4gICAgICovXG4gICAgQElucHV0KCkgaW5pdGlhbENvbnRleHQ/OiBQYXJ0aWFsPFJldG9ybmFyUmF0ZWlvT3V0cHV0PjtcblxuICAgIC8qKiBSYXRlaW9zIGluaWNpYWlzIHBhcmEgcG9wdWxhciBhIGdyaWQgcXVhbmRvIGFsaW1lbnRhZG8gcG9yIGlucHV0cy4gKi9cbiAgICBASW5wdXQoKSBpbml0aWFsUmF0ZWlvcz86IFJhdGVpb0NvbnRhW107XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sYSBzZSBvIHJhdGVpbyBkZXZlIHNlciBjYXJyZWdhZG8gYXV0b21hdGljYW1lbnRlIHZpYSBBUEkgcXVhbmRvXG4gICAgICogaWRNb3ZpbWVudG8gZXN0w6EgcHJlc2VudGUgKG1vZG8gY29uZWN0YWRvKS4gRGVmYXVsdDogdHJ1ZS5cbiAgICAgKlxuICAgICAqIERlZmluYSBjb21vIGZhbHNlIHBhcmEgcmVzdGF1cmFyIHVtIHJhdGVpbyBxdWUgbyB1c3XDoXJpbyBqw6EgZGlzdHJpYnVpdSBlIHF1ZVxuICAgICAqIGFpbmRhIG7Do28gZm9pIHBlcnNpc3RpZG8gbm8gYmFja2VuZCBkZSByYXRlaW86IG8gY29tcG9uZW50ZSBwb3B1bGEgYSBncmlkIGFcbiAgICAgKiBwYXJ0aXIgZGUgaW5pdGlhbENvbnRleHQvaW5pdGlhbFJhdGVpb3MgZSBtYW50w6ltIG8gYm90w6NvIFNhbHZhciBlIGEgZ3JhdmHDp8Ojb1xuICAgICAqIHZpbmN1bGFkYSBhbyBtb3ZpbWVudG8uXG4gICAgICovXG4gICAgQElucHV0KCkgbG9hZEZyb21BcGkgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgZW1wcmVzYSB1c2FkbyBwYXJhIGZpbHRyYXIgb3MgbG9va3VwcyBkZSBjb250YSBmaW5hbmNlaXJhIGUgY2VudHJvIGRlIGN1c3RvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIHNvYnJlc2NyZXZlIG8gSUQgZGVyaXZhZG8gZG8gY29udGV4dG8gY2FycmVnYWRvL2luaWNpYWwuXG4gICAgICovXG4gICAgQElucHV0KCkgZW1wcmVzYUlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkYSBmaWxpYWwgdXNhZG8gcGVsYSBBUEkgZGUgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKiBRdWFuZG8gaW5mb3JtYWRvLCB0ZW0gcHJpb3JpZGFkZSBzb2JyZSBvIElEIGRlcml2YWRvIGRvIGNvbnRleHRvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbGlhbElkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDcml0w6lyaW8gZGUgcmF0ZWlvIHBhZHLDo28gdXNhZG8gcGVsYSBBUEkgZGUgc3VnZXN0w6NvLlxuICAgICAqIERlZmF1bHQ6ICdWMycgKERlc3Blc2FzIOKAlCBDb250YSBYIEMuIEN1c3RvcykuXG4gICAgICovXG4gICAgQElucHV0KCkgY3JpUmF0OiBDcml0ZXJpb1JhdGVpbyA9ICdWMyc7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkYSBjb250YSBmaW5hbmNlaXJhIChlMDkxcGxmKSBwYXJhIGZpbHRyYXIgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIMOpIGVudmlhZG8gY29tbyBwYXLDom1ldHJvIG5hIEFQSSBzdWdlcmlyUmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGUwOTFwbGZJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZG8gY2VudHJvIGRlIGN1c3RvIChlMDQ0Y2N1KSBwYXJhIGZpbHRyYXIgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIMOpIGVudmlhZG8gY29tbyBwYXLDom1ldHJvIG5hIEFQSSBzdWdlcmlyUmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGUwNDRjY3VJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgdHJhbnNhw6fDo28gdXNhZGEgcGFyYSBmaWx0cmFyIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpZFRyYW5zYWNhbzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgZmFtw61saWEgdXNhZGEgcGFyYSBmaWx0cmFyIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpZEZhbWlsaWE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRhIGRlcml2YcOnw6NvIHVzYWRhIHBhcmEgZmlsdHJhciBhIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICovXG4gICAgQElucHV0KCkgaWREZXJpdmFjYW86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRvIHNlcnZpw6dvIHVzYWRvIHBhcmEgZmlsdHJhciBhIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICovXG4gICAgQElucHV0KCkgaWRTZXJ2aWNvOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBWYWxvciBleGNlZGVudGUgaW5mb3JtYWRvIHBhcmEgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIMOpIGVudmlhZG8gY29tbyBwYXLDom1ldHJvIG5hIEFQSSBzdWdlcmlyUmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbG9yRXhjZWRlbnRlOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDw7NkaWdvIElTTyBkYSBtb2VkYSBwYXJhIGZvcm1hdGHDp8OjbyBkZSB2YWxvcmVzIG5hIGdyaWQgKGV4OiAnQlJMJywgJ1VTRCcpLlxuICAgICAqIFNlIG7Do28gaW5mb3JtYWRvLCB1c2EgZXN0aWxvIGRlY2ltYWwgc2VtIHPDrW1ib2xvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5Q29kZTogc3RyaW5nO1xuXG4gICAgLy8gPT09IE9VVFBVVFMgPT09XG4gICAgQE91dHB1dCgpIHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhdGVpb1NhdmVFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJhdGVpb0NoYW5nZUV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8UmF0ZWlvRXJyb3JFdmVudD4oKTtcblxuICAgIC8vID09PSBSRUZFUsOKTkNJQVMgRE8gVEVNUExBVEUgPT09XG4gICAgQFZpZXdDaGlsZCgndGFibGVSYXRlaW8nKSByZWFkb25seSB0YWJsZTogVGFibGU7XG5cbiAgICAvLyA9PT0gQ09OU1RBTlRFUyBFWFBPU1RBUyBBTyBURU1QTEFURSA9PT1cbiAgICByZWFkb25seSBCdXR0b25Qcmlvcml0eSA9IEJ1dHRvblByaW9yaXR5O1xuICAgIHJlYWRvbmx5IEJ1dHRvblNpemUgPSBCdXR0b25TaXplO1xuXG4gICAgLy8gPT09IEVTVEFETyA9PT1cbiAgICBwdWJsaWMgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGVkQ29udGV4dDogUmV0b3JuYXJSYXRlaW9PdXRwdXQ7XG4gICAgcHVibGljIHNlbGVjdGlvbjogYW55W10gPSBbXTtcbiAgICAvKiogU2VsZcOnw6NvIGRlIGNlbnRyb3MgZGUgY3VzdG8gcG9yIGNvbnRhIGZpbmFuY2VpcmEgKGtleWVkIHBvciBpZENvbnRhRmluYW5jZWlyYSkuICovXG4gICAgcHVibGljIGNjU2VsZWN0aW9uOiB7IFtpZENvbnRhRmluYW5jZWlyYTogc3RyaW5nXTogUmF0ZWlvQ0N1c3RvW10gfSA9IHt9O1xuICAgIHB1YmxpYyBncmlkQ29sdW1uczogYW55W107XG4gICAgcHVibGljIGNvbnRhc0RhdGFTb3VyY2U6IFJhdGVpb0NvbnRhW10gPSBbXTtcbiAgICBwdWJsaWMgZWRpdGluZ1Jvd0JhY2t1cDogUmF0ZWlvQ29udGEgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZWRpdGluZ0NDQmFja3VwOiBSYXRlaW9DQ3VzdG8gfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiDDmmx0aW1vIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGxvb2t1cCBkZSBjb250YSAoY2FycmVnYSBhbmFTaW4gcGFyYSB2YWxpZGHDp8OjbykuICovXG4gICAgcHVibGljIHNlbGVjdGVkQ29udGE6IENvbnRhRmluYW5jZWlyYUxvb2t1cCB8IG51bGwgPSBudWxsO1xuICAgIC8qKiDDmmx0aW1vIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGxvb2t1cCBkZSBjZW50cm8gZGUgY3VzdG8gKGNhcnJlZ2EgYW5hU2luL2FjZVJhdCkuICovXG4gICAgcHVibGljIHNlbGVjdGVkQ0M6IENlbnRyb0N1c3RvTG9va3VwIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyA9PT0gTU9EQUwgQ09OVEEgRklOQU5DRUlSQSA9PT1cbiAgICBwdWJsaWMgZGlzcGxheUNvbnRhRGlhbG9nID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnRhRGlhbG9nRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNvbnRhRGlhbG9nRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZWRpdGluZ0NvbnRhSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gPT09IE1PREFMIENFTlRSTyBERSBDVVNUTyA9PT1cbiAgICBwdWJsaWMgZGlzcGxheUNDRGlhbG9nID0gZmFsc2U7XG4gICAgcHVibGljIGNjRGlhbG9nRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNjRGlhbG9nRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZWRpdGluZ0NDQ29udGFJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGVkaXRpbmdDQ0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwdWJsaWMgZ2V0IGVmZmVjdGl2ZVJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpYzogSW50ZWdyYWNhb0NvbnRyb2xhZG9yaWEgfCB1bmRlZmluZWQgPSB0aGlzLmxvYWRlZENvbnRleHQ/LmludGVncmFjYW9Db250cm9sYWRvcmlhO1xuICAgICAgICBjb25zdCBoYXNJbnRlZ3JhY2FvID0gISFpYyAmJiAoXG4gICAgICAgICAgICBpYy5jb250YWJpbGlkYWRlID09PSB0cnVlIHx8XG4gICAgICAgICAgICBpYy50cmlidXRvcyA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgaWMucGF0cmltb25pbyA9PT0gdHJ1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkT25seSB8fCBoYXNJbnRlZ3JhY2FvO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29udGFzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ2NvbnRhcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbG9yQmFzZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWRDb250ZXh0Py52YWxvckJhc2UgPz8gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBlcmNlbnR1YWxSZXN0YW50ZSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzb21hID0gdGhpcy5jb250YXNEYXRhU291cmNlLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGNvbnRhKSA9PiBhY2MgKyAoY29udGEucGVyY2VudHVhbCB8fCAwKSwgMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gKygxMDAgLSBzb21hKS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbG9yUmVzdGFudGUoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc29tYSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBjb250YSkgPT4gYWNjICsgKGNvbnRhLnZhbG9yUmF0ZWFkb0NvbnRhIHx8IDApLCAwXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiArKHRoaXMudmFsb3JCYXNlIC0gc29tYSkudG9GaXhlZCh0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbG9yIHJlc3RhbnRlIGEgc2VyIGV4aWJpZG8gbm9zIGNhcmRzIGRlIHJlc3Vtby5cbiAgICAgKiBDb25zaWRlcmEgbyB0b3RhbCBqw6EgZGlzdHJpYnXDrWRvIG5vcyBjZW50cm9zIGRlIGN1c3RvIGRlIHRvZGFzIGFzIGNvbnRhc1xuICAgICAqIChlIG7Do28gbyB0b3RhbCBkYXMgY29udGFzIGZpbmFuY2VpcmFzKSwgcmVmbGV0aW5kbyBhIGRpc3RyaWJ1acOnw6NvIHJlYWxcbiAgICAgKiBwb250YS1hLXBvbnRhIOKAlCBjZW50cm8gZGUgY3VzdG8gw6kgc2VtcHJlIG9icmlnYXTDs3Jpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbG9yUmVzdGFudGVEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRvdGFsQ0MgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2UucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgY29udGEpID0+IGFjYyArIChjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGNjQWNjLCBjYykgPT4gY2NBY2MgKyAoY2MudmFsb3IgfHwgMCksIDBcbiAgICAgICAgICAgICksIDBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICsodGhpcy52YWxvckJhc2UgLSB0b3RhbENDKS50b0ZpeGVkKHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyY2VudHVhbCByZXN0YW50ZSBhIHNlciBleGliaWRvIG5vcyBjYXJkcyBkZSByZXN1bW8uXG4gICAgICogRGVyaXZhZG8gZGUgYHZhbG9yUmVzdGFudGVEaXNwbGF5YCBwYXJhIG1hbnRlciBjb25zaXN0w6puY2lhIGNvbSBvIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGVyY2VudHVhbFJlc3RhbnRlRGlzcGxheSgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMudmFsb3JCYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKyh0aGlzLnZhbG9yUmVzdGFudGVEaXNwbGF5IC8gdGhpcy52YWxvckJhc2UgKiAxMDApLnRvRml4ZWQodGhpcy5jb25maWcucGVyY2VudGFnZVNjYWxlID8/IDQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyRm9ybWF0T3B0aW9ucygpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeUNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3lDb2RlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbnVtYmVyRm9ybWF0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHN0eWxlOiAnZGVjaW1hbCcsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDIsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogRXJwUmF0ZWlvRWRpdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZTA5MVBsZkxvb2t1cDogRTA5MVBsZkxvb2t1cCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlMDQ0Q2N1TG9va3VwOiBFMDQ0Q2N1TG9va3VwLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgY29udGFzOiB0aGlzLmZiLmFycmF5KFtdKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb3ZpbWVudG9DaGFuZ2VkID0gY2hhbmdlcy5pZE1vdmltZW50byB8fCBjaGFuZ2VzLnRpcG9Nb3ZpbWVudG87XG5cbiAgICAgICAgaWYgKG1vdmltZW50b0NoYW5nZWQgJiYgdGhpcy5pZE1vdmltZW50byAmJiB0aGlzLnRpcG9Nb3ZpbWVudG8gJiYgdGhpcy5sb2FkRnJvbUFwaSkge1xuICAgICAgICAgICAgLy8gTW9kbyBjb25lY3RhZG8gY29tIGNhcmdhIHZpYSBBUElcbiAgICAgICAgICAgIHRoaXMuY2FycmVnYXJSYXRlaW8oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5wdXREcml2ZW4gJiYgKGNoYW5nZXMuaW5pdGlhbENvbnRleHQgfHwgY2hhbmdlcy5pbml0aWFsUmF0ZWlvcyB8fCBjaGFuZ2VzLmxvYWRGcm9tQXBpIHx8IG1vdmltZW50b0NoYW5nZWQpKSB7XG4gICAgICAgICAgICAvLyBBbGltZW50YWRvIHBvciBpbnB1dHM6IG1vZG8gc3RhbmRhbG9uZSBPVSBjb25lY3RhZG8gc2VtIGNhcmdhIHZpYSBBUElcbiAgICAgICAgICAgIHRoaXMuaW5pY2lhbGl6YXJQb3JJbnB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZXRvcm5hIG8gY29udGXDumRvIGF0dWFsIGRhIGdyaWQgKHVzbyBzdGFuZGFsb25lIOKAlCBxdWVtIGNvbnNvbWUgbMOqIG9zIHJhdGVpb3MgZGFxdWkpLiAqL1xuICAgIHB1YmxpYyBnZXQgcmF0ZWlvcygpOiBSYXRlaW9Db250YVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFzRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBlc3TDoSBvcGVyYW5kbyBzZW0gaWRNb3ZpbWVudG8gKG1vZG8gc3RhbmRhbG9uZSkuICovXG4gICAgcHVibGljIGdldCBpc1N0YW5kYWxvbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pZE1vdmltZW50bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2UgbyBjb21wb25lbnRlIMOpIGFsaW1lbnRhZG8gcG9yIGlucHV0cyBlbSB2ZXogZGEgQVBJOlxuICAgICAqIG1vZG8gc3RhbmRhbG9uZSAoc2VtIGlkTW92aW1lbnRvKSBPVSBtb2RvIGNvbmVjdGFkbyBjb20gbG9hZEZyb21BcGkgPSBmYWxzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzSW5wdXREcml2ZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3RhbmRhbG9uZSB8fCAhdGhpcy5sb2FkRnJvbUFwaTtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBlc3TDoSBwcm9udG8gcGFyYSBleGliaXIgVUkgKGNhcnJlZ291IHZpYSBBUEkgT1UgZm9pIGluaWNpYWxpemFkbyBwb3IgaW5wdXRzKS4gKi9cbiAgICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMubG9hZGVkQ29udGV4dCB8fCB0aGlzLmlzSW5wdXREcml2ZW47XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvLyA9PT0gQcOHw5VFUyBQw5pCTElDQVMgPT09XG5cbiAgICBwdWJsaWMgb25TYWx2YXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZVJlYWRPbmx5KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbnRhU2VtQ2VudHJvQ3VzdG8oKSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX2NlbnRyb19jdXN0b19vYnJpZ2F0b3JpbycpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVycm9yLmVtaXQoeyBvcGVyYWNhbzogJ3NhdmUnLCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzdHJpYnVpY2FvQ29tcGxldGEoKSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX2Rpc3RyaWJ1aWNhb19pbmNvbXBsZXRhJyk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmxvYWRlZENvbnRleHQ7XG4gICAgICAgIGlmICghY3R4Py5lMDcwZmlsPy5pZCB8fCAhY3R4Py5jcmlSYXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb19jb250ZXh0b19pbmNvbXBsZXRvJyk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dDogR3JhdmFyUmF0ZWlvTWFudWFsSW5wdXQgPSB7XG4gICAgICAgICAgICBpZE1vdmltZW50bzogdGhpcy5pZE1vdmltZW50byxcbiAgICAgICAgICAgIHRpcG9Nb3ZpbWVudG86IHRoaXMudGlwb01vdmltZW50byxcbiAgICAgICAgICAgIGFncnVwYWRvcklkOiBjdHguYWdydXBhZG9ySWQsXG4gICAgICAgICAgICBlMDcwZmlsX2lkOiBjdHguZTA3MGZpbC5pZCxcbiAgICAgICAgICAgIGNyaXRlcmlvUmF0ZWlvOiBjdHguY3JpUmF0LFxuICAgICAgICAgICAgZGF0YUJhc2U6IGN0eC5kYXRhQmFzZSxcbiAgICAgICAgICAgIGRhdGFNb3ZpbWVudG86IGN0eC5kYXRhTW92aW1lbnRvLFxuICAgICAgICAgICAgcmF0ZWlvczogdGhpcy5jb250YXNEYXRhU291cmNlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdyYXZhclJhdGVpb01hbnVhbChpbnB1dClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnNhbHZvX2NvbV9zdWNlc3NvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3Iuc2Fsdm9fY29tX3N1Y2Vzc29fZGV0YWxoZScpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmUuZW1pdCh7IGlkTW92aW1lbnRvOiB0aGlzLmlkTW92aW1lbnRvLCB0aXBvTW92aW1lbnRvOiB0aGlzLnRpcG9Nb3ZpbWVudG8sIHJhdGVpb3M6IHRoaXMuY29udGFzRGF0YVNvdXJjZSB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fc2FsdmFyJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2U6IGRldGFpbCwgb3JpZ2luYWxFcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU3VnZXJpcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlUmVhZE9ubHkgfHwgIXRoaXMuc2hvd1N1Z2VzdGFvQnV0dG9uKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMubG9hZGVkQ29udGV4dDtcbiAgICAgICAgY29uc3QgZTA3MGZpbF9pZCA9IHRoaXMuZmlsaWFsSWQgfHwgY3R4Py5lMDcwZmlsPy5pZDtcbiAgICAgICAgY29uc3QgY3JpdGVyaW8gPSB0aGlzLmNyaVJhdCB8fCBjdHg/LmNyaVJhdDtcbiAgICAgICAgY29uc3QgdmFsb3JCYXNlID0gY3R4Py52YWxvckJhc2UgPz8gMDtcblxuICAgICAgICBpZiAoIWUwNzBmaWxfaWQgfHwgIWNyaXRlcmlvKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbWV0cm86IFN1Z2VyaXJSYXRlaW9QYXJhbWV0cm8gPSB7XG4gICAgICAgICAgICBlMDcwZmlsX2lkLFxuICAgICAgICAgICAgdmFsb3JCYXNlLFxuICAgICAgICAgICAgY3JpUmF0OiBjcml0ZXJpbyxcbiAgICAgICAgICAgIGRhdGFCYXNlOiBjdHg/LmRhdGFCYXNlLFxuICAgICAgICAgICAgZGF0YU1vdmltZW50bzogY3R4Py5kYXRhTW92aW1lbnRvXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuaWRNb3ZpbWVudG8pIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5pZE1vdmltZW50byA9IHRoaXMuaWRNb3ZpbWVudG87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZTA5MXBsZklkKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8uZTA5MXBsZl9pZCA9IHRoaXMuZTA5MXBsZklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmUwNDRjY3VJZCkge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmUwNDRjY3VfaWQgPSB0aGlzLmUwNDRjY3VJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZFRyYW5zYWNhbykge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkVHJhbnNhY2FvID0gdGhpcy5pZFRyYW5zYWNhbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZEZhbWlsaWEpIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5pZEZhbWlsaWEgPSB0aGlzLmlkRmFtaWxpYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZERlcml2YWNhbykge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkRGVyaXZhY2FvID0gdGhpcy5pZERlcml2YWNhbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZFNlcnZpY28pIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5pZFNlcnZpY28gPSB0aGlzLmlkU2VydmljbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52YWxvckV4Y2VkZW50ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8udmFsb3JFeGNlZGVudGUgPSB0aGlzLnZhbG9yRXhjZWRlbnRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQ6IFN1Z2VyaXJSYXRlaW9JbnB1dCA9IHtcbiAgICAgICAgICAgIHRpcG86IHRoaXMudGlwb01vdmltZW50byxcbiAgICAgICAgICAgIHBhcmFtZXRyb3M6IFtwYXJhbWV0cm9dXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnN1Z2VyaXJSYXRlaW8oaW5wdXQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmluYWxpemUoKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIChyZXNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Z2VzdGFvID0gKHJlc3Auc3VnZXN0YW8gfHwgW10pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZChzID0+ICF0aGlzLmlkTW92aW1lbnRvIHx8IHMuaWRNb3ZpbWVudG8gPT09IHRoaXMuaWRNb3ZpbWVudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVzcC5zdWdlc3RhbyB8fCBbXSlbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhdGVpbyA9IHN1Z2VzdGFvPy5yYXRlaW87XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3VnZXN0YW8gfHwgIXJhdGVpbyB8fCByYXRlaW8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGFyQ29tUmF0ZWlvcyhyYXRlaW8pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnIpID0+IHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc3VnZ2VzdCcsIG1lc3NhZ2U6IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3N1Z2VyaXInKSwgb3JpZ2luYWxFcnJvcjogZXJyIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8vID09PSBNT0RBTCBDT05UQSBGSU5BTkNFSVJBID09PVxuXG4gICAgcHVibGljIG9wZW5Db250YURpYWxvZyhlZGl0SW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ29udGFJbmRleCA9IGVkaXRJbmRleCAhPSBudWxsID8gZWRpdEluZGV4IDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nUGN0ID0gdGhpcy5lZGl0aW5nQ29udGFJbmRleCAhPSBudWxsXG4gICAgICAgICAgICA/IHRoaXMucGVyY2VudHVhbFJlc3RhbnRlICsgdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdLnBlcmNlbnR1YWxcbiAgICAgICAgICAgIDogdGhpcy5wZXJjZW50dWFsUmVzdGFudGU7XG4gICAgICAgIC8vIFVzYSBvIHZhbG9yIHJlc3RhbnRlIHJlYWwgZW0gdmV6IGRlIHJlY2FsY3VsYXIgdmlhIHBlcmNlbnR1YWwsIGV2aXRhbmRvXG4gICAgICAgIC8vIGRpZmVyZW7Dp2FzIGRlIGFycmVkb25kYW1lbnRvIGFjdW11bGFkYXMgbmFzIGVudHJhZGFzIGFudGVyaW9yZXMuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ1ZhbG9yID0gdGhpcy5lZGl0aW5nQ29udGFJbmRleCAhPSBudWxsXG4gICAgICAgICAgICA/ICsodGhpcy52YWxvclJlc3RhbnRlICsgdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdLnZhbG9yUmF0ZWFkb0NvbnRhKS50b0ZpeGVkKHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMilcbiAgICAgICAgICAgIDogdGhpcy52YWxvclJlc3RhbnRlO1xuXG4gICAgICAgIGxldCBjb250YVZhbHVlID0gbnVsbDtcbiAgICAgICAgbGV0IHBlcmNlbnR1YWxWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHJlbWFpbmluZ1BjdCA+IDAgPyByZW1haW5pbmdQY3QgOiBudWxsO1xuICAgICAgICBsZXQgdmFsb3JWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHBlcmNlbnR1YWxWYWx1ZSAhPSBudWxsID8gcmVtYWluaW5nVmFsb3IgOiBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhID0gdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdO1xuICAgICAgICAgICAgY29udGFWYWx1ZSA9IHsgaWQ6IGNvbnRhLmlkQ29udGFGaW5hbmNlaXJhLCBsYWJlbDogY29udGEuY29udGFGaW5hbmNlaXJhIH07XG4gICAgICAgICAgICBwZXJjZW50dWFsVmFsdWUgPSBjb250YS5wZXJjZW50dWFsO1xuICAgICAgICAgICAgdmFsb3JWYWx1ZSA9IGNvbnRhLnZhbG9yUmF0ZWFkb0NvbnRhO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbnRhID0gY29udGFWYWx1ZSBhcyBDb250YUZpbmFuY2VpcmFMb29rdXAgfCBudWxsO1xuICAgICAgICB0aGlzLmNvbnRhRGlhbG9nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBjb250YUZpbmFuY2VpcmE6IFt7IHZhbHVlOiBjb250YVZhbHVlLCBkaXNhYmxlZDogdGhpcy5lZGl0aW5nQ29udGFJbmRleCAhPSBudWxsIH0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgcGVyY2VudHVhbDogW3sgdmFsdWU6IHBlcmNlbnR1YWxWYWx1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heChyZW1haW5pbmdQY3QpXV0sXG4gICAgICAgICAgICB2YWxvcjogW3sgdmFsdWU6IHZhbG9yVmFsdWUsIGRpc2FibGVkOiBmYWxzZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgocmVtYWluaW5nVmFsb3IpXV1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjb250YUZpbmFuY2VpcmEnKS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IENvbnRhRmluYW5jZWlyYUxvb2t1cCkgPT4gKHRoaXMuc2VsZWN0ZWRDb250YSA9IHZhbHVlIHx8IG51bGwpKTtcbiAgICAgICAgdGhpcy5zZXR1cFBlcmNlbnR1YWxWYWxvclN5bmModGhpcy5jb250YURpYWxvZ0Zvcm1Hcm91cCwgKCkgPT4gdGhpcy52YWxvckJhc2UpO1xuICAgICAgICB0aGlzLmNvbnRhRGlhbG9nRmllbGRzID0gdGhpcy5nZXRDb250YURpYWxvZ0ZpZWxkcygpO1xuICAgICAgICB0aGlzLmRpc3BsYXlDb250YURpYWxvZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2F2ZUNvbnRhRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YURpYWxvZ0Zvcm1Hcm91cC5pbnZhbGlkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRhQ29udHJvbCA9IHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjb250YUZpbmFuY2VpcmEnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgY29udGFGaW5hbmNlaXJhID0gZGF0YS5jb250YUZpbmFuY2VpcmE7XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWwgPSBOdW1iZXIoZGF0YS5wZXJjZW50dWFsKSB8fCAwO1xuICAgICAgICBjb25zdCB2YWxvciA9ICsoTnVtYmVyKGRhdGEudmFsb3IpIHx8IDApLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICAgICAgY29uc3QgaWRDb250YUZpbmFuY2VpcmEgPSB0aGlzLnNlbGVjdGVkQ29udGE/LmlkIHx8IGNvbnRhRmluYW5jZWlyYT8uaWQgfHwgJyc7XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gYW5hbMOtdGljYTogY29udGEgc2ludMOpdGljYSBuw6NvIHBvZGUgc2VyIHVzYWRhIG5vIHJhdGVpb1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbnRhPy5hbmFTaW4gPT09IEVycFJhdGVpb0VkaXRvckNvbXBvbmVudC5BTkFfU0lOX1NJTlRFVElDTykge1xuICAgICAgICAgICAgY29udGFDb250cm9sLnNldEVycm9ycyh7IGNvbnRhU2ludGV0aWNhOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gZGUgZHVwbGljaWRhZGUgKGFkacOnw6NvIGUgZWRpw6fDo28sIGlnbm9yYW5kbyBvIGl0ZW0gZW0gZWRpw6fDo28pXG4gICAgICAgIGNvbnN0IGR1cGxpY2FkYSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5zb21lKFxuICAgICAgICAgICAgKGMsIGkpID0+IGkgIT09IHRoaXMuZWRpdGluZ0NvbnRhSW5kZXggJiYgYy5pZENvbnRhRmluYW5jZWlyYSA9PT0gaWRDb250YUZpbmFuY2VpcmFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGR1cGxpY2FkYSkge1xuICAgICAgICAgICAgY29udGFDb250cm9sLnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhID0gdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdO1xuICAgICAgICAgICAgY29udGEucGVyY2VudHVhbCA9IHBlcmNlbnR1YWw7XG4gICAgICAgICAgICBjb250YS52YWxvclJhdGVhZG9Db250YSA9IHZhbG9yO1xuICAgICAgICAgICAgLy8gUmVjYWxjdWxhIG9zIHZhbG9yZXMgZG9zIENDcyBwcm9wb3JjaW9uYWxtZW50ZSBhbyBub3ZvIHZhbG9yIGRhIGNvbnRhLFxuICAgICAgICAgICAgLy8gbWFudGVuZG8gb3MgcGVyY2VudHVhaXMgaW50YWN0b3MuXG4gICAgICAgICAgICBpZiAoY29udGEucmF0ZWlvc0NDdXN0bz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVuY3lTY2FsZSA9IHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMjtcbiAgICAgICAgICAgICAgICBjb250YS5yYXRlaW9zQ0N1c3RvID0gY29udGEucmF0ZWlvc0NDdXN0by5tYXAoY2MgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2MsXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yOiArKChjYy5wZXJjZW50dWFsIC8gMTAwKSAqIHZhbG9yKS50b0ZpeGVkKGN1cnJlbmN5U2NhbGUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbnRhID0gY29udGFGaW5hbmNlaXJhPy5sYWJlbCB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IG5vdmFDb250YTogUmF0ZWlvQ29udGEgPSB7XG4gICAgICAgICAgICAgICAgaWRDb250YUZpbmFuY2VpcmEsXG4gICAgICAgICAgICAgICAgY29udGFGaW5hbmNlaXJhOiBsYWJlbENvbnRhLFxuICAgICAgICAgICAgICAgIHBlcmNlbnR1YWwsXG4gICAgICAgICAgICAgICAgdmFsb3JSYXRlYWRvQ29udGE6IHZhbG9yLFxuICAgICAgICAgICAgICAgIHJhdGVpb3NDQ3VzdG86IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZSwgbm92YUNvbnRhXTtcbiAgICAgICAgICAgIHRoaXMuY2NTZWxlY3Rpb25bbm92YUNvbnRhLmlkQ29udGFGaW5hbmNlaXJhXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwbGF5Q29udGFEaWFsb2cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGlkZUNvbnRhRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXlDb250YURpYWxvZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vID09PSBNT0RBTCBDRU5UUk8gREUgQ1VTVE8gPT09XG5cbiAgICBwdWJsaWMgb3BlbkNDRGlhbG9nKGNvbnRhSW5kZXg6IG51bWJlciwgZWRpdENDSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ0NDb250YUluZGV4ID0gY29udGFJbmRleDtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ0NJbmRleCA9IGVkaXRDQ0luZGV4ICE9IG51bGwgPyBlZGl0Q0NJbmRleCA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbY29udGFJbmRleF07XG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGNvbnN0IHZhbG9yQmFzZUNDID0gY29udGEudmFsb3JSYXRlYWRvQ29udGEgfHwgMDtcblxuICAgICAgICAvLyBDYWxjdWxhIG8gcmVzdGFudGUgZXhjbHVpbmRvIG8gaXRlbSBlbSBlZGnDp8OjbyAocGFyYSBxdWUgZWRpw6fDo28gcG9zc2EgbWFudGVyIG8gcHLDs3ByaW8gdmFsb3IpXG4gICAgICAgIGNvbnN0IHNvbWFDQ1BjdCA9IGNjTGlzdC5yZWR1Y2UoKGFjYywgY2MsIGkpID0+IGFjYyArIChpID09PSB0aGlzLmVkaXRpbmdDQ0luZGV4ID8gMCA6IChjYy5wZXJjZW50dWFsIHx8IDApKSwgMCk7XG4gICAgICAgIGNvbnN0IHNvbWFDQ1ZhbG9yID0gY2NMaXN0LnJlZHVjZSgoYWNjLCBjYywgaSkgPT4gYWNjICsgKGkgPT09IHRoaXMuZWRpdGluZ0NDSW5kZXggPyAwIDogKGNjLnZhbG9yIHx8IDApKSwgMCk7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ1BjdCA9ICsoMTAwIC0gc29tYUNDUGN0KS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nVmFsb3IgPSArKHZhbG9yQmFzZUNDIC0gc29tYUNDVmFsb3IpLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcblxuICAgICAgICBsZXQgY2NWYWx1ZSA9IG51bGw7XG4gICAgICAgIGxldCBwZXJjZW50dWFsVmFsdWU6IG51bWJlciB8IG51bGwgPSByZW1haW5pbmdQY3QgPiAwID8gcmVtYWluaW5nUGN0IDogbnVsbDtcbiAgICAgICAgLy8gVXNhIG8gdmFsb3IgcmVzdGFudGUgcmVhbCAoasOhIGNhbGN1bGFkbyBhY2ltYSkgZW0gdmV6IGRlIHJlY2FsY3VsYXIgdmlhIHBlcmNlbnR1YWwsXG4gICAgICAgIC8vIGV2aXRhbmRvIGRpZmVyZW7Dp2FzIGRlIGFycmVkb25kYW1lbnRvIGFjdW11bGFkYXMgbm9zIENDcyBhbnRlcmlvcmVzLlxuICAgICAgICBsZXQgdmFsb3JWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHBlcmNlbnR1YWxWYWx1ZSAhPSBudWxsID8gcmVtYWluaW5nVmFsb3IgOiBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNjID0gY2NMaXN0W3RoaXMuZWRpdGluZ0NDSW5kZXhdO1xuICAgICAgICAgICAgY2NWYWx1ZSA9IHsgaWQ6IGNjLmlkQ2VudHJvQ3VzdG8sIGxhYmVsOiBjYy5kZXNjQ0N1c3RvIHx8IGNjLmlkQ2VudHJvQ3VzdG8gfTtcbiAgICAgICAgICAgIHBlcmNlbnR1YWxWYWx1ZSA9IGNjLnBlcmNlbnR1YWw7XG4gICAgICAgICAgICB2YWxvclZhbHVlID0gY2MudmFsb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXhQY3Q6IHBlcmNlbnR1YWwgbcOheGltbyBxdWUgZXN0ZSBDQyBwb2RlIHRlciAobsOjbyBwb2RlIHVsdHJhcGFzc2FyIG8gcmVzdGFudGUgZGEgY29udGEpXG4gICAgICAgIGNvbnN0IG1heFBjdCA9IHJlbWFpbmluZ1BjdDtcbiAgICAgICAgLy8gbWF4VmFsb3I6IHZhbG9yIG3DoXhpbW8gcXVlIGVzdGUgQ0MgcG9kZSB0ZXIgKG7Do28gcG9kZSB1bHRyYXBhc3NhciBvIHJlc3RhbnRlIGVtIGRpbmhlaXJvKVxuICAgICAgICBjb25zdCBtYXhWYWxvciA9IHJlbWFpbmluZ1ZhbG9yO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQyA9IGNjVmFsdWUgYXMgQ2VudHJvQ3VzdG9Mb29rdXAgfCBudWxsO1xuICAgICAgICB0aGlzLmNjRGlhbG9nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBjZW50cm9DdXN0bzogW3sgdmFsdWU6IGNjVmFsdWUsIGRpc2FibGVkOiB0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBwZXJjZW50dWFsOiBbeyB2YWx1ZTogcGVyY2VudHVhbFZhbHVlLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4KG1heFBjdCldXSxcbiAgICAgICAgICAgIHZhbG9yOiBbeyB2YWx1ZTogdmFsb3JWYWx1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heChtYXhWYWxvcildXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5nZXQoJ2NlbnRyb0N1c3RvJykudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBDZW50cm9DdXN0b0xvb2t1cCkgPT4gKHRoaXMuc2VsZWN0ZWRDQyA9IHZhbHVlIHx8IG51bGwpKTtcbiAgICAgICAgdGhpcy5zZXR1cFBlcmNlbnR1YWxWYWxvclN5bmModGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cCwgKCkgPT4gdmFsb3JCYXNlQ0MpO1xuICAgICAgICB0aGlzLmNjRGlhbG9nRmllbGRzID0gdGhpcy5nZXRDQ0RpYWxvZ0ZpZWxkcygpO1xuICAgICAgICB0aGlzLmRpc3BsYXlDQ0RpYWxvZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2F2ZUNDRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5pbnZhbGlkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGNjQ29udHJvbCA9IHRoaXMuY2NEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjZW50cm9DdXN0bycpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICBjb25zdCBjZW50cm9DdXN0byA9IGRhdGEuY2VudHJvQ3VzdG87XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWwgPSBOdW1iZXIoZGF0YS5wZXJjZW50dWFsKSB8fCAwO1xuICAgICAgICBjb25zdCB2YWxvciA9ICsoTnVtYmVyKGRhdGEudmFsb3IpIHx8IDApLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbdGhpcy5lZGl0aW5nQ0NDb250YUluZGV4XTtcbiAgICAgICAgY29uc3QgaWRDZW50cm9DdXN0byA9IHRoaXMuc2VsZWN0ZWRDQz8uaWQgfHwgY2VudHJvQ3VzdG8/LmlkIHx8ICcnO1xuXG4gICAgICAgIC8vIFZhbGlkYcOnw6NvIGFuYWzDrXRpY2E6IENDIHNpbnTDqXRpY28gb3UgcXVlIG7Do28gYWNlaXRhIHJhdGVpbyDDqSBpbnbDoWxpZG9cbiAgICAgICAgY29uc3QgY2NJbnZhbGlkbyA9IHRoaXMuc2VsZWN0ZWRDQz8uYWNlUmF0ID09PSBmYWxzZVxuICAgICAgICAgICAgfHwgdGhpcy5zZWxlY3RlZENDPy5hbmFTaW4gPT09IEVycFJhdGVpb0VkaXRvckNvbXBvbmVudC5BTkFfU0lOX1NJTlRFVElDTztcbiAgICAgICAgaWYgKGNjSW52YWxpZG8pIHtcbiAgICAgICAgICAgIGNjQ29udHJvbC5zZXRFcnJvcnMoeyBjZW50cm9DdXN0b0ludmFsaWRvOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gZGUgZHVwbGljaWRhZGUgbmEgbWVzbWEgY29udGEgKGFkacOnw6NvIGUgZWRpw6fDo28sIGlnbm9yYW5kbyBvIGl0ZW0gZW0gZWRpw6fDo28pXG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGNvbnN0IGR1cGxpY2FkbyA9IGNjTGlzdC5zb21lKFxuICAgICAgICAgICAgKGNjLCBpKSA9PiBpICE9PSB0aGlzLmVkaXRpbmdDQ0luZGV4ICYmIGNjLmlkQ2VudHJvQ3VzdG8gPT09IGlkQ2VudHJvQ3VzdG9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGR1cGxpY2Fkbykge1xuICAgICAgICAgICAgY2NDb250cm9sLnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNjID0gY29udGEucmF0ZWlvc0NDdXN0b1t0aGlzLmVkaXRpbmdDQ0luZGV4XTtcbiAgICAgICAgICAgIGNjLnBlcmNlbnR1YWwgPSBwZXJjZW50dWFsO1xuICAgICAgICAgICAgY2MudmFsb3IgPSB2YWxvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ0N1c3RvID0gY2VudHJvQ3VzdG8/LmxhYmVsIHx8ICcnO1xuICAgICAgICAgICAgY29udGEucmF0ZWlvc0NDdXN0byA9IFsuLi5jY0xpc3QsIHsgaWRDZW50cm9DdXN0bywgZGVzY0NDdXN0bzogbGFiZWxDQ3VzdG8sIHBlcmNlbnR1YWwsIHZhbG9yIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIHRoaXMuZGlzcGxheUNDRGlhbG9nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkhpZGVDQ0RpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5Q0NEaWFsb2cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA9PT0gQcOHw5VFUyBEQSBUQUJFTEEgPT09XG5cbiAgICBwdWJsaWMgb25EZWxldGVTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5sZW5ndGgpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IGlkc1RvUmVtb3ZlID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvbi5tYXAocyA9PiBzLmlkQ29udGFGaW5hbmNlaXJhKSk7XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5maWx0ZXIoYyA9PiAhaWRzVG9SZW1vdmUuaGFzKGMuaWRDb250YUZpbmFuY2VpcmEpKTtcbiAgICAgICAgaWRzVG9SZW1vdmUuZm9yRWFjaChpZCA9PiBkZWxldGUgdGhpcy5jY1NlbGVjdGlvbltpZF0pO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogUmVtb3ZlIG9zIGNlbnRyb3MgZGUgY3VzdG8gc2VsZWNpb25hZG9zIGRlIHVtYSBjb250YSBmaW5hbmNlaXJhLiAqL1xuICAgIHB1YmxpYyBvbkRlbGV0ZVNlbGVjdGVkQ0MoY29udGE6IFJhdGVpb0NvbnRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjaW9uYWRvcyA9IHRoaXMuY2NTZWxlY3Rpb25bY29udGEuaWRDb250YUZpbmFuY2VpcmFdIHx8IFtdO1xuICAgICAgICBpZiAoIXNlbGVjaW9uYWRvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLm5lbmh1bV9jZW50cm9fY3VzdG9fc2VsZWNpb25hZG8nKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRzVG9SZW1vdmUgPSBuZXcgU2V0KHNlbGVjaW9uYWRvcy5tYXAoY2MgPT4gY2MuaWRDZW50cm9DdXN0bykpO1xuICAgICAgICBjb250YS5yYXRlaW9zQ0N1c3RvID0gY29udGEucmF0ZWlvc0NDdXN0by5maWx0ZXIoY2MgPT4gIWlkc1RvUmVtb3ZlLmhhcyhjYy5pZENlbnRyb0N1c3RvKSk7XG4gICAgICAgIHRoaXMuY2NTZWxlY3Rpb25bY29udGEuaWRDb250YUZpbmFuY2VpcmFdID0gW107XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IFsuLi50aGlzLmNvbnRhc0RhdGFTb3VyY2VdO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlckNvbnRhKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZpZGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbaW5kZXhdO1xuICAgICAgICBpZiAocmVtb3ZpZGEpIHsgZGVsZXRlIHRoaXMuY2NTZWxlY3Rpb25bcmVtb3ZpZGEuaWRDb250YUZpbmFuY2VpcmFdOyB9XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZXJDZW50cm9DdXN0byhjb250YUluZGV4OiBudW1iZXIsIGNjSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250YSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZVtjb250YUluZGV4XTtcbiAgICAgICAgY29udGEucmF0ZWlvc0NDdXN0byA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8uZmlsdGVyKChfLCBpKSA9PiBpICE9PSBjY0luZGV4KTtcbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldENvbnRhSW5kZXgocm93RGF0YTogUmF0ZWlvQ29udGEpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLmluZGV4T2Yocm93RGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENDSW5kZXgoY29udGE6IFJhdGVpb0NvbnRhLCBjYzogUmF0ZWlvQ0N1c3RvKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIChjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdKS5pbmRleE9mKGNjKTtcbiAgICB9XG5cbiAgICAvLyA9PT0gUFJJVkFET1MgPT09XG5cbiAgICAvKiogSW5pY2lhbGl6YSBvIGNvbXBvbmVudGUgYSBwYXJ0aXIgZG9zIGlucHV0cyAoc2VtIGNoYW1hZGEgw6AgQVBJIGRlIGNhcmdhKS4gKi9cbiAgICBwcml2YXRlIGluaWNpYWxpemFyUG9ySW5wdXRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRlZENvbnRleHQgPSAodGhpcy5pbml0aWFsQ29udGV4dCB8fCB7fSkgYXMgUmV0b3JuYXJSYXRlaW9PdXRwdXQ7XG4gICAgICAgIHRoaXMucG9wdWxhckNvbVJhdGVpb3ModGhpcy5pbml0aWFsUmF0ZWlvcyB8fCBbXSk7XG4gICAgICAgIGlmICghdGhpcy5lbXByZXNhSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1wcmVzYUlkID0gdGhpcy5pbml0aWFsQ29udGV4dD8uZTA3MGZpbD8uZTA3MGVtcD8uaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkQ29sdW1ucyA9IHRoaXMuZ2V0R3JpZENvbHVtbnMoKTtcbiAgICAgICAgLy8gRW1pdGUgbyBlc3RhZG8gZGUgdmFsaWRhZGUgasOhIG5hIGNhcmdhIGluaWNpYWwgKHNlbSBtYXJjYXIgY29tbyBcInN1am9cIiksXG4gICAgICAgIC8vIHBlcm1pdGluZG8gcXVlIG8gaG9zdCBjb25oZcOnYSBvIGlzVmFsaWQgbWVzbW8gc2VtIG8gdXN1w6FyaW8gZWRpdGFyLlxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FycmVnYXJSYXRlaW8oKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VydmljZVxuICAgICAgICAgICAgLnJldG9ybmFyUmF0ZWlvKHsgaWRNb3ZpbWVudG86IHRoaXMuaWRNb3ZpbWVudG8sIHRpcG9Nb3ZpbWVudG86IHRoaXMudGlwb01vdmltZW50byB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbmFsaXplKCgpID0+ICh0aGlzLmxvYWRpbmcgPSBmYWxzZSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAob3V0cHV0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkQ29udGV4dCA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGFyQ29tUmF0ZWlvcyhvdXRwdXQucmF0ZWlvIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVtcHJlc2FJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbXByZXNhSWQgPSBvdXRwdXQuZTA3MGZpbC5lMDcwZW1wLmlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZENvbHVtbnMgPSB0aGlzLmdldEdyaWRDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVtaXRlIG8gZXN0YWRvIGRlIHZhbGlkYWRlIGRvIHJhdGVpbyBjYXJyZWdhZG8gKHNlbSBtYXJjYXIgY29tbyBcInN1am9cIikuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLmVycm9yLmVtaXQoeyBvcGVyYWNhbzogJ2xvYWQnLCBtZXNzYWdlOiBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb19jYXJyZWdhcicpLCBvcmlnaW5hbEVycm9yOiBlcnIgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3B1bGFyQ29tUmF0ZWlvcyhyYXRlaW9zOiBSYXRlaW9Db250YVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IFsuLi5yYXRlaW9zXTtcbiAgICAgICAgdGhpcy5jY1NlbGVjdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRhc0RhdGFTb3VyY2UuZm9yRWFjaChjb250YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNjU2VsZWN0aW9uW2NvbnRhLmlkQ29udGFGaW5hbmNlaXJhXSA9IFtdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXN0cmlidWnDp8OjbyBjb21wbGV0YTogcmVzdGFudGVzIGdsb2JhaXMgZSBkZSBjYWRhIGNvbnRhIGlndWFpcyBhIHplcm8uXG4gICAgICogRXhwb3N0byBwdWJsaWNhbWVudGUgcGFyYSBxdWUgbyB0ZW1wbGF0ZSBwb3NzYSByZWFnaXIgYW8gZXN0YWRvIHJlYWwgZGVcbiAgICAgKiBjb21wbGV0dWRlIChjb250YXMgKyBjZW50cm9zIGRlIGN1c3RvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3RyaWJ1aWNhb0NvbXBsZXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wZXJjZW50dWFsUmVzdGFudGUgIT09IDAgfHwgdGhpcy52YWxvclJlc3RhbnRlICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLmV2ZXJ5KGNvbnRhID0+IHRoaXMuaXNDb250YUNDQ29tcGxldGEoY29udGEpKTtcbiAgICB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNhciBvIGdldHRlciBgZGlzdHJpYnVpY2FvQ29tcGxldGFgLiBNYW50aWRvIHBhcmEgY29tcGF0aWJpbGlkYWRlIGludGVybmEuICovXG4gICAgcHJpdmF0ZSBpc0Rpc3RyaWJ1aWNhb0NvbXBsZXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXN0cmlidWljYW9Db21wbGV0YTtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhIHNlIGjDoSBhbyBtZW5vcyB1bWEgY29udGEgZmluYW5jZWlyYSBzZW0gbmVuaHVtIGNlbnRybyBkZSBjdXN0byB2aW5jdWxhZG8uICovXG4gICAgcHJpdmF0ZSBoYXNDb250YVNlbUNlbnRyb0N1c3RvKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLnNvbWUoY29udGEgPT4gKGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW10pLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqIFJlc3RhbnRlIGRlICUgZSBkZSB2YWxvciBkb3MgY2VudHJvcyBkZSBjdXN0byBkZSB1bWEgY29udGEgaWd1YWwgYSB6ZXJvLiAqL1xuICAgIHByaXZhdGUgaXNDb250YUNDQ29tcGxldGEoY29udGE6IFJhdGVpb0NvbnRhKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNjcyA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGlmIChjY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBDZW50cm8gZGUgY3VzdG8gw6kgc2VtcHJlIG9icmlnYXTDs3JpbzogY29udGEgc2VtIG5lbmh1bSBDQyBudW5jYSDDqSBjb21wbGV0YS5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb21hUGN0ID0gY2NzLnJlZHVjZSgoYWNjLCBjYykgPT4gYWNjICsgKGNjLnBlcmNlbnR1YWwgfHwgMCksIDApO1xuICAgICAgICBjb25zdCBzb21hVmFsb3IgPSBjY3MucmVkdWNlKChhY2MsIGNjKSA9PiBhY2MgKyAoY2MudmFsb3IgfHwgMCksIDApO1xuICAgICAgICBjb25zdCBwY3RSZXN0YW50ZSA9ICsoMTAwIC0gc29tYVBjdCkudG9GaXhlZCh0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCk7XG4gICAgICAgIGNvbnN0IHZhbG9yUmVzdGFudGUgPSArKChjb250YS52YWxvclJhdGVhZG9Db250YSB8fCAwKSAtIHNvbWFWYWxvcikudG9GaXhlZCh0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDIpO1xuICAgICAgICByZXR1cm4gcGN0UmVzdGFudGUgPT09IDAgJiYgdmFsb3JSZXN0YW50ZSA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRhRGlhbG9nRmllbGRzKCk6IEZvcm1GaWVsZFtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZTA5MVBsZkxvb2t1cC5tb3VudE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogJ2NvbnRhRmluYW5jZWlyYScsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5RmllbGRzOiBbJ2FuYVNpbiddLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZXhjbHVpZG8nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ2ZhbHNlJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzaXRGaW4nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdlMDcwZW1wJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogW3RoaXMuZW1wcmVzYUlkXSB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJjZW50dWFsJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnBlcmNlbnR1YWwnKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGUsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiA3LFxuICAgICAgICAgICAgICAgIHNjYWxlOiB0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCxcbiAgICAgICAgICAgICAgICByaWdodEFkZG9uOiB7IGxhYmVsOiAnJScgfSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsb3InLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IudmFsb3InKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Nb25leSxcbiAgICAgICAgICAgICAgICBjdXJyZW5uY3k6ICgpID0+IHRoaXMuY3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMTgsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENDRGlhbG9nRmllbGRzKCk6IEZvcm1GaWVsZFtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZTA0NENjdUxvb2t1cC5tb3VudE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogJ2NlbnRyb0N1c3RvJyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlGaWVsZHM6IFsnYW5hU2luJywgJ2FjZVJhdCddLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZXhjbHVpZG8nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ2ZhbHNlJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzaXRDY3UnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdlMDcwZW1wJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogW3RoaXMuZW1wcmVzYUlkXSB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJjZW50dWFsJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnBlcmNlbnR1YWwnKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGUsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiA3LFxuICAgICAgICAgICAgICAgIHNjYWxlOiB0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCxcbiAgICAgICAgICAgICAgICByaWdodEFkZG9uOiB7IGxhYmVsOiAnJScgfSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsb3InLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IudmFsb3InKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Nb25leSxcbiAgICAgICAgICAgICAgICBjdXJyZW5uY3k6ICgpID0+IHRoaXMuY3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMTgsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaW5jcm9uaXphIG9zIGNhbXBvcyBwZXJjZW50dWFsIGUgdmFsb3IgZGUgdW0gRm9ybUdyb3VwIGRlIG1vZGFsLlxuICAgICAqIFF1YW5kbyBvIHVzdcOhcmlvIGFsdGVyYSBwZXJjZW50dWFsLCByZWNhbGN1bGEgdmFsb3IgKHBlcmNlbnR1YWwvMTAwICogYmFzZSkuXG4gICAgICogUXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhIHZhbG9yLCByZWNhbGN1bGEgcGVyY2VudHVhbCAodmFsb3IvYmFzZSAqIDEwMCkuXG4gICAgICogTyBhcmd1bWVudG8gZ2V0QmFzZSByZXRvcm5hIGEgYmFzZSB1c2FkYSBubyBjw6FsY3VsbyAodmFsb3JCYXNlIGdsb2JhbCBvdSB2YWxvclJhdGVhZG9Db250YSBkYSBjb250YSBwYWkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBQZXJjZW50dWFsVmFsb3JTeW5jKGZvcm06IEZvcm1Hcm91cCwgZ2V0QmFzZTogKCkgPT4gbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWxTY2FsZSA9IHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0O1xuICAgICAgICBjb25zdCBjdXJyZW5jeVNjYWxlID0gdGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyO1xuXG4gICAgICAgIGZvcm0uZ2V0KCdwZXJjZW50dWFsJykudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocGN0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gZ2V0QmFzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChwY3QgPT0gbnVsbCB8fCBiYXNlID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm92b1ZhbG9yID0gKygoTnVtYmVyKHBjdCkgLyAxMDApICogYmFzZSkudG9GaXhlZChjdXJyZW5jeVNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGZvcm0uZ2V0KCd2YWxvcicpLnZhbHVlKSAhPT0gbm92b1ZhbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0KCd2YWxvcicpLnNldFZhbHVlKG5vdm9WYWxvciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZvcm0uZ2V0KCd2YWxvcicpLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IGdldEJhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgIWJhc2UpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm92b1BjdCA9ICsoKE51bWJlcih2YWwpIC8gYmFzZSkgKiAxMDApLnRvRml4ZWQocGVyY2VudHVhbFNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGZvcm0uZ2V0KCdwZXJjZW50dWFsJykudmFsdWUpICE9PSBub3ZvUGN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0KCdwZXJjZW50dWFsJykuc2V0VmFsdWUobm92b1BjdCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0R3JpZENvbHVtbnMoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2NvbnRhRmluYW5jZWlyYScsIGhlYWRlcjogJ2VycHgucmF0ZWlvX2VkaXRvci5jb250YV9maW5hbmNlaXJhJyB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ3BlcmNlbnR1YWwnLCBoZWFkZXI6ICdlcnB4LnJhdGVpb19lZGl0b3IucGVyY2VudHVhbCcgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICd2YWxvclJhdGVhZG9Db250YScsIGhlYWRlcjogJ2VycHgucmF0ZWlvX2VkaXRvci52YWxvcicgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdENoYW5nZShpc0RpcnR5OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGlzRGlydHksXG4gICAgICAgICAgICBpc1ZhbGlkOiB0aGlzLmlzRGlzdHJpYnVpY2FvQ29tcGxldGEoKSxcbiAgICAgICAgICAgIHJhdGVpb3M6IHRoaXMuY29udGFzRGF0YVNvdXJjZVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|