@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
110 lines • 25.8 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { NewFile } from '../new-file';
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
import { debounceTime, map, shareReplay, tap, withLatestFrom } from 'rxjs/operators';
import { MessageService } from '../../../services/message.service';
import { ValidationService } from "../../../services/validation.service";
import { InfoTipService } from '../../../../info-tip/info-tip.service';
export class CaricaDocumentiComponent {
constructor(msg, infoTipService) {
this.msg = msg;
this.infoTipService = infoTipService;
this.onFileAdded = new EventEmitter();
this.maxDate = new Date();
this.validitaForm$ = new Subject();
/* Stream files caricati */
this.files$ = new BehaviorSubject(null);
}
ngOnInit() {
// //TODO
// if (!this.tipologieEmittente) {
// this.tipologieEmittente = [{ codice: "TIPOLOGIE_EMITTENTE_1", descrizione: "tipologieEmittente1", id: "1", codiceLingua: "it_IT" }]
// }
this.form = new FormGroup({});
const tipoDocumento = new FormControl({ value: null, disabled: false }, [Validators.required]);
const soggettoEmittente = new FormControl({ value: "", disabled: false }, [Validators.required]);
const dataDocumento = new FormControl({ value: "", disabled: false }, [Validators.required, ValidationService.ValidateDate]);
const numeroDocumento = new FormControl({ value: "", disabled: false }, [Validators.required]);
const tipologiaEmittente = new FormControl({ value: null, disabled: false }, []);
const note = new FormControl({ value: "", disabled: false }, []);
this.form.addControl('tipoDocumento', tipoDocumento);
this.form.addControl('soggettoEmittente', soggettoEmittente);
this.form.addControl('dataDocumento', dataDocumento);
this.form.addControl('numeroDocumento', numeroDocumento);
this.form.addControl('tipologiaEmittente', tipologiaEmittente);
this.form.addControl('note', note);
this.tipoDocumento$ = tipoDocumento.valueChanges.pipe(shareReplay());
this.soggettoEmittente$ = soggettoEmittente.valueChanges.pipe(shareReplay());
this.dataDocumento$ = dataDocumento.valueChanges.pipe(shareReplay());
this.numeroDocumento$ = numeroDocumento.valueChanges
.pipe(debounceTime(800), shareReplay());
this.addFiles$ = new Subject();
this.note$ = new Subject();
this.tipologieEmittente$ = new Subject();
const dtos$ = combineLatest([this.tipoDocumento$, this.files$, this.soggettoEmittente$, this.dataDocumento$, this.numeroDocumento$, this.tipologieEmittente$, this.note$])
.pipe(map(([tipDocumento, file, soggettoEmittente, dataDocumento, numeroDocumento, codiceTipoEmittente, nota]) => {
return new NewFile(new Date().getTime().toString(), file, tipDocumento, soggettoEmittente, dataDocumento, numeroDocumento, codiceTipoEmittente, nota);
}));
this.addFiles$.pipe(debounceTime(300), withLatestFrom(dtos$), tap(([_, dto]) => {
this.onFileAdded.emit(dto);
this.validitaForm$.next(true);
this.pulisciForm();
})).subscribe();
this.infoTipService.getInfo$('numero-documento').subscribe(info => {
this.numeroDocumentoCaption = info.tooltip;
});
}
sfoglia(_) {
if (this.fileInput.nativeElement) {
this.fileInput.nativeElement.click();
}
}
filesChanged() {
const file = this.fileInput.nativeElement.files[0];
this.files$.next(file);
this.nameFileTruncated = this.formatFunction(file.name);
}
aggiungiFile(event) {
this.tipologieEmittente$.next(this.form.value["tipologiaEmittente"]);
this.note$.next(this.form.value["note"]);
this.addFiles$.next(event);
this.fileInput.nativeElement.value = '';
//this.form.reset();
}
resetForm() {
this.form.reset();
}
ngOnDistory() {
this.subscription.unsubscribe();
}
formatFunction(nomeFile) {
return nomeFile.length > 18 ? nomeFile.substring(0, 18) + '...' + nomeFile.substring(nomeFile.length, nomeFile.length - 4) : nomeFile;
}
pulisciForm() {
Object.keys(this.form.value)
.forEach(campo => {
this.form.get(campo).setValue('');
});
this.files$.next(null);
}
}
CaricaDocumentiComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-carica-documenti',
template: "<div class=\"row d-flex align-items-center\" [formGroup]=\"form\">\r\n\t<div class=\"col-12 col-md-6 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'tipo-documento' | traduzione}} {{' *'}}</mat-label>\r\n\t\t\t<mat-select formControlName=\"tipoDocumento\">\r\n\t\t\t\t<mat-option *ngFor=\"let tipoDocumento of tipologieDocumento\" [value]=\"tipoDocumento\">\r\n\t\t\t\t\t{{tipoDocumento.descrizione}}\r\n\t\t\t\t</mat-option>\r\n\t\t\t</mat-select>\r\n\t\t\t<mat-error *ngIf=\"form.controls['tipoDocumento'].invalid\">\r\n\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['tipoDocumento']) | traduzione}}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint *infoTip=\"'tipo-documento'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<div class=\"col-12 col-md-6 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'soggetto-emittente' | traduzione}}{{' *'}}</mat-label>\r\n\t\t\t<input matInput formControlName=\"soggettoEmittente\">\r\n\t\t\t<mat-error *ngIf=\"form.controls['soggettoEmittente'].invalid\">\r\n\t\t\t\t{{ msg.produceMessage('obbligatorio', form.controls['soggettoEmittente']) | traduzione}}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint *infoTip=\"'soggetto-emittente'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\r\n\t<div class=\"col-12 col-md-6 col-lg-3 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'data-documento' | traduzione}}{{' *'}}</mat-label>\r\n\t\t\t<input matInput [matDatepicker]=\"picker\" formControlName=\"dataDocumento\" [max]=\"maxDate\">\r\n\t\t\t<mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n\t\t\t<mat-datepicker #picker></mat-datepicker>\r\n\t\t\t<mat-error *ngIf=\"form.controls['dataDocumento'].invalid\">\r\n\t\t\t\t{{ msg.getErrorData(form.controls[\"dataDocumento\"]) | traduzione }}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint *infoTip=\"'data-documento'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\r\n\t</div>\r\n\t<div class=\"col-12 col-md-6 col-lg-3 my-2\">\r\n\t\t<mat-form-field appearance=\"\"> \r\n\t\t\t<mat-label>{{'numero-documento' | traduzione}}{{'*'}}</mat-label>\r\n\t\t\t<input matInput formControlName=\"numeroDocumento\" #numeroDoc maxlength=\"49\">\r\n\t\t\t<mat-error *ngIf=\"form.controls['numeroDocumento'].invalid\">\r\n\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['numeroDocumento']) | traduzione}}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint align=\"start\" style=\"max-width: 70%!important;color: black!important;\">{{numeroDocumentoCaption}}</mat-hint>\r\n\t\t\t<mat-hint align=\"end\">{{numeroDoc.value.length}} / 49</mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"col-12 col-md-9 col-lg-3 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'tipologia-emittente' | traduzione}}</mat-label>\r\n\t\t\t<!-- TODO -->\r\n\t\t\t<!-- <mat-select formControlName=\"tipologiaEmittente\">\r\n\t\t\t\t<mat-option [value]=\"null\">-- {{ 'placeholder' | traduzione }} --</mat-option>\r\n\t\t\t\t<mat-option *ngFor=\"let tipologiaEmittente of tipologieEmittente\" [value]=\"tipologiaEmittente\">\r\n\t\t\t\t\t{{tipologiaEmittente.descrizione}}\r\n\t\t\t\t</mat-option>\r\n\t\t\t</mat-select> -->\r\n\t\t\t<mat-select placeholder=\"{{'seleziona' | traduzione}}\" formControlName=\"tipologiaEmittente\">\r\n\t\t\t\t<mat-option \r\n\t\t\t\t\t*ngFor=\"let tipoEmittente of tipologieTipiEmittenti$ | async\"\r\n\t\t\t\t\t[value]=\"tipoEmittente.codice\"\r\n\t\t\t\t>\r\n\t\t\t\t{{ tipoEmittente.descrizione }}\r\n\t\t\t\t</mat-option>\r\n\t\t\t</mat-select>\r\n\t\t\t<mat-hint *infoTip=\"'tipologia-emittente'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<div class=\"col-12 col-md-3 col-lg-3 my-2\">\r\n\t\t<button mat-stroked-button color=\"primary\" class=\"text-uppercase mb-2\" (click)=\"sfoglia($event)\">\r\n\t\t\t<i class=\"fas fa-upload\"></i> {{'upload-file' | traduzione}}\r\n\t\t</button>\r\n\r\n\t\t<p *ngIf=\"files$ | async as files\" class=\"position-absolute mb-0 mt-2 text-muted file-upl\">\r\n\t\t\t<i class=\"far fa-file-alt text-primary mr-1\" aria-hidden=\"true\"></i>\r\n\t\t\t{{nameFileTruncated}}\r\n\t\t\t<!-- <a href=\"#\" (click)=\"files$.next(null)\"><span class=\" ml-1 sr-only\">{{'scarta_il_file' |\r\n\t\t\t\t\ttraduzione}}</span><i class=\"fas fa-times-circle ml-2 text-danger\"></i></a> -->\r\n\t\t</p>\r\n\t</div>\r\n\t<div class=\"col-12 my-2\">\r\n\t\t<mat-form-field class=\"example-full-width\">\r\n\t\t\t<mat-label>{{'note' | traduzione}}</mat-label>\r\n\t\t\t<textarea matInput \r\n\t\t\tplaceholder=\"Lorem ipsum...\" \r\n\t\t\tformControlName=\"note\"\r\n\t\t\tmaxlength=\"511\"\r\n\t\t\t#testo\r\n\t\t\t></textarea>\r\n\t\t\t<mat-hint *infoTip=\"'note'\"></mat-hint>\r\n\t\t\t<mat-hint align=\"end\">{{testo.value.length}} / 511</mat-hint>\r\n\t\t</mat-form-field>\r\n\r\n\t</div>\r\n\t<div class=\"col-12 text-right my-2\">\r\n\t\t<button type=\"button\" mat-flat-button color=\"primary\" class=\"text-uppercase mb-2\" (click)=\"aggiungiFile($event)\"\r\n\t\t\t[disabled]=\"form.invalid || (files$ | async) == null\">\r\n\t\t\t{{'aggiungi' | traduzione}}\r\n\t\t</button>\r\n\t</div>\r\n\t<input #fileInput *ngIf=\"(tipoDocumento$ | async) != null\" type=\"file\" class=\"hidden\"\r\n\t\t(change)=\"filesChanged($event)\" accept=\".pdf\">\r\n</div>",
styles: ["button#buttoneCarica{display:none}.file-upl{white-space:nowrap}"]
},] }
];
CaricaDocumentiComponent.ctorParameters = () => [
{ type: MessageService },
{ type: InfoTipService }
];
CaricaDocumentiComponent.propDecorators = {
tipologieDocumento: [{ type: Input }],
tipologieEmittente: [{ type: Input }],
tipologieTipiEmittenti$: [{ type: Input }],
onFileAdded: [{ type: Output }],
fileInput: [{ type: ViewChild, args: ['fileInput',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyaWNhLWRvY3VtZW50aS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi1zb2Z0d2FyZWZhY3RvcnkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kZXBvc2l0aS9jb21wb25lbnRzL2RvY3VtZW50YXppb25lL2NhcmljYS1kb2N1bWVudGkvY2FyaWNhLWRvY3VtZW50aS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFcEcsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBYyxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDdkYsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBUXJFLE1BQU0sT0FBTyx3QkFBd0I7SUF5Q3BDLFlBQW1CLEdBQW1CLEVBQVUsY0FBOEI7UUFBM0QsUUFBRyxHQUFILEdBQUcsQ0FBZ0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUEzQjlFLGdCQUFXLEdBQTBCLElBQUksWUFBWSxFQUFF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LENBQUMsUUFBZ0I7UUFDOUIsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDdEksQ0FBQztJQUVELFdBQVc7UUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDOzs7WUF2SkQsU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLHNwS0FBZ0Q7O2FBRWhEOzs7WUFUTyxjQUFjO1lBRWQsY0FBYzs7O2lDQVVwQixLQUFLO2lDQUdMLEtBQUs7c0NBR0wsS0FBSzswQkFLTCxNQUFNO3dCQUdOLFNBQVMsU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1RpcG9Eb2N1bWVudG99IGZyb20gJy4uLy4uLy4uL21vZGVscy90aXBvLWRvY3VtZW50byc7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge05ld0ZpbGV9IGZyb20gJy4uL25ldy1maWxlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBtYXAsIHNoYXJlUmVwbGF5LCB0YXAsIHdpdGhMYXRlc3RGcm9tfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7VGlwb2xvZ2ljYURUT30gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RpcG9sb2dpY2EtZC10LW8nO1xyXG5pbXBvcnQge01lc3NhZ2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7SW5mb1RpcFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL2luZm8tdGlwL2luZm8tdGlwLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnbGliLWNhcmljYS1kb2N1bWVudGknLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9jYXJpY2EtZG9jdW1lbnRpLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9jYXJpY2EtZG9jdW1lbnRpLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FyaWNhRG9jdW1lbnRpQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblx0QElucHV0KClcclxuXHR0aXBvbG9naWVEb2N1bWVudG86IEFycmF5PFRpcG9sb2dpY2FEVE8+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHRpcG9sb2dpZUVtaXR0ZW50ZTogQXJyYXk8VGlwb2xvZ2ljYURUTz47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0dGlwb2xvZ2llVGlwaUVtaXR0ZW50aSQ6IE9ic2VydmFibGU8QXJyYXk8VGlwb2xvZ2ljYURUTz4+O1xyXG5cclxuXHRmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdG9uRmlsZUFkZGVkOiBFdmVudEVtaXR0ZXI8TmV3RmlsZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cdEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpXHJcblx0ZmlsZUlucHV0OiBFbGVtZW50UmVmO1xyXG5cdG1heERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuXHQvKiBTdHJlYW0gY2FtcGkgaW5wdXQgKi9cclxuXHR0aXBvRG9jdW1lbnRvJDogT2JzZXJ2YWJsZTxUaXBvRG9jdW1lbnRvPjtcclxuXHRzb2dnZXR0b0VtaXR0ZW50ZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHRkYXRhRG9jdW1lbnRvJDogT2JzZXJ2YWJsZTxEYXRlPjtcclxuXHRudW1lcm9Eb2N1bWVudG8kOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcblx0bm90ZSQ6IFN1YmplY3Q8c3RyaW5nPjtcclxuXHR0aXBvbG9naWVFbWl0dGVudGUkOiBTdWJqZWN0PFRpcG9sb2dpY2FEVE8+O1xyXG5cdHZhbGlkaXRhRm9ybSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cdG5hbWVGaWxlVHJ1bmNhdGVkOiBzdHJpbmc7XHJcblxyXG5cdC8qIFN0cmVhbSBmaWxlcyBjYXJpY2F0aSAqL1xyXG5cdGZpbGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsZT4obnVsbCk7XHJcblxyXG5cdC8qIFN0cmVhbSBjbGljayBib3R0b25lIGFnZ2l1bmdpIGZpbGVzICovXHJcblx0YWRkRmlsZXMkOiBTdWJqZWN0PGFueT47XHJcblxyXG5cdHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRudW1lcm9Eb2N1bWVudG9DYXB0aW9uOiBzdHJpbmc7XHJcblxyXG5cclxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgbXNnOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBpbmZvVGlwU2VydmljZTogSW5mb1RpcFNlcnZpY2UpIHsgfVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdC8vIC8vVE9ET1xyXG5cdFx0Ly8gaWYgKCF0aGlzLnRpcG9sb2dpZUVtaXR0ZW50ZSkge1xyXG5cdFx0Ly8gXHR0aGlzLnRpcG9sb2dpZUVtaXR0ZW50ZSA9IFt7IGNvZGljZTogXCJUSVBPTE9HSUVfRU1JVFRFTlRFXzFcIiwgZGVzY3JpemlvbmU6IFwidGlwb2xvZ2llRW1pdHRlbnRlMVwiLCBpZDogXCIxXCIsIGNvZGljZUxpbmd1YTogXCJpdF9JVFwiIH1dXHJcblx0XHQvLyB9XHJcblx0XHR0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHRcdGNvbnN0IHRpcG9Eb2N1bWVudG8gPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcblx0XHRjb25zdCBzb2dnZXR0b0VtaXR0ZW50ZSA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBcIlwiLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuXHRcdGNvbnN0IGRhdGFEb2N1bWVudG8gPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogXCJcIiwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0aW9uU2VydmljZS5WYWxpZGF0ZURhdGVdKTtcclxuXHRcdGNvbnN0IG51bWVyb0RvY3VtZW50byA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBcIlwiLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuXHRcdGNvbnN0IHRpcG9sb2dpYUVtaXR0ZW50ZSA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogZmFsc2UgfSwgW10pO1xyXG5cdFx0Y29uc3Qgbm90ZSA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBcIlwiLCBkaXNhYmxlZDogZmFsc2UgfSwgW10pO1xyXG5cclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCd0aXBvRG9jdW1lbnRvJywgdGlwb0RvY3VtZW50byk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgnc29nZ2V0dG9FbWl0dGVudGUnLCBzb2dnZXR0b0VtaXR0ZW50ZSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgnZGF0YURvY3VtZW50bycsIGRhdGFEb2N1bWVudG8pO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woJ251bWVyb0RvY3VtZW50bycsIG51bWVyb0RvY3VtZW50byk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgndGlwb2xvZ2lhRW1pdHRlbnRlJywgdGlwb2xvZ2lhRW1pdHRlbnRlKTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCdub3RlJywgbm90ZSk7XHJcblxyXG5cdFx0dGhpcy50aXBvRG9jdW1lbnRvJCA9IHRpcG9Eb2N1bWVudG8udmFsdWVDaGFuZ2VzLnBpcGUoc2hhcmVSZXBsYXkoKSk7XHJcblx0XHR0aGlzLnNvZ2dldHRvRW1pdHRlbnRlJCA9IHNvZ2dldHRvRW1pdHRlbnRlLnZhbHVlQ2hhbmdlcy5waXBlKHNoYXJlUmVwbGF5KCkpO1xyXG5cdFx0dGhpcy5kYXRhRG9jdW1lbnRvJCA9IGRhdGFEb2N1bWVudG8udmFsdWVDaGFuZ2VzLnBpcGUoc2hhcmVSZXBsYXkoKSk7XHJcblxyXG5cdFx0dGhpcy5udW1lcm9Eb2N1bWVudG8kID0gbnVtZXJvRG9jdW1lbnRvLnZhbHVlQ2hhbmdlc1xyXG5cdFx0XHQucGlwZShkZWJvdW5jZVRpbWUoODAwKSwgc2hhcmVSZXBsYXkoKSk7XHJcblxyXG5cdFx0dGhpcy5hZGRGaWxlcyQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblxyXG5cdFx0dGhpcy5ub3RlJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHRcdHRoaXMudGlwb2xvZ2llRW1pdHRlbnRlJCA9IG5ldyBTdWJqZWN0PFRpcG9sb2dpY2FEVE8+KCk7XHJcblxyXG5cclxuXHRcdGNvbnN0IGR0b3MkOiBPYnNlcnZhYmxlPE5ld0ZpbGU+ID0gY29tYmluZUxhdGVzdChcclxuXHRcdFx0W3RoaXMudGlwb0RvY3VtZW50byQsIHRoaXMuZmlsZXMkLCB0aGlzLnNvZ2dldHRvRW1pdHRlbnRlJCwgdGhpcy5kYXRhRG9jdW1lbnRvJCwgdGhpcy5udW1lcm9Eb2N1bWVudG8kLCB0aGlzLnRpcG9sb2dpZUVtaXR0ZW50ZSQsIHRoaXMubm90ZSRdKVxyXG5cdFx0XHQucGlwZShcclxuXHRcdFx0XHRtYXAoKFt0aXBEb2N1bWVudG8sIGZpbGUsIHNvZ2dldHRvRW1pdHRlbnRlLCBkYXRhRG9jdW1lbnRvLCBudW1lcm9Eb2N1bWVudG8sIGNvZGljZVRpcG9FbWl0dGVudGUsIG5vdGFdKSA9PiB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbmV3IE5ld0ZpbGUoXHJcblx0XHRcdFx0XHRcdG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCksXHJcblx0XHRcdFx0XHRcdGZpbGUgYXMgRmlsZSxcclxuXHRcdFx0XHRcdFx0dGlwRG9jdW1lbnRvIGFzIFRpcG9Eb2N1bWVudG8sXHJcblx0XHRcdFx0XHRcdHNvZ2dldHRvRW1pdHRlbnRlIGFzIHN0cmluZyxcclxuXHRcdFx0XHRcdFx0ZGF0YURvY3VtZW50byBhcyBEYXRlLFxyXG5cdFx0XHRcdFx0XHRudW1lcm9Eb2N1bWVudG8gYXMgc3RyaW5nLFxyXG5cdFx0XHRcdFx0XHRjb2RpY2VUaXBvRW1pdHRlbnRlIGFzIHN0cmluZyxcclxuXHRcdFx0XHRcdFx0bm90YSBhcyBzdHJpbmcpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0dGhpcy5hZGRGaWxlcyQucGlwZShcclxuXHRcdFx0ZGVib3VuY2VUaW1lKDMwMCksXHJcblx0XHRcdHdpdGhMYXRlc3RGcm9tKGR0b3MkKSxcclxuXHRcdFx0dGFwKChbXywgZHRvXSkgPT4ge1xyXG5cdFx0XHRcdHRoaXMub25GaWxlQWRkZWQuZW1pdChkdG8pO1xyXG5cdFx0XHRcdHRoaXMudmFsaWRpdGFGb3JtJC5uZXh0KHRydWUpO1xyXG5cdFx0XHRcdHRoaXMucHVsaXNjaUZvcm0oKTtcclxuXHRcdFx0fSlcclxuXHRcdCkuc3Vic2NyaWJlKCk7XHJcblxyXG5cdFx0dGhpcy5pbmZvVGlwU2VydmljZS5nZXRJbmZvJCgnbnVtZXJvLWRvY3VtZW50bycpLnN1YnNjcmliZShpbmZvID0+IHtcclxuXHRcdFx0dGhpcy5udW1lcm9Eb2N1bWVudG9DYXB0aW9uID0gaW5mby50b29sdGlwO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzZm9nbGlhKF8pIHtcclxuXHRcdGlmICh0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZpbGVzQ2hhbmdlZCgpIHtcclxuXHRcdGNvbnN0IGZpbGU6IEZpbGUgPSB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzWzBdO1xyXG5cdFx0dGhpcy5maWxlcyQubmV4dChmaWxlKTtcclxuXHRcdHRoaXMubmFtZUZpbGVUcnVuY2F0ZWQgPSB0aGlzLmZvcm1hdEZ1bmN0aW9uKGZpbGUubmFtZSk7XHJcblxyXG5cdH1cclxuXHJcblx0YWdnaXVuZ2lGaWxlKGV2ZW50KSB7XHJcblx0XHR0aGlzLnRpcG9sb2dpZUVtaXR0ZW50ZSQubmV4dCh0aGlzLmZvcm0udmFsdWVbXCJ0aXBvbG9naWFFbWl0dGVudGVcIl0pO1xyXG5cdFx0dGhpcy5ub3RlJC5uZXh0KHRoaXMuZm9ybS52YWx1ZVtcIm5vdGVcIl0pO1xyXG5cdFx0dGhpcy5hZGRGaWxlcyQubmV4dChldmVudCk7XHJcblx0XHR0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcblx0XHQvL3RoaXMuZm9ybS5yZXNldCgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHJlc2V0Rm9ybSgpIHtcclxuXHRcdHRoaXMuZm9ybS5yZXNldCgpO1xyXG5cdH1cclxuXHJcblx0bmdPbkRpc3RvcnkoKSB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcblx0fVxyXG5cclxuXHRmb3JtYXRGdW5jdGlvbihub21lRmlsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBub21lRmlsZS5sZW5ndGggPiAxOCA/IG5vbWVGaWxlLnN1YnN0cmluZygwLCAxOCkgKyAnLi4uJyArIG5vbWVGaWxlLnN1YnN0cmluZyhub21lRmlsZS5sZW5ndGgsIG5vbWVGaWxlLmxlbmd0aCAtIDQpIDogbm9tZUZpbGVcclxuXHR9XHJcblxyXG5cdHB1bGlzY2lGb3JtKCkge1xyXG5cdFx0T2JqZWN0LmtleXModGhpcy5mb3JtLnZhbHVlKVxyXG5cdFx0XHQuZm9yRWFjaChjYW1wbyA9PiB7XHJcblx0XHRcdFx0dGhpcy5mb3JtLmdldChjYW1wbykuc2V0VmFsdWUoJycpXHJcblx0XHRcdH0pO1xyXG5cdFx0dGhpcy5maWxlcyQubmV4dChudWxsKTtcclxuXHR9XHJcbn1cclxuIl19