@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
153 lines • 37.9 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { iif, of, Subscription } from 'rxjs';
import { debounceTime, distinctUntilChanged, filter, switchMap, take } from 'rxjs/operators';
import { getDateErrorMessage, getErrorMessage } from '../../utils/validators-messages.utils';
import { ValidateCodiceFiscalePIVA, ValidateName } from "../../utils/validators.utils";
import { ModalitaPagamentoService } from '../../services/modalita-pagamento.service';
export class EstremiPersonaFisicaComponent {
constructor(modalitaPagamentoService) {
this.modalitaPagamentoService = modalitaPagamentoService;
this.viewSessoPF = false;
this.validatePersonaFisicaEmitter = new EventEmitter();
this.personaFisicaEmitter = new EventEmitter();
this.maxDataNascita = new Date();
this.subscription = new Subscription();
this.getErrorMessage = getErrorMessage;
this.getDateErrorMessage = getDateErrorMessage;
// this.initPersonaFisicaForm();
// this.setCodiceFiscaleValidators();
}
set _disableForm(val) {
this.disableForm = val;
if (this.disableForm) {
this.estremiPersonaFisicaForm.disable();
this.validatePersonaFisicaEmitter.emit();
}
else {
this.estremiPersonaFisicaForm.enable();
}
}
ngOnInit() {
this.initPersonaFisicaForm();
this.setFormControlsValue();
this.setCodiceFiscaleValidators();
// Set/Unset form controls validation on isNatoEstero Value Change
this.subscription.add(this.estremiPersonaFisicaForm.controls['isNatoEstero'].valueChanges.subscribe(isNatoEstero => {
if (isNatoEstero) {
this.estremiPersonaFisicaForm.controls['provinciaNascita'].setValidators([]);
this.estremiPersonaFisicaForm.controls['provinciaNascita'].patchValue(null);
this.estremiPersonaFisicaForm.controls['provinciaNascita'].updateValueAndValidity();
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].setValidators([]);
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].patchValue(null);
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].updateValueAndValidity();
this.estremiPersonaFisicaForm.controls['nazioneNascita'].setValidators([Validators.required]);
this.estremiPersonaFisicaForm.controls['nazioneNascita'].updateValueAndValidity();
}
else {
this.estremiPersonaFisicaForm.controls['provinciaNascita'].setValidators([Validators.required]);
this.estremiPersonaFisicaForm.controls['provinciaNascita'].updateValueAndValidity();
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].setValidators([Validators.required]);
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].updateValueAndValidity();
this.estremiPersonaFisicaForm.controls['nazioneNascita'].setValidators([]);
this.estremiPersonaFisicaForm.controls['nazioneNascita'].patchValue(null);
this.estremiPersonaFisicaForm.controls['nazioneNascita'].updateValueAndValidity();
}
}));
this.getComuniOnProvinciaChange();
this.validatePersonaFisica();
this.personaFisicaEmit();
}
getComuniOnProvinciaChange() {
this.subscription.add(this.estremiPersonaFisicaForm.controls['provinciaNascita'].valueChanges.pipe(distinctUntilChanged(), switchMap(siglaProvinciaNascita => iif(() => !!siglaProvinciaNascita, this.modalitaPagamentoService.getComuni$(siglaProvinciaNascita).pipe(take(1)), of([])))).subscribe(comuni => {
this.comuni = comuni;
}));
}
validatePersonaFisica() {
this.subscription.add(this.estremiPersonaFisicaForm.valueChanges.pipe(debounceTime(500), filter(() => this.estremiPersonaFisicaForm.valid)).subscribe((_) => {
this.validatePersonaFisicaEmitter.emit();
}));
}
personaFisicaEmit() {
this.subscription.add(this.estremiPersonaFisicaForm.valueChanges.pipe(debounceTime(500)).subscribe((_) => {
const personaFisica = {
infoAnagrafiche: {
codFiscale: this.estremiPersonaFisicaForm.controls['codiceFiscale'].value,
cognome: this.estremiPersonaFisicaForm.controls['cognome'].value,
nome: this.estremiPersonaFisicaForm.controls['nome'].value
},
infoNascita: {
comuneNascita: this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].value,
provinciaNascita: this.estremiPersonaFisicaForm.controls['provinciaNascita'].value,
dataNascita: this.estremiPersonaFisicaForm.controls['dataNascita'].value
}
};
const isValid = this.estremiPersonaFisicaForm.valid;
this.personaFisicaEmitter.emit({ persona: personaFisica ? personaFisica : null, isValid });
}));
}
initPersonaFisicaForm() {
this.estremiPersonaFisicaForm = new FormGroup({
codiceFiscale: new FormControl(null),
nome: new FormControl(null, [Validators.required, ValidateName]),
cognome: new FormControl(null, [Validators.required, ValidateName]),
isNatoEstero: new FormControl(false),
provinciaNascita: new FormControl(null),
codiceComuneNascita: new FormControl(null),
nazioneNascita: new FormControl(null),
dataNascita: new FormControl(null, [Validators.required]),
sesso: new FormControl(null, this.viewSessoPF ? [Validators.required] : [])
});
}
setCodiceFiscaleValidators() {
this.estremiPersonaFisicaForm.controls['codiceFiscale'].setValidators([
Validators.required,
ValidateCodiceFiscalePIVA
]);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
convertToUppercase(event) {
this.estremiPersonaFisicaForm.get('codiceFiscale').setValue(event.target.value.toUpperCase());
}
onProvinciaChange() {
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].patchValue(null);
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].markAsTouched();
}
setFormControlsValue() {
var _a;
this.estremiPersonaFisicaForm.controls['codiceFiscale'].setValue(this.personaFisica ? this.personaFisica.infoAnagrafiche.codFiscale : null);
this.estremiPersonaFisicaForm.controls['nome'].setValue(this.personaFisica ? this.personaFisica.infoAnagrafiche.nome : null);
this.estremiPersonaFisicaForm.controls['cognome'].setValue(this.personaFisica ? this.personaFisica.infoAnagrafiche.cognome : null);
this.estremiPersonaFisicaForm.controls['isNatoEstero'].setValue(this.personaFisica && this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? true : false);
this.estremiPersonaFisicaForm.controls['provinciaNascita'].setValue(this.personaFisica && !this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? this.personaFisica.infoNascita.provinciaNascita : null);
this.estremiPersonaFisicaForm.controls['codiceComuneNascita'].setValue(this.personaFisica && !this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? this.personaFisica.infoNascita.comuneNascita : null);
this.estremiPersonaFisicaForm.controls['dataNascita'].setValue(this.personaFisica ? this.personaFisica.infoNascita.dataNascita : null);
// TODO
this.estremiPersonaFisicaForm.controls['sesso'].setValue(this.viewSessoPF ? 'M' : null);
this.estremiPersonaFisicaForm.controls['nazioneNascita'].setValue(this.personaFisica && this.personaFisica.infoNascita.comuneNascita.startsWith("Z") ? (_a = this.personaFisica.infoNascita) === null || _a === void 0 ? void 0 : _a.comuneNascita : null);
}
}
EstremiPersonaFisicaComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-estremi-persona-fisica',
template: "<form [formGroup]=\"estremiPersonaFisicaForm\" [ngxsForm]=\"ngxsFormPath\">\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"codiceFiscale\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[maxlength]=\"16\"\r\n\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }} {{ 'codice-fiscale' | traduzione }}\"\r\n\t\t\t\t\t\t(input)=\"convertToUppercase($event)\" />\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['codiceFiscale'].invalid\">\r\n\t\t\t\t\t{{ getErrorMessage(estremiPersonaFisicaForm.controls['codiceFiscale']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"nome\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[maxlength]=\"100\"\r\n\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }} {{ 'nome' | traduzione }}\"/>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm?.controls['nome'].invalid\">\r\n\t\t\t\t\t{{ getErrorMessage(estremiPersonaFisicaForm.controls['nome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"cognome\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[maxlength]=\"100\"\r\n\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }} {{ 'cognome' | traduzione }}\"/>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm?.controls['cognome'].invalid\">\r\n\t\t\t\t\t{{ getErrorMessage(estremiPersonaFisicaForm.controls['cognome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-12 pt-3 pb-2 pt-lg-2 pb-lg-2\">\r\n\t\t\t<mat-checkbox formControlName=\"isNatoEstero\"\r\n\t\t\t\t\t\t color=\"primary\">\r\n\t\t\t\t<info-tip-label label=\"localita-nascita-estera\"></info-tip-label>\r\n\t\t\t</mat-checkbox>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row\">\r\n\t\t<ng-container *ngIf=\"!estremiPersonaFisicaForm?.controls['isNatoEstero']?.value else nascitaEstera\">\r\n\t\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'provincia-nascita' | traduzione }}</mat-label>\r\n\t\t\t\t\t<mat-select [placeholder]=\"'seleziona' | traduzione\" formControlName=\"provinciaNascita\" (valueChange)=\"onProvinciaChange()\">\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let provincia of province\" [value]=\"provincia.sigla\">\r\n\t\t\t\t\t\t\t{{ provincia.denominazione }}\r\n\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['provinciaNascita'].invalid\">\r\n\t\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'comune-nascita' | traduzione }}</mat-label>\r\n\t\t\t\t\t<mat-select placeholder=\"{{ 'seleziona' | traduzione }}\" formControlName=\"codiceComuneNascita\">\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let comune of comuni\" [value]=\"comune.codiceCatastale\">\r\n\t\t\t\t\t\t\t{{ comune.denominazione }}\r\n\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['codiceComuneNascita'].invalid\">\r\n\t\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t\t<ng-template #nascitaEstera>\r\n\t\t\t<div class=\"col-12 col-lg-4 mt-2 mt-lg-0\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'nazione-nascita' | traduzione }}</mat-label>\r\n\t\t\t\t\t<mat-select [placeholder]=\"'seleziona' | traduzione\" formControlName=\"nazioneNascita\">\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let nazione of nazioni\" [value]=\"nazione.codiceCatastale\">\r\n\t\t\t\t\t\t\t{{ nazione.denominazione }}\r\n\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['nazioneNascita'].invalid\">\r\n\t\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t\t</mat-error>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t</ng-template>\r\n\t\t<div class=\"col-12\" [ngClass]=\"viewSessoPF ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\testremiPersonaFisicaForm?.controls['isNatoEstero']?.value ? ' col-lg-4 mt-2 mt-lg-0'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ' col-lg-2 mt-2 mt-lg-0'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ' col-lg-4 mt-2 mt-lg-0'\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<input formControlName=\"dataNascita\"\r\n\t\t\t\t\t\t[max]=\"maxDataNascita\"\r\n\t\t\t\t\t\tmatInput\r\n\t\t\t\t\t\t[matDatepicker]=\"dataNascita\"\r\n\t\t\t\t\t\t[placeholder]=\"('required' | traduzione) + ('data-nascita' | traduzione)\">\r\n\t\t\t\t<mat-datepicker-toggle matSuffix [for]=\"dataNascita\"></mat-datepicker-toggle>\r\n\t\t\t\t<mat-datepicker #dataNascita></mat-datepicker>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['dataNascita'].invalid\">\r\n\t\t\t\t\t{{ getDateErrorMessage(estremiPersonaFisicaForm.controls['dataNascita']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'formato-data'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"viewSessoPF\" class=\"col-12 col-lg-2 mt-2 mt-lg-0\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'sesso' | traduzione }}</mat-label>\r\n\t\t\t\t<mat-select [placeholder]=\"'seleziona' | traduzione\" formControlName=\"sesso\">\r\n\t\t\t\t\t<mat-option [value]=\"null\"> {{ \"seleziona\" | traduzione }} </mat-option>\r\n\t\t\t\t\t<mat-option value=\"M\">{{ \"maschio\" | traduzione }}</mat-option>\r\n\t\t\t\t\t<mat-option value=\"F\">{{ \"femmina\" | traduzione }}</mat-option>\r\n\t\t\t\t</mat-select>\r\n\t\t\t\t<mat-error *ngIf=\"estremiPersonaFisicaForm.controls['sesso'].invalid\">\r\n\t\t\t\t\t{{ 'obbligatorio' | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row\">\r\n\t\t<div class=\"col-12 mt-2 mt-lg-0\">\r\n\t\t\t<mat-error *ngIf=\"!isPersonaFisicaValid && (estremiPersonaFisicaForm.dirty)\">\r\n\t\t\t\t{{'invalid-dati-anagrafici' | traduzione }}\r\n\t\t\t</mat-error>\r\n\t\t</div>\r\n\t</div>\r\n</form>\r\n\r\n",
styles: [""]
},] }
];
EstremiPersonaFisicaComponent.ctorParameters = () => [
{ type: ModalitaPagamentoService }
];
EstremiPersonaFisicaComponent.propDecorators = {
ngxsFormPath: [{ type: Input }],
province: [{ type: Input }],
nazioni: [{ type: Input }],
isPersonaFisicaValid: [{ type: Input }],
personaFisica: [{ type: Input }],
viewSessoPF: [{ type: Input }],
validatePersonaFisicaEmitter: [{ type: Output }],
personaFisicaEmitter: [{ type: Output }],
_disableForm: [{ type: Input, args: ['disableForm',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXN0cmVtaS1wZXJzb25hLWZpc2ljYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi1zb2Z0d2FyZWZhY3RvcnkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbGl0YS1wYWdhbWVudG8vY29tcG9uZW50cy9lc3RyZW1pLXBlcnNvbmEtZmlzaWNhL2VzdHJlbWktcGVyc29uYS1maXNpY2EuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzNGLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxZQUFZLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQU1uRixNQUFNLE9BQU8sNkJBQTZCO0lBaUR6QyxZQUFvQix3QkFBa0Q7UUFBbEQsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQS9CdEUsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFHN0IsaUNBQTRCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUd4RCx5QkFB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QkFBd0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsMENBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5TSxDQUFDOzs7WUF4TEQsU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSw0QkFBNEI7Z0JBQ3RDLDY0TUFBc0Q7O2FBRXREOzs7WUFMTyx3QkFBd0I7OzsyQkFROUIsS0FBSzt1QkFHTCxLQUFLO3NCQUdMLEtBQUs7bUNBR0wsS0FBSzs0QkFHTCxLQUFLOzBCQUdMLEtBQUs7MkNBR0wsTUFBTTttQ0FHTixNQUFNOzJCQUdOLEtBQUssU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtpaWYsIG9mLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7Q29tdW5lTW9kZWwsIERhdGlBbmFnUGVyc29uYUZpc2ljYU1vZGVsLCBMb2NhbGl0YU1vZGVsLCBOYXppb25lTW9kZWx9IGZyb20gJy4uLy4uL21vZGVscy9lc3RyZW1pLXBlcnNvbmEtZmlzaWNhLm1vZGVsJztcclxuaW1wb3J0IHtnZXREYXRlRXJyb3JNZXNzYWdlLCBnZXRFcnJvck1lc3NhZ2V9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMtbWVzc2FnZXMudXRpbHMnO1xyXG5pbXBvcnQge1ZhbGlkYXRlQ29kaWNlRmlzY2FsZVBJVkEsIFZhbGlkYXRlTmFtZX0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMudXRpbHNcIjtcclxuaW1wb3J0IHtNb2RhbGl0YVBhZ2FtZW50b1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGFsaXRhLXBhZ2FtZW50by5zZXJ2aWNlJztcclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdsaWItZXN0cmVtaS1wZXJzb25hLWZpc2ljYScsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2VzdHJlbWktcGVyc29uYS1maXNpY2EuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2VzdHJlbWktcGVyc29uYS1maXNpY2EuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXN0cmVtaVBlcnNvbmFGaXNpY2FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0bmd4c0Zvcm1QYXRoOiBzdHJpbmc7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHJvdmluY2U6IExvY2FsaXRhTW9kZWxbXTtcclxuXHJcblx0QElucHV0KClcclxuXHRuYXppb25pOiBOYXppb25lTW9kZWxbXTtcclxuXHJcblx0QElucHV0KClcclxuXHRpc1BlcnNvbmFGaXNpY2FWYWxpZDogYm9vbGVhbjtcclxuXHJcblx0QElucHV0KClcclxuXHRwZXJzb25hRmlzaWNhOiBEYXRpQW5hZ1BlcnNvbmFGaXNpY2FNb2RlbDtcclxuXHJcblx0QElucHV0KClcclxuXHR2aWV3U2Vzc29QRjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHR2YWxpZGF0ZVBlcnNvbmFGaXNpY2FFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRwZXJzb25hRmlzaWNhRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwZXJzb25hOiBEYXRpQW5hZ1BlcnNvbmFGaXNpY2FNb2RlbCwgaXNWYWxpZDogYm9vbGVhbiB9PigpO1xyXG5cclxuXHRASW5wdXQoJ2Rpc2FibGVGb3JtJylcclxuXHRzZXQgX2Rpc2FibGVGb3JtKHZhbDogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5kaXNhYmxlRm9ybSA9IHZhbDtcclxuXHRcdGlmICh0aGlzLmRpc2FibGVGb3JtKSB7XHJcblx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmRpc2FibGUoKTtcclxuXHRcdFx0dGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2FFbWl0dGVyLmVtaXQoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmVuYWJsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZGlzYWJsZUZvcm06IGJvb2xlYW47XHJcblxyXG5cdGNvbXVuaTogQ29tdW5lTW9kZWxbXTtcclxuXHJcblx0ZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtOiBGb3JtR3JvdXA7XHJcblx0bWF4RGF0YU5hc2NpdGEgPSBuZXcgRGF0ZSgpO1xyXG5cclxuXHRwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuXHRnZXRFcnJvck1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2U7XHJcblx0Z2V0RGF0ZUVycm9yTWVzc2FnZSA9IGdldERhdGVFcnJvck1lc3NhZ2U7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWxpdGFQYWdhbWVudG9TZXJ2aWNlOiBNb2RhbGl0YVBhZ2FtZW50b1NlcnZpY2UpIHtcclxuXHRcdC8vIHRoaXMuaW5pdFBlcnNvbmFGaXNpY2FGb3JtKCk7XHJcblx0XHQvLyB0aGlzLnNldENvZGljZUZpc2NhbGVWYWxpZGF0b3JzKCk7XHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaW5pdFBlcnNvbmFGaXNpY2FGb3JtKCk7XHJcblx0XHR0aGlzLnNldEZvcm1Db250cm9sc1ZhbHVlKCk7XHJcblx0XHR0aGlzLnNldENvZGljZUZpc2NhbGVWYWxpZGF0b3JzKCk7XHJcblxyXG5cdFx0Ly8gU2V0L1Vuc2V0IGZvcm0gY29udHJvbHMgdmFsaWRhdGlvbiBvbiBpc05hdG9Fc3Rlcm8gVmFsdWUgQ2hhbmdlXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2lzTmF0b0VzdGVybyddLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoaXNOYXRvRXN0ZXJvID0+IHtcclxuXHRcdFx0aWYgKGlzTmF0b0VzdGVybykge1xyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnBhdGNoVmFsdWUobnVsbClcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnBhdGNoVmFsdWUobnVsbClcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ3Byb3ZpbmNpYU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ25hemlvbmVOYXNjaXRhJ10uc2V0VmFsaWRhdG9ycyhbXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS5wYXRjaFZhbHVlKG51bGwpXHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ25hemlvbmVOYXNjaXRhJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KSk7XHJcblxyXG5cdFx0dGhpcy5nZXRDb211bmlPblByb3ZpbmNpYUNoYW5nZSgpO1xyXG5cdFx0dGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2EoKTtcclxuXHRcdHRoaXMucGVyc29uYUZpc2ljYUVtaXQoKTtcclxufVxyXG5cclxuXHRnZXRDb211bmlPblByb3ZpbmNpYUNoYW5nZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcblx0XHRcdFx0c3dpdGNoTWFwKHNpZ2xhUHJvdmluY2lhTmFzY2l0YSA9PlxyXG5cdFx0XHRcdFx0aWlmKCgpID0+ICEhc2lnbGFQcm92aW5jaWFOYXNjaXRhLFxyXG5cdFx0XHRcdFx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvU2VydmljZS5nZXRDb211bmkkKHNpZ2xhUHJvdmluY2lhTmFzY2l0YSkucGlwZSh0YWtlKDEpKSxcclxuXHRcdFx0XHRcdFx0b2YoW10pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSkuc3Vic2NyaWJlKGNvbXVuaSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jb211bmkgPSBjb211bmk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0dmFsaWRhdGVQZXJzb25hRmlzaWNhKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRcdGRlYm91bmNlVGltZSg1MDApLFxyXG5cdFx0XHRcdGZpbHRlcigoKSA9PiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS52YWxpZCksXHJcblx0XHRcdCkuc3Vic2NyaWJlKChfKSA9PiB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZVBlcnNvbmFGaXNpY2FFbWl0dGVyLmVtaXQoKTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwZXJzb25hRmlzaWNhRW1pdCgpOiB2b2lkIHtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdFx0ZGVib3VuY2VUaW1lKDUwMCksXHJcblx0XHRcdFx0Ly8gZmlsdGVyKCgpID0+IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLnZhbGlkKSxcclxuXHRcdFx0KS5zdWJzY3JpYmUoKF8pID0+IHtcclxuXHRcdFx0XHRjb25zdCBwZXJzb25hRmlzaWNhOiBEYXRpQW5hZ1BlcnNvbmFGaXNpY2FNb2RlbCA9IHtcclxuXHRcdFx0XHRcdGluZm9BbmFncmFmaWNoZToge1xyXG5cdFx0XHRcdFx0XHRjb2RGaXNjYWxlOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlRmlzY2FsZSddLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRjb2dub21lOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29nbm9tZSddLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRub21lOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbm9tZSddLnZhbHVlXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0aW5mb05hc2NpdGE6IHtcclxuXHRcdFx0XHRcdFx0Y29tdW5lTmFzY2l0YSA6IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10udmFsdWUsXHJcblx0XHRcdFx0XHRcdHByb3ZpbmNpYU5hc2NpdGEgOiBcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10udmFsdWUsXHJcblx0XHRcdFx0XHRcdGRhdGFOYXNjaXRhIDogdGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2RhdGFOYXNjaXRhJ10udmFsdWVcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnN0IGlzVmFsaWQgPSB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS52YWxpZDtcclxuXHRcdFx0XHR0aGlzLnBlcnNvbmFGaXNpY2FFbWl0dGVyLmVtaXQoeyBwZXJzb25hOiBwZXJzb25hRmlzaWNhID8gcGVyc29uYUZpc2ljYSA6IG51bGwsIGlzVmFsaWQgfSk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0aW5pdFBlcnNvbmFGaXNpY2FGb3JtKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuXHRcdFx0Y29kaWNlRmlzY2FsZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRub21lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRlTmFtZV0pLFxyXG5cdFx0XHRjb2dub21lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRlTmFtZV0pLFxyXG5cdFx0XHRpc05hdG9Fc3Rlcm86IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcblx0XHRcdHByb3ZpbmNpYU5hc2NpdGE6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuXHRcdFx0Y29kaWNlQ29tdW5lTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRuYXppb25lTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRkYXRhTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcblx0XHRcdHNlc3NvOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgdGhpcy52aWV3U2Vzc29QRiA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6ICBbXSlcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2V0Q29kaWNlRmlzY2FsZVZhbGlkYXRvcnMoKSB7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlRmlzY2FsZSddLnNldFZhbGlkYXRvcnMoW1xyXG5cdFx0XHRWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG5cdFx0XHRWYWxpZGF0ZUNvZGljZUZpc2NhbGVQSVZBXHJcblx0XHRdKTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHR9XHJcblxyXG5cdGNvbnZlcnRUb1VwcGVyY2FzZShldmVudDogRXZlbnQpIHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmdldCgnY29kaWNlRmlzY2FsZScpLnNldFZhbHVlKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUudG9VcHBlckNhc2UoKSk7XHJcblx0fVxyXG5cclxuXHRvblByb3ZpbmNpYUNoYW5nZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10ucGF0Y2hWYWx1ZShudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10ubWFya0FzVG91Y2hlZCgpO1xyXG5cdH1cclxuXHJcblx0c2V0Rm9ybUNvbnRyb2xzVmFsdWUoKTogdm9pZHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VGaXNjYWxlJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9BbmFncmFmaWNoZS5jb2RGaXNjYWxlIDogbnVsbCk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbm9tZSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvQW5hZ3JhZmljaGUubm9tZSA6IG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZ25vbWUnXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgPyB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb0FuYWdyYWZpY2hlLmNvZ25vbWUgOiBudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydpc05hdG9Fc3Rlcm8nXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgJiYgdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLmNvbXVuZU5hc2NpdGEuc3RhcnRzV2l0aChcIlpcIikgPyB0cnVlIDogZmFsc2UpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ3Byb3ZpbmNpYU5hc2NpdGEnXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgICYmICF0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YS5zdGFydHNXaXRoKFwiWlwiKSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YS5wcm92aW5jaWFOYXNjaXRhIDogbnVsbCk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSAmJiAhdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLmNvbXVuZU5hc2NpdGEuc3RhcnRzV2l0aChcIlpcIikgPyB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YSA6IG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2RhdGFOYXNjaXRhJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLmRhdGFOYXNjaXRhIDogbnVsbCk7XHJcblx0XHQvLyBUT0RPXHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snc2Vzc28nXS5zZXRWYWx1ZSh0aGlzLnZpZXdTZXNzb1BGID8gJ00nOiBudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWyduYXppb25lTmFzY2l0YSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSAmJiB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YS5zdGFydHNXaXRoKFwiWlwiKSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YT8uY29tdW5lTmFzY2l0YSA6IG51bGwpO1xyXG5cdH1cclxufVxyXG4iXX0=