UNPKG

@formql/core

Version:

FormQL - A framework for building dynamic forms

185 lines 28.7 kB
import { __decorate, __metadata, __param } from "tslib"; import { Inject, Injectable } from '@angular/core'; import { FormBuilder } from '@angular/forms'; import { concatMap, map } from 'rxjs/operators'; import { RuleLogic } from '../validators/rule-logic'; import { ComponentResolverService } from './component-resolver.service'; import { HelperService } from './helper.service'; import * as i0 from "@angular/core"; import * as i1 from "./component-resolver.service"; import * as i2 from "@angular/forms"; let FormService = class FormService { constructor(srv, componentResolverService, formBuilder) { this.componentResolverService = componentResolverService; this.formBuilder = formBuilder; this.ruleLogic = new RuleLogic(); this.injectedService = srv; } getFormAndData(formName, ids) { if (ids) return this.injectedService.getForm(formName).pipe(map((response) => response), concatMap((model) => this.injectedService.getData(model.dataSource, ids).pipe(map((data) => this.initialiseFormState(model, data))))); else return this.injectedService.getForm(formName).pipe(map((model) => this.initialiseFormState(model, null))); } /* Invokes the form save in the injected service (see constructor for service) */ saveForm(name, form) { // remove all transactional data const updateForm = HelperService.deepCopy(form); updateForm.pages.forEach((page) => { page.sections.forEach((section) => { section.components.forEach((component) => { Object.keys(component) .filter((key) => component[key] === null) .forEach((key) => delete component[key]); delete component.value; if (component.rules) if (Object.keys(component.rules).length === 0 && component.rules.constructor === Object) delete component.rules; else Object.keys(component.rules).forEach((p) => { delete component.rules[p].value; }); }); }); }); return this.injectedService.saveForm(name, updateForm).pipe(map((response) => { return response; })); } /* Invokes the data save in the injected service (see constructor for service) */ saveData(dataSource, ids, data) { return this.injectedService.saveData(dataSource, ids, data).pipe(map((result) => { return result; })); } /* Updates a component value and recalculates all dependents If reset is set to true, it will recalculate all dependents, this is when a rules as been modified in the FormQL Editor */ updateComponent(component, formState, reset = false) { const value = HelperService.resolveType(component.value, component.type); formState.data = HelperService.setValue(component.schema, value, formState.data); if (reset) this.resetComponentDependents(formState); // refresh any dependent components if (component.dependents) component.dependents.forEach((key) => { formState.components[key] = this.resolveComponentRules(formState.components[key], formState); }); // set the value on any components that have the same schema Object.keys(formState.components).forEach((key) => { const c = formState.components[key]; if (c.schema === component.schema) try { c.value = HelperService.getValue(c.schema, formState.data, c.type); } catch (err) { throw err; } }); return formState; } /* Initialises Form State */ initialiseFormState(form, data) { const reactiveFormStructure = HelperService.createReactiveFormStructure(form, true, data); const formState = { components: reactiveFormStructure.components, data: Object.assign({}, reactiveFormStructure.data), form: form, formControls: reactiveFormStructure.formControls, reactiveForm: this.formBuilder.group(reactiveFormStructure.pageGroup) }; return this.resolveConditions(formState); } /* Resets all component dependents, it should only be called when a user modified a question in the formql editor */ resetComponentDependents(formState) { if (formState.components) { Object.keys(formState.components).forEach((componentKey) => delete formState.components[componentKey].dependents); Object.keys(formState.components).forEach((componentKey) => { const component = formState.components[componentKey]; if (component.rules) Object.keys(component.rules).forEach((ruleKey) => { const rule = component.rules[ruleKey]; this.ruleLogic.resetDependancies(formState, rule.condition, component); }); }); Object.keys(formState.components).forEach((componentKey) => (formState.components[componentKey] = this.resolveComponentRules(formState.components[componentKey], formState))); } } getData(query, ids) { return this.injectedService.getData(query, ids).pipe(map((data) => { if (data) return data; else return {}; })); } getForms() { return this.injectedService.getForms().pipe(map((data) => { return data; })); } getForm(name) { return this.injectedService.getForm(name).pipe(map((data) => { return data; })); } /* Resolve all rules for any given component */ resolveComponentRules(component, formState) { if (component.rules) { let resetValidator = false; Object.keys(component.rules).forEach((key) => { const property = component.rules[key]; if (property.condition) { resetValidator = true; const evaluatedValue = this.ruleLogic.evaluate(formState.data, property.condition); if (key === 'value') { const value = HelperService.resolveType(evaluatedValue, component.type); if (component.value !== value) { component.value = value; formState = this.updateComponent(component, formState); } } property.value = evaluatedValue; } else delete component.rules[key]; }); if (resetValidator) formState.formControls[component.componentId] = HelperService.setValidators(this.componentResolverService, component, formState.formControls[component.componentId]); } return component; } /* Resolves all conditions in each component, used when initialising the form */ resolveConditions(formState) { if (formState.components) { const components = formState.components; Object.keys(components).forEach((componentKey) => (components[componentKey] = this.resolveComponentRules(components[componentKey], formState))); } return formState; } }; FormService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FormService_Factory() { return new FormService(i0.ɵɵinject("FormQLService"), i0.ɵɵinject(i1.ComponentResolverService), i0.ɵɵinject(i2.FormBuilder)); }, token: FormService, providedIn: "root" }); FormService = __decorate([ Injectable({ providedIn: 'root' }), __param(0, Inject('FormQLService')), __metadata("design:paramtypes", [Object, ComponentResolverService, FormBuilder]) ], FormService); export { FormService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZvcm1xbC9jb3JlLyIsInNvdXJjZXMiOlsic2VydmljZXMvZm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1oRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBS2pELElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFLdEIsWUFDMkIsR0FBRyxFQUNwQix3QkFBa0QsRUFDbEQsV0FBd0I7UUFEeEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUwxQixjQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQU9sQyxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBRU0sY0FBYyxDQUFDLFFBQWdCLEVBQUUsR0FBa0I7UUFDeEQsSUFBSSxHQUFHO1lBQ0wsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ2hELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQWEsUUFBUSxDQUFDLEVBQ3ZDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFB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QUFFO1lBQ3hCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQzdCLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQy9HLENBQUM7U0FDSDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRixDQUFBOztBQTVNWSxXQUFXO0lBSHZCLFVBQVUsQ0FBQztRQUNWLFVBQVUsRUFBRSxNQUFNO0tBQ25CLENBQUM7SUFPRyxXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTs2Q0FDVSx3QkFBd0I7UUFDckMsV0FBVztHQVJ2QixXQUFXLENBNE12QjtTQTVNWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBJRm9ybVFMU2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZm9ybXFsLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tY29tcG9uZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybVBhZ2UgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1wYWdlLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybVNlY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1zZWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybURhdGFTb3VyY2UsIEZvcm1TdGF0ZSwgRm9ybVdpbmRvdyB9IGZyb20gJy4uL21vZGVscy9mb3JtLXdpbmRvdy5tb2RlbCc7XHJcbmltcG9ydCB7IFJ1bGVMb2dpYyB9IGZyb20gJy4uL3ZhbGlkYXRvcnMvcnVsZS1sb2dpYyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlc29sdmVyU2VydmljZSB9IGZyb20gJy4vY29tcG9uZW50LXJlc29sdmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi9oZWxwZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBpbmplY3RlZFNlcnZpY2U6IElGb3JtUUxTZXJ2aWNlO1xyXG5cclxuICBwcml2YXRlIHJ1bGVMb2dpYyA9IG5ldyBSdWxlTG9naWMoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdGb3JtUUxTZXJ2aWNlJykgc3J2LFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRSZXNvbHZlclNlcnZpY2U6IENvbXBvbmVudFJlc29sdmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLmluamVjdGVkU2VydmljZSA9IHNydjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtQW5kRGF0YShmb3JtTmFtZTogc3RyaW5nLCBpZHM6IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPEZvcm1TdGF0ZT4ge1xyXG4gICAgaWYgKGlkcylcclxuICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWRTZXJ2aWNlLmdldEZvcm0oZm9ybU5hbWUpLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gPEZvcm1XaW5kb3c+cmVzcG9uc2UpLFxyXG4gICAgICAgIGNvbmNhdE1hcCgobW9kZWwpID0+XHJcbiAgICAgICAgICB0aGlzLmluamVjdGVkU2VydmljZS5nZXREYXRhKG1vZGVsLmRhdGFTb3VyY2UsIGlkcykucGlwZShtYXAoKGRhdGEpID0+IHRoaXMuaW5pdGlhbGlzZUZvcm1TdGF0ZShtb2RlbCwgZGF0YSkpKVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIGVsc2UgcmV0dXJuIHRoaXMuaW5qZWN0ZWRTZXJ2aWNlLmdldEZvcm0oZm9ybU5hbWUpLnBpcGUobWFwKChtb2RlbCkgPT4gdGhpcy5pbml0aWFsaXNlRm9ybVN0YXRlKG1vZGVsLCBudWxsKSkpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIEludm9rZXMgdGhlIGZvcm0gc2F2ZSBpbiB0aGUgaW5qZWN0ZWQgc2VydmljZSAoc2VlIGNvbnN0cnVjdG9yIGZvciBzZXJ2aWNlKVxyXG4gICovXHJcbiAgcHVibGljIHNhdmVGb3JtPFQsIFU+KG5hbWU6IHN0cmluZywgZm9ybTogRm9ybVdpbmRvdyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgLy8gcmVtb3ZlIGFsbCB0cmFuc2FjdGlvbmFsIGRhdGFcclxuICAgIGNvbnN0IHVwZGF0ZUZvcm0gPSBIZWxwZXJTZXJ2aWNlLmRlZXBDb3B5KGZvcm0pO1xyXG4gICAgdXBkYXRlRm9ybS5wYWdlcy5mb3JFYWNoKChwYWdlOiBGb3JtUGFnZSkgPT4ge1xyXG4gICAgICBwYWdlLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb246IEZvcm1TZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgc2VjdGlvbi5jb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudDogRm9ybUNvbXBvbmVudDxVPikgPT4ge1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50KVxyXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGNvbXBvbmVudFtrZXldID09PSBudWxsKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiBkZWxldGUgY29tcG9uZW50W2tleV0pO1xyXG4gICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC52YWx1ZTtcclxuICAgICAgICAgIGlmIChjb21wb25lbnQucnVsZXMpXHJcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb21wb25lbnQucnVsZXMpLmxlbmd0aCA9PT0gMCAmJiBjb21wb25lbnQucnVsZXMuY29uc3RydWN0b3IgPT09IE9iamVjdClcclxuICAgICAgICAgICAgICBkZWxldGUgY29tcG9uZW50LnJ1bGVzO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50LnJ1bGVzKS5mb3JFYWNoKChwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY29tcG9uZW50LnJ1bGVzW3BdLnZhbHVlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmluamVjdGVkU2VydmljZS5zYXZlRm9ybShuYW1lLCB1cGRhdGVGb3JtKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBUKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBJbnZva2VzIHRoZSBkYXRhIHNhdmUgaW4gdGhlIGluamVjdGVkIHNlcnZpY2UgKHNlZSBjb25zdHJ1Y3RvciBmb3Igc2VydmljZSlcclxuICAqL1xyXG4gIHB1YmxpYyBzYXZlRGF0YTxUPihkYXRhU291cmNlOiBGb3JtRGF0YVNvdXJjZSwgaWRzOiBBcnJheTxzdHJpbmc+LCBkYXRhOiBUKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmplY3RlZFNlcnZpY2Uuc2F2ZURhdGEoZGF0YVNvdXJjZSwgaWRzLCBkYXRhKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3VsdDogVCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIFVwZGF0ZXMgYSBjb21wb25lbnQgdmFsdWUgYW5kIHJlY2FsY3VsYXRlcyBhbGwgZGVwZW5kZW50c1xyXG4gICAgSWYgcmVzZXQgaXMgc2V0IHRvIHRydWUsIGl0IHdpbGwgcmVjYWxjdWxhdGUgYWxsIGRlcGVuZGVudHMsIHRoaXMgaXMgd2hlbiBhIHJ1bGVzIGFzIGJlZW5cclxuICAgIG1vZGlmaWVkIGluIHRoZSBGb3JtUUwgRWRpdG9yXHJcbiAgKi9cclxuICBwdWJsaWMgdXBkYXRlQ29tcG9uZW50PFQ+KGNvbXBvbmVudDogRm9ybUNvbXBvbmVudDxUPiwgZm9ybVN0YXRlOiBGb3JtU3RhdGUsIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBGb3JtU3RhdGUge1xyXG4gICAgY29uc3QgdmFsdWUgPSBIZWxwZXJTZXJ2aWNlLnJlc29sdmVUeXBlKGNvbXBvbmVudC52YWx1ZSwgY29tcG9uZW50LnR5cGUpO1xyXG4gICAgZm9ybVN0YXRlLmRhdGEgPSBIZWxwZXJTZXJ2aWNlLnNldFZhbHVlKGNvbXBvbmVudC5zY2hlbWEsIHZhbHVlLCBmb3JtU3RhdGUuZGF0YSk7XHJcblxyXG4gICAgaWYgKHJlc2V0KSB0aGlzLnJlc2V0Q29tcG9uZW50RGVwZW5kZW50cyhmb3JtU3RhdGUpO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggYW55IGRlcGVuZGVudCBjb21wb25lbnRzXHJcbiAgICBpZiAoY29tcG9uZW50LmRlcGVuZGVudHMpXHJcbiAgICAgIGNvbXBvbmVudC5kZXBlbmRlbnRzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGZvcm1TdGF0ZS5jb21wb25lbnRzW2tleV0gPSB0aGlzLnJlc29sdmVDb21wb25lbnRSdWxlcyhmb3JtU3RhdGUuY29tcG9uZW50c1trZXldLCBmb3JtU3RhdGUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIHZhbHVlIG9uIGFueSBjb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzY2hlbWFcclxuICAgIE9iamVjdC5rZXlzKGZvcm1TdGF0ZS5jb21wb25lbnRzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3QgYyA9IGZvcm1TdGF0ZS5jb21wb25lbnRzW2tleV07XHJcbiAgICAgIGlmIChjLnNjaGVtYSA9PT0gY29tcG9uZW50LnNjaGVtYSlcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYy52YWx1ZSA9IEhlbHBlclNlcnZpY2UuZ2V0VmFsdWUoYy5zY2hlbWEsIGZvcm1TdGF0ZS5kYXRhLCBjLnR5cGUpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm1TdGF0ZTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBJbml0aWFsaXNlcyBGb3JtIFN0YXRlXHJcbiAgKi9cclxuICBwdWJsaWMgaW5pdGlhbGlzZUZvcm1TdGF0ZTxUPihmb3JtOiBGb3JtV2luZG93LCBkYXRhOiBUKTogRm9ybVN0YXRlIHtcclxuICAgIGNvbnN0IHJlYWN0aXZlRm9ybVN0cnVjdHVyZSA9IEhlbHBlclNlcnZpY2UuY3JlYXRlUmVhY3RpdmVGb3JtU3RydWN0dXJlKGZvcm0sIHRydWUsIGRhdGEpO1xyXG4gICAgY29uc3QgZm9ybVN0YXRlID0gPEZvcm1TdGF0ZT57XHJcbiAgICAgIGNvbXBvbmVudHM6IHJlYWN0aXZlRm9ybVN0cnVjdHVyZS5jb21wb25lbnRzLFxyXG4gICAgICBkYXRhOiB7IC4uLnJlYWN0aXZlRm9ybVN0cnVjdHVyZS5kYXRhIH0sXHJcbiAgICAgIGZvcm06IGZvcm0sXHJcbiAgICAgIGZvcm1Db250cm9sczogcmVhY3RpdmVGb3JtU3RydWN0dXJlLmZvcm1Db250cm9scyxcclxuICAgICAgcmVhY3RpdmVGb3JtOiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHJlYWN0aXZlRm9ybVN0cnVjdHVyZS5wYWdlR3JvdXApXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvbmRpdGlvbnMoZm9ybVN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBSZXNldHMgYWxsIGNvbXBvbmVudCBkZXBlbmRlbnRzLCBpdCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBhIHVzZXIgbW9kaWZpZWQgYSBxdWVzdGlvbiBpbiB0aGUgZm9ybXFsIGVkaXRvclxyXG4gICovXHJcbiAgcHJpdmF0ZSByZXNldENvbXBvbmVudERlcGVuZGVudHMoZm9ybVN0YXRlOiBGb3JtU3RhdGUpOiB2b2lkIHtcclxuICAgIGlmIChmb3JtU3RhdGUuY29tcG9uZW50cykge1xyXG4gICAgICBPYmplY3Qua2V5cyhmb3JtU3RhdGUuY29tcG9uZW50cykuZm9yRWFjaCgoY29tcG9uZW50S2V5KSA9PiBkZWxldGUgZm9ybVN0YXRlLmNvbXBvbmVudHNbY29tcG9uZW50S2V5XS5kZXBlbmRlbnRzKTtcclxuICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlLmNvbXBvbmVudHMpLmZvckVhY2goKGNvbXBvbmVudEtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGZvcm1TdGF0ZS5jb21wb25lbnRzW2NvbXBvbmVudEtleV07XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudC5ydWxlcylcclxuICAgICAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudC5ydWxlcykuZm9yRWFjaCgocnVsZUtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBydWxlID0gY29tcG9uZW50LnJ1bGVzW3J1bGVLZXldO1xyXG4gICAgICAgICAgICB0aGlzLnJ1bGVMb2dpYy5yZXNldERlcGVuZGFuY2llcyhmb3JtU3RhdGUsIHJ1bGUuY29uZGl0aW9uLCBjb21wb25lbnQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBPYmplY3Qua2V5cyhmb3JtU3RhdGUuY29tcG9uZW50cykuZm9yRWFjaChcclxuICAgICAgICAoY29tcG9uZW50S2V5KSA9PlxyXG4gICAgICAgICAgKGZvcm1TdGF0ZS5jb21wb25lbnRzW2NvbXBvbmVudEtleV0gPSB0aGlzLnJlc29sdmVDb21wb25lbnRSdWxlcyhcclxuICAgICAgICAgICAgZm9ybVN0YXRlLmNvbXBvbmVudHNbY29tcG9uZW50S2V5XSxcclxuICAgICAgICAgICAgZm9ybVN0YXRlXHJcbiAgICAgICAgICApKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhPFQ+KHF1ZXJ5OiBGb3JtRGF0YVNvdXJjZSwgaWRzOiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxUIHwge30+IHtcclxuICAgIHJldHVybiB0aGlzLmluamVjdGVkU2VydmljZS5nZXREYXRhKHF1ZXJ5LCBpZHMpLnBpcGUoXHJcbiAgICAgIG1hcCgoZGF0YTogVCkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhKSByZXR1cm4gZGF0YTtcclxuICAgICAgICBlbHNlIHJldHVybiB7fTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1zPFQ+KCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWRTZXJ2aWNlLmdldEZvcm1zKCkucGlwZShcclxuICAgICAgbWFwKChkYXRhOiBUKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtKG5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWRTZXJ2aWNlLmdldEZvcm0obmFtZSkucGlwZShcclxuICAgICAgbWFwKChkYXRhOiBGb3JtV2luZG93KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIFJlc29sdmUgYWxsIHJ1bGVzIGZvciBhbnkgZ2l2ZW4gY29tcG9uZW50XHJcbiAgKi9cclxuICBwcml2YXRlIHJlc29sdmVDb21wb25lbnRSdWxlczxUPihjb21wb25lbnQ6IEZvcm1Db21wb25lbnQ8VD4sIGZvcm1TdGF0ZTogRm9ybVN0YXRlKTogRm9ybUNvbXBvbmVudDxUPiB7XHJcbiAgICBpZiAoY29tcG9uZW50LnJ1bGVzKSB7XHJcbiAgICAgIGxldCByZXNldFZhbGlkYXRvciA9IGZhbHNlO1xyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnQucnVsZXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29tcG9uZW50LnJ1bGVzW2tleV07XHJcbiAgICAgICAgaWYgKHByb3BlcnR5LmNvbmRpdGlvbikge1xyXG4gICAgICAgICAgcmVzZXRWYWxpZGF0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgY29uc3QgZXZhbHVhdGVkVmFsdWUgPSB0aGlzLnJ1bGVMb2dpYy5ldmFsdWF0ZShmb3JtU3RhdGUuZGF0YSwgcHJvcGVydHkuY29uZGl0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAoa2V5ID09PSAndmFsdWUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gSGVscGVyU2VydmljZS5yZXNvbHZlVHlwZShldmFsdWF0ZWRWYWx1ZSwgY29tcG9uZW50LnR5cGUpO1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LnZhbHVlICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IHZhbHVlIGFzIFQ7XHJcbiAgICAgICAgICAgICAgZm9ybVN0YXRlID0gdGhpcy51cGRhdGVDb21wb25lbnQoY29tcG9uZW50LCBmb3JtU3RhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwcm9wZXJ0eS52YWx1ZSA9IGV2YWx1YXRlZFZhbHVlIGFzIGJvb2xlYW47XHJcbiAgICAgICAgfSBlbHNlIGRlbGV0ZSBjb21wb25lbnQucnVsZXNba2V5XTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChyZXNldFZhbGlkYXRvcilcclxuICAgICAgICBmb3JtU3RhdGUuZm9ybUNvbnRyb2xzW2NvbXBvbmVudC5jb21wb25lbnRJZF0gPSBIZWxwZXJTZXJ2aWNlLnNldFZhbGlkYXRvcnMoXHJcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlc29sdmVyU2VydmljZSxcclxuICAgICAgICAgIGNvbXBvbmVudCxcclxuICAgICAgICAgIGZvcm1TdGF0ZS5mb3JtQ29udHJvbHNbY29tcG9uZW50LmNvbXBvbmVudElkXVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29tcG9uZW50O1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIFJlc29sdmVzIGFsbCBjb25kaXRpb25zIGluIGVhY2ggY29tcG9uZW50LCB1c2VkIHdoZW4gaW5pdGlhbGlzaW5nIHRoZSBmb3JtXHJcbiAgKi9cclxuICBwdWJsaWMgcmVzb2x2ZUNvbmRpdGlvbnMoZm9ybVN0YXRlOiBGb3JtU3RhdGUpOiBGb3JtU3RhdGUge1xyXG4gICAgaWYgKGZvcm1TdGF0ZS5jb21wb25lbnRzKSB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBmb3JtU3RhdGUuY29tcG9uZW50cztcclxuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaChcclxuICAgICAgICAoY29tcG9uZW50S2V5KSA9PiAoY29tcG9uZW50c1tjb21wb25lbnRLZXldID0gdGhpcy5yZXNvbHZlQ29tcG9uZW50UnVsZXMoY29tcG9uZW50c1tjb21wb25lbnRLZXldLCBmb3JtU3RhdGUpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1TdGF0ZTtcclxuICB9XHJcbn1cclxuIl19