UNPKG

@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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXN0cmVtaS1wZXJzb25hLWZpc2ljYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiRDovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi10ZXJuaS9jb21tb24tY29tcG9uZW50LWxpYi9wcm9qZWN0cy9wb3J0YWwtY29tbW9uLWNvbXBvbmVudC1saWIvc3JjLyIsInNvdXJjZXMiOlsibGliL21vZGFsaXRhLXBhZ2FtZW50by9jb21wb25lbnRzL2VzdHJlbWktcGVyc29uYS1maXNpY2EvZXN0cmVtaS1wZXJzb25hLWZpc2ljYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDM0YsT0FBTyxFQUFDLHlCQUF5QixFQUFFLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3JGLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBTW5GLE1BQU0sT0FBTyw2QkFBNkI7SUFpRHpDLFlBQW9CLHdCQUFrRDtRQUFsRCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBL0J0RSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUc3QixpQ0FBNEIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBR3hELHlCQUFvQixHQUFHLElB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LFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVywwQ0FBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlNLENBQUM7OztZQXhMRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLDRCQUE0QjtnQkFDdEMsNjRNQUFzRDs7YUFFdEQ7OztZQUxPLHdCQUF3Qjs7OzJCQVE5QixLQUFLO3VCQUdMLEtBQUs7c0JBR0wsS0FBSzttQ0FHTCxLQUFLOzRCQUdMLEtBQUs7MEJBR0wsS0FBSzsyQ0FHTCxNQUFNO21DQUdOLE1BQU07MkJBR04sS0FBSyxTQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge2lpZiwgb2YsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBzd2l0Y2hNYXAsIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtDb211bmVNb2RlbCwgRGF0aUFuYWdQZXJzb25hRmlzaWNhTW9kZWwsIExvY2FsaXRhTW9kZWwsIE5hemlvbmVNb2RlbH0gZnJvbSAnLi4vLi4vbW9kZWxzL2VzdHJlbWktcGVyc29uYS1maXNpY2EubW9kZWwnO1xyXG5pbXBvcnQge2dldERhdGVFcnJvck1lc3NhZ2UsIGdldEVycm9yTWVzc2FnZX0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9ycy1tZXNzYWdlcy51dGlscyc7XHJcbmltcG9ydCB7VmFsaWRhdGVDb2RpY2VGaXNjYWxlUElWQSwgVmFsaWRhdGVOYW1lfSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdG9ycy51dGlsc1wiO1xyXG5pbXBvcnQge01vZGFsaXRhUGFnYW1lbnRvU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kYWxpdGEtcGFnYW1lbnRvLnNlcnZpY2UnO1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2xpYi1lc3RyZW1pLXBlcnNvbmEtZmlzaWNhJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vZXN0cmVtaS1wZXJzb25hLWZpc2ljYS5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vZXN0cmVtaS1wZXJzb25hLWZpc2ljYS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFc3RyZW1pUGVyc29uYUZpc2ljYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcblx0QElucHV0KClcclxuXHRuZ3hzRm9ybVBhdGg6IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRwcm92aW5jZTogTG9jYWxpdGFNb2RlbFtdO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdG5hemlvbmk6IE5hemlvbmVNb2RlbFtdO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGlzUGVyc29uYUZpc2ljYVZhbGlkOiBib29sZWFuO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHBlcnNvbmFGaXNpY2E6IERhdGlBbmFnUGVyc29uYUZpc2ljYU1vZGVsO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHZpZXdTZXNzb1BGOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHZhbGlkYXRlUGVyc29uYUZpc2ljYUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHBlcnNvbmFGaXNpY2FFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBlcnNvbmE6IERhdGlBbmFnUGVyc29uYUZpc2ljYU1vZGVsLCBpc1ZhbGlkOiBib29sZWFuIH0+KCk7XHJcblxyXG5cdEBJbnB1dCgnZGlzYWJsZUZvcm0nKVxyXG5cdHNldCBfZGlzYWJsZUZvcm0odmFsOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLmRpc2FibGVGb3JtID0gdmFsO1xyXG5cdFx0aWYgKHRoaXMuZGlzYWJsZUZvcm0pIHtcclxuXHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uZGlzYWJsZSgpO1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlUGVyc29uYUZpc2ljYUVtaXR0ZXIuZW1pdCgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uZW5hYmxlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRkaXNhYmxlRm9ybTogYm9vbGVhbjtcclxuXHJcblx0Y29tdW5pOiBDb211bmVNb2RlbFtdO1xyXG5cclxuXHRlc3RyZW1pUGVyc29uYUZpc2ljYUZvcm06IEZvcm1Hcm91cDtcclxuXHRtYXhEYXRhTmFzY2l0YSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG5cdGdldEVycm9yTWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZTtcclxuXHRnZXREYXRlRXJyb3JNZXNzYWdlID0gZ2V0RGF0ZUVycm9yTWVzc2FnZTtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbGl0YVBhZ2FtZW50b1NlcnZpY2U6IE1vZGFsaXRhUGFnYW1lbnRvU2VydmljZSkge1xyXG5cdFx0Ly8gdGhpcy5pbml0UGVyc29uYUZpc2ljYUZvcm0oKTtcclxuXHRcdC8vIHRoaXMuc2V0Q29kaWNlRmlzY2FsZVZhbGlkYXRvcnMoKTtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5pbml0UGVyc29uYUZpc2ljYUZvcm0oKTtcclxuXHRcdHRoaXMuc2V0Rm9ybUNvbnRyb2xzVmFsdWUoKTtcclxuXHRcdHRoaXMuc2V0Q29kaWNlRmlzY2FsZVZhbGlkYXRvcnMoKTtcclxuXHJcblx0XHQvLyBTZXQvVW5zZXQgZm9ybSBjb250cm9scyB2YWxpZGF0aW9uIG9uIGlzTmF0b0VzdGVybyBWYWx1ZSBDaGFuZ2VcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snaXNOYXRvRXN0ZXJvJ10udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShpc05hdG9Fc3Rlcm8gPT4ge1xyXG5cdFx0XHRpZiAoaXNOYXRvRXN0ZXJvKSB7XHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ3Byb3ZpbmNpYU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtdKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10ucGF0Y2hWYWx1ZShudWxsKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtdKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10ucGF0Y2hWYWx1ZShudWxsKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWyduYXppb25lTmFzY2l0YSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWyduYXppb25lTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXHJcblx0XHRcdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29kaWNlQ29tdW5lTmFzY2l0YSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS5zZXRWYWxpZGF0b3JzKFtdKVxyXG5cdFx0XHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWyduYXppb25lTmFzY2l0YSddLnBhdGNoVmFsdWUobnVsbClcclxuXHRcdFx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snbmF6aW9uZU5hc2NpdGEnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdH1cclxuXHRcdH0pKTtcclxuXHJcblx0XHR0aGlzLmdldENvbXVuaU9uUHJvdmluY2lhQ2hhbmdlKCk7XHJcblx0XHR0aGlzLnZhbGlkYXRlUGVyc29uYUZpc2ljYSgpO1xyXG5cdFx0dGhpcy5wZXJzb25hRmlzaWNhRW1pdCgpO1xyXG59XHJcblxyXG5cdGdldENvbXVuaU9uUHJvdmluY2lhQ2hhbmdlKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydwcm92aW5jaWFOYXNjaXRhJ10udmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuXHRcdFx0XHRzd2l0Y2hNYXAoc2lnbGFQcm92aW5jaWFOYXNjaXRhID0+XHJcblx0XHRcdFx0XHRpaWYoKCkgPT4gISFzaWdsYVByb3ZpbmNpYU5hc2NpdGEsXHJcblx0XHRcdFx0XHRcdHRoaXMubW9kYWxpdGFQYWdhbWVudG9TZXJ2aWNlLmdldENvbXVuaSQoc2lnbGFQcm92aW5jaWFOYXNjaXRhKS5waXBlKHRha2UoMSkpLFxyXG5cdFx0XHRcdFx0XHRvZihbXSlcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpKS5zdWJzY3JpYmUoY29tdW5pID0+IHtcclxuXHRcdFx0XHR0aGlzLmNvbXVuaSA9IGNvbXVuaTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHR2YWxpZGF0ZVBlcnNvbmFGaXNpY2EoKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdFx0ZGVib3VuY2VUaW1lKDUwMCksXHJcblx0XHRcdFx0ZmlsdGVyKCgpID0+IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLnZhbGlkKSxcclxuXHRcdFx0KS5zdWJzY3JpYmUoKF8pID0+IHtcclxuXHRcdFx0XHR0aGlzLnZhbGlkYXRlUGVyc29uYUZpc2ljYUVtaXR0ZXIuZW1pdCgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHBlcnNvbmFGaXNpY2FFbWl0KCk6IHZvaWQge1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS52YWx1ZUNoYW5nZXMucGlwZShcclxuXHRcdFx0XHRkZWJvdW5jZVRpbWUoNTAwKSxcclxuXHRcdFx0XHQvLyBmaWx0ZXIoKCkgPT4gdGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0udmFsaWQpLFxyXG5cdFx0XHQpLnN1YnNjcmliZSgoXykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHBlcnNvbmFGaXNpY2E6IERhdGlBbmFnUGVyc29uYUZpc2ljYU1vZGVsID0ge1xyXG5cdFx0XHRcdFx0aW5mb0FuYWdyYWZpY2hlOiB7XHJcblx0XHRcdFx0XHRcdGNvZEZpc2NhbGU6IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VGaXNjYWxlJ10udmFsdWUsXHJcblx0XHRcdFx0XHRcdGNvZ25vbWU6IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2dub21lJ10udmFsdWUsXHJcblx0XHRcdFx0XHRcdG5vbWU6IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydub21lJ10udmFsdWVcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRpbmZvTmFzY2l0YToge1xyXG5cdFx0XHRcdFx0XHRjb211bmVOYXNjaXRhIDogdGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS52YWx1ZSxcclxuXHRcdFx0XHRcdFx0cHJvdmluY2lhTmFzY2l0YSA6IFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ3Byb3ZpbmNpYU5hc2NpdGEnXS52YWx1ZSxcclxuXHRcdFx0XHRcdFx0ZGF0YU5hc2NpdGEgOiB0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snZGF0YU5hc2NpdGEnXS52YWx1ZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0Y29uc3QgaXNWYWxpZCA9IHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLnZhbGlkO1xyXG5cdFx0XHRcdHRoaXMucGVyc29uYUZpc2ljYUVtaXR0ZXIuZW1pdCh7IHBlcnNvbmE6IHBlcnNvbmFGaXNpY2EgPyBwZXJzb25hRmlzaWNhIDogbnVsbCwgaXNWYWxpZCB9KTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRpbml0UGVyc29uYUZpc2ljYUZvcm0oKTogdm9pZCB7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG5cdFx0XHRjb2RpY2VGaXNjYWxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcblx0XHRcdG5vbWU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdGVOYW1lXSksXHJcblx0XHRcdGNvZ25vbWU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdGVOYW1lXSksXHJcblx0XHRcdGlzTmF0b0VzdGVybzogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcclxuXHRcdFx0cHJvdmluY2lhTmFzY2l0YTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG5cdFx0XHRjb2RpY2VDb211bmVOYXNjaXRhOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcblx0XHRcdG5hemlvbmVOYXNjaXRhOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcblx0XHRcdGRhdGFOYXNjaXRhOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuXHRcdFx0c2Vzc286IG5ldyBGb3JtQ29udHJvbChudWxsLCB0aGlzLnZpZXdTZXNzb1BGID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdIDogIFtdKVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzZXRDb2RpY2VGaXNjYWxlVmFsaWRhdG9ycygpIHtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VGaXNjYWxlJ10uc2V0VmFsaWRhdG9ycyhbXHJcblx0XHRcdFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcblx0XHRcdFZhbGlkYXRlQ29kaWNlRmlzY2FsZVBJVkFcclxuXHRcdF0pO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cdH1cclxuXHJcblx0Y29udmVydFRvVXBwZXJjYXNlKGV2ZW50OiBFdmVudCkge1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uZ2V0KCdjb2RpY2VGaXNjYWxlJykuc2V0VmFsdWUoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZS50b1VwcGVyQ2FzZSgpKTtcclxuXHR9XHJcblxyXG5cdG9uUHJvdmluY2lhQ2hhbmdlKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS5wYXRjaFZhbHVlKG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUNvbXVuZU5hc2NpdGEnXS5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHRzZXRGb3JtQ29udHJvbHNWYWx1ZSgpOiB2b2lke1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2NvZGljZUZpc2NhbGUnXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgPyB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb0FuYWdyYWZpY2hlLmNvZEZpc2NhbGUgOiBudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydub21lJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9BbmFncmFmaWNoZS5ub21lIDogbnVsbCk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snY29nbm9tZSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvQW5hZ3JhZmljaGUuY29nbm9tZSA6IG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ2lzTmF0b0VzdGVybyddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSAmJiB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YS5zdGFydHNXaXRoKFwiWlwiKSA/IHRydWUgOiBmYWxzZSk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1sncHJvdmluY2lhTmFzY2l0YSddLnNldFZhbHVlKHRoaXMucGVyc29uYUZpc2ljYSAgJiYgIXRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YS5jb211bmVOYXNjaXRhLnN0YXJ0c1dpdGgoXCJaXCIpID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhLnByb3ZpbmNpYU5hc2NpdGEgOiBudWxsKTtcclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydjb2RpY2VDb211bmVOYXNjaXRhJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhICYmICF0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuY29tdW5lTmFzY2l0YS5zdGFydHNXaXRoKFwiWlwiKSA/IHRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YS5jb211bmVOYXNjaXRhIDogbnVsbCk7XHJcblx0XHR0aGlzLmVzdHJlbWlQZXJzb25hRmlzaWNhRm9ybS5jb250cm9sc1snZGF0YU5hc2NpdGEnXS5zZXRWYWx1ZSh0aGlzLnBlcnNvbmFGaXNpY2EgPyB0aGlzLnBlcnNvbmFGaXNpY2EuaW5mb05hc2NpdGEuZGF0YU5hc2NpdGEgOiBudWxsKTtcclxuXHRcdC8vIFRPRE9cclxuXHRcdHRoaXMuZXN0cmVtaVBlcnNvbmFGaXNpY2FGb3JtLmNvbnRyb2xzWydzZXNzbyddLnNldFZhbHVlKHRoaXMudmlld1Nlc3NvUEYgPyAnTSc6IG51bGwpO1xyXG5cdFx0dGhpcy5lc3RyZW1pUGVyc29uYUZpc2ljYUZvcm0uY29udHJvbHNbJ25hemlvbmVOYXNjaXRhJ10uc2V0VmFsdWUodGhpcy5wZXJzb25hRmlzaWNhICYmIHRoaXMucGVyc29uYUZpc2ljYS5pbmZvTmFzY2l0YS5jb211bmVOYXNjaXRhLnN0YXJ0c1dpdGgoXCJaXCIpID8gdGhpcy5wZXJzb25hRmlzaWNhLmluZm9OYXNjaXRhPy5jb211bmVOYXNjaXRhIDogbnVsbCk7XHJcblx0fVxyXG59XHJcbiJdfQ==