UNPKG

formioangular-colfuturo

Version:

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

236 lines 30.6 kB
import { EventEmitter, Injectable, Optional } from "@angular/core"; import { FormioPromiseService } from "formioangular-colfuturo"; import { FormioAlerts } from "formioangular-colfuturo"; import { Formio, Utils } from "formiojs-colfuturo"; import _ from "lodash"; import * as i0 from "@angular/core"; import * as i1 from "formioangular-colfuturo"; import * as i2 from "./resource.config"; import * as i3 from "./resources.service"; export class FormioResourceService { appConfig; config; resourcesService; initialized = false; form; alerts; resource; resourceUrl; formUrl; formFormio; formio; refresh; resourceResolve; resourceReject; resourceLoaded; resourceLoading; resourceId; resources; ready; readyResolve; readyReject; formLoading; formLoaded; formResolve; formReject; isLoading; constructor(appConfig, config, resourcesService) { this.appConfig = appConfig; this.config = config; this.resourcesService = resourcesService; this.isLoading = true; this.alerts = new FormioAlerts(); this.refresh = new EventEmitter(); } initialize() { console.warn("FormioResourceService.initialize() has been deprecated."); } setResource(resourceId) { this.resourceLoading = null; this.formLoading = null; this.ready = new Promise((resolve, reject) => { this.readyResolve = resolve; this.readyReject = reject; }); this.formLoaded = new Promise((resolve, reject) => { this.formResolve = resolve; this.formReject = reject; }); this.resourceLoaded = new Promise((resolve, reject) => { this.resourceResolve = resolve; this.resourceReject = reject; }); this.resourceId = resourceId; this.resourceUrl = this.appConfig.appUrl + "/" + this.config.form; if (this.resourceId) { this.resourceUrl += "/submission/" + this.resourceId; } if (this.appConfig && this.appConfig.appUrl) { Formio.setBaseUrl(this.appConfig.apiUrl); Formio.setProjectUrl(this.appConfig.appUrl); Formio.formOnly = this.appConfig.formOnly; } else { console.error("You must provide an AppConfig within your application!"); } this.formio = new FormioPromiseService(this.resourceUrl); this.resource = { data: {} }; } init(route) { const snapshot = route.snapshot; const reset = snapshot.queryParams?.hasOwnProperty("reset") ? snapshot.queryParams.reset : false; const resourceId = snapshot.params["id"]; if (resourceId && resourceId === this.resourceId && !reset) { return this.ready; } // Set the resource. this.setResource(resourceId); // Add this resource service to the list of all resources in context. if (this.resourcesService) { this.resources = this.resourcesService.resources; this.resources[this.config.name] = this; } if (this.resourceId) { return this.loadForm() .then(() => this.loadResource()) .then(() => this.readyResolve(this.form)) .catch((err) => this.readyReject(err)); } return this.loadForm() .then(() => this.readyResolve(this.form)) .catch((err) => this.readyReject(err)); } onError(error) { this.alerts.setAlert({ type: "danger", message: error.message || error, }); if (this.resourcesService) { this.resourcesService.error.emit(error); } throw error; } onFormError(err) { this.formReject(err); this.onError(err); } loadForm() { if (this.formLoading) { return this.formLoading; } this.formUrl = this.appConfig.appUrl + "/" + this.config.form; this.formFormio = new FormioPromiseService(this.formUrl); this.isLoading = true; this.formLoading = this.formFormio .loadForm() .then((form) => { this.form = form; this.formResolve(form); this.isLoading = false; this.loadParents(); return form; }, (err) => this.onFormError(err)) .catch((err) => this.onFormError(err)); return this.formLoading; } loadParents() { if (!this.config.parents || !this.config.parents.length) { return Promise.resolve([]); } if (!this.resourcesService) { console.warn("You must provide the FormioResources within your application to use nested resources."); return Promise.resolve([]); } return this.formLoading.then((form) => { // Iterate through the list of parents. const _parentsLoaded = []; this.config.parents.forEach((parent) => { const resourceName = parent.resource || parent; const resourceField = parent.field || parent; const filterResource = parent.hasOwnProperty("filter") ? parent.filter : true; if (this.resources.hasOwnProperty(resourceName) && this.resources[resourceName].resourceLoaded) { _parentsLoaded.push(this.resources[resourceName].resourceLoaded.then((resource) => { let parentPath = ""; Utils.eachComponent(form.components, (component, path) => { if (component.key === resourceField) { component.hidden = true; component.clearOnHide = false; _.set(this.resource.data, path, resource); parentPath = path; return true; } }); return { name: parentPath, filter: filterResource, resource, }; })); } }); // When all the parents have loaded, emit that to the onParents emitter. return Promise.all(_parentsLoaded).then((parents) => { this.refresh.emit({ form: form, submission: this.resource, }); return parents; }); }); } onSubmissionError(err) { this.onError(err); this.resourceReject(err); } loadResource() { if (this.resourceLoading) { return this.resourceLoading; } this.isLoading = true; this.resourceLoading = this.formio .loadSubmission(null, { ignoreCache: true }) .then((resource) => { this.resource = resource; this.isLoading = false; this.refresh.emit({ property: "submission", value: this.resource, }); this.resourceResolve(resource); return resource; }, (err) => this.onSubmissionError(err)) .catch((err) => this.onSubmissionError(err)); return this.resourceLoading; } save(resource) { const formio = resource._id ? this.formio : this.formFormio; return formio .saveSubmission(resource) .then((saved) => { this.resource = saved; return saved; }, (err) => this.onError(err)) .catch((err) => this.onError(err)); } remove() { return this.formio .deleteSubmission() .then(() => { this.resource = null; }, (err) => this.onError(err)) .catch((err) => this.onError(err)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioResourceService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormioResourceConfig }, { token: i3.FormioResources, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioResourceService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormioResourceService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.FormioAppConfig }, { type: i2.FormioResourceConfig }, { type: i3.FormioResources, decorators: [{ type: Optional }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZm9ybWlvL3Jlc291cmNlL3NyYy9yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUluRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7O0FBR3ZCLE1BQU0sT0FBTyxxQkFBcUI7SUE4QnZCO0lBQ0E7SUFDWTtJQS9CZCxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksQ0FBTTtJQUNWLE1BQU0sQ0FBZTtJQUNyQixRQUFRLENBQU07SUFDZCxXQUFXLENBQVU7SUFDckIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBdUI7SUFDakMsTUFBTSxDQUF1QjtJQUM3QixPQUFPLENBQW1DO0lBRTFDLGVBQWUsQ0FBTTtJQUNyQixjQUFjLENBQU07SUFDcEIsY0FBYyxDQUFnQjtJQUU5QixlQUFlLENBQWdCO0lBQy9CLFVBQVUsQ0FBVTtJQUNwQixTQUFTLENBQU07SUFFZixLQUFLLENBQWdCO0lBQ3JCLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsV0FBVyxDQUFnQjtJQUMzQixVQUFVLENBQWU7SUFDekIsV0FBVyxDQUFNO0lBQ2pCLFVBQVUsQ0FBTTtJQUNoQixTQUFTLENBQVU7SUFFMUIsWUFDUyxTQUEwQixFQUMxQixNQUE0QixFQUNoQixnQkFBaUM7UUFGN0MsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsV0FB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RyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVELE9BQU8sTUFBTTthQUNWLGNBQWMsQ0FBQyxRQUFRLENBQUM7YUFDeEIsSUFBSSxDQUNILENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRCxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FDaEM7YUFDQSxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU07YUFDZixnQkFBZ0IsRUFBRTthQUNsQixJQUFJLENBQ0gsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQyxFQUNELENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUNoQzthQUNBLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBL1BVLHFCQUFxQjs0R0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQURqQyxVQUFVOzswQkFpQ04sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBGb3JtaW9SZXNvdXJjZUNvbmZpZyB9IGZyb20gXCIuL3Jlc291cmNlLmNvbmZpZ1wiO1xuaW1wb3J0IHsgRm9ybWlvUmVzb3VyY2VzIH0gZnJvbSBcIi4vcmVzb3VyY2VzLnNlcnZpY2VcIjtcbmltcG9ydCB7IEZvcm1pb1Byb21pc2VTZXJ2aWNlIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBGb3JtaW9BbGVydHMgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcbmltcG9ydCB7IEZvcm1pb0FwcENvbmZpZyB9IGZyb20gXCJmb3JtaW9hbmd1bGFyLWNvbGZ1dHVyb1wiO1xuaW1wb3J0IHsgRm9ybWlvUmVmcmVzaFZhbHVlIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XG5pbXBvcnQgeyBGb3JtaW8sIFV0aWxzIH0gZnJvbSBcImZvcm1pb2pzLWNvbGZ1dHVyb1wiO1xuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRm9ybWlvUmVzb3VyY2VTZXJ2aWNlIHtcbiAgcHVibGljIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JtOiBhbnk7XG4gIHB1YmxpYyBhbGVydHM6IEZvcm1pb0FsZXJ0cztcbiAgcHVibGljIHJlc291cmNlOiBhbnk7XG4gIHB1YmxpYyByZXNvdXJjZVVybD86IHN0cmluZztcbiAgcHVibGljIGZvcm1Vcmw6IHN0cmluZztcbiAgcHVibGljIGZvcm1Gb3JtaW86IEZvcm1pb1Byb21pc2VTZXJ2aWNlO1xuICBwdWJsaWMgZm9ybWlvOiBGb3JtaW9Qcm9taXNlU2VydmljZTtcbiAgcHVibGljIHJlZnJlc2g6IEV2ZW50RW1pdHRlcjxGb3JtaW9SZWZyZXNoVmFsdWU+O1xuXG4gIHB1YmxpYyByZXNvdXJjZVJlc29sdmU6IGFueTtcbiAgcHVibGljIHJlc291cmNlUmVqZWN0OiBhbnk7XG4gIHB1YmxpYyByZXNvdXJjZUxvYWRlZD86IFByb21pc2U8YW55PjtcblxuICBwdWJsaWMgcmVzb3VyY2VMb2FkaW5nPzogUHJvbWlzZTxhbnk+O1xuICBwdWJsaWMgcmVzb3VyY2VJZD86IHN0cmluZztcbiAgcHVibGljIHJlc291cmNlczogYW55O1xuXG4gIHB1YmxpYyByZWFkeT86IFByb21pc2U8YW55PjtcbiAgcHVibGljIHJlYWR5UmVzb2x2ZTogYW55O1xuICBwdWJsaWMgcmVhZHlSZWplY3Q6IGFueTtcblxuICBwdWJsaWMgZm9ybUxvYWRpbmc/OiBQcm9taXNlPGFueT47XG4gIHB1YmxpYyBmb3JtTG9hZGVkOiBQcm9taXNlPGFueT47XG4gIHB1YmxpYyBmb3JtUmVzb2x2ZTogYW55O1xuICBwdWJsaWMgZm9ybVJlamVjdDogYW55O1xuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhcHBDb25maWc6IEZvcm1pb0FwcENvbmZpZyxcbiAgICBwdWJsaWMgY29uZmlnOiBGb3JtaW9SZXNvdXJjZUNvbmZpZyxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcmVzb3VyY2VzU2VydmljZTogRm9ybWlvUmVzb3VyY2VzXG4gICkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFsZXJ0cyA9IG5ldyBGb3JtaW9BbGVydHMoKTtcbiAgICB0aGlzLnJlZnJlc2ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuICBpbml0aWFsaXplKCkge1xuICAgIGNvbnNvbGUud2FybihcIkZvcm1pb1Jlc291cmNlU2VydmljZS5pbml0aWFsaXplKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC5cIik7XG4gIH1cblxuICBzZXRSZXNvdXJjZShyZXNvdXJjZUlkOiBhbnkpIHtcbiAgICB0aGlzLnJlc291cmNlTG9hZGluZyA9IG51bGw7XG4gICAgdGhpcy5mb3JtTG9hZGluZyA9IG51bGw7XG4gICAgdGhpcy5yZWFkeSA9IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlYWR5UmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLnJlYWR5UmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUxvYWRlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KSA9PiB7XG4gICAgICB0aGlzLmZvcm1SZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuZm9ybVJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgICB0aGlzLnJlc291cmNlTG9hZGVkID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzb3VyY2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVzb3VyY2VSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNvdXJjZUlkID0gcmVzb3VyY2VJZDtcbiAgICB0aGlzLnJlc291cmNlVXJsID0gdGhpcy5hcHBDb25maWcuYXBwVXJsICsgXCIvXCIgKyB0aGlzLmNvbmZpZy5mb3JtO1xuICAgIGlmICh0aGlzLnJlc291cmNlSWQpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VVcmwgKz0gXCIvc3VibWlzc2lvbi9cIiArIHRoaXMucmVzb3VyY2VJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXBwQ29uZmlnICYmIHRoaXMuYXBwQ29uZmlnLmFwcFVybCkge1xuICAgICAgRm9ybWlvLnNldEJhc2VVcmwodGhpcy5hcHBDb25maWcuYXBpVXJsKTtcbiAgICAgIEZvcm1pby5zZXRQcm9qZWN0VXJsKHRoaXMuYXBwQ29uZmlnLmFwcFVybCk7XG4gICAgICBGb3JtaW8uZm9ybU9ubHkgPSB0aGlzLmFwcENvbmZpZy5mb3JtT25seTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihcIllvdSBtdXN0IHByb3ZpZGUgYW4gQXBwQ29uZmlnIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIVwiKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtaW8gPSBuZXcgRm9ybWlvUHJvbWlzZVNlcnZpY2UodGhpcy5yZXNvdXJjZVVybCk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IHsgZGF0YToge30gfTtcbiAgfVxuXG4gIGluaXQocm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSByb3V0ZS5zbmFwc2hvdDtcbiAgICBjb25zdCByZXNldCA9IHNuYXBzaG90LnF1ZXJ5UGFyYW1zPy5oYXNPd25Qcm9wZXJ0eShcInJlc2V0XCIpXG4gICAgICA/IHNuYXBzaG90LnF1ZXJ5UGFyYW1zLnJlc2V0XG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHJlc291cmNlSWQgPSBzbmFwc2hvdC5wYXJhbXNbXCJpZFwiXTtcbiAgICBpZiAocmVzb3VyY2VJZCAmJiByZXNvdXJjZUlkID09PSB0aGlzLnJlc291cmNlSWQgJiYgIXJlc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIHJlc291cmNlLlxuICAgIHRoaXMuc2V0UmVzb3VyY2UocmVzb3VyY2VJZCk7XG5cbiAgICAvLyBBZGQgdGhpcyByZXNvdXJjZSBzZXJ2aWNlIHRvIHRoZSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgaW4gY29udGV4dC5cbiAgICBpZiAodGhpcy5yZXNvdXJjZXNTZXJ2aWNlKSB7XG4gICAgICB0aGlzLnJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzU2VydmljZS5yZXNvdXJjZXM7XG4gICAgICB0aGlzLnJlc291cmNlc1t0aGlzLmNvbmZpZy5uYW1lXSA9IHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzb3VyY2VJZCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZEZvcm0oKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvYWRSZXNvdXJjZSgpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0aGlzLmZvcm0pKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4gdGhpcy5yZWFkeVJlamVjdChlcnIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2FkRm9ybSgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0aGlzLmZvcm0pKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMucmVhZHlSZWplY3QoZXJyKSk7XG4gIH1cblxuICBvbkVycm9yKGVycm9yOiBhbnkpIHtcbiAgICB0aGlzLmFsZXJ0cy5zZXRBbGVydCh7XG4gICAgICB0eXBlOiBcImRhbmdlclwiLFxuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBlcnJvcixcbiAgICB9KTtcbiAgICBpZiAodGhpcy5yZXNvdXJjZXNTZXJ2aWNlKSB7XG4gICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZXJyb3IuZW1pdChlcnJvcik7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgb25Gb3JtRXJyb3IoZXJyOiBhbnkpIHtcbiAgICB0aGlzLmZvcm1SZWplY3QoZXJyKTtcbiAgICB0aGlzLm9uRXJyb3IoZXJyKTtcbiAgfVxuXG4gIGxvYWRGb3JtKCkge1xuICAgIGlmICh0aGlzLmZvcm1Mb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtTG9hZGluZztcbiAgICB9XG4gICAgdGhpcy5mb3JtVXJsID0gdGhpcy5hcHBDb25maWcuYXBwVXJsICsgXCIvXCIgKyB0aGlzLmNvbmZpZy5mb3JtO1xuICAgIHRoaXMuZm9ybUZvcm1pbyA9IG5ldyBGb3JtaW9Qcm9taXNlU2VydmljZSh0aGlzLmZvcm1VcmwpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1Mb2FkaW5nID0gdGhpcy5mb3JtRm9ybWlvXG4gICAgICAubG9hZEZvcm0oKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChmb3JtOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgICAgICAgIHRoaXMuZm9ybVJlc29sdmUoZm9ybSk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmxvYWRQYXJlbnRzKCk7XG4gICAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgICAgIH0sXG4gICAgICAgIChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLm9uRm9ybUVycm9yKGVycikpO1xuICAgIHJldHVybiB0aGlzLmZvcm1Mb2FkaW5nO1xuICB9XG5cbiAgbG9hZFBhcmVudHMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5wYXJlbnRzIHx8ICF0aGlzLmNvbmZpZy5wYXJlbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5yZXNvdXJjZXNTZXJ2aWNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiWW91IG11c3QgcHJvdmlkZSB0aGUgRm9ybWlvUmVzb3VyY2VzIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHRvIHVzZSBuZXN0ZWQgcmVzb3VyY2VzLlwiXG4gICAgICApO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1Mb2FkaW5nLnRoZW4oKGZvcm0pID0+IHtcbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiBwYXJlbnRzLlxuICAgICAgY29uc3QgX3BhcmVudHNMb2FkZWQ6IEFycmF5PFByb21pc2U8YW55Pj4gPSBbXTtcbiAgICAgIHRoaXMuY29uZmlnLnBhcmVudHMuZm9yRWFjaCgocGFyZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VOYW1lID0gcGFyZW50LnJlc291cmNlIHx8IHBhcmVudDtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZCA9IHBhcmVudC5maWVsZCB8fCBwYXJlbnQ7XG4gICAgICAgIGNvbnN0IGZpbHRlclJlc291cmNlID0gcGFyZW50Lmhhc093blByb3BlcnR5KFwiZmlsdGVyXCIpXG4gICAgICAgICAgPyBwYXJlbnQuZmlsdGVyXG4gICAgICAgICAgOiB0cnVlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZXMuaGFzT3duUHJvcGVydHkocmVzb3VyY2VOYW1lKSAmJlxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgX3BhcmVudHNMb2FkZWQucHVzaChcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWQudGhlbihcbiAgICAgICAgICAgICAgKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50UGF0aCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgVXRpbHMuZWFjaENvbXBvbmVudChmb3JtLmNvbXBvbmVudHMsIChjb21wb25lbnQsIHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQua2V5ID09PSByZXNvdXJjZUZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2xlYXJPbkhpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgXy5zZXQodGhpcy5yZXNvdXJjZS5kYXRhLCBwYXRoLCByZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbmFtZTogcGFyZW50UGF0aCxcbiAgICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyUmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFdoZW4gYWxsIHRoZSBwYXJlbnRzIGhhdmUgbG9hZGVkLCBlbWl0IHRoYXQgdG8gdGhlIG9uUGFyZW50cyBlbWl0dGVyLlxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKF9wYXJlbnRzTG9hZGVkKS50aGVuKChwYXJlbnRzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoLmVtaXQoe1xuICAgICAgICAgIGZvcm06IGZvcm0sXG4gICAgICAgICAgc3VibWlzc2lvbjogdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvblN1Ym1pc3Npb25FcnJvcihlcnI6IGFueSkge1xuICAgIHRoaXMub25FcnJvcihlcnIpO1xuICAgIHRoaXMucmVzb3VyY2VSZWplY3QoZXJyKTtcbiAgfVxuXG4gIGxvYWRSZXNvdXJjZSgpIHtcbiAgICBpZiAodGhpcy5yZXNvdXJjZUxvYWRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTG9hZGluZztcbiAgICB9XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzb3VyY2VMb2FkaW5nID0gdGhpcy5mb3JtaW9cbiAgICAgIC5sb2FkU3VibWlzc2lvbihudWxsLCB7IGlnbm9yZUNhY2hlOiB0cnVlIH0pXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2guZW1pdCh7XG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJzdWJtaXNzaW9uXCIsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJlc291cmNlUmVzb2x2ZShyZXNvdXJjZSk7XG4gICAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25TdWJtaXNzaW9uRXJyb3IoZXJyKVxuICAgICAgKVxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vblN1Ym1pc3Npb25FcnJvcihlcnIpKTtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUxvYWRpbmc7XG4gIH1cblxuICBzYXZlKHJlc291cmNlOiBhbnkpIHtcbiAgICBjb25zdCBmb3JtaW8gPSByZXNvdXJjZS5faWQgPyB0aGlzLmZvcm1pbyA6IHRoaXMuZm9ybUZvcm1pbztcbiAgICByZXR1cm4gZm9ybWlvXG4gICAgICAuc2F2ZVN1Ym1pc3Npb24ocmVzb3VyY2UpXG4gICAgICAudGhlbihcbiAgICAgICAgKHNhdmVkOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlID0gc2F2ZWQ7XG4gICAgICAgICAgcmV0dXJuIHNhdmVkO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWlvXG4gICAgICAuZGVsZXRlU3VibWlzc2lvbigpXG4gICAgICAudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLm9uRXJyb3IoZXJyKSk7XG4gIH1cbn1cbiJdfQ==