UNPKG

@formio-tmt/angular

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.

258 lines 36.4 kB
import { GridFooterPositions } from './types/grid-footer-positions'; import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef } from '@angular/core'; import { each } from 'lodash'; import { Formio } from '@formio-tmt/js'; import FormComponents from './form/index'; import SubmissionComponents from './submission/index'; import { FormioPromiseService } from '@formio-tmt/angular'; import { SortType } from './types/grid-header'; import * as i0 from "@angular/core"; import * as i1 from "@formio-tmt/angular"; import * as i2 from "@angular/common"; class FormioGridComponent { alerts; resolver; ref; footerPosition = GridFooterPositions.bottom; src; items; onForm; query; refresh; columns; gridType; size; components; formio; label; createText; isActionAllowed; select; rowSelect; rowAction; createItem; error; headerElement; bodyElement; footerElement; page = 0; isLoading = false; initialized = false; header; body; footer; footerPositions = GridFooterPositions; constructor(alerts, resolver, ref) { this.alerts = alerts; this.resolver = resolver; this.ref = ref; this.select = this.rowSelect = new EventEmitter(); this.rowAction = new EventEmitter(); this.createItem = new EventEmitter(); this.error = new EventEmitter(); this.isLoading = true; } createComponent(property, component) { const factory = this.resolver.resolveComponentFactory(component); const componentRef = property.createComponent(factory); return componentRef.instance; } loadGrid(src) { // If no source is provided, then skip. if (!src && !this.formio) { return; } // Do not double load. if (this.formio && this.src && (src === this.src)) { return; } if (src) { this.src = src; this.formio = new FormioPromiseService(this.src, { formOnly: true }); } // Load the header. this.header.load(this.formio, {}, this.columns) .then(() => this.setPage(0)) .catch(error => this.onError(error)); } ngOnInit() { // Create our components. const comps = this.components || ((this.gridType === 'form') ? FormComponents : SubmissionComponents); this.header = this.createComponent(this.headerElement, comps.header); this.header.actionAllowed = this.actionAllowed.bind(this); this.header.sort.subscribe(header => this.sortColumn(header)); this.body = this.createComponent(this.bodyElement, comps.body); this.body.header = this.header; this.body.actionAllowed = this.actionAllowed.bind(this); this.body.rowSelect.subscribe(row => this.rowSelect.emit(row)); this.body.rowAction.subscribe(action => this.rowAction.emit(action)); this.footer = this.createComponent(this.footerElement, comps.footer); this.footer.header = this.header; this.footer.body = this.body; this.footer.actionAllowed = this.actionAllowed.bind(this); this.footer.createText = this.createText; this.footer.size = this.size; this.footer.pageChanged.subscribe(page => this.pageChanged(page)); this.footer.createItem.subscribe(item => this.createItem.emit(item)); } ngOnChanges(changes) { if (this.initialized) { if ((changes.src && changes.src.currentValue) || (changes.formio && changes.formio.currentValue)) { this.loadGrid(changes.src.currentValue); } if (changes.items && changes.items.currentValue) { this.refreshGrid(); } } if (this.footer && (changes.createText && changes.createText.currentValue)) { this.footer.createText = changes.createText.currentValue; } } ngAfterViewInit() { this.alerts.setAlerts([]); this.query = this.query || {}; if (this.refresh) { this.refresh.subscribe((query) => this.refreshGrid(query)); } this.loadGrid(this.src); this.initialized = true; this.ref.detectChanges(); } actionAllowed(action) { if (this.isActionAllowed) { return this.isActionAllowed(action); } else { return true; } } onError(error) { this.isLoading = false; this.error.emit(error); if (typeof error === 'string' || error.message) { this.alerts.setAlert({ type: 'danger', message: error.message || error }); } } refreshGrid(query) { this.alerts.setAlerts([]); this.query = query || this.query; if (!this.query.hasOwnProperty('limit')) { this.query.limit = 10; } if (!this.query.hasOwnProperty('skip')) { this.query.skip = 0; } this.isLoading = true; this.ref.detectChanges(); Formio.cache = {}; let loader = null; if (this.items) { loader = Promise.resolve(this.body.setRows(this.query, this.items)); } else { loader = this.body.load(this.formio, this.query); } return loader.then(info => { this.isLoading = false; this.initialized = true; this.ref.detectChanges(); }).catch(error => this.onError(error)); } setPage(num = -1) { this.page = num !== -1 ? num : this.page; if (!this.query.hasOwnProperty('limit')) { this.query.limit = 10; } if (!this.query.hasOwnProperty('skip')) { this.query.skip = 0; } this.query.skip = this.page * this.query.limit; this.refreshGrid(); } sortColumn(header) { // Reset all other column sorts. each(this.header.headers, (col) => { if (col.key !== header.key) { col.sort = ''; } }); switch (header.sort) { case 'asc': header.sort = SortType.DESC; this.query.sort = '-' + header.key; break; case 'desc': header.sort = undefined; delete this.query.sort; break; case undefined: header.sort = SortType.ASC; this.query.sort = header.key; break; } this.refreshGrid(); } pageChanged(page) { this.setPage(page.page - 1); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioGridComponent, deps: [{ token: i1.FormioAlerts }, { token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: FormioGridComponent, selector: "formio-grid", inputs: { footerPosition: "footerPosition", src: "src", items: "items", onForm: "onForm", query: "query", refresh: "refresh", columns: "columns", gridType: "gridType", size: "size", components: "components", formio: "formio", label: "label", createText: "createText", isActionAllowed: "isActionAllowed" }, outputs: { select: "select", rowSelect: "rowSelect", rowAction: "rowAction", createItem: "createItem", error: "error" }, viewQueries: [{ propertyName: "headerElement", first: true, predicate: ["headerTemplate"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "bodyElement", first: true, predicate: ["bodyTemplate"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "footerElement", first: true, predicate: ["footerTemplate"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #headerTemplate></ng-template>\r\n<ng-template #bodyTemplate></ng-template>\r\n<ng-template #footerTemplate></ng-template>\r\n<div class=\"formio-grid\">\r\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\r\n <table class=\"table table-bordered table-striped table-hover\">\r\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\r\n </ng-container>\r\n <ng-container *ngIf=\"initialized\"\r\n [ngTemplateOutlet]=\"header.template\"></ng-container>\r\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\r\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\r\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\r\n </ng-container>\r\n </table>\r\n</div>\r\n", styles: [".formio-grid{position:relative;width:100%}.grid-refresh{height:400px;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.FormioLoaderComponent, selector: "formio-loader", inputs: ["isLoading"] }, { kind: "component", type: i1.FormioAlertsComponent, selector: "formio-alerts", inputs: ["alerts"], outputs: ["focusComponent"] }] }); } export { FormioGridComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioGridComponent, decorators: [{ type: Component, args: [{ selector: 'formio-grid', template: "<ng-template #headerTemplate></ng-template>\r\n<ng-template #bodyTemplate></ng-template>\r\n<ng-template #footerTemplate></ng-template>\r\n<div class=\"formio-grid\">\r\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\r\n <table class=\"table table-bordered table-striped table-hover\">\r\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\r\n </ng-container>\r\n <ng-container *ngIf=\"initialized\"\r\n [ngTemplateOutlet]=\"header.template\"></ng-container>\r\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\r\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\r\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\r\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\r\n </ng-container>\r\n </table>\r\n</div>\r\n", styles: [".formio-grid{position:relative;width:100%}.grid-refresh{height:400px;width:100%}\n"] }] }], ctorParameters: function () { return [{ type: i1.FormioAlerts }, { type: i0.ComponentFactoryResolver }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { footerPosition: [{ type: Input }], src: [{ type: Input }], items: [{ type: Input }], onForm: [{ type: Input }], query: [{ type: Input }], refresh: [{ type: Input }], columns: [{ type: Input }], gridType: [{ type: Input }], size: [{ type: Input }], components: [{ type: Input }], formio: [{ type: Input }], label: [{ type: Input }], createText: [{ type: Input }], isActionAllowed: [{ type: Input }], select: [{ type: Output }], rowSelect: [{ type: Output }], rowAction: [{ type: Output }], createItem: [{ type: Output }], error: [{ type: Output }], headerElement: [{ type: ViewChild, args: ['headerTemplate', { read: ViewContainerRef, static: true }] }], bodyElement: [{ type: ViewChild, args: ['bodyTemplate', { read: ViewContainerRef, static: true }] }], footerElement: [{ type: ViewChild, args: ['footerTemplate', { read: ViewContainerRef, static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWZvcm1pby9ncmlkL3NyYy9ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZm9ybWlvL2dyaWQvc3JjL2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSXRDLE9BQU8sY0FBYyxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLG9CQUFvQixNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE9BQU8sRUFBYSxRQUFRLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUV6RCxNQUthLG1CQUFtQjtJQWlDckI7SUFDQztJQUNBO0lBbENELGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDNUMsR0FBRyxDQUFVO0lBQ2IsS0FBSyxDQUFjO0lBQ25CLE1BQU0sQ0FBZ0I7SUFDdEIsS0FBSyxDQUFPO0lBQ1osT0FBTyxDQUF3QjtJQUMvQixPQUFPLENBQXFCO0lBQzVCLFFBQVEsQ0FBVTtJQUNsQixJQUFJLENBQVU7SUFDZCxVQUFVLENBQU87SUFDakIsTUFBTSxDQUF3QjtJQUM5QixLQUFLLENBQVU7SUFDZixVQUFVLENBQVM7SUFDbkIsZUFBZSxDQUFNO0lBQ3BCLE1BQU0sQ0FBdUI7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QUFFLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0EsV0FBVztzQkFBN0UsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDSSxhQUFhO3NCQUFqRixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmlkRm9vdGVyUG9zaXRpb25zIH0gZnJvbSAnLi90eXBlcy9ncmlkLWZvb3Rlci1wb3NpdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtGb3JtaW9BbGVydHN9IGZyb20gJ0Bmb3JtaW8tdG10L2FuZ3VsYXInO1xyXG5pbXBvcnQge2VhY2h9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7Rm9ybWlvfSBmcm9tICdAZm9ybWlvLXRtdC9qcyc7XHJcbmltcG9ydCB7R3JpZEhlYWRlckNvbXBvbmVudH0gZnJvbSAnLi9HcmlkSGVhZGVyQ29tcG9uZW50JztcclxuaW1wb3J0IHtHcmlkQm9keUNvbXBvbmVudH0gZnJvbSAnLi9HcmlkQm9keUNvbXBvbmVudCc7XHJcbmltcG9ydCB7R3JpZEZvb3RlckNvbXBvbmVudH0gZnJvbSAnLi9HcmlkRm9vdGVyQ29tcG9uZW50JztcclxuaW1wb3J0IEZvcm1Db21wb25lbnRzIGZyb20gJy4vZm9ybS9pbmRleCc7XHJcbmltcG9ydCBTdWJtaXNzaW9uQ29tcG9uZW50cyBmcm9tICcuL3N1Ym1pc3Npb24vaW5kZXgnO1xyXG5pbXBvcnQge0Zvcm1pb1Byb21pc2VTZXJ2aWNlfSBmcm9tICdAZm9ybWlvLXRtdC9hbmd1bGFyJztcclxuaW1wb3J0IHtHcmlkQ29sdW1ufSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uJztcclxuaW1wb3J0IHtHcmlkSGVhZGVyLCBTb3J0VHlwZX0gZnJvbSAnLi90eXBlcy9ncmlkLWhlYWRlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Zvcm1pby1ncmlkJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtaW9HcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIGZvb3RlclBvc2l0aW9uID0gR3JpZEZvb3RlclBvc2l0aW9ucy5ib3R0b207XHJcbiAgQElucHV0KCkgc3JjPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGl0ZW1zPzogQXJyYXk8YW55PjtcclxuICBASW5wdXQoKSBvbkZvcm0/OiBQcm9taXNlPGFueT47XHJcbiAgQElucHV0KCkgcXVlcnk/OiBhbnk7XHJcbiAgQElucHV0KCkgcmVmcmVzaD86IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIEBJbnB1dCgpIGNvbHVtbnM/OiBBcnJheTxHcmlkQ29sdW1uPjtcclxuICBASW5wdXQoKSBncmlkVHlwZT86IHN0cmluZztcclxuICBASW5wdXQoKSBzaXplPzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGNvbXBvbmVudHM/OiBhbnk7XHJcbiAgQElucHV0KCkgZm9ybWlvPzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3JlYXRlVGV4dDogU3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzQWN0aW9uQWxsb3dlZDogYW55O1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIEBPdXRwdXQoKSByb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIEBPdXRwdXQoKSByb3dBY3Rpb246IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIEBPdXRwdXQoKSBjcmVhdGVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCkgZXJyb3I6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlclRlbXBsYXRlJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZX0pIGhlYWRlckVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYm9keVRlbXBsYXRlJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZX0pIGJvZHlFbGVtZW50OiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2Zvb3RlclRlbXBsYXRlJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZX0pIGZvb3RlckVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIHB1YmxpYyBwYWdlID0gMDtcclxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHVibGljIGluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHVibGljIGhlYWRlcjogR3JpZEhlYWRlckNvbXBvbmVudDtcclxuICBwdWJsaWMgYm9keTogR3JpZEJvZHlDb21wb25lbnQ7XHJcbiAgcHVibGljIGZvb3RlcjogR3JpZEZvb3RlckNvbXBvbmVudDtcclxuICBwdWJsaWMgZm9vdGVyUG9zaXRpb25zID0gR3JpZEZvb3RlclBvc2l0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgYWxlcnRzOiBGb3JtaW9BbGVydHMsXHJcbiAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHRoaXMuc2VsZWN0ID0gdGhpcy5yb3dTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLnJvd0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuY3JlYXRlSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVDb21wb25lbnQocHJvcGVydHksIGNvbXBvbmVudCkge1xyXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHByb3BlcnR5LmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5KTtcclxuICAgIHJldHVybiBjb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBsb2FkR3JpZChzcmM/OiBzdHJpbmcpIHtcclxuICAgIC8vIElmIG5vIHNvdXJjZSBpcyBwcm92aWRlZCwgdGhlbiBza2lwLlxyXG4gICAgaWYgKCFzcmMgJiYgIXRoaXMuZm9ybWlvKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIERvIG5vdCBkb3VibGUgbG9hZC5cclxuICAgIGlmICh0aGlzLmZvcm1pbyAmJiB0aGlzLnNyYyAmJiAoc3JjID09PSB0aGlzLnNyYykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzcmMpIHtcclxuICAgICAgdGhpcy5zcmMgPSBzcmM7XHJcbiAgICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pb1Byb21pc2VTZXJ2aWNlKHRoaXMuc3JjLCB7IGZvcm1Pbmx5OiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvYWQgdGhlIGhlYWRlci5cclxuICAgIHRoaXMuaGVhZGVyLmxvYWQodGhpcy5mb3JtaW8sIHt9LCB0aGlzLmNvbHVtbnMpXHJcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuc2V0UGFnZSgwKSlcclxuICAgICAgLmNhdGNoKGVycm9yID0+IHRoaXMub25FcnJvcihlcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBDcmVhdGUgb3VyIGNvbXBvbmVudHMuXHJcbiAgICBjb25zdCBjb21wcyA9IHRoaXMuY29tcG9uZW50cyB8fCAoKHRoaXMuZ3JpZFR5cGUgPT09ICdmb3JtJykgPyBGb3JtQ29tcG9uZW50cyA6IFN1Ym1pc3Npb25Db21wb25lbnRzKTtcclxuXHJcbiAgICB0aGlzLmhlYWRlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMuaGVhZGVyRWxlbWVudCwgY29tcHMuaGVhZGVyKTtcclxuICAgIHRoaXMuaGVhZGVyLmFjdGlvbkFsbG93ZWQgPSB0aGlzLmFjdGlvbkFsbG93ZWQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMuaGVhZGVyLnNvcnQuc3Vic2NyaWJlKGhlYWRlciA9PiB0aGlzLnNvcnRDb2x1bW4oaGVhZGVyKSk7XHJcblxyXG4gICAgdGhpcy5ib2R5ID0gdGhpcy5jcmVhdGVDb21wb25lbnQodGhpcy5ib2R5RWxlbWVudCwgY29tcHMuYm9keSk7XHJcbiAgICB0aGlzLmJvZHkuaGVhZGVyID0gdGhpcy5oZWFkZXI7XHJcbiAgICB0aGlzLmJvZHkuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5ib2R5LnJvd1NlbGVjdC5zdWJzY3JpYmUocm93ID0+IHRoaXMucm93U2VsZWN0LmVtaXQocm93KSk7XHJcbiAgICB0aGlzLmJvZHkucm93QWN0aW9uLnN1YnNjcmliZShhY3Rpb24gPT4gdGhpcy5yb3dBY3Rpb24uZW1pdChhY3Rpb24pKTtcclxuXHJcbiAgICB0aGlzLmZvb3RlciA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMuZm9vdGVyRWxlbWVudCwgY29tcHMuZm9vdGVyKTtcclxuICAgIHRoaXMuZm9vdGVyLmhlYWRlciA9IHRoaXMuaGVhZGVyO1xyXG4gICAgdGhpcy5mb290ZXIuYm9keSA9IHRoaXMuYm9keTtcclxuICAgIHRoaXMuZm9vdGVyLmFjdGlvbkFsbG93ZWQgPSB0aGlzLmFjdGlvbkFsbG93ZWQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZVRleHQgPSB0aGlzLmNyZWF0ZVRleHQ7XHJcbiAgICB0aGlzLmZvb3Rlci5zaXplID0gdGhpcy5zaXplO1xyXG4gICAgdGhpcy5mb290ZXIucGFnZUNoYW5nZWQuc3Vic2NyaWJlKHBhZ2UgPT4gdGhpcy5wYWdlQ2hhbmdlZChwYWdlKSk7XHJcbiAgICB0aGlzLmZvb3Rlci5jcmVhdGVJdGVtLnN1YnNjcmliZShpdGVtID0+IHRoaXMuY3JlYXRlSXRlbS5lbWl0KGl0ZW0pKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIChjaGFuZ2VzLnNyYyAmJiBjaGFuZ2VzLnNyYy5jdXJyZW50VmFsdWUpIHx8XHJcbiAgICAgICAgKGNoYW5nZXMuZm9ybWlvICYmIGNoYW5nZXMuZm9ybWlvLmN1cnJlbnRWYWx1ZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkR3JpZChjaGFuZ2VzLnNyYy5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2hhbmdlcy5pdGVtcyAmJiBjaGFuZ2VzLml0ZW1zLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZvb3RlciAmJlxyXG4gICAgICAgIChjaGFuZ2VzLmNyZWF0ZVRleHQgJiYgY2hhbmdlcy5jcmVhdGVUZXh0LmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgdGhpcy5mb290ZXIuY3JlYXRlVGV4dCA9IGNoYW5nZXMuY3JlYXRlVGV4dC5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmFsZXJ0cy5zZXRBbGVydHMoW10pO1xyXG4gICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnkgfHwge307XHJcbiAgICBpZiAodGhpcy5yZWZyZXNoKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaC5zdWJzY3JpYmUoKHF1ZXJ5OiBvYmplY3QpID0+IHRoaXMucmVmcmVzaEdyaWQocXVlcnkpKTtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZEdyaWQodGhpcy5zcmMpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25BbGxvd2VkKGFjdGlvbikge1xyXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25BbGxvd2VkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzQWN0aW9uQWxsb3dlZChhY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xyXG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgfHwgZXJyb3IubWVzc2FnZSkge1xyXG4gICAgICB0aGlzLmFsZXJ0cy5zZXRBbGVydCh7XHJcbiAgICAgICAgdHlwZTogJ2RhbmdlcicsXHJcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBlcnJvclxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hHcmlkKHF1ZXJ5PzogYW55KSB7XHJcbiAgICB0aGlzLmFsZXJ0cy5zZXRBbGVydHMoW10pO1xyXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5IHx8IHRoaXMucXVlcnk7XHJcbiAgICBpZiAoIXRoaXMucXVlcnkuaGFzT3duUHJvcGVydHkoJ2xpbWl0JykpIHtcclxuICAgICAgdGhpcy5xdWVyeS5saW1pdCA9IDEwO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5Lmhhc093blByb3BlcnR5KCdza2lwJykpIHtcclxuICAgICAgdGhpcy5xdWVyeS5za2lwID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIEZvcm1pby5jYWNoZSA9IHt9O1xyXG4gICAgbGV0IGxvYWRlciA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICBsb2FkZXIgPSBQcm9taXNlLnJlc29sdmUodGhpcy5ib2R5LnNldFJvd3ModGhpcy5xdWVyeSwgdGhpcy5pdGVtcykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9hZGVyID0gdGhpcy5ib2R5LmxvYWQodGhpcy5mb3JtaW8sIHRoaXMucXVlcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsb2FkZXIudGhlbihpbmZvID0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pLmNhdGNoKGVycm9yID0+IHRoaXMub25FcnJvcihlcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZShudW0gPSAtMSkge1xyXG4gICAgdGhpcy5wYWdlID0gbnVtICE9PSAtMSA/IG51bSA6IHRoaXMucGFnZTtcclxuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eSgnbGltaXQnKSkge1xyXG4gICAgICB0aGlzLnF1ZXJ5LmxpbWl0ID0gMTA7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucXVlcnkuaGFzT3duUHJvcGVydHkoJ3NraXAnKSkge1xyXG4gICAgICB0aGlzLnF1ZXJ5LnNraXAgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5xdWVyeS5za2lwID0gdGhpcy5wYWdlICogdGhpcy5xdWVyeS5saW1pdDtcclxuICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcclxuICB9XHJcblxyXG4gIHNvcnRDb2x1bW4oaGVhZGVyOiBHcmlkSGVhZGVyKSB7XHJcbiAgICAvLyBSZXNldCBhbGwgb3RoZXIgY29sdW1uIHNvcnRzLlxyXG4gICAgZWFjaCh0aGlzLmhlYWRlci5oZWFkZXJzLCAoY29sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbC5rZXkgIT09IGhlYWRlci5rZXkpIHtcclxuICAgICAgICBjb2wuc29ydCA9ICcnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHN3aXRjaCAoaGVhZGVyLnNvcnQpIHtcclxuICAgICAgY2FzZSAnYXNjJzpcclxuICAgICAgICBoZWFkZXIuc29ydCA9IFNvcnRUeXBlLkRFU0M7XHJcbiAgICAgICAgdGhpcy5xdWVyeS5zb3J0ID0gJy0nICsgaGVhZGVyLmtleTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGVzYyc6XHJcbiAgICAgICAgaGVhZGVyLnNvcnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucXVlcnkuc29ydDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSB1bmRlZmluZWQ6XHJcbiAgICAgICAgaGVhZGVyLnNvcnQgPSBTb3J0VHlwZS5BU0M7XHJcbiAgICAgICAgdGhpcy5xdWVyeS5zb3J0ID0gaGVhZGVyLmtleTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaEdyaWQoKTtcclxuICB9XHJcblxyXG4gIHBhZ2VDaGFuZ2VkKHBhZ2U6IGFueSkge1xyXG4gICAgdGhpcy5zZXRQYWdlKHBhZ2UucGFnZSAtIDEpO1xyXG4gIH1cclxufVxyXG4iLCI8bmctdGVtcGxhdGUgI2hlYWRlclRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZm9vdGVyVGVtcGxhdGU+PC9uZy10ZW1wbGF0ZT5cclxuPGRpdiBjbGFzcz1cImZvcm1pby1ncmlkXCI+XHJcbiAgPGZvcm1pby1hbGVydHMgW2FsZXJ0c109XCJhbGVydHNcIj48L2Zvcm1pby1hbGVydHM+XHJcbiAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlclwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRpYWxpemVkICYmIFtmb290ZXJQb3NpdGlvbnMudG9wLCBmb290ZXJQb3NpdGlvbnMuYm90aF0uaW5kZXhPZihmb290ZXJQb3NpdGlvbikgIT09IC0xXCJcclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyLnRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcG9zaXRpb246IGZvb3RlclBvc2l0aW9ucy50b3AsIGxhYmVsOiBsYWJlbCB9XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbml0aWFsaXplZFwiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlci50ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPGZvcm1pby1sb2FkZXIgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIj48L2Zvcm1pby1sb2FkZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWRcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJib2R5LnRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWQgJiYgW2Zvb3RlclBvc2l0aW9ucy5ib3R0b20sIGZvb3RlclBvc2l0aW9ucy5ib3RoXS5pbmRleE9mKGZvb3RlclBvc2l0aW9uKSAhPT0gLTFcIlxyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJmb290ZXIudGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBwb3NpdGlvbjogZm9vdGVyUG9zaXRpb25zLmJvdHRvbSwgbGFiZWw6IGxhYmVsIH1cIj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PlxyXG4iXX0=