UNPKG

formioangular-colfuturo

Version:

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

260 lines 36.1 kB
import { GridFooterPositions } from "./types/grid-footer-positions"; import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, } from "@angular/core"; import { each } from "lodash"; import { FormioCore as Formio } from "formiojs-colfuturo"; import FormComponents from "./form/index"; import SubmissionComponents from "./submission/index"; import { FormioPromiseService } from "formioangular-colfuturo"; import { SortType } from "./types/grid-header"; import * as i0 from "@angular/core"; import * as i1 from "formioangular-colfuturo"; import * as i2 from "@angular/common"; export 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: "17.3.12", 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: "17.3.12", 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>\n<ng-template #bodyTemplate></ng-template>\n<ng-template #footerTemplate></ng-template>\n<div class=\"formio-grid\">\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\n <table class=\"table table-bordered table-striped table-hover\">\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\n </ng-container>\n <ng-container *ngIf=\"initialized\"\n [ngTemplateOutlet]=\"header.template\"></ng-container>\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\n </ng-container>\n </table>\n</div>\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"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioGridComponent, decorators: [{ type: Component, args: [{ selector: "formio-grid", template: "<ng-template #headerTemplate></ng-template>\n<ng-template #bodyTemplate></ng-template>\n<ng-template #footerTemplate></ng-template>\n<div class=\"formio-grid\">\n <formio-alerts [alerts]=\"alerts\"></formio-alerts>\n <table class=\"table table-bordered table-striped table-hover\">\n <ng-container *ngIf=\"initialized && [footerPositions.top, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.top, label: label }\">\n </ng-container>\n <ng-container *ngIf=\"initialized\"\n [ngTemplateOutlet]=\"header.template\"></ng-container>\n <formio-loader [isLoading]=\"isLoading\"></formio-loader>\n <ng-container *ngIf=\"initialized\" [ngTemplateOutlet]=\"body.template\"></ng-container>\n <ng-container *ngIf=\"initialized && [footerPositions.bottom, footerPositions.both].indexOf(footerPosition) !== -1\"\n [ngTemplateOutlet]=\"footer.template\" [ngTemplateOutletContext]=\"{ position: footerPositions.bottom, label: label }\">\n </ng-container>\n </table>\n</div>\n", styles: [".formio-grid{position:relative;width:100%}.grid-refresh{height:400px;width:100%}\n"] }] }], ctorParameters: () => [{ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWZvcm1pby9ncmlkL3NyYy9ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZm9ybWlvL2dyaWQvc3JjL2dyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsSUFBSSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUkxRCxPQUFPLGNBQWMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxvQkFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFPM0QsTUFBTSxPQUFPLG1CQUFtQjtJQW9DckI7SUFDQztJQUNBO0lBckNELGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDNUMsR0FBRyxDQUFVO0lBQ2IsS0FBSyxDQUFjO0lBQ25CLE1BQU0sQ0FBZ0I7SUFDdEIsS0FBSyxDQUFPO0lBQ1osT0FBTyxDQUF3QjtJQUMvQixPQUFPLENBQXFCO0lBQzVCLFFBQVEsQ0FBVTtJQUNsQixJQUFJLENBQVU7SUFDZCxVQUFVLENBQU87SUFDakIsTUFBTSxDQUF3QjtJQUM5QixLQUFLLENBQVU7SUFDZixVQUFVLENBQVM7SUFDbkIsZUFBZSxDQUFNO0lB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S0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFFUCxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHckUsV0FBVztzQkFEVixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUduRSxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRGb290ZXJQb3NpdGlvbnMgfSBmcm9tIFwiLi90eXBlcy9ncmlkLWZvb3Rlci1wb3NpdGlvbnNcIjtcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybWlvQWxlcnRzIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBlYWNoIH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgRm9ybWlvQ29yZSBhcyBGb3JtaW8gfSBmcm9tIFwiZm9ybWlvanMtY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4vR3JpZEhlYWRlckNvbXBvbmVudFwiO1xuaW1wb3J0IHsgR3JpZEJvZHlDb21wb25lbnQgfSBmcm9tIFwiLi9HcmlkQm9keUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgR3JpZEZvb3RlckNvbXBvbmVudCB9IGZyb20gXCIuL0dyaWRGb290ZXJDb21wb25lbnRcIjtcbmltcG9ydCBGb3JtQ29tcG9uZW50cyBmcm9tIFwiLi9mb3JtL2luZGV4XCI7XG5pbXBvcnQgU3VibWlzc2lvbkNvbXBvbmVudHMgZnJvbSBcIi4vc3VibWlzc2lvbi9pbmRleFwiO1xuaW1wb3J0IHsgRm9ybWlvUHJvbWlzZVNlcnZpY2UgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcbmltcG9ydCB7IEdyaWRDb2x1bW4gfSBmcm9tIFwiLi90eXBlcy9ncmlkLWNvbHVtblwiO1xuaW1wb3J0IHsgR3JpZEhlYWRlciwgU29ydFR5cGUgfSBmcm9tIFwiLi90eXBlcy9ncmlkLWhlYWRlclwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiZm9ybWlvLWdyaWRcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2dyaWQuY29tcG9uZW50LnNjc3NcIl0sXG4gIHRlbXBsYXRlVXJsOiBcIi4vZ3JpZC5jb21wb25lbnQuaHRtbFwiLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtaW9HcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBmb290ZXJQb3NpdGlvbiA9IEdyaWRGb290ZXJQb3NpdGlvbnMuYm90dG9tO1xuICBASW5wdXQoKSBzcmM/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGl0ZW1zPzogQXJyYXk8YW55PjtcbiAgQElucHV0KCkgb25Gb3JtPzogUHJvbWlzZTxhbnk+O1xuICBASW5wdXQoKSBxdWVyeT86IGFueTtcbiAgQElucHV0KCkgcmVmcmVzaD86IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xuICBASW5wdXQoKSBjb2x1bW5zPzogQXJyYXk8R3JpZENvbHVtbj47XG4gIEBJbnB1dCgpIGdyaWRUeXBlPzogc3RyaW5nO1xuICBASW5wdXQoKSBzaXplPzogbnVtYmVyO1xuICBASW5wdXQoKSBjb21wb25lbnRzPzogYW55O1xuICBASW5wdXQoKSBmb3JtaW8/OiBGb3JtaW9Qcm9taXNlU2VydmljZTtcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNyZWF0ZVRleHQ6IFN0cmluZztcbiAgQElucHV0KCkgaXNBY3Rpb25BbGxvd2VkOiBhbnk7XG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xuICBAT3V0cHV0KCkgcm93U2VsZWN0OiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcbiAgQE91dHB1dCgpIHJvd0FjdGlvbjogRXZlbnRFbWl0dGVyPG9iamVjdD47XG4gIEBPdXRwdXQoKSBjcmVhdGVJdGVtOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIGVycm9yOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQFZpZXdDaGlsZChcImhlYWRlclRlbXBsYXRlXCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGhlYWRlckVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoXCJib2R5VGVtcGxhdGVcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgYm9keUVsZW1lbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoXCJmb290ZXJUZW1wbGF0ZVwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBmb290ZXJFbGVtZW50OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIHB1YmxpYyBwYWdlID0gMDtcbiAgcHVibGljIGlzTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHVibGljIGhlYWRlcjogR3JpZEhlYWRlckNvbXBvbmVudDtcbiAgcHVibGljIGJvZHk6IEdyaWRCb2R5Q29tcG9uZW50O1xuICBwdWJsaWMgZm9vdGVyOiBHcmlkRm9vdGVyQ29tcG9uZW50O1xuICBwdWJsaWMgZm9vdGVyUG9zaXRpb25zID0gR3JpZEZvb3RlclBvc2l0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWxlcnRzOiBGb3JtaW9BbGVydHMsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLnNlbGVjdCA9IHRoaXMucm93U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMucm93QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuY3JlYXRlSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVycm9yID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0eSwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBwcm9wZXJ0eS5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgfVxuXG4gIGxvYWRHcmlkKHNyYz86IHN0cmluZykge1xuICAgIC8vIElmIG5vIHNvdXJjZSBpcyBwcm92aWRlZCwgdGhlbiBza2lwLlxuICAgIGlmICghc3JjICYmICF0aGlzLmZvcm1pbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBEbyBub3QgZG91YmxlIGxvYWQuXG4gICAgaWYgKHRoaXMuZm9ybWlvICYmIHRoaXMuc3JjICYmIHNyYyA9PT0gdGhpcy5zcmMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3JjKSB7XG4gICAgICB0aGlzLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pb1Byb21pc2VTZXJ2aWNlKHRoaXMuc3JjLCB7IGZvcm1Pbmx5OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIGhlYWRlci5cbiAgICB0aGlzLmhlYWRlclxuICAgICAgLmxvYWQodGhpcy5mb3JtaW8sIHt9LCB0aGlzLmNvbHVtbnMpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLnNldFBhZ2UoMCkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm9uRXJyb3IoZXJyb3IpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIENyZWF0ZSBvdXIgY29tcG9uZW50cy5cbiAgICBjb25zdCBjb21wcyA9XG4gICAgICB0aGlzLmNvbXBvbmVudHMgfHxcbiAgICAgICh0aGlzLmdyaWRUeXBlID09PSBcImZvcm1cIiA/IEZvcm1Db21wb25lbnRzIDogU3VibWlzc2lvbkNvbXBvbmVudHMpO1xuXG4gICAgdGhpcy5oZWFkZXIgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmhlYWRlckVsZW1lbnQsIGNvbXBzLmhlYWRlcik7XG4gICAgdGhpcy5oZWFkZXIuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGVhZGVyLnNvcnQuc3Vic2NyaWJlKChoZWFkZXIpID0+IHRoaXMuc29ydENvbHVtbihoZWFkZXIpKTtcblxuICAgIHRoaXMuYm9keSA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHRoaXMuYm9keUVsZW1lbnQsIGNvbXBzLmJvZHkpO1xuICAgIHRoaXMuYm9keS5oZWFkZXIgPSB0aGlzLmhlYWRlcjtcbiAgICB0aGlzLmJvZHkuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYm9keS5yb3dTZWxlY3Quc3Vic2NyaWJlKChyb3cpID0+IHRoaXMucm93U2VsZWN0LmVtaXQocm93KSk7XG4gICAgdGhpcy5ib2R5LnJvd0FjdGlvbi5zdWJzY3JpYmUoKGFjdGlvbikgPT4gdGhpcy5yb3dBY3Rpb24uZW1pdChhY3Rpb24pKTtcblxuICAgIHRoaXMuZm9vdGVyID0gdGhpcy5jcmVhdGVDb21wb25lbnQodGhpcy5mb290ZXJFbGVtZW50LCBjb21wcy5mb290ZXIpO1xuICAgIHRoaXMuZm9vdGVyLmhlYWRlciA9IHRoaXMuaGVhZGVyO1xuICAgIHRoaXMuZm9vdGVyLmJvZHkgPSB0aGlzLmJvZHk7XG4gICAgdGhpcy5mb290ZXIuYWN0aW9uQWxsb3dlZCA9IHRoaXMuYWN0aW9uQWxsb3dlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZVRleHQgPSB0aGlzLmNyZWF0ZVRleHQ7XG4gICAgdGhpcy5mb290ZXIuc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICB0aGlzLmZvb3Rlci5wYWdlQ2hhbmdlZC5zdWJzY3JpYmUoKHBhZ2UpID0+IHRoaXMucGFnZUNoYW5nZWQocGFnZSkpO1xuICAgIHRoaXMuZm9vdGVyLmNyZWF0ZUl0ZW0uc3Vic2NyaWJlKChpdGVtKSA9PiB0aGlzLmNyZWF0ZUl0ZW0uZW1pdChpdGVtKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgaWYgKFxuICAgICAgICAoY2hhbmdlcy5zcmMgJiYgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKSB8fFxuICAgICAgICAoY2hhbmdlcy5mb3JtaW8gJiYgY2hhbmdlcy5mb3JtaW8uY3VycmVudFZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubG9hZEdyaWQoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZXMuaXRlbXMgJiYgY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZvb3RlciAmJiBjaGFuZ2VzLmNyZWF0ZVRleHQgJiYgY2hhbmdlcy5jcmVhdGVUZXh0LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5mb290ZXIuY3JlYXRlVGV4dCA9IGNoYW5nZXMuY3JlYXRlVGV4dC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0cyhbXSk7XG4gICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gICAgaWYgKHRoaXMucmVmcmVzaCkge1xuICAgICAgdGhpcy5yZWZyZXNoLnN1YnNjcmliZSgocXVlcnk6IG9iamVjdCkgPT4gdGhpcy5yZWZyZXNoR3JpZChxdWVyeSkpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRHcmlkKHRoaXMuc3JjKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBhY3Rpb25BbGxvd2VkKGFjdGlvbikge1xuICAgIGlmICh0aGlzLmlzQWN0aW9uQWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNBY3Rpb25BbGxvd2VkKGFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IoZXJyb3I6IGFueSkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiIHx8IGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0KHtcbiAgICAgICAgdHlwZTogXCJkYW5nZXJcIixcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hHcmlkKHF1ZXJ5PzogYW55KSB7XG4gICAgdGhpcy5hbGVydHMuc2V0QWxlcnRzKFtdKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnkgfHwgdGhpcy5xdWVyeTtcbiAgICBpZiAoIXRoaXMucXVlcnkuaGFzT3duUHJvcGVydHkoXCJsaW1pdFwiKSkge1xuICAgICAgdGhpcy5xdWVyeS5saW1pdCA9IDEwO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucXVlcnkuaGFzT3duUHJvcGVydHkoXCJza2lwXCIpKSB7XG4gICAgICB0aGlzLnF1ZXJ5LnNraXAgPSAwO1xuICAgIH1cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIEZvcm1pby5jYWNoZSA9IHt9O1xuICAgIGxldCBsb2FkZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICBsb2FkZXIgPSBQcm9taXNlLnJlc29sdmUodGhpcy5ib2R5LnNldFJvd3ModGhpcy5xdWVyeSwgdGhpcy5pdGVtcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkZXIgPSB0aGlzLmJvZHkubG9hZCh0aGlzLmZvcm1pbywgdGhpcy5xdWVyeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvYWRlclxuICAgICAgLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm9uRXJyb3IoZXJyb3IpKTtcbiAgfVxuXG4gIHNldFBhZ2UobnVtID0gLTEpIHtcbiAgICB0aGlzLnBhZ2UgPSBudW0gIT09IC0xID8gbnVtIDogdGhpcy5wYWdlO1xuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eShcImxpbWl0XCIpKSB7XG4gICAgICB0aGlzLnF1ZXJ5LmxpbWl0ID0gMTA7XG4gICAgfVxuICAgIGlmICghdGhpcy5xdWVyeS5oYXNPd25Qcm9wZXJ0eShcInNraXBcIikpIHtcbiAgICAgIHRoaXMucXVlcnkuc2tpcCA9IDA7XG4gICAgfVxuICAgIHRoaXMucXVlcnkuc2tpcCA9IHRoaXMucGFnZSAqIHRoaXMucXVlcnkubGltaXQ7XG4gICAgdGhpcy5yZWZyZXNoR3JpZCgpO1xuICB9XG5cbiAgc29ydENvbHVtbihoZWFkZXI6IEdyaWRIZWFkZXIpIHtcbiAgICAvLyBSZXNldCBhbGwgb3RoZXIgY29sdW1uIHNvcnRzLlxuICAgIGVhY2godGhpcy5oZWFkZXIuaGVhZGVycywgKGNvbDogYW55KSA9PiB7XG4gICAgICBpZiAoY29sLmtleSAhPT0gaGVhZGVyLmtleSkge1xuICAgICAgICBjb2wuc29ydCA9IFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc3dpdGNoIChoZWFkZXIuc29ydCkge1xuICAgICAgY2FzZSBcImFzY1wiOlxuICAgICAgICBoZWFkZXIuc29ydCA9IFNvcnRUeXBlLkRFU0M7XG4gICAgICAgIHRoaXMucXVlcnkuc29ydCA9IFwiLVwiICsgaGVhZGVyLmtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVzY1wiOlxuICAgICAgICBoZWFkZXIuc29ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVsZXRlIHRoaXMucXVlcnkuc29ydDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgaGVhZGVyLnNvcnQgPSBTb3J0VHlwZS5BU0M7XG4gICAgICAgIHRoaXMucXVlcnkuc29ydCA9IGhlYWRlci5rZXk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hHcmlkKCk7XG4gIH1cblxuICBwYWdlQ2hhbmdlZChwYWdlOiBhbnkpIHtcbiAgICB0aGlzLnNldFBhZ2UocGFnZS5wYWdlIC0gMSk7XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGU+PC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Zvb3RlclRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XG48ZGl2IGNsYXNzPVwiZm9ybWlvLWdyaWRcIj5cbiAgPGZvcm1pby1hbGVydHMgW2FsZXJ0c109XCJhbGVydHNcIj48L2Zvcm1pby1hbGVydHM+XG4gIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWQgJiYgW2Zvb3RlclBvc2l0aW9ucy50b3AsIGZvb3RlclBvc2l0aW9ucy5ib3RoXS5pbmRleE9mKGZvb3RlclBvc2l0aW9uKSAhPT0gLTFcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyLnRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcG9zaXRpb246IGZvb3RlclBvc2l0aW9ucy50b3AsIGxhYmVsOiBsYWJlbCB9XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRpYWxpemVkXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlci50ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxmb3JtaW8tbG9hZGVyIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCI+PC9mb3JtaW8tbG9hZGVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbml0aWFsaXplZFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHkudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWQgJiYgW2Zvb3RlclBvc2l0aW9ucy5ib3R0b20sIGZvb3RlclBvc2l0aW9ucy5ib3RoXS5pbmRleE9mKGZvb3RlclBvc2l0aW9uKSAhPT0gLTFcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyLnRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcG9zaXRpb246IGZvb3RlclBvc2l0aW9ucy5ib3R0b20sIGxhYmVsOiBsYWJlbCB9XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGFibGU+XG48L2Rpdj5cbiJdfQ==