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.

152 lines 29.1 kB
import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core"; import { FormGroup } from "@angular/forms"; import { combineLatest, merge, Observable, Subject } from "rxjs"; import { debounceTime, map, scan, shareReplay, startWith, tap, withLatestFrom } from "rxjs/operators"; import { Tuple } from "../../models/tuple"; import { TipiDocumento } from "../../constants/tipi-documenti"; import { Modals } from "../../utils/modals"; import { Azione, GenericModalData } from "../../common-component/generic-modal/generic-modal-data"; export class DocumentazioneComponent { constructor(modals) { this.modals = modals; //TODO this.allegatiMock = [{ chiaveCollegamento: "7afe2d6c-5757-4684-91fc-387c7c15dbf6", dataCreazione: "2021-01-08", dataInizioStaging: "2021-01-08", dataStaging: "2021-01-08", dataValidazione: null, descrizione: "Test request10", idCreatore: "1", idDocumento: "ad397ac0-f017-48e1-98fb-3e4c514adbdb", idIstanza: "2380b34a-4b2d-4a9b-896b-ba4a27cdbf7f", jsonMetadati: "", nome: "fileditest10.txt", proprietario: { tipoProprietario: "PF", idProprietario: "1", idSottoProprietario: null }, statiDocumento: [{ idDocumento: "ad397ac0-f017-48e1-98fb-3e4c514adbdb", stato: "DOC_VALID", dataCambiamentoStato: "2021-01-08", nota: null, lastState: true }], tipoDocumento: { id: "e617df75-0c3b-41a6-b7a0-c514ede2e9ee", codice: "CU", descrizione: "Certifcazione Unica" }, tipoServizio: { id: "f2c7415f-5a20-4f14-a379-d07d0d1cbd9a", codice: "CU", descrizione: "Certificazione Unica" }, url: "/v1/documento/ad397ac0-f017-48e1-98fb-3e4c514adbdb/download" }]; this.nextStep = new EventEmitter(); this.salvaBozza = new EventEmitter(); this.previousStep = new EventEmitter(); this.direction = "both-ways"; this.isFinal = false; this.avantiClicks$ = new Subject(); this.indietroClicks$ = new Subject(); } ngOnInit() { this.form = new FormGroup({}); if (!this.documenti) { this.initDocumnetazione(); } this.addFiles$ = new Subject(); this.removeFile$ = new Subject(); this.removeFile$.subscribe(console.log); //------Si accumulano i documenti validi da inviare------- const adds$ = this.addFiles$.pipe(map((file) => (acc) => { if (file.file != null) { if (!file.file.name.toLowerCase().endsWith(".pdf")) { // this.modals.failure(["Si prega di inserire solamente file in formato pdf"]); this.modals.openConfirm(this.buildErrore("Si prega di inserire solamente file in formato pdf")); return acc; } if (file.file.size == 0) { // this.modals.failure(["Si prega di non inserire file vuoti"]); this.modals.openConfirm(this.buildErrore("zero-file-size")); return acc; } const fileExists = acc.find(loaded => loaded.file.name === file.file.name) != null; if (fileExists) { // this.modals.failure(["Si prega di inserire un file diverso da quelli che sono stati inserti"]); this.modals.openConfirm(this.buildErrore("Si prega di inserire un file diverso da quelli che sono stati inseriti")); return acc; } this.caricaDocumenti.resetForm(); } //console.log("[file]", [...acc, file]); return [...acc, file]; })); this.nomeColonne$ = new Observable(ob => ob.next(["nr._Documento", "tipo_Documento", "data_Documento", "tipologia_emittente", "organo_emittente", "obbligatorio"])); this.mappatura$ = this.addFiles$.pipe(map(file => Object.keys(file[0]))); const removals$ = this.removeFile$.pipe(map((index) => (acc) => { return acc.filter((_, i) => index !== i); })); this.files$ = merge(adds$, removals$).pipe(scan((acc, op) => op(acc), []), startWith([]), tap(_ => console.log("[DocumentazioneComponent] - metadatiDocumenti", _)), shareReplay()); this.viewList$ = this.files$.pipe(map(files => files.length > 0)); const presentAndMissing$ = combineLatest([this.files$, this.tipologieDocumento$]) .pipe(map(([files, tipologieDocumento]) => { const tipiDoc = tipologieDocumento ? tipologieDocumento.filter((t) => t.codice != TipiDocumento.ALTRO) : []; const missing = tipiDoc.filter((tipoDoc) => { const typeFound = files.find((file) => file.tipoDocumento.codice == tipoDoc.codice); return typeFound ? false : true; }); return Tuple.of(files, missing); }), shareReplay()); //scrivere l'errore this.hasMissingFileTypes$ = presentAndMissing$.pipe(map((t) => t._2.length > 0), startWith(false)); // //scrivere l'errore this.missingFileTypes$ = presentAndMissing$.pipe(map((t) => t._2)); //emettere lista dei file caricati const present$ = presentAndMissing$.pipe(map((t) => t._1)); this.subscription = this.avantiClicks$ .pipe(debounceTime(250), withLatestFrom(present$), // tap(([_, present]) => console.log("[present]", present)), tap(([_, present]) => this.nextStep.emit(present))) .subscribe(); this.tipologieDocumentoAll$ = this.tipologieDocumento$; } ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } } forward($event) { this.avantiClicks$.next($event); } backward(_) { this.previousStep.emit([]); } complete(_) { } onSalvaBozza(_) { this.salvaBozza.emit([]); } initDocumnetazione() { this.documenti = new Array(); } buildErrore(msg) { const data = new GenericModalData(); data.title = 'dialogTitleError'; data.paragrafi = [msg ]; const noOp = new Azione('ko'); noOp.testo = 'KO'; data.azioni = [noOp]; return data; } } DocumentazioneComponent.decorators = [ { type: Component, args: [{ selector: 'lib-documentazione', template: "<div class=\"row\" class=\"mt-3 mb-5\">\r\n\t<mat-expansion-panel class=\"panel\" [expanded]=\"true\" [formGroup]=\"form\">\r\n <mat-expansion-panel-header\r\n [collapsedHeight]=\"'48px'\"\r\n [expandedHeight]=\"'48px'\"\r\n class=\"custom-header\"\r\n >\r\n <mat-panel-title>\r\n <h3 class=\"h5 mb-0\"><info-tip-label label=\"documentazione\"></info-tip-label></h3>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\t<div class=\"col-12\">\r\n\t\t<br>\r\n\t\t<div class=\"row\">\r\n\t\t\t<div class=\"col-12 mb-3\">\r\n\t\t\t\t<h3 class=\"h5 mb-0\"><info-tip-label label=\"documentazione-da-allegare\"></info-tip-label></h3>\r\n\t\t\t\t<div class=\"divider\"></div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<lib-carica-documenti\r\n\t\t\t[tipologieDocumento]=\"tipologieDocumentoAll$ | async\"\r\n\t\t\t[tipologieTipiEmittenti$]=\"tipologieTipiEmittenti$\"\r\n\t\t\t(onFileAdded)=\"addFiles$.next($event)\"\r\n\t\t\t#caricaDocumenti\r\n\t\t>\r\n\t\t</lib-carica-documenti>\r\n\t</div>\r\n\t<div class=\"col-12\" *ngIf=\"viewList$ | async\">\r\n\t\t<div class=\"d-flex border-bottom align-items-baseline mb-3\">\r\n\t\t\t<h3 class=\"h5 mb-0\">{{'documentazione-inserita' | traduzione}}</h3>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"col-12\" *ngIf=\"viewList$ | async\">\r\n\t\t<lib-tabella-documenti [files$]=\"files$\" (indiceSelezionato)=\"removeFile$.next($event)\">\r\n\t\t</lib-tabella-documenti>\r\n\t</div>\r\n\t<div class=\"col-md-12\">\r\n\t\t<mat-error *ngIf=\"hasMissingFileTypes$ | async\">\r\n\t\t\t<p class=\"h6 mt-4\">{{'documenti-mancanti' | traduzione}}</p>\r\n\t\t\t<p *ngFor=\"let missing of missingFileTypes$ | async\">\r\n\t\t\t\t{{ missing.descrizione }}\r\n\t\t\t</p>\r\n\t\t</mat-error>\r\n\t</div>\r\n\t</mat-expansion-panel>\r\n\t<div class=\"mt-4\"></div>\r\n\t<lib-stepper-navigator\r\n\t\t[form]=\"form\"\r\n\t\t[direction]=\"direction\"\r\n\t\t[isFinal]=\"isFinal\"\r\n\t\t(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(goBackward)=\"complete($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n\t\t[isContainerValid]=\"!(hasMissingFileTypes$ | async)\"\r\n\t>\r\n\t</lib-stepper-navigator>\r\n</div>\r\n", styles: [""] },] } ]; DocumentazioneComponent.ctorParameters = () => [ { type: Modals } ]; DocumentazioneComponent.propDecorators = { documenti: [{ type: Input }], tipologieDocumento$: [{ type: Input }], tipologieTipiEmittenti$: [{ type: Input }], nextStep: [{ type: Output }], salvaBozza: [{ type: Output }], previousStep: [{ type: Output }], caricaDocumenti: [{ type: ViewChild, args: ['caricaDocumenti',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRhemlvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItc29mdHdhcmVmYWN0b3J5L2NvbW1vbi1jb21wb25lbnQtbGliL3Byb2plY3RzL3BvcnRhbC1jb21tb24tY29tcG9uZW50LWxpYi9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVwb3NpdGkvY29tcG9uZW50cy9kb2N1bWVudGF6aW9uZS9kb2N1bWVudGF6aW9uZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFN0UsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRzFDLE9BQU8sRUFBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx5REFBeUQsQ0FBQztBQVFqRyxNQUFNLE9BQU8sdUJBQXVCO0lBZ0VuQyxZQUFzQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTVEcEMsTUFBTTtRQUNOLGlCQUFZLEdBQUcsQ0FBQztnQkFDZixrQkFBa0IsRUFBRSxzQ0FBc0M7Z0JBQzFELGFBQWEsRUFB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U0FBUyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Zvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7RG9jdW1lbnRvRFRPfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RvY3VtZW50by1kdG9cIjtcclxuaW1wb3J0IHtUaXBvRG9jdW1lbnRvfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3RpcG8tZG9jdW1lbnRvXCI7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtOZXdGaWxlfSBmcm9tIFwiLi9uZXctZmlsZVwiO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgbWFwLCBzY2FuLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YXAsIHdpdGhMYXRlc3RGcm9tfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtUdXBsZX0gZnJvbSBcIi4uLy4uL21vZGVscy90dXBsZVwiO1xyXG5pbXBvcnQge1RpcGlEb2N1bWVudG99IGZyb20gXCIuLi8uLi9jb25zdGFudHMvdGlwaS1kb2N1bWVudGlcIjtcclxuaW1wb3J0IHtNb2RhbHN9IGZyb20gXCIuLi8uLi91dGlscy9tb2RhbHNcIjtcclxuaW1wb3J0IHtUaXBvbG9naWNhRFRPfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3RpcG9sb2dpY2EtZC10LW9cIjtcclxuaW1wb3J0IHtUaXBvRG9jdW1lbnRvRFRPfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3RpcG8tZG9jdW1lbnRvLmR0b1wiO1xyXG5pbXBvcnQge0F6aW9uZSwgR2VuZXJpY01vZGFsRGF0YX0gZnJvbSBcIi4uLy4uL2NvbW1vbi1jb21wb25lbnQvZ2VuZXJpYy1tb2RhbC9nZW5lcmljLW1vZGFsLWRhdGFcIjtcclxuaW1wb3J0IHsgQ2FyaWNhRG9jdW1lbnRpQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9kb2N1bWVudGF6aW9uZS9jYXJpY2EtZG9jdW1lbnRpL2NhcmljYS1kb2N1bWVudGkuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnbGliLWRvY3VtZW50YXppb25lJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vZG9jdW1lbnRhemlvbmUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2RvY3VtZW50YXppb25lLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRhemlvbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHRmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG5cdC8vVE9ET1xyXG5cdGFsbGVnYXRpTW9jayA9IFt7XHJcblx0XHRjaGlhdmVDb2xsZWdhbWVudG86IFwiN2FmZTJkNmMtNTc1Ny00Njg0LTkxZmMtMzg3YzdjMTVkYmY2XCIsXHJcblx0XHRkYXRhQ3JlYXppb25lOiBcIjIwMjEtMDEtMDhcIixcclxuXHRcdGRhdGFJbml6aW9TdGFnaW5nOiBcIjIwMjEtMDEtMDhcIixcclxuXHRcdGRhdGFTdGFnaW5nOiBcIjIwMjEtMDEtMDhcIixcclxuXHRcdGRhdGFWYWxpZGF6aW9uZTogbnVsbCxcclxuXHRcdGRlc2NyaXppb25lOiBcIlRlc3QgcmVxdWVzdDEwXCIsXHJcblx0XHRpZENyZWF0b3JlOiBcIjFcIixcclxuXHRcdGlkRG9jdW1lbnRvOiBcImFkMzk3YWMwLWYwMTctNDhlMS05OGZiLTNlNGM1MTRhZGJkYlwiLFxyXG5cdFx0aWRJc3RhbnphOiBcIjIzODBiMzRhLTRiMmQtNGE5Yi04OTZiLWJhNGEyN2NkYmY3ZlwiLFxyXG5cdFx0anNvbk1ldGFkYXRpOiBcIlwiLFxyXG5cdFx0bm9tZTogXCJmaWxlZGl0ZXN0MTAudHh0XCIsXHJcblx0XHRwcm9wcmlldGFyaW86IHsgdGlwb1Byb3ByaWV0YXJpbzogXCJQRlwiLCBpZFByb3ByaWV0YXJpbzogXCIxXCIsIGlkU290dG9Qcm9wcmlldGFyaW86IG51bGwgfSxcclxuXHRcdHN0YXRpRG9jdW1lbnRvOiBbeyBpZERvY3VtZW50bzogXCJhZDM5N2FjMC1mMDE3LTQ4ZTEtOThmYi0zZTRjNTE0YWRiZGJcIiwgc3RhdG86IFwiRE9DX1ZBTElEXCIsIGRhdGFDYW1iaWFtZW50b1N0YXRvOiBcIjIwMjEtMDEtMDhcIiwgbm90YTogbnVsbCwgbGFzdFN0YXRlOiB0cnVlIH1dLFxyXG5cdFx0dGlwb0RvY3VtZW50bzogeyBpZDogXCJlNjE3ZGY3NS0wYzNiLTQxYTYtYjdhMC1jNTE0ZWRlMmU5ZWVcIiwgY29kaWNlOiBcIkNVXCIsIGRlc2NyaXppb25lOiBcIkNlcnRpZmNhemlvbmUgVW5pY2FcIiB9LFxyXG5cdFx0dGlwb1NlcnZpemlvOiB7IGlkOiBcImYyYzc0MTVmLTVhMjAtNGYxNC1hMzc5LWQwN2QwZDFjYmQ5YVwiLCBjb2RpY2U6IFwiQ1VcIiwgZGVzY3JpemlvbmU6IFwiQ2VydGlmaWNhemlvbmUgVW5pY2FcIiB9LFxyXG5cdFx0dXJsOiBcIi92MS9kb2N1bWVudG8vYWQzOTdhYzAtZjAxNy00OGUxLTk4ZmItM2U0YzUxNGFkYmRiL2Rvd25sb2FkXCJcclxuXHR9XVxyXG5cclxuXHQvL1RPRE9cclxuXHQvLyBASW5wdXQoKVxyXG5cdC8vIGRvY3VtZW50YXppb25lOiBBcnJheTxEb2N1bWVudG9EVE8+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGRvY3VtZW50aTogQXJyYXk8RG9jdW1lbnRvRFRPPjtcclxuXHJcblx0QElucHV0KClcclxuXHR0aXBvbG9naWVEb2N1bWVudG8kOiBPYnNlcnZhYmxlPEFycmF5PFRpcG9Eb2N1bWVudG9EVE8+PjtcclxuXHJcblx0QElucHV0KClcclxuXHR0aXBvbG9naWVUaXBpRW1pdHRlbnRpJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvbG9naWNhRFRPPj47XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdG5leHRTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxOZXdGaWxlPj4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0c2FsdmFCb3p6YSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8TmV3RmlsZT4+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHByZXZpb3VzU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8TmV3RmlsZT4+KCk7XHJcblxyXG5cdEBWaWV3Q2hpbGQoJ2NhcmljYURvY3VtZW50aScpXHJcblx0Y2FyaWNhRG9jdW1lbnRpOiBDYXJpY2FEb2N1bWVudGlDb21wb25lbnQ7XHJcblxyXG5cdGFkZEZpbGVzJDogU3ViamVjdDxOZXdGaWxlPjtcclxuXHRyZW1vdmVGaWxlJDogU3ViamVjdDxudW1iZXI+O1xyXG5cdGZpbGVzJDogT2JzZXJ2YWJsZTxBcnJheTxOZXdGaWxlPj47XHJcblx0dmlld0xpc3QkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cdHRpcG9sb2dpZURvY3VtZW50b0FsbCQ6IE9ic2VydmFibGU8QXJyYXk8VGlwb0RvY3VtZW50b0RUTz4+O1xyXG5cdGhhc01pc3NpbmdGaWxlVHlwZXMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cdG1pc3NpbmdGaWxlVHlwZXMkOiBPYnNlcnZhYmxlPEFycmF5PFRpcG9Eb2N1bWVudG8+PjtcclxuXHRkaXJlY3Rpb24gPSBcImJvdGgtd2F5c1wiO1xyXG5cdGlzRmluYWwgPSBmYWxzZTtcclxuXHRhdmFudGlDbGlja3MkID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdG5vbWVDb2xvbm5lJDogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+PjtcclxuXHRtYXBwYXR1cmEkOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xyXG5cdGluZGlldHJvQ2xpY2tzJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHRzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIG1vZGFsczogTW9kYWxzKSB7IH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG5cdFx0aWYgKCF0aGlzLmRvY3VtZW50aSkge1xyXG5cdFx0XHR0aGlzLmluaXREb2N1bW5ldGF6aW9uZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYWRkRmlsZXMkID0gbmV3IFN1YmplY3QoKTtcclxuXHRcdHRoaXMucmVtb3ZlRmlsZSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuXHRcdHRoaXMucmVtb3ZlRmlsZSQuc3Vic2NyaWJlKGNvbnNvbGUubG9nKTtcclxuXHJcblx0XHQvLy0tLS0tLVNpIGFjY3VtdWxhbm8gaSBkb2N1bWVudGkgdmFsaWRpIGRhIGludmlhcmUtLS0tLS0tXHJcblx0XHRjb25zdCBhZGRzJCA9IHRoaXMuYWRkRmlsZXMkLnBpcGUoXHJcblx0XHRcdG1hcCgoZmlsZTogTmV3RmlsZSkgPT4gKGFjYzogQXJyYXk8TmV3RmlsZT4pID0+IHtcclxuXHRcdFx0XHRpZiAoZmlsZS5maWxlICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdGlmICghZmlsZS5maWxlLm5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcIi5wZGZcIikpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5tb2RhbHMuZmFpbHVyZShbXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSBzb2xhbWVudGUgZmlsZSBpbiBmb3JtYXRvIHBkZlwiXSk7XHJcblx0XHRcdFx0XHRcdHRoaXMubW9kYWxzLm9wZW5Db25maXJtKHRoaXMuYnVpbGRFcnJvcmUoXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSBzb2xhbWVudGUgZmlsZSBpbiBmb3JtYXRvIHBkZlwiKSk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhY2M7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoZmlsZS5maWxlLnNpemUgPT0gMCkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLm1vZGFscy5mYWlsdXJlKFtcIlNpIHByZWdhIGRpIG5vbiBpbnNlcmlyZSBmaWxlIHZ1b3RpXCJdKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5tb2RhbHMub3BlbkNvbmZpcm0odGhpcy5idWlsZEVycm9yZShcInplcm8tZmlsZS1zaXplXCIpKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNvbnN0IGZpbGVFeGlzdHMgPSBhY2MuZmluZChsb2FkZWQgPT4gbG9hZGVkLmZpbGUubmFtZSA9PT0gZmlsZS5maWxlLm5hbWUpICE9IG51bGw7XHJcblx0XHRcdFx0XHRpZiAoZmlsZUV4aXN0cykge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLm1vZGFscy5mYWlsdXJlKFtcIlNpIHByZWdhIGRpIGluc2VyaXJlIHVuIGZpbGUgZGl2ZXJzbyBkYSBxdWVsbGkgY2hlIHNvbm8gc3RhdGkgaW5zZXJ0aVwiXSk7XHJcblx0XHRcdFx0XHRcdHRoaXMubW9kYWxzLm9wZW5Db25maXJtKHRoaXMuYnVpbGRFcnJvcmUoXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSB1biBmaWxlIGRpdmVyc28gZGEgcXVlbGxpIGNoZSBzb25vIHN0YXRpIGluc2VyaXRpXCIpKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0aGlzLmNhcmljYURvY3VtZW50aS5yZXNldEZvcm0oKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhcIltmaWxlXVwiLCBbLi4uYWNjLCBmaWxlXSk7XHJcblx0XHRcdFx0cmV0dXJuIFsuLi5hY2MsIGZpbGVdO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLm5vbWVDb2xvbm5lJCA9XHJcblx0XHRcdG5ldyBPYnNlcnZhYmxlKG9iID0+IG9iLm5leHQoW1wibnIuX0RvY3VtZW50b1wiLCBcInRpcG9fRG9jdW1lbnRvXCIsIFwiZGF0YV9Eb2N1bWVudG9cIiwgXCJ0aXBvbG9naWFfZW1pdHRlbnRlXCIsIFwib3JnYW5vX2VtaXR0ZW50ZVwiLCBcIm9iYmxpZ2F0b3Jpb1wiXSkpO1xyXG5cclxuXHRcdHRoaXMubWFwcGF0dXJhJCA9IHRoaXMuYWRkRmlsZXMkLnBpcGUobWFwKGZpbGUgPT4gT2JqZWN0LmtleXMoZmlsZVswXSkpKVxyXG5cclxuXHRcdGNvbnN0IHJlbW92YWxzJCA9IHRoaXMucmVtb3ZlRmlsZSQucGlwZShcclxuXHRcdFx0bWFwKChpbmRleDogbnVtYmVyKSA9PiAoYWNjOiBBcnJheTxOZXdGaWxlPikgPT4ge1xyXG5cdFx0XHRcdHJldHVybiBhY2MuZmlsdGVyKChfLCBpKSA9PiBpbmRleCAhPT0gaSk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuZmlsZXMkID0gbWVyZ2UoYWRkcyQsIHJlbW92YWxzJCkucGlwZShcclxuXHRcdFx0c2NhbigoYWNjLCBvcCkgPT4gb3AoYWNjKSwgW10pLFxyXG5cdFx0XHRzdGFydFdpdGgoW10pLFxyXG5cdFx0XHR0YXAoXyA9PiBjb25zb2xlLmxvZyhcIltEb2N1bWVudGF6aW9uZUNvbXBvbmVudF0gLSBtZXRhZGF0aURvY3VtZW50aVwiLCBfKSksXHJcblx0XHRcdHNoYXJlUmVwbGF5KClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy52aWV3TGlzdCQgPSB0aGlzLmZpbGVzJC5waXBlKG1hcChmaWxlcyA9PiBmaWxlcy5sZW5ndGggPiAwKSk7XHJcblxyXG5cdFx0Y29uc3QgcHJlc2VudEFuZE1pc3NpbmckID0gY29tYmluZUxhdGVzdChcclxuXHRcdFx0W3RoaXMuZmlsZXMkLCB0aGlzLnRpcG9sb2dpZURvY3VtZW50byRdXHJcblx0XHQpXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdG1hcCgoW2ZpbGVzLCB0aXBvbG9naWVEb2N1bWVudG9dKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCB0aXBpRG9jID0gdGlwb2xvZ2llRG9jdW1lbnRvXHJcblx0XHRcdFx0XHRcdD8gdGlwb2xvZ2llRG9jdW1lbnRvLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHQodCkgPT4gdC5jb2RpY2UgIT0gVGlwaURvY3VtZW50by5BTFRST1xyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdDogW107XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbWlzc2luZyA9IHRpcGlEb2MuZmlsdGVyKCh0aXBvRG9jKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHR5cGVGb3VuZCA9IGZpbGVzLmZpbmQoXHJcblx0XHRcdFx0XHRcdFx0KGZpbGUpID0+IGZpbGUudGlwb0RvY3VtZW50by5jb2RpY2UgPT0gdGlwb0RvYy5jb2RpY2VcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVGb3VuZCA/IGZhbHNlIDogdHJ1ZTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBUdXBsZS5vZihmaWxlcywgbWlzc2luZyk7XHJcblx0XHRcdFx0fSksXHJcblx0XHRcdFx0c2hhcmVSZXBsYXkoKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdC8vc2NyaXZlcmUgbCdlcnJvcmVcclxuXHRcdHRoaXMuaGFzTWlzc2luZ0ZpbGVUeXBlcyQgPSBwcmVzZW50QW5kTWlzc2luZyQucGlwZShcclxuXHRcdFx0bWFwKCh0KSA9PiB0Ll8yLmxlbmd0aCA+IDApLFxyXG5cdFx0XHRzdGFydFdpdGgoZmFsc2UpXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIC8vc2NyaXZlcmUgbCdlcnJvcmVcclxuXHRcdHRoaXMubWlzc2luZ0ZpbGVUeXBlcyQgPSBwcmVzZW50QW5kTWlzc2luZyQucGlwZShtYXAoKHQpID0+IHQuXzIpKTtcclxuXHJcblx0XHQvL2VtZXR0ZXJlIGxpc3RhIGRlaSBmaWxlIGNhcmljYXRpXHJcblx0XHRjb25zdCBwcmVzZW50JCA9IHByZXNlbnRBbmRNaXNzaW5nJC5waXBlKG1hcCgodCkgPT4gdC5fMSkpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5hdmFudGlDbGlja3MkXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdGRlYm91bmNlVGltZSgyNTApLFxyXG5cdFx0XHRcdHdpdGhMYXRlc3RGcm9tKHByZXNlbnQkKSxcclxuXHRcdFx0XHQvLyB0YXAoKFtfLCBwcmVzZW50XSkgPT4gY29uc29sZS5sb2coXCJbcHJlc2VudF1cIiwgcHJlc2VudCkpLFxyXG5cdFx0XHRcdHRhcCgoW18sIHByZXNlbnRdKSA9PiB0aGlzLm5leHRTdGVwLmVtaXQocHJlc2VudCkpXHJcblx0XHRcdClcclxuXHRcdFx0LnN1YnNjcmliZSgpO1xyXG5cclxuXHRcdHRoaXMudGlwb2xvZ2llRG9jdW1lbnRvQWxsJCA9IHRoaXMudGlwb2xvZ2llRG9jdW1lbnRvJDtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmb3J3YXJkKCRldmVudDogYW55KSB7XHJcblx0XHR0aGlzLmF2YW50aUNsaWNrcyQubmV4dCgkZXZlbnQpO1xyXG5cdH1cclxuXHJcblx0YmFja3dhcmQoXzogYW55KSB7XHJcblx0XHR0aGlzLnByZXZpb3VzU3RlcC5lbWl0KFtdKTtcclxuXHR9XHJcblxyXG5cdGNvbXBsZXRlKF86IGFueSkgeyB9XHJcblxyXG5cdG9uU2FsdmFCb3p6YShfOiBhbnkpIHtcclxuXHRcdHRoaXMuc2FsdmFCb3p6YS5lbWl0KFtdKTtcclxuXHR9XHJcblxyXG5cdGluaXREb2N1bW5ldGF6aW9uZSgpIHtcclxuXHRcdHRoaXMuZG9jdW1lbnRpID0gbmV3IEFycmF5PERvY3VtZW50b0RUTz4oKTtcclxuXHR9XHJcblxyXG5cdGJ1aWxkRXJyb3JlKG1zZzogc3RyaW5nKTogR2VuZXJpY01vZGFsRGF0YSB7XHJcblx0XHRjb25zdCBkYXRhID0gbmV3IEdlbmVyaWNNb2RhbERhdGEoKTtcclxuXHJcblx0XHRkYXRhLnRpdGxlID0gJ2RpYWxvZ1RpdGxlRXJyb3InO1xyXG5cdFx0ZGF0YS5wYXJhZ3JhZmkgPVxyXG5cdFx0XHRbIG1zZ1xyXG5cdFx0XHRdO1xyXG5cdFx0Y29uc3Qgbm9PcCA9IG5ldyBBemlvbmUoJ2tvJyk7XHJcblx0XHRub09wLnRlc3RvID0gJ0tPJztcclxuXHJcblx0XHRkYXRhLmF6aW9uaSA9IFtub09wXTtcclxuXHRcdHJldHVybiBkYXRhO1xyXG5cdH1cclxuXHJcbn1cclxuIl19