UNPKG

formioangular-colfuturo

Version:

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

236 lines 31.3 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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RyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVELE9BQU8sTUFBTTthQUNWLGNBQWMsQ0FBQyxRQUFRLENBQUM7YUFDeEIsSUFBSSxDQUNILENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRCxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FDaEM7YUFDQSxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU07YUFDZixnQkFBZ0IsRUFBRTthQUNsQixJQUFJLENBQ0gsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQyxFQUNELENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUNoQzthQUNBLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBL1BVLHFCQUFxQjs0R0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQURqQyxVQUFVOzswQkFpQ04sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgRm9ybWlvUmVzb3VyY2VDb25maWcgfSBmcm9tIFwiLi9yZXNvdXJjZS5jb25maWdcIjtcclxuaW1wb3J0IHsgRm9ybWlvUmVzb3VyY2VzIH0gZnJvbSBcIi4vcmVzb3VyY2VzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRm9ybWlvUHJvbWlzZVNlcnZpY2UgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IHsgRm9ybWlvQWxlcnRzIH0gZnJvbSBcImZvcm1pb2FuZ3VsYXItY29sZnV0dXJvXCI7XHJcbmltcG9ydCB7IEZvcm1pb0FwcENvbmZpZyB9IGZyb20gXCJmb3JtaW9hbmd1bGFyLWNvbGZ1dHVyb1wiO1xyXG5pbXBvcnQgeyBGb3JtaW9SZWZyZXNoVmFsdWUgfSBmcm9tIFwiZm9ybWlvYW5ndWxhci1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IHsgRm9ybWlvLCBVdGlscyB9IGZyb20gXCJmb3JtaW9qcy1jb2xmdXR1cm9cIjtcclxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRm9ybWlvUmVzb3VyY2VTZXJ2aWNlIHtcclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZm9ybTogYW55O1xyXG4gIHB1YmxpYyBhbGVydHM6IEZvcm1pb0FsZXJ0cztcclxuICBwdWJsaWMgcmVzb3VyY2U6IGFueTtcclxuICBwdWJsaWMgcmVzb3VyY2VVcmw/OiBzdHJpbmc7XHJcbiAgcHVibGljIGZvcm1Vcmw6IHN0cmluZztcclxuICBwdWJsaWMgZm9ybUZvcm1pbzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgcHVibGljIGZvcm1pbzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgcHVibGljIHJlZnJlc2g6IEV2ZW50RW1pdHRlcjxGb3JtaW9SZWZyZXNoVmFsdWU+O1xyXG5cclxuICBwdWJsaWMgcmVzb3VyY2VSZXNvbHZlOiBhbnk7XHJcbiAgcHVibGljIHJlc291cmNlUmVqZWN0OiBhbnk7XHJcbiAgcHVibGljIHJlc291cmNlTG9hZGVkPzogUHJvbWlzZTxhbnk+O1xyXG5cclxuICBwdWJsaWMgcmVzb3VyY2VMb2FkaW5nPzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyByZXNvdXJjZUlkPzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZXNvdXJjZXM6IGFueTtcclxuXHJcbiAgcHVibGljIHJlYWR5PzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyByZWFkeVJlc29sdmU6IGFueTtcclxuICBwdWJsaWMgcmVhZHlSZWplY3Q6IGFueTtcclxuXHJcbiAgcHVibGljIGZvcm1Mb2FkaW5nPzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBmb3JtTG9hZGVkOiBQcm9taXNlPGFueT47XHJcbiAgcHVibGljIGZvcm1SZXNvbHZlOiBhbnk7XHJcbiAgcHVibGljIGZvcm1SZWplY3Q6IGFueTtcclxuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBhcHBDb25maWc6IEZvcm1pb0FwcENvbmZpZyxcclxuICAgIHB1YmxpYyBjb25maWc6IEZvcm1pb1Jlc291cmNlQ29uZmlnLFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlc291cmNlc1NlcnZpY2U6IEZvcm1pb1Jlc291cmNlc1xyXG4gICkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hbGVydHMgPSBuZXcgRm9ybWlvQWxlcnRzKCk7XHJcbiAgICB0aGlzLnJlZnJlc2ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgY29uc29sZS53YXJuKFwiRm9ybWlvUmVzb3VyY2VTZXJ2aWNlLmluaXRpYWxpemUoKSBoYXMgYmVlbiBkZXByZWNhdGVkLlwiKTtcclxuICB9XHJcblxyXG4gIHNldFJlc291cmNlKHJlc291cmNlSWQ6IGFueSkge1xyXG4gICAgdGhpcy5yZXNvdXJjZUxvYWRpbmcgPSBudWxsO1xyXG4gICAgdGhpcy5mb3JtTG9hZGluZyA9IG51bGw7XHJcbiAgICB0aGlzLnJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWFkeVJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlYWR5UmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1Mb2FkZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmZvcm1SZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgdGhpcy5mb3JtUmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc291cmNlTG9hZGVkID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlc291cmNlUmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc291cmNlSWQgPSByZXNvdXJjZUlkO1xyXG4gICAgdGhpcy5yZXNvdXJjZVVybCA9IHRoaXMuYXBwQ29uZmlnLmFwcFVybCArIFwiL1wiICsgdGhpcy5jb25maWcuZm9ybTtcclxuICAgIGlmICh0aGlzLnJlc291cmNlSWQpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVVybCArPSBcIi9zdWJtaXNzaW9uL1wiICsgdGhpcy5yZXNvdXJjZUlkO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBwQ29uZmlnICYmIHRoaXMuYXBwQ29uZmlnLmFwcFVybCkge1xyXG4gICAgICBGb3JtaW8uc2V0QmFzZVVybCh0aGlzLmFwcENvbmZpZy5hcGlVcmwpO1xyXG4gICAgICBGb3JtaW8uc2V0UHJvamVjdFVybCh0aGlzLmFwcENvbmZpZy5hcHBVcmwpO1xyXG4gICAgICBGb3JtaW8uZm9ybU9ubHkgPSB0aGlzLmFwcENvbmZpZy5mb3JtT25seTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGFuIEFwcENvbmZpZyB3aXRoaW4geW91ciBhcHBsaWNhdGlvbiFcIik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1pbyA9IG5ldyBGb3JtaW9Qcm9taXNlU2VydmljZSh0aGlzLnJlc291cmNlVXJsKTtcclxuICAgIHRoaXMucmVzb3VyY2UgPSB7IGRhdGE6IHt9IH07XHJcbiAgfVxyXG5cclxuICBpbml0KHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgY29uc3Qgc25hcHNob3QgPSByb3V0ZS5zbmFwc2hvdDtcclxuICAgIGNvbnN0IHJlc2V0ID0gc25hcHNob3QucXVlcnlQYXJhbXM/Lmhhc093blByb3BlcnR5KFwicmVzZXRcIilcclxuICAgICAgPyBzbmFwc2hvdC5xdWVyeVBhcmFtcy5yZXNldFxyXG4gICAgICA6IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHNuYXBzaG90LnBhcmFtc1tcImlkXCJdO1xyXG4gICAgaWYgKHJlc291cmNlSWQgJiYgcmVzb3VyY2VJZCA9PT0gdGhpcy5yZXNvdXJjZUlkICYmICFyZXNldCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZWFkeTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgdGhlIHJlc291cmNlLlxyXG4gICAgdGhpcy5zZXRSZXNvdXJjZShyZXNvdXJjZUlkKTtcclxuXHJcbiAgICAvLyBBZGQgdGhpcyByZXNvdXJjZSBzZXJ2aWNlIHRvIHRoZSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgaW4gY29udGV4dC5cclxuICAgIGlmICh0aGlzLnJlc291cmNlc1NlcnZpY2UpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlc1NlcnZpY2UucmVzb3VyY2VzO1xyXG4gICAgICB0aGlzLnJlc291cmNlc1t0aGlzLmNvbmZpZy5uYW1lXSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVzb3VyY2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkRm9ybSgpXHJcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkUmVzb3VyY2UoKSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0aGlzLmZvcm0pKVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLnJlYWR5UmVqZWN0KGVycikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxvYWRGb3JtKClcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFkeVJlc29sdmUodGhpcy5mb3JtKSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMucmVhZHlSZWplY3QoZXJyKSk7XHJcbiAgfVxyXG5cclxuICBvbkVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0KHtcclxuICAgICAgdHlwZTogXCJkYW5nZXJcIixcclxuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB8fCBlcnJvcixcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMucmVzb3VyY2VzU2VydmljZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZXJyb3IuZW1pdChlcnJvcik7XHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJvcjtcclxuICB9XHJcblxyXG4gIG9uRm9ybUVycm9yKGVycjogYW55KSB7XHJcbiAgICB0aGlzLmZvcm1SZWplY3QoZXJyKTtcclxuICAgIHRoaXMub25FcnJvcihlcnIpO1xyXG4gIH1cclxuXHJcbiAgbG9hZEZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtTG9hZGluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtTG9hZGluZztcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybVVybCA9IHRoaXMuYXBwQ29uZmlnLmFwcFVybCArIFwiL1wiICsgdGhpcy5jb25maWcuZm9ybTtcclxuICAgIHRoaXMuZm9ybUZvcm1pbyA9IG5ldyBGb3JtaW9Qcm9taXNlU2VydmljZSh0aGlzLmZvcm1VcmwpO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtTG9hZGluZyA9IHRoaXMuZm9ybUZvcm1pb1xyXG4gICAgICAubG9hZEZvcm0oKVxyXG4gICAgICAudGhlbihcclxuICAgICAgICAoZm9ybTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xyXG4gICAgICAgICAgdGhpcy5mb3JtUmVzb2x2ZShmb3JtKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYXJlbnRzKCk7XHJcbiAgICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpKTtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Mb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgbG9hZFBhcmVudHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLnBhcmVudHMgfHwgIXRoaXMuY29uZmlnLnBhcmVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnJlc291cmNlc1NlcnZpY2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiWW91IG11c3QgcHJvdmlkZSB0aGUgRm9ybWlvUmVzb3VyY2VzIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHRvIHVzZSBuZXN0ZWQgcmVzb3VyY2VzLlwiXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUxvYWRpbmcudGhlbigoZm9ybSkgPT4ge1xyXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgcGFyZW50cy5cclxuICAgICAgY29uc3QgX3BhcmVudHNMb2FkZWQ6IEFycmF5PFByb21pc2U8YW55Pj4gPSBbXTtcclxuICAgICAgdGhpcy5jb25maWcucGFyZW50cy5mb3JFYWNoKChwYXJlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHBhcmVudC5yZXNvdXJjZSB8fCBwYXJlbnQ7XHJcbiAgICAgICAgY29uc3QgcmVzb3VyY2VGaWVsZCA9IHBhcmVudC5maWVsZCB8fCBwYXJlbnQ7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyUmVzb3VyY2UgPSBwYXJlbnQuaGFzT3duUHJvcGVydHkoXCJmaWx0ZXJcIilcclxuICAgICAgICAgID8gcGFyZW50LmZpbHRlclxyXG4gICAgICAgICAgOiB0cnVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzLmhhc093blByb3BlcnR5KHJlc291cmNlTmFtZSkgJiZcclxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIF9wYXJlbnRzTG9hZGVkLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWQudGhlbihcclxuICAgICAgICAgICAgICAocmVzb3VyY2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudFBhdGggPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZWFjaENvbXBvbmVudChmb3JtLmNvbXBvbmVudHMsIChjb21wb25lbnQsIHBhdGgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5rZXkgPT09IHJlc291cmNlRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2xlYXJPbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBfLnNldCh0aGlzLnJlc291cmNlLmRhdGEsIHBhdGgsIHJlc291cmNlKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gcGF0aDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBwYXJlbnRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlclJlc291cmNlLFxyXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBXaGVuIGFsbCB0aGUgcGFyZW50cyBoYXZlIGxvYWRlZCwgZW1pdCB0aGF0IHRvIHRoZSBvblBhcmVudHMgZW1pdHRlci5cclxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKF9wYXJlbnRzTG9hZGVkKS50aGVuKChwYXJlbnRzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnJlZnJlc2guZW1pdCh7XHJcbiAgICAgICAgICBmb3JtOiBmb3JtLFxyXG4gICAgICAgICAgc3VibWlzc2lvbjogdGhpcy5yZXNvdXJjZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3VibWlzc2lvbkVycm9yKGVycjogYW55KSB7XHJcbiAgICB0aGlzLm9uRXJyb3IoZXJyKTtcclxuICAgIHRoaXMucmVzb3VyY2VSZWplY3QoZXJyKTtcclxuICB9XHJcblxyXG4gIGxvYWRSZXNvdXJjZSgpIHtcclxuICAgIGlmICh0aGlzLnJlc291cmNlTG9hZGluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUxvYWRpbmc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnJlc291cmNlTG9hZGluZyA9IHRoaXMuZm9ybWlvXHJcbiAgICAgIC5sb2FkU3VibWlzc2lvbihudWxsLCB7IGlnbm9yZUNhY2hlOiB0cnVlIH0pXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgIChyZXNvdXJjZTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoLmVtaXQoe1xyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJzdWJtaXNzaW9uXCIsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlc291cmNlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlUmVzb2x2ZShyZXNvdXJjZSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25TdWJtaXNzaW9uRXJyb3IoZXJyKVxyXG4gICAgICApXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMub25TdWJtaXNzaW9uRXJyb3IoZXJyKSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUxvYWRpbmc7XHJcbiAgfVxyXG5cclxuICBzYXZlKHJlc291cmNlOiBhbnkpIHtcclxuICAgIGNvbnN0IGZvcm1pbyA9IHJlc291cmNlLl9pZCA/IHRoaXMuZm9ybWlvIDogdGhpcy5mb3JtRm9ybWlvO1xyXG4gICAgcmV0dXJuIGZvcm1pb1xyXG4gICAgICAuc2F2ZVN1Ym1pc3Npb24ocmVzb3VyY2UpXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgIChzYXZlZDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlID0gc2F2ZWQ7XHJcbiAgICAgICAgICByZXR1cm4gc2F2ZWQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkVycm9yKGVycikpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWlvXHJcbiAgICAgIC5kZWxldGVTdWJtaXNzaW9uKClcclxuICAgICAgLnRoZW4oXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkVycm9yKGVycikpO1xyXG4gIH1cclxufVxyXG4iXX0=