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.

172 lines 31.9 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Subject } from 'rxjs'; import { map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; import { CodiceTipoPagamento } from '../../constants/tipo-pagamemto'; import { fromIdAndTipo } from '../../models/modalita-pagamento-dto'; import { PagamentoDTO } from '../../models/pagamento-dto'; import { ComponentOutputStatus } from '../../normalizzazione/component-output-status'; import { MessageService } from '../../services/message.service'; import { ComponentReducer } from '../../utils/component-reducer'; import { toBonificoExtraSepa, toBonificoSepa, toTesoreria, toVagliaBdi } from './modalita-pagamento-mapper'; export class PagamentoComponent { constructor(msg) { this.msg = msg; this.nextStep = new EventEmitter(); this.salvaBozza = new EventEmitter(); this.previousStep = new EventEmitter(); this.direction = 'both-ways'; this.isFinal = false; this.changesVagliaBdi$ = new Subject(); this.changesAttoPignoramento$ = new Subject(); } ngOnInit() { this.form = new FormGroup({}); let valid = true; if (!this.pagamento) { this.initPagamento(); valid = false; } // console.log('[PagamentoComponent] onInit', this.pagamento); this.tipoModalitaPagamento = new FormControl({ value: this.pagamento.tipoPagamento, disabled: false }, [Validators.required]); this.form.addControl('tipoModalitaPagamento', this.tipoModalitaPagamento); const initalModalitaPagamento = fromIdAndTipo(this.pagamento.idModalitaPagamento, this.pagamento.tipoPagamento); this.modalitaPagamento = new FormControl({ value: initalModalitaPagamento, disabled: false }, [Validators.required]); this.form.addControl('modalitaPagamento', this.modalitaPagamento); const changesTipoModalitaPagamento$ = this.tipoModalitaPagamento.valueChanges .pipe(shareReplay()); this.modalitaPagamentoPerTipoSelezionato$ = changesTipoModalitaPagamento$ .pipe(tap(_ => this.modalitaPagamento.setValue(null)), tap(_ => this.resetPagamenti()), startWith(this.pagamento.tipoPagamento), switchMap(tipoModalitaPagamento => this.modalitaPagamento$.pipe(map(modalitaPagamentoPF => { const modalitaPagamentoPerTipo = modalitaPagamentoPF.filter(mod => tipoModalitaPagamento == mod.tipologiaPagamento.codice); return modalitaPagamentoPerTipo; })))); const changesTipoRimborso$ = changesTipoModalitaPagamento$.pipe(map(tipoRimborso => { return ComponentOutputStatus.of(tipoRimborso != null, (pagamento) => pagamento.tipoPagamento = tipoRimborso); })); const changesModalitaRimborso$ = this.modalitaPagamento.valueChanges.pipe(map(rimborso => { return ComponentOutputStatus.of(true, _ => { // console.log('[PagamentoComponent] rimborso', rimborso); if (rimborso != undefined && rimborso != '') { this.setRimborso(rimborso); } }); })); const pagamentoChanges$ = ComponentReducer.reducer4(changesTipoRimborso$, changesModalitaRimborso$, this.changesVagliaBdi$, //TODO this.changesAttoPignoramento$, this.pagamentoValid(), ComponentOutputStatus.of(valid, this.pagamento)) .pipe(shareReplay()); this.isFormValid$ = pagamentoChanges$.pipe(map(_ => _.status), startWith(valid)); pagamentoChanges$.subscribe((pagStatus) => { console.log("[PagamentoComponent] status", pagStatus); }); } pagamentoValid() { return pagamento => { let pagamentoValid; if (pagamento.tipoPagamento) { switch (pagamento.tipoPagamento) { case (CodiceTipoPagamento.CODICE_BONIFICO_SEPA): pagamentoValid = pagamento.bonifico != null; break; case (CodiceTipoPagamento.CODICE_BONIFICO_EXTRA_SEPA): pagamentoValid = pagamento.bonificoExtraSepa != null; break; case (CodiceTipoPagamento.CODICE_TESORERIA): pagamentoValid = pagamento.tesoreria != null; break; case (CodiceTipoPagamento.CODICE_VAGLIA): pagamentoValid = pagamento.vagliaBDI != null; break; default: pagamentoValid = false; } } else { pagamentoValid = false; } return pagamentoValid; }; } modalitaComparator(m1, m2) { return (m1 || {}).idModalitaPagamento == (m2 || {}).idModalitaPagamento; } resetPagamenti() { this.changesVagliaBdi$.next(ComponentOutputStatus.of(true, (p) => p.vagliaBDI = null)); } setRimborso(rimborso) { // console.log('[setRimborso]', rimborso); this.resetModalitaPagamento(); this.pagamento.idModalitaPagamento = rimborso.idModalitaPagamento; switch (rimborso.tipologiaPagamento.codice) { case (CodiceTipoPagamento.CODICE_BONIFICO_SEPA): this.pagamento.bonifico = toBonificoSepa(rimborso); break; case (CodiceTipoPagamento.CODICE_BONIFICO_EXTRA_SEPA): this.pagamento.bonificoExtraSepa = toBonificoExtraSepa(rimborso); break; case (CodiceTipoPagamento.CODICE_TESORERIA): this.pagamento.tesoreria = toTesoreria(rimborso); break; case (CodiceTipoPagamento.CODICE_VAGLIA): this.pagamento.vagliaBDI = toVagliaBdi(rimborso); break; default: } } resetModalitaPagamento() { this.pagamento.idModalitaPagamento = null; this.pagamento.vagliaBDI = null; this.pagamento.tesoreria = null; this.pagamento.bonificoExtraSepa = null; this.pagamento.bonifico = null; } hasSelectedModalitaDiPagamentoAnd(v) { return this.hasSelectedModalitaDiPagamento() && v; } hasSelectedModalitaDiPagamento() { return this.modalitaPagamento.value; } //TODO isAutoritaGiudiziaria() { return this.hasSelectedModalitaDiPagamentoAnd(CodiceTipoPagamento.CODICE_BONIFICO_SEPA == this.tipoModalitaPagamento.value); } forward(_) { this.nextStep.emit(this.pagamento); } onSalvaBozza(_) { this.salvaBozza.emit(this.pagamento); } backward(_) { this.previousStep.emit(this.pagamento); } complete(_) { } initPagamento() { this.pagamento = new PagamentoDTO(); } //TODO attoPignoramentoReady(attoPignoramnetoStatus) { // console.log('[attoPignoramentoReady]', attoPignoramnetoStatus); this.changesAttoPignoramento$.next(attoPignoramnetoStatus.mapValue((pign) => (at) => at.tribunale = pign)); } } PagamentoComponent.decorators = [ { type: Component, args: [{ selector: 'lib-pagamento', template: "<mat-expansion-panel class=\"panel\" [expanded]=\"true\">\r\n\t<mat-expansion-panel-header [collapsedHeight]=\"'48px'\" [expandedHeight]=\"'48px'\" class=\"custom-header\">\r\n\t\t<mat-panel-title>\r\n\t\t\t<h3>{{'modalita-pagamento' | traduzione}}</h3>\r\n\t\t</mat-panel-title>\r\n\t</mat-expansion-panel-header>\r\n\t<form [formGroup]=\"form\">\r\n\t\t<div class=\"collapse-body mt-2\">\r\n\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"col-md-6\">\r\n\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t<mat-label>{{'required'| traduzione}}{{'tipologia-pagamento' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t<mat-select formControlName=\"tipoModalitaPagamento\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let pagamento of tipologiePagamento$ | async\"\r\n\t\t\t\t\t\t\t\t[value]=\"pagamento.codice\">\r\n\t\t\t\t\t\t\t\t{{pagamento.descrizione}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['tipoModalitaPagamento'].invalid\">\r\n\t\t\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['tipoModalitaPagamento']) | traduzione}}\r\n\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"col-md-6\">\r\n\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t<mat-label>{{'required'| traduzione}}{{'modalita-pagamento' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t<mat-select formControlName=\"modalitaPagamento\" [compareWith]=\"modalitaComparator\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let modalita of modalitaPagamentoPerTipoSelezionato$ | async\"\r\n\t\t\t\t\t\t\t\t[value]=\"modalita\">\r\n\t\t\t\t\t\t\t\t{{modalita.conto || modalita.tipologiaPagamento.descrizione}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['modalitaPagamento'].invalid\">\r\n\t\t\t\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['modalitaPagamento']) | traduzione}}\r\n\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<lib-dati-tribunale *ngIf=\"isAutoritaGiudiziaria()\"\r\n\t\t\t\t(attoPignoramentoReady)=\"attoPignoramentoReady($event)\"\r\n\t\t\t\t[attoPignoramento]=\"attoPignoramento\"\r\n\t\t\t\t[province]=\"province\"\r\n\t\t\t>\r\n\t\t\t</lib-dati-tribunale>\r\n\t\t</div>\r\n\t</form>\r\n</mat-expansion-panel>\r\n<!-- TODO -->\r\n<!-- <div class=\"mt-4\"></div>\r\n<lp-stepper-navigator-rx\r\n\t\t[form]=\"form\"\r\n\t\t[direction]=\"direction\"\r\n\t\t[isFinal]=\"isFinal\"\r\n\t\t[isContainerValid]=\"isFormValid$\"\r\n\t\t(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(complete)=\"complete($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n>\r\n</lp-stepper-navigator-rx> -->\r\n", styles: [".mat-card{border-radius:0!important;border-top:5px solid #0a2644}.divider{background-color:#737373;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-value{max-width:100%;width:100%!important}"] },] } ]; PagamentoComponent.ctorParameters = () => [ { type: MessageService } ]; PagamentoComponent.propDecorators = { pagamento: [{ type: Input }], tipologiePagamento$: [{ type: Input }], modalitaPagamento$: [{ type: Input }], province: [{ type: Input }], attoPignoramento: [{ type: Input }], nextStep: [{ type: Output }], salvaBozza: [{ type: Output }], previousStep: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnYW1lbnRvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJEOi9Qcm9nZXR0aS9EQUcvc29yZ2VudGkvZ2l0bGFiLXRlcm5pL2NvbW1vbi1jb21wb25lbnQtbGliL3Byb2plY3RzL3BvcnRhbC1jb21tb24tY29tcG9uZW50LWxpYi9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVwb3NpdGkvY29tcG9uZW50cy9wYWdhbWVudG8vcGFnYW1lbnRvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsYUFBYSxFQUF3QixNQUFNLHFDQUFxQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUcxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFPNUcsTUFBTSxPQUFPLGtCQUFrQjtJQTRDOUIsWUFBb0IsR0FBbUI7UUFBbkIs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YUFFekM7OztZQVJRLGNBQWM7Ozt3QkFhckIsS0FBSztrQ0FHTCxLQUFLO2lDQUdMLEtBQUs7dUJBR0wsS0FBSzsrQkFHTCxLQUFLO3VCQUdMLE1BQU07eUJBR04sTUFBTTsyQkFHTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvZGljZVRpcG9QYWdhbWVudG8gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGlwby1wYWdhbWVtdG8nO1xyXG5pbXBvcnQgeyBBdHRvUGlnbm9yYW1uZXRvRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2F0dG8tcGlnbm9yYW1lbnRvLWR0byc7XHJcbmltcG9ydCB7IGZyb21JZEFuZFRpcG8sIE1vZGFsaXRhUGFnYW1lbnRvRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21vZGFsaXRhLXBhZ2FtZW50by1kdG8nO1xyXG5pbXBvcnQgeyBQYWdhbWVudG9EVE8gfSBmcm9tICcuLi8uLi9tb2RlbHMvcGFnYW1lbnRvLWR0byc7XHJcbmltcG9ydCB7IExvY2FsaXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvcnRhbGUvbG9jYWxpdGEnO1xyXG5pbXBvcnQgeyBUaXBvbG9naWNhRFRPIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RpcG9sb2dpY2EtZC10LW8nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRPdXRwdXRTdGF0dXMgfSBmcm9tICcuLi8uLi9ub3JtYWxpenphemlvbmUvY29tcG9uZW50LW91dHB1dC1zdGF0dXMnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlZHVjZXIgfSBmcm9tICcuLi8uLi91dGlscy9jb21wb25lbnQtcmVkdWNlcic7XHJcbmltcG9ydCB7IHRvQm9uaWZpY29FeHRyYVNlcGEsIHRvQm9uaWZpY29TZXBhLCB0b1Rlc29yZXJpYSwgdG9WYWdsaWFCZGkgfSBmcm9tICcuL21vZGFsaXRhLXBhZ2FtZW50by1tYXBwZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdsaWItcGFnYW1lbnRvJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vcGFnYW1lbnRvLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9wYWdhbWVudG8uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdhbWVudG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHRmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cGFnYW1lbnRvOiBQYWdhbWVudG9EVE87XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0dGlwb2xvZ2llUGFnYW1lbnRvJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvbG9naWNhRFRPPj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0bW9kYWxpdGFQYWdhbWVudG8kOiBPYnNlcnZhYmxlPEFycmF5PE1vZGFsaXRhUGFnYW1lbnRvRFRPPj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHJvdmluY2U6IE9ic2VydmFibGU8QXJyYXk8TG9jYWxpdGE+PjtcclxuXHJcblx0QElucHV0KClcclxuXHRhdHRvUGlnbm9yYW1lbnRvOiBBdHRvUGlnbm9yYW1uZXRvRFRPO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRuZXh0U3RlcDogRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0c2FsdmFCb3p6YTogRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2FtZW50b0RUTz4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0cHJldmlvdXNTdGVwOiBFdmVudEVtaXR0ZXI8UGFnYW1lbnRvRFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnYW1lbnRvRFRPPigpO1xyXG5cclxuXHR0aXBvTW9kYWxpdGFQYWdhbWVudG86IEZvcm1Db250cm9sO1xyXG5cdG1vZGFsaXRhUGFnYW1lbnRvOiBGb3JtQ29udHJvbDtcclxuXHRwYXRpZW50Q2F0ZWdvcnk6IEZvcm1Db250cm9sO1xyXG5cdGRpcmVjdGlvbjogc3RyaW5nID0gJ2JvdGgtd2F5cyc7XHJcblx0aXNGaW5hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRjaGFuZ2VzVmFnbGlhQmRpJCA9IG5ldyBTdWJqZWN0PENvbXBvbmVudE91dHB1dFN0YXR1czwodmFsdWU6IFBhZ2FtZW50b0RUTykgPT4gdm9pZD4+KCk7XHJcblxyXG5cdGlzRm9ybVZhbGlkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcblx0ZGVmYXVsdFZhbHVlTW9kYWxpdGFSaW1ib3JzbzogTW9kYWxpdGFQYWdhbWVudG9EVE87XHJcblxyXG5cdG1vZGFsaXRhUGFnYW1lbnRvUGVyVGlwb1NlbGV6aW9uYXRvJDogT2JzZXJ2YWJsZTxBcnJheTxNb2RhbGl0YVBhZ2FtZW50b0RUTz4+O1xyXG5cclxuXHRjaGFuZ2VzQXR0b1BpZ25vcmFtZW50byQgPSBuZXcgU3ViamVjdDxDb21wb25lbnRPdXRwdXRTdGF0dXM8KHZhbHVlOiBQYWdhbWVudG9EVE8pID0+IHZvaWQ+PigpO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIG1zZzogTWVzc2FnZVNlcnZpY2UpIHsgfVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIXRoaXMucGFnYW1lbnRvKSB7XHJcblx0XHRcdHRoaXMuaW5pdFBhZ2FtZW50bygpO1xyXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKCdbUGFnYW1lbnRvQ29tcG9uZW50XSBvbkluaXQnLCB0aGlzLnBhZ2FtZW50byk7XHJcblxyXG5cdFx0dGhpcy50aXBvTW9kYWxpdGFQYWdhbWVudG8gPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5wYWdhbWVudG8udGlwb1BhZ2FtZW50bywgZGlzYWJsZWQ6IGZhbHNlIH0sXHJcblx0XHRcdFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgndGlwb01vZGFsaXRhUGFnYW1lbnRvJywgdGhpcy50aXBvTW9kYWxpdGFQYWdhbWVudG8pO1xyXG5cclxuXHRcdGNvbnN0IGluaXRhbE1vZGFsaXRhUGFnYW1lbnRvID0gZnJvbUlkQW5kVGlwbyh0aGlzLnBhZ2FtZW50by5pZE1vZGFsaXRhUGFnYW1lbnRvLCB0aGlzLnBhZ2FtZW50by50aXBvUGFnYW1lbnRvKTtcclxuXHJcblx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGluaXRhbE1vZGFsaXRhUGFnYW1lbnRvLCBkaXNhYmxlZDogZmFsc2UgfSxcclxuXHRcdFx0W1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCdtb2RhbGl0YVBhZ2FtZW50bycsIHRoaXMubW9kYWxpdGFQYWdhbWVudG8pO1xyXG5cclxuXHRcdGNvbnN0IGNoYW5nZXNUaXBvTW9kYWxpdGFQYWdhbWVudG8kID0gdGhpcy50aXBvTW9kYWxpdGFQYWdhbWVudG8udmFsdWVDaGFuZ2VzXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdHNoYXJlUmVwbGF5KClcclxuXHRcdFx0KTtcclxuXHJcblx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvUGVyVGlwb1NlbGV6aW9uYXRvJCA9IGNoYW5nZXNUaXBvTW9kYWxpdGFQYWdhbWVudG8kXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdHRhcChfID0+IHRoaXMubW9kYWxpdGFQYWdhbWVudG8uc2V0VmFsdWUobnVsbCkpLFxyXG5cdFx0XHRcdHRhcChfID0+IHRoaXMucmVzZXRQYWdhbWVudGkoKSksXHJcblx0XHRcdFx0c3RhcnRXaXRoKHRoaXMucGFnYW1lbnRvLnRpcG9QYWdhbWVudG8pLFxyXG5cdFx0XHRcdHN3aXRjaE1hcCh0aXBvTW9kYWxpdGFQYWdhbWVudG8gPT5cclxuXHRcdFx0XHRcdHRoaXMubW9kYWxpdGFQYWdhbWVudG8kLnBpcGUoXHJcblx0XHRcdFx0XHRcdG1hcChtb2RhbGl0YVBhZ2FtZW50b1BGID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtb2RhbGl0YVBhZ2FtZW50b1BlclRpcG8gPSBtb2RhbGl0YVBhZ2FtZW50b1BGLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdG1vZCA9PiB0aXBvTW9kYWxpdGFQYWdhbWVudG8gPT0gbW9kLnRpcG9sb2dpYVBhZ2FtZW50by5jb2RpY2VcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtb2RhbGl0YVBhZ2FtZW50b1BlclRpcG87XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHQpXHJcblxyXG5cdFx0Y29uc3QgY2hhbmdlc1RpcG9SaW1ib3JzbyQgPSBjaGFuZ2VzVGlwb01vZGFsaXRhUGFnYW1lbnRvJC5waXBlKFxyXG5cdFx0XHRtYXAodGlwb1JpbWJvcnNvID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0dGlwb1JpbWJvcnNvICE9IG51bGwsXHJcblx0XHRcdFx0XHQocGFnYW1lbnRvOiBQYWdhbWVudG9EVE8pID0+IHBhZ2FtZW50by50aXBvUGFnYW1lbnRvID0gdGlwb1JpbWJvcnNvKVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCBjaGFuZ2VzTW9kYWxpdGFSaW1ib3JzbyQgPVxyXG5cdFx0XHR0aGlzLm1vZGFsaXRhUGFnYW1lbnRvLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRcdG1hcChyaW1ib3JzbyA9PiB7XHJcblx0XHRcdFx0XHRyZXR1cm4gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0XHR0cnVlLFxyXG5cdFx0XHRcdFx0XHRfID0+IHtcclxuXHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnW1BhZ2FtZW50b0NvbXBvbmVudF0gcmltYm9yc28nLCByaW1ib3Jzbyk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJpbWJvcnNvICE9IHVuZGVmaW5lZCAmJiByaW1ib3JzbyAhPSAnJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRSaW1ib3JzbyhyaW1ib3Jzbyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Y29uc3QgcGFnYW1lbnRvQ2hhbmdlcyQ6IE9ic2VydmFibGU8Q29tcG9uZW50T3V0cHV0U3RhdHVzPFBhZ2FtZW50b0RUTz4+ID1cclxuXHRcdFx0Q29tcG9uZW50UmVkdWNlci5yZWR1Y2VyNChcclxuXHRcdFx0XHRjaGFuZ2VzVGlwb1JpbWJvcnNvJCxcclxuXHRcdFx0XHRjaGFuZ2VzTW9kYWxpdGFSaW1ib3JzbyQsXHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VzVmFnbGlhQmRpJCxcclxuXHRcdFx0XHQvL1RPRE9cclxuXHRcdFx0XHR0aGlzLmNoYW5nZXNBdHRvUGlnbm9yYW1lbnRvJCxcclxuXHRcdFx0XHR0aGlzLnBhZ2FtZW50b1ZhbGlkKCksXHJcblx0XHRcdFx0Q29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKHZhbGlkLCB0aGlzLnBhZ2FtZW50bylcclxuXHRcdFx0KVxyXG5cdFx0XHRcdC5waXBlKHNoYXJlUmVwbGF5KCkpO1xyXG5cclxuXHRcdHRoaXMuaXNGb3JtVmFsaWQkID0gcGFnYW1lbnRvQ2hhbmdlcyQucGlwZShtYXAoXyA9PiBfLnN0YXR1cyksIHN0YXJ0V2l0aCh2YWxpZCkpO1xyXG5cclxuXHRcdHBhZ2FtZW50b0NoYW5nZXMkLnN1YnNjcmliZSgocGFnU3RhdHVzKSA9PiB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiW1BhZ2FtZW50b0NvbXBvbmVudF0gc3RhdHVzXCIsIHBhZ1N0YXR1cylcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBwYWdhbWVudG9WYWxpZCgpOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gcGFnYW1lbnRvID0+IHtcclxuXHRcdFx0bGV0IHBhZ2FtZW50b1ZhbGlkOiBib29sZWFuO1xyXG5cdFx0XHRpZiAocGFnYW1lbnRvLnRpcG9QYWdhbWVudG8pIHtcclxuXHJcblx0XHRcdFx0c3dpdGNoIChwYWdhbWVudG8udGlwb1BhZ2FtZW50bykge1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fU0VQQSk6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gcGFnYW1lbnRvLmJvbmlmaWNvICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fRVhUUkFfU0VQQSk6XHJcblx0XHRcdFx0XHRcdHBhZ2FtZW50b1ZhbGlkID0gcGFnYW1lbnRvLmJvbmlmaWNvRXh0cmFTZXBhICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfVEVTT1JFUklBKTpcclxuXHRcdFx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBwYWdhbWVudG8udGVzb3JlcmlhICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfVkFHTElBKTpcclxuXHRcdFx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBwYWdhbWVudG8udmFnbGlhQkRJICE9IG51bGw7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0cGFnYW1lbnRvVmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHBhZ2FtZW50b1ZhbGlkO1xyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdG1vZGFsaXRhQ29tcGFyYXRvcihtMTogTW9kYWxpdGFQYWdhbWVudG9EVE8sIG0yOiBNb2RhbGl0YVBhZ2FtZW50b0RUTywpIHtcclxuXHRcdHJldHVybiAobTEgfHwge30pLmlkTW9kYWxpdGFQYWdhbWVudG8gPT0gKG0yIHx8IHt9KS5pZE1vZGFsaXRhUGFnYW1lbnRvO1xyXG5cdH1cclxuXHJcblx0cmVzZXRQYWdhbWVudGkoKSB7XHJcblx0XHR0aGlzLmNoYW5nZXNWYWdsaWFCZGkkLm5leHQoXHJcblx0XHRcdENvbXBvbmVudE91dHB1dFN0YXR1cy5vZih0cnVlLCAocDogUGFnYW1lbnRvRFRPKSA9PiBwLnZhZ2xpYUJESSA9IG51bGwpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c2V0UmltYm9yc28ocmltYm9yc286IE1vZGFsaXRhUGFnYW1lbnRvRFRPKSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZygnW3NldFJpbWJvcnNvXScsIHJpbWJvcnNvKTtcclxuXHRcdHRoaXMucmVzZXRNb2RhbGl0YVBhZ2FtZW50bygpO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uaWRNb2RhbGl0YVBhZ2FtZW50byA9IHJpbWJvcnNvLmlkTW9kYWxpdGFQYWdhbWVudG87XHJcblx0XHRzd2l0Y2ggKHJpbWJvcnNvLnRpcG9sb2dpYVBhZ2FtZW50by5jb2RpY2UpIHtcclxuXHRcdFx0Y2FzZSAoQ29kaWNlVGlwb1BhZ2FtZW50by5DT0RJQ0VfQk9OSUZJQ09fU0VQQSk6XHJcblx0XHRcdFx0dGhpcy5wYWdhbWVudG8uYm9uaWZpY28gPSB0b0JvbmlmaWNvU2VwYShyaW1ib3Jzbyk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX0JPTklGSUNPX0VYVFJBX1NFUEEpOlxyXG5cdFx0XHRcdHRoaXMucGFnYW1lbnRvLmJvbmlmaWNvRXh0cmFTZXBhID0gdG9Cb25pZmljb0V4dHJhU2VwYShyaW1ib3Jzbyk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgKENvZGljZVRpcG9QYWdhbWVudG8uQ09ESUNFX1RFU09SRVJJQSk6XHJcblx0XHRcdFx0dGhpcy5wYWdhbWVudG8udGVzb3JlcmlhID0gdG9UZXNvcmVyaWEocmltYm9yc28pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChDb2RpY2VUaXBvUGFnYW1lbnRvLkNPRElDRV9WQUdMSUEpOlxyXG5cdFx0XHRcdHRoaXMucGFnYW1lbnRvLnZhZ2xpYUJESSA9IHRvVmFnbGlhQmRpKHJpbWJvcnNvKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJlc2V0TW9kYWxpdGFQYWdhbWVudG8oKSB7XHJcblx0XHR0aGlzLnBhZ2FtZW50by5pZE1vZGFsaXRhUGFnYW1lbnRvID0gbnVsbDtcclxuXHRcdHRoaXMucGFnYW1lbnRvLnZhZ2xpYUJESSA9IG51bGw7XHJcblx0XHR0aGlzLnBhZ2FtZW50by50ZXNvcmVyaWEgPSBudWxsO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uYm9uaWZpY29FeHRyYVNlcGEgPSBudWxsO1xyXG5cdFx0dGhpcy5wYWdhbWVudG8uYm9uaWZpY28gPSBudWxsO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGhhc1NlbGVjdGVkTW9kYWxpdGFEaVBhZ2FtZW50b0FuZCh2OiBib29sZWFuKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5oYXNTZWxlY3RlZE1vZGFsaXRhRGlQYWdhbWVudG8oKSAmJiB2O1xyXG5cdH1cclxuXHRwdWJsaWMgaGFzU2VsZWN0ZWRNb2RhbGl0YURpUGFnYW1lbnRvKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubW9kYWxpdGFQYWdhbWVudG8udmFsdWU7XHJcblx0fVxyXG5cclxuXHQvL1RPRE9cclxuXHRwdWJsaWMgaXNBdXRvcml0YUdpdWRpemlhcmlhKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaGFzU2VsZWN0ZWRNb2RhbGl0YURpUGFnYW1lbnRvQW5kKFxyXG5cdFx0XHRDb2RpY2VUaXBvUGFnYW1lbnRvLkNPRElDRV9CT05JRklDT19TRVBBID09IHRoaXMudGlwb01vZGFsaXRhUGFnYW1lbnRvLnZhbHVlXHJcblx0XHQpXHJcblx0fVxyXG5cclxuXHRmb3J3YXJkKF8pIHtcclxuXHRcdHRoaXMubmV4dFN0ZXAuZW1pdCh0aGlzLnBhZ2FtZW50byk7XHJcblx0fVxyXG5cclxuXHRvblNhbHZhQm96emEoXykge1xyXG5cdFx0dGhpcy5zYWx2YUJvenphLmVtaXQodGhpcy5wYWdhbWVudG8pO1xyXG5cdH1cclxuXHJcblx0YmFja3dhcmQoXykge1xyXG5cdFx0dGhpcy5wcmV2aW91c1N0ZXAuZW1pdCh0aGlzLnBhZ2FtZW50byk7XHJcblx0fVxyXG5cclxuXHRjb21wbGV0ZShfKSB7IH1cclxuXHJcblx0aW5pdFBhZ2FtZW50bygpIHtcclxuXHRcdHRoaXMucGFnYW1lbnRvID0gbmV3IFBhZ2FtZW50b0RUTygpO1xyXG5cdH1cclxuXHJcblx0Ly9UT0RPXHJcblx0YXR0b1BpZ25vcmFtZW50b1JlYWR5KGF0dG9QaWdub3JhbW5ldG9TdGF0dXM6IENvbXBvbmVudE91dHB1dFN0YXR1czxBdHRvUGlnbm9yYW1uZXRvRFRPPikge1xyXG5cdFx0Ly8gY29uc29sZS5sb2coJ1thdHRvUGlnbm9yYW1lbnRvUmVhZHldJywgYXR0b1BpZ25vcmFtbmV0b1N0YXR1cyk7XHJcblx0XHR0aGlzLmNoYW5nZXNBdHRvUGlnbm9yYW1lbnRvJC5uZXh0KFxyXG5cdFx0XHRhdHRvUGlnbm9yYW1uZXRvU3RhdHVzLm1hcFZhbHVlKFxyXG5cdFx0XHRcdChwaWduKSA9PiAoYXQ6IFBhZ2FtZW50b0RUTykgPT5cclxuXHRcdFx0XHRcdGF0LnRyaWJ1bmFsZSA9IHBpZ25cclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19