@formql/core
Version:
FormQL - A framework for building dynamic forms
293 lines • 42.6 kB
JavaScript
var HelperService_1;
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import * as i0 from "@angular/core";
let HelperService = HelperService_1 = class HelperService {
static evaluateCondition(condition, data) {
'use strict';
let response = { value: false, error: null };
if (condition && condition.trim() !== '' && condition !== 'false') {
if (condition === 'true') {
response.value = true;
return response;
}
if (!data)
return response;
response = Object.assign({}, this.evaluate(condition, data));
if (response.value !== true)
response.value = false;
}
return response;
}
static evaluateValue(path, data) {
'use strict';
let response = { value: null, error: null };
if (!data)
return response;
response = Object.assign({}, this.evaluate(path, data));
if (Number.isNaN(response.value) || response.value === Infinity)
response.value = null;
else
response.value = this.deepCopy(response.value);
return response;
}
static evaluate(path, data) {
'use strict';
const response = { value: null, error: null };
const props = Object.keys(data);
const params = [];
for (let i = 0; i < props.length; i++)
params.push(data[props[i]]);
params.push(path);
props.push('path');
const expression = `
'use strict'
let window = undefined;
let document = undefined;
let alert = undefined;
let a = undefined;
return ${path};
`;
props.push(expression);
try {
const evalFunc = new Function(...props);
response.value = evalFunc(...params);
}
catch (err) {
response.error = err;
}
return response;
}
static setValue(schema, value, data) {
if (value === undefined)
value = null;
if (schema) {
if (!data)
data = {};
let key = schema;
if (schema.indexOf('.') !== -1) {
const arr = schema.split('.');
let item = data;
for (let i = 0; i <= arr.length - 1; i++) {
key = arr[i];
if (!item[key])
item[key] = {};
if (i !== arr.length - 1)
item = item[key];
}
item[key] = value;
}
else
data[key] = value;
}
return data;
}
static getValue(schema, data, type) {
if (!schema || !data || (data && Object.keys(data).length === 0 && data.constructor === Object))
return;
try {
const evalFunc = new Function('data', `return data.${schema};`);
return HelperService_1.resolveType(evalFunc(data), type);
}
catch (err) {
return null;
}
}
static setValidators(componentResolverService, component, control) {
const componentRef = componentResolverService.resolveComponent(component.componentName);
if (!componentRef)
return control;
const type = componentRef.componentType;
if (type && (!type['validators'] || (type['validators'] && type['validators'].length === 0)))
return control;
const validators = [];
const rules = component.rules;
if (rules != null) {
const FormValidators = type['validators'];
Object.keys(rules).forEach((key) => {
const item = rules[key];
if (item.value && item.key !== 'readonly' && item.key !== 'hidden' && item.key !== 'value') {
const validator = FormValidators.find((x) => x.key === item.key);
if (validator && validator.validator)
validators.push(validator.validator);
}
else if (item.value && item.key === 'readonly' && control.enabled)
control.disable();
});
if (control.disabled &&
(!rules || (rules && !rules.readonly) || (rules && rules.readonly && !rules.readonly.value)))
control.enable();
}
if (validators.length > 0)
control.setValidators(validators);
return control;
}
static createReactiveFormStructure(form, initialiseData = true, data = null) {
const formControls = {};
const components = {};
const pageGroup = new FormGroup({});
form.pages.forEach((page) => {
const sectionGroup = {};
if (page.sections != null)
page.sections.forEach((section) => {
const componentGroup = {};
if (section.components != null)
section.components.forEach((component) => {
components[component.componentId] = component;
const singleComponentGroup = new FormControl();
formControls[component.componentId] = singleComponentGroup;
componentGroup[component.componentId] = singleComponentGroup;
if (initialiseData) {
if (!data)
data = {};
data = HelperService_1.instantiateData(data, component.schema);
try {
const value = this.getValue(component.schema, data, component.type);
if (value) {
formControls[component.componentId].setValue(value);
component.value = value;
}
}
catch (err) {
throw err;
}
}
});
sectionGroup[section.sectionId] = new FormGroup(componentGroup);
});
pageGroup[page.pageId] = new FormGroup(sectionGroup);
});
return { pageGroup: pageGroup, formControls: formControls, components: components, data: data };
}
static instantiateData(data, schema) {
if (schema && schema.indexOf('.') !== -1) {
const arr = schema.split('.');
let item = data;
let key = '';
for (let i = 0; i <= arr.length - 2; i++) {
key = arr[i];
if (!item[key])
item[key] = {};
if (i !== arr.length - 2)
item = item[key];
}
}
return data;
}
static deepCopy(oldObj, ignoreProperty = null) {
let newObj = oldObj;
if (oldObj && typeof oldObj === 'object') {
newObj = Object.prototype.toString.call(oldObj) === '[object Array]' ? [] : {};
for (const i in oldObj)
if (!ignoreProperty || (ignoreProperty && !ignoreProperty.find((p) => p === i)))
newObj[i] = this.deepCopy(oldObj[i]);
}
return newObj;
}
static propertyCopy(source, target, ignoreProperties = null) {
if (source && typeof source === 'object')
for (const i in source)
if (!ignoreProperties || (ignoreProperties && !ignoreProperties.find((p) => p === i)))
if (source[i] && typeof source[i] === 'object') {
if (!target[i])
target[i] = {};
target[i] = this.propertyCopy(source[i], target[i]);
}
else
target[i] = source[i];
else
console.log(`propertyCopy function doesn't support primitives`);
return target;
}
static formatForGraphQl(obj) {
const updatedData = this.deepCopy(obj);
if (updatedData['__typename'])
delete updatedData['__typename'];
let dataForQuery = '';
Object.keys(updatedData).forEach((fieldName) => {
if (updatedData[fieldName] == null)
dataForQuery += fieldName + ': null,';
else if (typeof updatedData[fieldName] === 'object')
dataForQuery += this.formatForGraphQl(updatedData[fieldName]);
else if (typeof updatedData[fieldName] === 'number' || typeof updatedData[fieldName] === 'boolean')
dataForQuery += fieldName + `:${updatedData[fieldName]},`;
else
dataForQuery += fieldName + `:\"${updatedData[fieldName]},`;
});
dataForQuery = `{${dataForQuery.slice(0, -1)}}`;
return dataForQuery;
}
static formatError(error) {
if (!error)
return;
if (error.error && error.error.message)
error.message = error.error.message;
return error;
}
static resolveType(value, type) {
if (value === null || value === undefined || value === '')
return null;
else if (Number.isNaN(value))
return 0;
switch (type) {
case 'number':
if (typeof value === 'string')
value = value.replace(/[^\d\.]/g, '');
return Number(value);
default:
return value;
}
}
static maskToArray(mask) {
const result = [];
if (mask) {
const maskTrimmed = mask.trim().substring(1).slice(0, -1).replace('\\\\', '\\');
const arry = maskTrimmed.split(',');
arry.forEach((item) => {
result.push(item.trim().replace(/\"/g, '').replace(/\'/g, ''));
});
}
return result;
}
static updateTemplates(form) {
form.pages.forEach((page) => {
page.template.reRender = false;
page.template = HelperService_1.deepCopy(page.template);
page.sections.forEach((section) => {
section.template.reRender = false;
section.template = HelperService_1.deepCopy(section.template);
});
});
return form;
}
static resetValidators(components, formControls, componentResolverService) {
if (components && Object.keys(components).length > 0)
Object.keys(components).forEach((key) => {
const component = components[key];
if (component) {
let componentControl = formControls[component.componentId];
if (componentControl)
componentControl = HelperService_1.setValidators(componentResolverService, component, componentControl);
}
});
return formControls;
}
static validateForm(formGroup) {
Object.keys(formGroup.controls).forEach((field) => {
const control = formGroup.get(field);
if (control instanceof FormControl)
control.markAsTouched({ onlySelf: true });
else if (control instanceof FormGroup)
this.validateForm(control);
});
}
};
HelperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function HelperService_Factory() { return new HelperService(); }, token: HelperService, providedIn: "root" });
HelperService = HelperService_1 = __decorate([
Injectable({
providedIn: 'root'
})
], HelperService);
export { HelperService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZm9ybXFsL2NvcmUvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBVXhELElBQWEsYUFBYSxxQkFBMUIsTUFBYSxhQUFhO0lBQ2pCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLElBQVM7UUFDMUQsWUFBWSxDQUFDO1FBQ2IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFM0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ2pFLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtnQkFDeEIsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBRUQsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFFM0IsUUFBUSxxQkFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBRSxDQUFDO1lBRWpELElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJO2dCQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBWSxFQUFFLElBQVM7UUFDakQsWUFBWSxDQUFDO1FBRWIsSUFBSSxRQUFRLEdBQWlCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUs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WUFBWSxXQUFXO2dCQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDekUsSUFBSSxPQUFPLFlBQVksU0FBUztnQkFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUE7O0FBblRZLGFBQWE7SUFIekIsVUFBVSxDQUFDO1FBQ1YsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQztHQUNXLGFBQWEsQ0FtVHpCO1NBblRZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGVscy9mb3JtLWNvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1FcnJvciwgRm9ybVdpbmRvdywgRm9ybUNvbXBvbmVudHMsIEZvcm1Db250cm9scyB9IGZyb20gJy4uL21vZGVscy9mb3JtLXdpbmRvdy5tb2RlbCc7XHJcbmltcG9ydCB7IEV2YWxSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy90eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybVZhbGlkYXRvciB9IGZyb20gJy4uL21vZGVscy9ydWxlLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi9jb21wb25lbnQtcmVzb2x2ZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIZWxwZXJTZXJ2aWNlIHtcclxuICBwdWJsaWMgc3RhdGljIGV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbjogc3RyaW5nLCBkYXRhOiBhbnkpOiBFdmFsUmVzcG9uc2Uge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG4gICAgbGV0IHJlc3BvbnNlID0gPEV2YWxSZXNwb25zZT57IHZhbHVlOiBmYWxzZSwgZXJyb3I6IG51bGwgfTtcclxuXHJcbiAgICBpZiAoY29uZGl0aW9uICYmIGNvbmRpdGlvbi50cmltKCkgIT09ICcnICYmIGNvbmRpdGlvbiAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBpZiAoY29uZGl0aW9uID09PSAndHJ1ZScpIHtcclxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRhdGEpIHJldHVybiByZXNwb25zZTtcclxuXHJcbiAgICAgIHJlc3BvbnNlID0geyAuLi50aGlzLmV2YWx1YXRlKGNvbmRpdGlvbiwgZGF0YSkgfTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS52YWx1ZSAhPT0gdHJ1ZSkgcmVzcG9uc2UudmFsdWUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZXZhbHVhdGVWYWx1ZShwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSk6IEV2YWxSZXNwb25zZSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0gPEV2YWxSZXNwb25zZT57IHZhbHVlOiBudWxsLCBlcnJvcjogbnVsbCB9O1xyXG5cclxuICAgIGlmICghZGF0YSkgcmV0dXJuIHJlc3BvbnNlO1xyXG5cclxuICAgIHJlc3BvbnNlID0geyAuLi50aGlzLmV2YWx1YXRlKHBhdGgsIGRhdGEpIH07XHJcblxyXG4gICAgaWYgKE51bWJlci5pc05hTihyZXNwb25zZS52YWx1ZSkgfHwgcmVzcG9uc2UudmFsdWUgPT09IEluZmluaXR5KSByZXNwb25zZS52YWx1ZSA9IG51bGw7XHJcbiAgICBlbHNlIHJlc3BvbnNlLnZhbHVlID0gdGhpcy5kZWVwQ29weShyZXNwb25zZS52YWx1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZXZhbHVhdGUocGF0aDogc3RyaW5nLCBkYXRhOiBhbnkpOiBFdmFsUmVzcG9uc2Uge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gPEV2YWxSZXNwb25zZT57IHZhbHVlOiBudWxsLCBlcnJvcjogbnVsbCB9O1xyXG5cclxuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoZGF0YSk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSBwYXJhbXMucHVzaChkYXRhW3Byb3BzW2ldXSk7XHJcblxyXG4gICAgcGFyYW1zLnB1c2gocGF0aCk7XHJcblxyXG4gICAgcHJvcHMucHVzaCgncGF0aCcpO1xyXG5cclxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBgXHJcbiAgICAgICAgICAgICd1c2Ugc3RyaWN0J1xyXG4gICAgICAgICAgICBsZXQgd2luZG93ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCBhbGVydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJldHVybiAke3BhdGh9O1xyXG4gICAgICAgIGA7XHJcblxyXG4gICAgcHJvcHMucHVzaChleHByZXNzaW9uKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBldmFsRnVuYyA9IG5ldyBGdW5jdGlvbiguLi5wcm9wcyk7XHJcbiAgICAgIHJlc3BvbnNlLnZhbHVlID0gZXZhbEZ1bmMoLi4ucGFyYW1zKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICByZXNwb25zZS5lcnJvciA9IGVycjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmFsdWU8VCwgVT4oc2NoZW1hOiBzdHJpbmcsIHZhbHVlOiBULCBkYXRhOiBVKTogVSB7XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICBpZiAoc2NoZW1hKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhKVxyXG4gICAgICAgICAgICBkYXRhID0ge30gYXMgVTtcclxuICAgICAgICBsZXQga2V5ID0gc2NoZW1hO1xyXG4gICAgICAgIGlmIChzY2hlbWEuaW5kZXhPZignLicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBzY2hlbWEuc3BsaXQoJy4nKTtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBkYXRhO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBhcnIubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1ba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW2tleV0gPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gYXJyLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1ba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxufVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldFZhbHVlPFQsIFU+KHNjaGVtYTogc3RyaW5nLCBkYXRhOiBULCB0eXBlOiBzdHJpbmcpOiBVIHtcclxuICAgIGlmICghc2NoZW1hIHx8ICFkYXRhIHx8IChkYXRhICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCAmJiBkYXRhLmNvbnN0cnVjdG9yID09PSBPYmplY3QpKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZXZhbEZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2RhdGEnLCBgcmV0dXJuIGRhdGEuJHtzY2hlbWF9O2ApO1xyXG4gICAgICByZXR1cm4gSGVscGVyU2VydmljZS5yZXNvbHZlVHlwZShldmFsRnVuYyhkYXRhKSwgdHlwZSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFZhbGlkYXRvcnMoXHJcbiAgICBjb21wb25lbnRSZXNvbHZlclNlcnZpY2U6IENvbXBvbmVudFJlc29sdmVyU2VydmljZSxcclxuICAgIGNvbXBvbmVudDogRm9ybUNvbXBvbmVudDxhbnk+LFxyXG4gICAgY29udHJvbDogRm9ybUNvbnRyb2xcclxuICApOiBGb3JtQ29udHJvbCB7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRSZXNvbHZlclNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudChjb21wb25lbnQuY29tcG9uZW50TmFtZSk7XHJcblxyXG4gICAgaWYgKCFjb21wb25lbnRSZWYpIHJldHVybiBjb250cm9sO1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBjb21wb25lbnRSZWYuY29tcG9uZW50VHlwZTtcclxuXHJcbiAgICBpZiAodHlwZSAmJiAoIXR5cGVbJ3ZhbGlkYXRvcnMnXSB8fCAodHlwZVsndmFsaWRhdG9ycyddICYmIHR5cGVbJ3ZhbGlkYXRvcnMnXS5sZW5ndGggPT09IDApKSkgcmV0dXJuIGNvbnRyb2w7XHJcblxyXG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgY29uc3QgcnVsZXMgPSBjb21wb25lbnQucnVsZXM7XHJcbiAgICBpZiAocnVsZXMgIT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBGb3JtVmFsaWRhdG9ycyA9IDxBcnJheTxGb3JtVmFsaWRhdG9yPj50eXBlWyd2YWxpZGF0b3JzJ107XHJcbiAgICAgIE9iamVjdC5rZXlzKHJ1bGVzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtID0gcnVsZXNba2V5XTtcclxuICAgICAgICBpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLmtleSAhPT0gJ3JlYWRvbmx5JyAmJiBpdGVtLmtleSAhPT0gJ2hpZGRlbicgJiYgaXRlbS5rZXkgIT09ICd2YWx1ZScpIHtcclxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IEZvcm1WYWxpZGF0b3JzLmZpbmQoKHgpID0+IHgua2V5ID09PSBpdGVtLmtleSk7XHJcbiAgICAgICAgICBpZiAodmFsaWRhdG9yICYmIHZhbGlkYXRvci52YWxpZGF0b3IpIHZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IudmFsaWRhdG9yKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udmFsdWUgJiYgaXRlbS5rZXkgPT09ICdyZWFkb25seScgJiYgY29udHJvbC5lbmFibGVkKSBjb250cm9sLmRpc2FibGUoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb250cm9sLmRpc2FibGVkICYmXHJcbiAgICAgICAgKCFydWxlcyB8fCAocnVsZXMgJiYgIXJ1bGVzLnJlYWRvbmx5KSB8fCAocnVsZXMgJiYgcnVsZXMucmVhZG9ubHkgJiYgIXJ1bGVzLnJlYWRvbmx5LnZhbHVlKSlcclxuICAgICAgKVxyXG4gICAgICAgIGNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPiAwKSBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcblxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlYWN0aXZlRm9ybVN0cnVjdHVyZTxUPihmb3JtOiBGb3JtV2luZG93LCBpbml0aWFsaXNlRGF0YSA9IHRydWUsIGRhdGE6IFQgPSBudWxsKSB7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbHMgPSB7fSBhcyBGb3JtQ29udHJvbHM7XHJcbiAgICBjb25zdCBjb21wb25lbnRzID0ge30gYXMgRm9ybUNvbXBvbmVudHM7XHJcbiAgICBjb25zdCBwYWdlR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgIGZvcm0ucGFnZXMuZm9yRWFjaCgocGFnZSkgPT4ge1xyXG4gICAgICBjb25zdCBzZWN0aW9uR3JvdXA6IGFueSA9IHt9O1xyXG4gICAgICBpZiAocGFnZS5zZWN0aW9ucyAhPSBudWxsKVxyXG4gICAgICAgIHBhZ2Uuc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50R3JvdXA6IGFueSA9IHt9O1xyXG4gICAgICAgICAgaWYgKHNlY3Rpb24uY29tcG9uZW50cyAhPSBudWxsKVxyXG4gICAgICAgICAgICBzZWN0aW9uLmNvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnQuY29tcG9uZW50SWRdID0gY29tcG9uZW50O1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNpbmdsZUNvbXBvbmVudEdyb3VwID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2NvbXBvbmVudC5jb21wb25lbnRJZF0gPSBzaW5nbGVDb21wb25lbnRHcm91cDtcclxuICAgICAgICAgICAgICBjb21wb25lbnRHcm91cFtjb21wb25lbnQuY29tcG9uZW50SWRdID0gc2luZ2xlQ29tcG9uZW50R3JvdXA7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChpbml0aWFsaXNlRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBkYXRhID0ge30gYXMgVDtcclxuXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gSGVscGVyU2VydmljZS5pbnN0YW50aWF0ZURhdGEoZGF0YSwgY29tcG9uZW50LnNjaGVtYSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoY29tcG9uZW50LnNjaGVtYSwgZGF0YSwgY29tcG9uZW50LnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbHNbY29tcG9uZW50LmNvbXBvbmVudElkXS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIHNlY3Rpb25Hcm91cFtzZWN0aW9uLnNlY3Rpb25JZF0gPSBuZXcgRm9ybUdyb3VwKGNvbXBvbmVudEdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgcGFnZUdyb3VwW3BhZ2UucGFnZUlkXSA9IG5ldyBGb3JtR3JvdXAoc2VjdGlvbkdyb3VwKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgcGFnZUdyb3VwOiBwYWdlR3JvdXAsIGZvcm1Db250cm9sczogZm9ybUNvbnRyb2xzLCBjb21wb25lbnRzOiBjb21wb25lbnRzLCBkYXRhOiBkYXRhIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGluc3RhbnRpYXRlRGF0YTxUPihkYXRhOiBULCBzY2hlbWE6IHN0cmluZyk6IFQge1xyXG4gICAgaWYgKHNjaGVtYSAmJiBzY2hlbWEuaW5kZXhPZignLicpICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBhcnIgPSBzY2hlbWEuc3BsaXQoJy4nKTtcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhO1xyXG4gICAgICBsZXQga2V5ID0gJyc7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGFyci5sZW5ndGggLSAyOyBpKyspIHtcclxuICAgICAgICBrZXkgPSBhcnJbaV07XHJcbiAgICAgICAgaWYgKCFpdGVtW2tleV0pIGl0ZW1ba2V5XSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoaSAhPT0gYXJyLmxlbmd0aCAtIDIpIGl0ZW0gPSBpdGVtW2tleV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBkZWVwQ29weShvbGRPYmo6IGFueSwgaWdub3JlUHJvcGVydHk6IEFycmF5PHN0cmluZz4gPSBudWxsKSB7XHJcbiAgICBsZXQgbmV3T2JqID0gb2xkT2JqO1xyXG4gICAgaWYgKG9sZE9iaiAmJiB0eXBlb2Ygb2xkT2JqID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBuZXdPYmogPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2xkT2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJyA/IFtdIDoge307XHJcbiAgICAgIGZvciAoY29uc3QgaSBpbiBvbGRPYmopXHJcbiAgICAgICAgaWYgKCFpZ25vcmVQcm9wZXJ0eSB8fCAoaWdub3JlUHJvcGVydHkgJiYgIWlnbm9yZVByb3BlcnR5LmZpbmQoKHApID0+IHAgPT09IGkpKSlcclxuICAgICAgICAgIG5ld09ialtpXSA9IHRoaXMuZGVlcENvcHkob2xkT2JqW2ldKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdPYmo7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHByb3BlcnR5Q29weShzb3VyY2U6IGFueSwgdGFyZ2V0OiBhbnksIGlnbm9yZVByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsKSB7XHJcbiAgICBpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKVxyXG4gICAgICBmb3IgKGNvbnN0IGkgaW4gc291cmNlKVxyXG4gICAgICAgIGlmICghaWdub3JlUHJvcGVydGllcyB8fCAoaWdub3JlUHJvcGVydGllcyAmJiAhaWdub3JlUHJvcGVydGllcy5maW5kKChwKSA9PiBwID09PSBpKSkpXHJcbiAgICAgICAgICBpZiAoc291cmNlW2ldICYmIHR5cGVvZiBzb3VyY2VbaV0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0W2ldKSB0YXJnZXRbaV0gPSB7fTtcclxuICAgICAgICAgICAgdGFyZ2V0W2ldID0gdGhpcy5wcm9wZXJ0eUNvcHkoc291cmNlW2ldLCB0YXJnZXRbaV0pO1xyXG4gICAgICAgICAgfSBlbHNlIHRhcmdldFtpXSA9IHNvdXJjZVtpXTtcclxuICAgICAgICBlbHNlIGNvbnNvbGUubG9nKGBwcm9wZXJ0eUNvcHkgZnVuY3Rpb24gZG9lc24ndCBzdXBwb3J0IHByaW1pdGl2ZXNgKTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBmb3JtYXRGb3JHcmFwaFFsKG9iajogYW55KSB7XHJcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMuZGVlcENvcHkob2JqKTtcclxuXHJcbiAgICBpZiAodXBkYXRlZERhdGFbJ19fdHlwZW5hbWUnXSkgZGVsZXRlIHVwZGF0ZWREYXRhWydfX3R5cGVuYW1lJ107XHJcblxyXG4gICAgbGV0IGRhdGFGb3JRdWVyeSA9ICcnO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHVwZGF0ZWREYXRhKS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcclxuICAgICAgaWYgKHVwZGF0ZWREYXRhW2ZpZWxkTmFtZV0gPT0gbnVsbCkgZGF0YUZvclF1ZXJ5ICs9IGZpZWxkTmFtZSArICc6IG51bGwsJztcclxuICAgICAgZWxzZSBpZiAodHlwZW9mIHVwZGF0ZWREYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnKVxyXG4gICAgICAgIGRhdGFGb3JRdWVyeSArPSB0aGlzLmZvcm1hdEZvckdyYXBoUWwodXBkYXRlZERhdGFbZmllbGROYW1lXSk7XHJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB1cGRhdGVkRGF0YVtmaWVsZE5hbWVdID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdXBkYXRlZERhdGFbZmllbGROYW1lXSA9PT0gJ2Jvb2xlYW4nKVxyXG4gICAgICAgIGRhdGFGb3JRdWVyeSArPSBmaWVsZE5hbWUgKyBgOiR7dXBkYXRlZERhdGFbZmllbGROYW1lXX0sYDtcclxuICAgICAgZWxzZSBkYXRhRm9yUXVlcnkgKz0gZmllbGROYW1lICsgYDpcXFwiJHt1cGRhdGVkRGF0YVtmaWVsZE5hbWVdfSxgO1xyXG4gICAgfSk7XHJcbiAgICBkYXRhRm9yUXVlcnkgPSBgeyR7ZGF0YUZvclF1ZXJ5LnNsaWNlKDAsIC0xKX19YDtcclxuICAgIHJldHVybiBkYXRhRm9yUXVlcnk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGZvcm1hdEVycm9yKGVycm9yOiBGb3JtRXJyb3IpIHtcclxuICAgIGlmICghZXJyb3IpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3IubWVzc2FnZSkgZXJyb3IubWVzc2FnZSA9IGVycm9yLmVycm9yLm1lc3NhZ2U7XHJcblxyXG4gICAgcmV0dXJuIGVycm9yO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZXNvbHZlVHlwZSh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7XHJcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSByZXR1cm4gMDtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZFxcLl0vZywgJycpO1xyXG5cclxuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBtYXNrVG9BcnJheShtYXNrOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgaWYgKG1hc2spIHtcclxuICAgICAgY29uc3QgbWFza1RyaW1tZWQgPSBtYXNrLnRyaW0oKS5zdWJzdHJpbmcoMSkuc2xpY2UoMCwgLTEpLnJlcGxhY2UoJ1xcXFxcXFxcJywgJ1xcXFwnKTtcclxuICAgICAgY29uc3QgYXJyeSA9IG1hc2tUcmltbWVkLnNwbGl0KCcsJyk7XHJcbiAgICAgIGFycnkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpLnJlcGxhY2UoL1xcJy9nLCAnJykpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVRlbXBsYXRlcyhmb3JtOiBGb3JtV2luZG93KTogRm9ybVdpbmRvdyB7XHJcbiAgICBmb3JtLnBhZ2VzLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgcGFnZS50ZW1wbGF0ZS5yZVJlbmRlciA9IGZhbHNlO1xyXG4gICAgICBwYWdlLnRlbXBsYXRlID0gSGVscGVyU2VydmljZS5kZWVwQ29weShwYWdlLnRlbXBsYXRlKTtcclxuICAgICAgcGFnZS5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgc2VjdGlvbi50ZW1wbGF0ZS5yZVJlbmRlciA9IGZhbHNlO1xyXG4gICAgICAgIHNlY3Rpb24udGVtcGxhdGUgPSBIZWxwZXJTZXJ2aWNlLmRlZXBDb3B5KHNlY3Rpb24udGVtcGxhdGUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlc2V0VmFsaWRhdG9ycyhcclxuICAgIGNvbXBvbmVudHM6IEZvcm1Db21wb25lbnRzLFxyXG4gICAgZm9ybUNvbnRyb2xzOiBGb3JtQ29udHJvbHMsXHJcbiAgICBjb21wb25lbnRSZXNvbHZlclNlcnZpY2U6IENvbXBvbmVudFJlc29sdmVyU2VydmljZVxyXG4gICk6IEZvcm1Db250cm9scyB7XHJcbiAgICBpZiAoY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwKVxyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRzW2tleV07XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICAgICAgbGV0IGNvbXBvbmVudENvbnRyb2wgPSBmb3JtQ29udHJvbHNbY29tcG9uZW50LmNvbXBvbmVudElkXTtcclxuICAgICAgICAgIGlmIChjb21wb25lbnRDb250cm9sKVxyXG4gICAgICAgICAgICBjb21wb25lbnRDb250cm9sID0gSGVscGVyU2VydmljZS5zZXRWYWxpZGF0b3JzKGNvbXBvbmVudFJlc29sdmVyU2VydmljZSwgY29tcG9uZW50LCBjb21wb25lbnRDb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm1Db250cm9scztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVGb3JtKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkKTtcclxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XHJcbiAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHRoaXMudmFsaWRhdGVGb3JtKGNvbnRyb2wpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==