@formql/core
Version:
FormQL - A framework for building dynamic forms
196 lines • 29.7 kB
JavaScript
import { __assign, __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";
var FormService = /** @class */ (function () {
function FormService(srv, componentResolverService, formBuilder) {
this.componentResolverService = componentResolverService;
this.formBuilder = formBuilder;
this.ruleLogic = new RuleLogic();
this.injectedService = srv;
}
FormService.prototype.getFormAndData = function (formName, ids) {
var _this = this;
if (ids)
return this.injectedService.getForm(formName).pipe(map(function (response) { return response; }), concatMap(function (model) {
return _this.injectedService.getData(model.dataSource, ids).pipe(map(function (data) { return _this.initialiseFormState(model, data); }));
}));
else
return this.injectedService.getForm(formName).pipe(map(function (model) { return _this.initialiseFormState(model, null); }));
};
/*
Invokes the form save in the injected service (see constructor for service)
*/
FormService.prototype.saveForm = function (name, form) {
// remove all transactional data
var updateForm = HelperService.deepCopy(form);
updateForm.pages.forEach(function (page) {
page.sections.forEach(function (section) {
section.components.forEach(function (component) {
Object.keys(component)
.filter(function (key) { return component[key] === null; })
.forEach(function (key) { return 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(function (p) {
delete component.rules[p].value;
});
});
});
});
return this.injectedService.saveForm(name, updateForm).pipe(map(function (response) {
return response;
}));
};
/*
Invokes the data save in the injected service (see constructor for service)
*/
FormService.prototype.saveData = function (dataSource, ids, data) {
return this.injectedService.saveData(dataSource, ids, data).pipe(map(function (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
*/
FormService.prototype.updateComponent = function (component, formState, reset) {
var _this = this;
if (reset === void 0) { reset = false; }
var 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(function (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(function (key) {
var 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
*/
FormService.prototype.initialiseFormState = function (form, data) {
var reactiveFormStructure = HelperService.createReactiveFormStructure(form, true, data);
var formState = {
components: reactiveFormStructure.components,
data: __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
*/
FormService.prototype.resetComponentDependents = function (formState) {
var _this = this;
if (formState.components) {
Object.keys(formState.components).forEach(function (componentKey) { return delete formState.components[componentKey].dependents; });
Object.keys(formState.components).forEach(function (componentKey) {
var component = formState.components[componentKey];
if (component.rules)
Object.keys(component.rules).forEach(function (ruleKey) {
var rule = component.rules[ruleKey];
_this.ruleLogic.resetDependancies(formState, rule.condition, component);
});
});
Object.keys(formState.components).forEach(function (componentKey) {
return (formState.components[componentKey] = _this.resolveComponentRules(formState.components[componentKey], formState));
});
}
};
FormService.prototype.getData = function (query, ids) {
return this.injectedService.getData(query, ids).pipe(map(function (data) {
if (data)
return data;
else
return {};
}));
};
FormService.prototype.getForms = function () {
return this.injectedService.getForms().pipe(map(function (data) {
return data;
}));
};
FormService.prototype.getForm = function (name) {
return this.injectedService.getForm(name).pipe(map(function (data) {
return data;
}));
};
/*
Resolve all rules for any given component
*/
FormService.prototype.resolveComponentRules = function (component, formState) {
var _this = this;
if (component.rules) {
var resetValidator_1 = false;
Object.keys(component.rules).forEach(function (key) {
var property = component.rules[key];
if (property.condition) {
resetValidator_1 = true;
var evaluatedValue = _this.ruleLogic.evaluate(formState.data, property.condition);
if (key === 'value') {
var 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_1)
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
*/
FormService.prototype.resolveConditions = function (formState) {
var _this = this;
if (formState.components) {
var components_1 = formState.components;
Object.keys(components_1).forEach(function (componentKey) { return (components_1[componentKey] = _this.resolveComponentRules(components_1[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);
return FormService;
}());
export { FormService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZvcm1xbC9jb3JlLyIsInNvdXJjZXMiOlsic2VydmljZXMvZm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1oRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBS2pEO0lBS0UscUJBQzJCLEdBQUcsRUFDcEIsd0JBQWtELEVBQ2xELFdBQXdCO1FBRHhCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFMMUIsY0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFPbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUM7SUFDN0IsQ0FBQztJQUVNLG9DQUFjLEdBQXJCLFVBQXNCLFFBQWdCLEVBQUUsR0FBa0I7UUFBMUQsaUJBU0M7UUFSQyxJQUFJLEdBQUc7WUFDTCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDaEQsR0FBRyxDQUFDLFVBQUMsUUFBUSxJQUFLLE9BQVksUUFBUSxFQUFwQixDQUFvQixDQUFDLEVBQ3ZDLFNBQVMsQ0FBQyxVQUFDLEtBQUs7Z0JBQ2QsT0FBQSxLQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FB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QXlCLFNBQW9CO1FBQTdDLGlCQVFDO1FBUEMsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFO1lBQ3hCLElBQU0sWUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFVLENBQUMsQ0FBQyxPQUFPLENBQzdCLFVBQUMsWUFBWSxJQUFLLE9BQUEsQ0FBQyxZQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUE1RixDQUE0RixDQUMvRyxDQUFDO1NBQ0g7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOztJQTNNVSxXQUFXO1FBSHZCLFVBQVUsQ0FBQztZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7UUFPRyxXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtpREFDVSx3QkFBd0I7WUFDckMsV0FBVztPQVJ2QixXQUFXLENBNE12QjtzQkE1TkQ7Q0E0TkMsQUE1TUQsSUE0TUM7U0E1TVksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSUZvcm1RTFNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Zvcm1xbC1zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGVscy9mb3JtLWNvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1QYWdlIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tcGFnZS5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1TZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tc2VjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1EYXRhU291cmNlLCBGb3JtU3RhdGUsIEZvcm1XaW5kb3cgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS13aW5kb3cubW9kZWwnO1xyXG5pbXBvcnQgeyBSdWxlTG9naWMgfSBmcm9tICcuLi92YWxpZGF0b3JzL3J1bGUtbG9naWMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuL2NvbXBvbmVudC1yZXNvbHZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJy4vaGVscGVyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgaW5qZWN0ZWRTZXJ2aWNlOiBJRm9ybVFMU2VydmljZTtcclxuXHJcbiAgcHJpdmF0ZSBydWxlTG9naWMgPSBuZXcgUnVsZUxvZ2ljKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnRm9ybVFMU2VydmljZScpIHNydixcclxuICAgIHByaXZhdGUgY29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlOiBDb21wb25lbnRSZXNvbHZlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlclxyXG4gICkge1xyXG4gICAgdGhpcy5pbmplY3RlZFNlcnZpY2UgPSBzcnY7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybUFuZERhdGEoZm9ybU5hbWU6IHN0cmluZywgaWRzOiBBcnJheTxzdHJpbmc+KTogT2JzZXJ2YWJsZTxGb3JtU3RhdGU+IHtcclxuICAgIGlmIChpZHMpXHJcbiAgICAgIHJldHVybiB0aGlzLmluamVjdGVkU2VydmljZS5nZXRGb3JtKGZvcm1OYW1lKS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IDxGb3JtV2luZG93PnJlc3BvbnNlKSxcclxuICAgICAgICBjb25jYXRNYXAoKG1vZGVsKSA9PlxyXG4gICAgICAgICAgdGhpcy5pbmplY3RlZFNlcnZpY2UuZ2V0RGF0YShtb2RlbC5kYXRhU291cmNlLCBpZHMpLnBpcGUobWFwKChkYXRhKSA9PiB0aGlzLmluaXRpYWxpc2VGb3JtU3RhdGUobW9kZWwsIGRhdGEpKSlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICBlbHNlIHJldHVybiB0aGlzLmluamVjdGVkU2VydmljZS5nZXRGb3JtKGZvcm1OYW1lKS5waXBlKG1hcCgobW9kZWwpID0+IHRoaXMuaW5pdGlhbGlzZUZvcm1TdGF0ZShtb2RlbCwgbnVsbCkpKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBJbnZva2VzIHRoZSBmb3JtIHNhdmUgaW4gdGhlIGluamVjdGVkIHNlcnZpY2UgKHNlZSBjb25zdHJ1Y3RvciBmb3Igc2VydmljZSlcclxuICAqL1xyXG4gIHB1YmxpYyBzYXZlRm9ybTxULCBVPihuYW1lOiBzdHJpbmcsIGZvcm06IEZvcm1XaW5kb3cpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIC8vIHJlbW92ZSBhbGwgdHJhbnNhY3Rpb25hbCBkYXRhXHJcbiAgICBjb25zdCB1cGRhdGVGb3JtID0gSGVscGVyU2VydmljZS5kZWVwQ29weShmb3JtKTtcclxuICAgIHVwZGF0ZUZvcm0ucGFnZXMuZm9yRWFjaCgocGFnZTogRm9ybVBhZ2UpID0+IHtcclxuICAgICAgcGFnZS5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBGb3JtU2VjdGlvbikgPT4ge1xyXG4gICAgICAgIHNlY3Rpb24uY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6IEZvcm1Db21wb25lbnQ8VT4pID0+IHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudClcclxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBjb21wb25lbnRba2V5XSA9PT0gbnVsbClcclxuICAgICAgICAgICAgLmZvckVhY2goKGtleSkgPT4gZGVsZXRlIGNvbXBvbmVudFtrZXldKTtcclxuICAgICAgICAgIGRlbGV0ZSBjb21wb25lbnQudmFsdWU7XHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnJ1bGVzKVxyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29tcG9uZW50LnJ1bGVzKS5sZW5ndGggPT09IDAgJiYgY29tcG9uZW50LnJ1bGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QpXHJcbiAgICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5ydWxlcztcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudC5ydWxlcykuZm9yRWFjaCgocCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5ydWxlc1twXS52YWx1ZTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5pbmplY3RlZFNlcnZpY2Uuc2F2ZUZvcm0obmFtZSwgdXBkYXRlRm9ybSkucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZTogVCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAgSW52b2tlcyB0aGUgZGF0YSBzYXZlIGluIHRoZSBpbmplY3RlZCBzZXJ2aWNlIChzZWUgY29uc3RydWN0b3IgZm9yIHNlcnZpY2UpXHJcbiAgKi9cclxuICBwdWJsaWMgc2F2ZURhdGE8VD4oZGF0YVNvdXJjZTogRm9ybURhdGFTb3VyY2UsIGlkczogQXJyYXk8c3RyaW5nPiwgZGF0YTogVCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0ZWRTZXJ2aWNlLnNhdmVEYXRhKGRhdGFTb3VyY2UsIGlkcywgZGF0YSkucGlwZShcclxuICAgICAgbWFwKChyZXN1bHQ6IFQpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBVcGRhdGVzIGEgY29tcG9uZW50IHZhbHVlIGFuZCByZWNhbGN1bGF0ZXMgYWxsIGRlcGVuZGVudHNcclxuICAgIElmIHJlc2V0IGlzIHNldCB0byB0cnVlLCBpdCB3aWxsIHJlY2FsY3VsYXRlIGFsbCBkZXBlbmRlbnRzLCB0aGlzIGlzIHdoZW4gYSBydWxlcyBhcyBiZWVuXHJcbiAgICBtb2RpZmllZCBpbiB0aGUgRm9ybVFMIEVkaXRvclxyXG4gICovXHJcbiAgcHVibGljIHVwZGF0ZUNvbXBvbmVudDxUPihjb21wb25lbnQ6IEZvcm1Db21wb25lbnQ8VD4sIGZvcm1TdGF0ZTogRm9ybVN0YXRlLCByZXNldDogYm9vbGVhbiA9IGZhbHNlKTogRm9ybVN0YXRlIHtcclxuICAgIGNvbnN0IHZhbHVlID0gSGVscGVyU2VydmljZS5yZXNvbHZlVHlwZShjb21wb25lbnQudmFsdWUsIGNvbXBvbmVudC50eXBlKTtcclxuICAgIGZvcm1TdGF0ZS5kYXRhID0gSGVscGVyU2VydmljZS5zZXRWYWx1ZShjb21wb25lbnQuc2NoZW1hLCB2YWx1ZSwgZm9ybVN0YXRlLmRhdGEpO1xyXG5cclxuICAgIGlmIChyZXNldCkgdGhpcy5yZXNldENvbXBvbmVudERlcGVuZGVudHMoZm9ybVN0YXRlKTtcclxuXHJcbiAgICAvLyByZWZyZXNoIGFueSBkZXBlbmRlbnQgY29tcG9uZW50c1xyXG4gICAgaWYgKGNvbXBvbmVudC5kZXBlbmRlbnRzKVxyXG4gICAgICBjb21wb25lbnQuZGVwZW5kZW50cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBmb3JtU3RhdGUuY29tcG9uZW50c1trZXldID0gdGhpcy5yZXNvbHZlQ29tcG9uZW50UnVsZXMoZm9ybVN0YXRlLmNvbXBvbmVudHNba2V5XSwgZm9ybVN0YXRlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gc2V0IHRoZSB2YWx1ZSBvbiBhbnkgY29tcG9uZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUgc2NoZW1hXHJcbiAgICBPYmplY3Qua2V5cyhmb3JtU3RhdGUuY29tcG9uZW50cykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGMgPSBmb3JtU3RhdGUuY29tcG9uZW50c1trZXldO1xyXG4gICAgICBpZiAoYy5zY2hlbWEgPT09IGNvbXBvbmVudC5zY2hlbWEpXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGMudmFsdWUgPSBIZWxwZXJTZXJ2aWNlLmdldFZhbHVlKGMuc2NoZW1hLCBmb3JtU3RhdGUuZGF0YSwgYy50eXBlKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtU3RhdGU7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAgSW5pdGlhbGlzZXMgRm9ybSBTdGF0ZVxyXG4gICovXHJcbiAgcHVibGljIGluaXRpYWxpc2VGb3JtU3RhdGU8VD4oZm9ybTogRm9ybVdpbmRvdywgZGF0YTogVCk6IEZvcm1TdGF0ZSB7XHJcbiAgICBjb25zdCByZWFjdGl2ZUZvcm1TdHJ1Y3R1cmUgPSBIZWxwZXJTZXJ2aWNlLmNyZWF0ZVJlYWN0aXZlRm9ybVN0cnVjdHVyZShmb3JtLCB0cnVlLCBkYXRhKTtcclxuICAgIGNvbnN0IGZvcm1TdGF0ZSA9IDxGb3JtU3RhdGU+e1xyXG4gICAgICBjb21wb25lbnRzOiByZWFjdGl2ZUZvcm1TdHJ1Y3R1cmUuY29tcG9uZW50cyxcclxuICAgICAgZGF0YTogeyAuLi5yZWFjdGl2ZUZvcm1TdHJ1Y3R1cmUuZGF0YSB9LFxyXG4gICAgICBmb3JtOiBmb3JtLFxyXG4gICAgICBmb3JtQ29udHJvbHM6IHJlYWN0aXZlRm9ybVN0cnVjdHVyZS5mb3JtQ29udHJvbHMsXHJcbiAgICAgIHJlYWN0aXZlRm9ybTogdGhpcy5mb3JtQnVpbGRlci5ncm91cChyZWFjdGl2ZUZvcm1TdHJ1Y3R1cmUucGFnZUdyb3VwKVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDb25kaXRpb25zKGZvcm1TdGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAgUmVzZXRzIGFsbCBjb21wb25lbnQgZGVwZW5kZW50cywgaXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYSB1c2VyIG1vZGlmaWVkIGEgcXVlc3Rpb24gaW4gdGhlIGZvcm1xbCBlZGl0b3JcclxuICAqL1xyXG4gIHByaXZhdGUgcmVzZXRDb21wb25lbnREZXBlbmRlbnRzKGZvcm1TdGF0ZTogRm9ybVN0YXRlKTogdm9pZCB7XHJcbiAgICBpZiAoZm9ybVN0YXRlLmNvbXBvbmVudHMpIHtcclxuICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlLmNvbXBvbmVudHMpLmZvckVhY2goKGNvbXBvbmVudEtleSkgPT4gZGVsZXRlIGZvcm1TdGF0ZS5jb21wb25lbnRzW2NvbXBvbmVudEtleV0uZGVwZW5kZW50cyk7XHJcbiAgICAgIE9iamVjdC5rZXlzKGZvcm1TdGF0ZS5jb21wb25lbnRzKS5mb3JFYWNoKChjb21wb25lbnRLZXkpID0+IHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBmb3JtU3RhdGUuY29tcG9uZW50c1tjb21wb25lbnRLZXldO1xyXG4gICAgICAgIGlmIChjb21wb25lbnQucnVsZXMpXHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhjb21wb25lbnQucnVsZXMpLmZvckVhY2goKHJ1bGVLZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcnVsZSA9IGNvbXBvbmVudC5ydWxlc1tydWxlS2V5XTtcclxuICAgICAgICAgICAgdGhpcy5ydWxlTG9naWMucmVzZXREZXBlbmRhbmNpZXMoZm9ybVN0YXRlLCBydWxlLmNvbmRpdGlvbiwgY29tcG9uZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlLmNvbXBvbmVudHMpLmZvckVhY2goXHJcbiAgICAgICAgKGNvbXBvbmVudEtleSkgPT5cclxuICAgICAgICAgIChmb3JtU3RhdGUuY29tcG9uZW50c1tjb21wb25lbnRLZXldID0gdGhpcy5yZXNvbHZlQ29tcG9uZW50UnVsZXMoXHJcbiAgICAgICAgICAgIGZvcm1TdGF0ZS5jb21wb25lbnRzW2NvbXBvbmVudEtleV0sXHJcbiAgICAgICAgICAgIGZvcm1TdGF0ZVxyXG4gICAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YTxUPihxdWVyeTogRm9ybURhdGFTb3VyY2UsIGlkczogQXJyYXk8c3RyaW5nPik6IE9ic2VydmFibGU8VCB8IHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmplY3RlZFNlcnZpY2UuZ2V0RGF0YShxdWVyeSwgaWRzKS5waXBlKFxyXG4gICAgICBtYXAoKGRhdGE6IFQpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSkgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgZWxzZSByZXR1cm4ge307XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtczxUPigpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiB0aGlzLmluamVjdGVkU2VydmljZS5nZXRGb3JtcygpLnBpcGUoXHJcbiAgICAgIG1hcCgoZGF0YTogVCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybShuYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmluamVjdGVkU2VydmljZS5nZXRGb3JtKG5hbWUpLnBpcGUoXHJcbiAgICAgIG1hcCgoZGF0YTogRm9ybVdpbmRvdykgPT4ge1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBSZXNvbHZlIGFsbCBydWxlcyBmb3IgYW55IGdpdmVuIGNvbXBvbmVudFxyXG4gICovXHJcbiAgcHJpdmF0ZSByZXNvbHZlQ29tcG9uZW50UnVsZXM8VD4oY29tcG9uZW50OiBGb3JtQ29tcG9uZW50PFQ+LCBmb3JtU3RhdGU6IEZvcm1TdGF0ZSk6IEZvcm1Db21wb25lbnQ8VD4ge1xyXG4gICAgaWYgKGNvbXBvbmVudC5ydWxlcykge1xyXG4gICAgICBsZXQgcmVzZXRWYWxpZGF0b3IgPSBmYWxzZTtcclxuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50LnJ1bGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGNvbXBvbmVudC5ydWxlc1trZXldO1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5jb25kaXRpb24pIHtcclxuICAgICAgICAgIHJlc2V0VmFsaWRhdG9yID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFZhbHVlID0gdGhpcy5ydWxlTG9naWMuZXZhbHVhdGUoZm9ybVN0YXRlLmRhdGEsIHByb3BlcnR5LmNvbmRpdGlvbik7XHJcblxyXG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3ZhbHVlJykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEhlbHBlclNlcnZpY2UucmVzb2x2ZVR5cGUoZXZhbHVhdGVkVmFsdWUsIGNvbXBvbmVudC50eXBlKTtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC52YWx1ZSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSB2YWx1ZSBhcyBUO1xyXG4gICAgICAgICAgICAgIGZvcm1TdGF0ZSA9IHRoaXMudXBkYXRlQ29tcG9uZW50KGNvbXBvbmVudCwgZm9ybVN0YXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcHJvcGVydHkudmFsdWUgPSBldmFsdWF0ZWRWYWx1ZSBhcyBib29sZWFuO1xyXG4gICAgICAgIH0gZWxzZSBkZWxldGUgY29tcG9uZW50LnJ1bGVzW2tleV07XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAocmVzZXRWYWxpZGF0b3IpXHJcbiAgICAgICAgZm9ybVN0YXRlLmZvcm1Db250cm9sc1tjb21wb25lbnQuY29tcG9uZW50SWRdID0gSGVscGVyU2VydmljZS5zZXRWYWxpZGF0b3JzKFxyXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZXNvbHZlclNlcnZpY2UsXHJcbiAgICAgICAgICBjb21wb25lbnQsXHJcbiAgICAgICAgICBmb3JtU3RhdGUuZm9ybUNvbnRyb2xzW2NvbXBvbmVudC5jb21wb25lbnRJZF1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBSZXNvbHZlcyBhbGwgY29uZGl0aW9ucyBpbiBlYWNoIGNvbXBvbmVudCwgdXNlZCB3aGVuIGluaXRpYWxpc2luZyB0aGUgZm9ybVxyXG4gICovXHJcbiAgcHVibGljIHJlc29sdmVDb25kaXRpb25zKGZvcm1TdGF0ZTogRm9ybVN0YXRlKTogRm9ybVN0YXRlIHtcclxuICAgIGlmIChmb3JtU3RhdGUuY29tcG9uZW50cykge1xyXG4gICAgICBjb25zdCBjb21wb25lbnRzID0gZm9ybVN0YXRlLmNvbXBvbmVudHM7XHJcbiAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goXHJcbiAgICAgICAgKGNvbXBvbmVudEtleSkgPT4gKGNvbXBvbmVudHNbY29tcG9uZW50S2V5XSA9IHRoaXMucmVzb2x2ZUNvbXBvbmVudFJ1bGVzKGNvbXBvbmVudHNbY29tcG9uZW50S2V5XSwgZm9ybVN0YXRlKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtU3RhdGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==