@ng-flexy/form
Version:
Flexy components and tools to build Angular 8+ applications
403 lines • 74.4 kB
JavaScript
import { Inject, Injectable, Optional } from '@angular/core';
import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
import { COMPLEX_TYPE_INDEX_MARKER, FlexyFormFieldType } from '../models/layout-json-schema.model';
import { FlexyLayoutJsonMapperService } from '@ng-flexy/layout';
import { cloneDeep, get, has } from 'lodash';
import { FlexyLoggerService } from '@ng-flexy/core';
import { FlexyFormsValidators } from '../validators/validators.utils';
import { FlexyForm } from '../models/form.model';
import { parseFormJson, replaceMarker } from './json-mapper.utils';
import { FLEXY_FORM_VALIDATORS } from '../form-options.token';
import * as i0 from "@angular/core";
import * as i1 from "../form-options.token";
import * as i2 from "@ng-flexy/layout";
import * as i3 from "@angular/forms";
import * as i4 from "@ng-flexy/core";
const INPUTS_READONLY_KEY = 'readonly';
const SCHEMA_CONTROL_NAME_KEY = 'name';
const SCHEMA_GROUP_KEY = 'groupKey';
const SCHEMA_COMPONENT_INPUTS_KEY = 'properties';
const SCHEMA_DEFAULT_KEY = 'default';
const ɵ0 = () => Validators.required, ɵ1 = data => Validators.maxLength(data), ɵ2 = data => Validators.minLength(data), ɵ3 = data => FlexyFormsValidators.minValidator(data), ɵ4 = data => FlexyFormsValidators.maxValidator(data), ɵ5 = () => FlexyFormsValidators.numberValidator, ɵ6 = () => FlexyFormsValidators.integerValidator, ɵ7 = () => FlexyFormsValidators.booleanValidator, ɵ8 = () => FlexyFormsValidators.emailValidator, ɵ9 = () => FlexyFormsValidators.noWhitespaceValidator, ɵ10 = () => FlexyFormsValidators.notEmptyValidator, ɵ11 = data => Validators.pattern(data), ɵ12 = data => FlexyFormsValidators.crossFieldValidator(data), ɵ13 = data => FlexyFormsValidators.crossFieldMinValidator(data), ɵ14 = data => FlexyFormsValidators.crossFieldMaxValidator(data), ɵ15 = data => FlexyFormsValidators.crossFieldAbsoluteMinValidator(data), ɵ16 = data => FlexyFormsValidators.forbiddenValuesValidator(data), ɵ17 = data => FlexyFormsValidators.arrayUniqueFieldsValidator(data), ɵ18 = data => FlexyFormsValidators.minLengthArray(data), ɵ19 = data => FlexyFormsValidators.maxLengthArray(data);
const DEFAULT_VALIDATORS_MAP = {
required: ɵ0,
maxLength: ɵ1,
minLength: ɵ2,
min: ɵ3,
max: ɵ4,
number: ɵ5,
integer: ɵ6,
boolean: ɵ7,
email: ɵ8,
noWhitespace: ɵ9,
notEmpty: ɵ10,
pattern: ɵ11,
crossField: ɵ12,
crossFieldMin: ɵ13,
crossFieldMax: ɵ14,
crossFieldAbsoluteMin: ɵ15,
forbiddenValues: ɵ16,
arrayUniqueFields: ɵ17,
minItems: ɵ18,
maxItems: ɵ19
};
export class FlexyFormJsonMapperService {
constructor(validatorsMap, jsonLayoutMapper, formBuilder, logger) {
this.jsonLayoutMapper = jsonLayoutMapper;
this.formBuilder = formBuilder;
this.logger = logger;
this._validatorsMap = DEFAULT_VALIDATORS_MAP;
if (validatorsMap) {
Object.assign(this._validatorsMap, validatorsMap);
}
}
get supportedValidators() {
return Object.keys(this._validatorsMap);
}
createForm(json, readonlyMode = false, formData) {
this.logger.debug('createForm');
FlexyFormJsonMapperService.controlCounter = 0;
const jsonSchema = parseFormJson(json);
const rootFormGroup = new FormGroup({});
const dynamicSchema = this.map(jsonSchema, readonlyMode, formData, rootFormGroup);
this.logger.debug('countOfControls', FlexyFormJsonMapperService.controlCounter);
return new FlexyForm(rootFormGroup, dynamicSchema, formData);
}
createItemControl(itemsSchema, readonlyMode, value) {
let control;
if (itemsSchema.children) {
control = new FormGroup({});
this.mapItem(itemsSchema, readonlyMode, value, control);
}
else {
control = this.formBuilder.control(value ? value : get(itemsSchema, 'componentInputs.default'), itemsSchema.validators
? this.mapValidators(itemsSchema.validators)
: []);
}
return control;
}
createArrayItemSchema(control, items, itemKeyDef, parentName, readonlyMode, formData, value, index, parentSchema = null) {
const citems = cloneDeep(items);
this.populateComplexTypeIndexMarker([citems], index + 1, value, itemKeyDef);
const isComplex = citems && !!citems.children;
let schema;
if (isComplex) {
const withRootValues = Object.assign({}, value);
const groupSchema = this._jsonLayoutItemMap({}, '' + index, parentSchema);
groupSchema.children = this.map([citems], readonlyMode, withRootValues, control, groupSchema);
schema = groupSchema;
}
else {
schema = this.jsonLayoutMapper.map([citems])[0];
schema.formControl = control;
control.setValue(value);
schema.id = parentSchema.id + ':' + index;
if (!schema.componentInputs) {
schema.componentInputs = {};
}
schema.componentInputs[INPUTS_READONLY_KEY] = readonlyMode;
}
return schema;
}
createGroupItemSchema(control, items, itemKeyDef, parentName, readonlyMode, formData, value, key, parentSchema = null) {
const citems = cloneDeep(items);
this.populateComplexTypeIndexMarker([citems], key, value, itemKeyDef);
const isComplex = citems && !!citems.children;
let schema;
if (isComplex) {
const withRootValues = Object.assign({}, value);
const groupSchema = this.map([citems], readonlyMode, withRootValues, control, null)[0];
schema = groupSchema;
}
else {
schema = this.jsonLayoutMapper.map([citems])[0];
schema.formControl = control;
control.setValue(value);
if (!schema.componentInputs) {
schema.componentInputs = {};
}
schema.componentInputs[INPUTS_READONLY_KEY] = readonlyMode;
schema.formName = citems.name;
}
schema.id = (parentSchema && parentSchema.id ? parentSchema.id + ':' : '') + key;
schema.groupKey = key;
return schema;
}
createSchema(json, readonlyMode = false, formData = {}, parentFormGroup, parentControlGroupName, parentSchema = null) {
const schema = [];
if (json && Array.isArray(json)) {
json.forEach((jsonItem, index) => {
const schemaItem = this.mapItem(jsonItem, readonlyMode, formData, parentFormGroup, parentControlGroupName, parentSchema, '' + index);
let itemParentFormGroup = parentFormGroup;
let itemParentControlGroupName = parentControlGroupName;
if (schemaItem.formControl instanceof FormGroup) {
itemParentFormGroup = schemaItem.formControl;
if ([FlexyFormFieldType.Group, FlexyFormFieldType.Array].includes(jsonItem.type)) {
itemParentControlGroupName = this.controlComplexName(jsonItem, itemParentControlGroupName);
}
}
if (jsonItem.children) {
schemaItem.children = this.createSchema(jsonItem.children, readonlyMode, formData, itemParentFormGroup, itemParentControlGroupName, schemaItem);
}
schema.push(schemaItem);
});
}
return schema;
}
map(json, readonlyMode = false, formData, parentFormGroup, parentSchema = null) {
const dynamicSchema = this.createSchema(json, readonlyMode, formData, parentFormGroup, null, parentSchema);
return dynamicSchema;
}
createControl(config) {
return config instanceof AbstractControl
? config
: config[1]
? this.formBuilder.control(config[0], config[1])
: this.formBuilder.control(config);
}
controlComplexName(jsonItem, parentName) {
return (parentName && jsonItem.name[0] === '.' ? parentName : '') + jsonItem.name;
}
mapItem(jsonItem, readonlyMode = false, formData = {}, parentFormGroup, parentControlGroupName = null, parentSchema = null, schemaId = '') {
const formSchemaItem = this._jsonLayoutItemMap(jsonItem, schemaId, parentSchema);
if (readonlyMode) {
if (!formSchemaItem.componentInputs) {
formSchemaItem.componentInputs = {};
}
formSchemaItem.componentInputs[INPUTS_READONLY_KEY] = readonlyMode;
}
let controlName = '';
if (jsonItem.name &&
jsonItem.type !== FlexyFormFieldType.Group &&
jsonItem.type !== FlexyFormFieldType.Array) {
controlName = jsonItem.name;
this.mapItemSetFieldControl(formSchemaItem, jsonItem, parentControlGroupName, formData);
}
else if (jsonItem.items &&
jsonItem.type === FlexyFormFieldType.Group) {
const groupJsonItem = jsonItem;
controlName = groupJsonItem.name;
this.mapItemSetGroupControl(formSchemaItem, jsonItem, parentControlGroupName, readonlyMode);
const formGroupName = (parentControlGroupName && groupJsonItem.name[0] === '.' ? parentControlGroupName : '') + groupJsonItem.name;
const formGroupData = has(formData, formGroupName) ? get(formData, formGroupName) : void 0;
if (formGroupData) {
jsonItem.children = [];
const isComplex = !!groupJsonItem.items.children;
Object.keys(formGroupData).forEach(key => {
const schemaJson = cloneDeep(groupJsonItem.items);
schemaJson.name = '.' + key;
if (isComplex) {
schemaJson.type = FlexyFormFieldType.Group;
}
schemaJson[SCHEMA_GROUP_KEY] = key;
this.populateComplexTypeIndexMarker([schemaJson], key, formGroupData[key], groupJsonItem.indexDef);
groupJsonItem.children.push(schemaJson);
});
}
}
else if (jsonItem.items &&
jsonItem.type === FlexyFormFieldType.Array) {
const arrayJsonItem = jsonItem;
controlName = arrayJsonItem.name;
this.mapItemSetArrayControl(formSchemaItem, arrayJsonItem, parentControlGroupName, formData, readonlyMode);
}
else {
controlName =
jsonItem.type === FlexyFormFieldType.Group
? jsonItem.name
: formSchemaItem.id
? 'g-' + formSchemaItem.id
: 'd-' + Date.now();
formSchemaItem.groupKey = jsonItem.groupKey;
// TODO to think: form control is required also for non FlexyFormFieldLayoutSchema
formSchemaItem.formControl = new FormGroup({}, this.mapValidators(jsonItem.validators));
}
const control = formSchemaItem.formControl;
if (control) {
parentFormGroup.addControl(this.unifyName(controlName, parentControlGroupName ? this.unifyName(parentControlGroupName) : ''), control);
}
return formSchemaItem;
}
_jsonLayoutItemMap(jsonItem, schemaId, parentSchema) {
const schema = this.jsonLayoutMapper.mapItem(jsonItem, schemaId, parentSchema);
// const SCHEMA_GROUP_KEY = 'groupKey';
const SCHEMA_IF = 'if';
const SCHEMA_CALC = 'calc';
// TODO tothink is problem with populate form group controls from external domain
[SCHEMA_GROUP_KEY, SCHEMA_IF, SCHEMA_CALC].forEach(key => {
if (jsonItem[key]) {
schema[key] = jsonItem[key];
}
});
return schema;
}
mapItemSetArrayControl(formSchemaItem, jsonItem, parentControlGroupName, formData, readonlyMode) {
let formName = (parentControlGroupName && jsonItem.name[0] === '.' ? parentControlGroupName : '') + jsonItem.name;
// its possible in array in group
if (formName.endsWith('.')) {
formName = formName.slice(0, -1);
}
const val = has(formData, formName) ? get(formData, formName) : void 0;
const formControl = this.createArrayControl(jsonItem, readonlyMode, val);
formSchemaItem.formControl = formControl;
formSchemaItem.formName = formName;
if (jsonItem.items) {
formSchemaItem.items = this.createArrayItems(jsonItem.items, jsonItem.indexDef, formControl, formName, readonlyMode, val, formData, formSchemaItem);
formSchemaItem.componentInputs = Object.assign(Object.assign({}, formSchemaItem.componentInputs), {
jsonSchema: jsonItem,
readonly: readonlyMode
});
}
}
mapItemSetGroupControl(formSchemaItem, jsonItem, parentControlGroupName, readonlyMode) {
const formGroupName = (parentControlGroupName && jsonItem.name[0] === '.' ? parentControlGroupName : '') + jsonItem.name;
formSchemaItem.formControl = new FormGroup({});
if (jsonItem.items) {
formSchemaItem.componentInputs = Object.assign(Object.assign({}, formSchemaItem.componentInputs), {
jsonSchema: jsonItem,
parentGroupName: formGroupName,
readonly: readonlyMode
});
}
}
mapItemSetFieldControl(formSchemaItem, jsonItem, parentControlGroupName, formData) {
FlexyFormJsonMapperService.controlCounter++;
const formName = (parentControlGroupName && jsonItem.name[0] === '.' ? parentControlGroupName : '') + jsonItem.name;
const val = has(formData, formName) ? get(formData, formName) : void 0;
const formControl = this.createControl(this.createControlConfig(jsonItem, val));
formSchemaItem.formName = formName;
formSchemaItem.formControl = formControl;
}
createArrayItems(items, itemKeyDef, arrayControl, parentName, readonlyMode = false, values, formData, parentSchema = null) {
const formArray = arrayControl;
const formSchema = [];
formArray.controls.forEach((control, index) => {
let value;
let key;
if (values && Array.isArray(values)) {
value = values[index];
key = '' + index;
}
else if (values && typeof values === 'object') {
key = Object.keys(values)[index];
value = values[key];
}
const schema = this.createArrayItemSchema(control, items, itemKeyDef, parentName, readonlyMode, formData, value, index, parentSchema);
schema.formName = key;
formSchema.push(schema);
});
return formSchema;
}
populateComplexTypeIndexMarker(items, key, value, marker = COMPLEX_TYPE_INDEX_MARKER) {
items.forEach(item => {
if (item.name) {
item.name = replaceMarker(item.name, marker, key);
}
if (item.if) {
item.if = replaceMarker(item.if, marker, key);
}
if (item.calc) {
item.calc = replaceMarker(item.calc, marker, key);
}
if (item.attributes) {
Object.keys(item.attributes).forEach(attr => {
if (typeof item.attributes[attr] === 'string') {
item.attributes[attr] = replaceMarker('' + item.attributes[attr], marker, key);
}
else if (typeof item.attributes[attr] === 'object') {
Object.keys(item.attributes[attr]).forEach(attrVal => {
const replaced = replaceMarker(attrVal, marker, key);
item.attributes[attr][attrVal] = replaceMarker('' + item.attributes[attr][attrVal], marker, key);
if (replaced !== attrVal) {
item.attributes[attr][replaced] = item.attributes[attr][attrVal];
delete item.attributes[attr][attrVal];
}
});
}
});
}
if (item[SCHEMA_COMPONENT_INPUTS_KEY]) {
const componentInputs = ['title', 'label', 'legend'];
componentInputs.forEach(propName => {
if (item[SCHEMA_COMPONENT_INPUTS_KEY][propName]) {
item[SCHEMA_COMPONENT_INPUTS_KEY][propName] = replaceMarker(item[SCHEMA_COMPONENT_INPUTS_KEY][propName], marker, key);
}
});
}
if (item.children) {
this.populateComplexTypeIndexMarker(item.children, key, value, marker);
}
if (item.items) {
this.populateComplexTypeIndexMarker([item.items], key, value, marker);
}
});
}
createControlConfig(item, defaultValue) {
if (item.name) {
return [defaultValue !== void 0 ? defaultValue : item[SCHEMA_DEFAULT_KEY], this.mapValidators(item.validators)];
}
return [];
}
createArrayControl(item, readonlyMode = false, values = []) {
const arraySchema = item;
const validators = [];
// TODO to thkink
// if (arraySchema.validators['minItems']) {
// validators.push(FlexyFormsValidators.minLengthArray(arraySchema.validators['minItems']));
// }
// if (arraySchema.validators['maxItems']) {
// validators.push(FlexyFormsValidators.maxLengthArray(arraySchema.validators['maxItems']));
// }
const formArray = new FormArray([], this.mapValidators(item.validators));
if (item.type === FlexyFormFieldType.Array && item.name) {
if (values && Array.isArray(values)) {
values.forEach(value => {
formArray.push(this.createItemControl(arraySchema.items, readonlyMode, value));
});
}
else if (values) {
console.warn('Wrong type of data. Values should be array', values);
}
}
return formArray;
}
unifyName(controlName, parentControlName = '') {
if (controlName[0] === '.') {
controlName = controlName.substring(1);
}
let name = controlName ? controlName.split('.').join('/') : 'p_' + Date.now();
if (parentControlName) {
name = name.replace(parentControlName + '/', '');
}
return name;
}
mapValidators(jsonValidator) {
const validators = [];
if (jsonValidator) {
Object.keys(jsonValidator).forEach(key => {
if (this._validatorsMap[key]) {
validators.push(this._validatorsMap[key](jsonValidator[key]));
}
else {
console.warn(`Validator ${key} is not supported`);
}
});
}
return validators;
}
}
FlexyFormJsonMapperService.controlCounter = 0;
FlexyFormJsonMapperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FlexyFormJsonMapperService_Factory() { return new FlexyFormJsonMapperService(i0.ɵɵinject(i1.FLEXY_FORM_VALIDATORS, 8), i0.ɵɵinject(i2.FlexyLayoutJsonMapperService), i0.ɵɵinject(i3.FormBuilder), i0.ɵɵinject(i4.FlexyLoggerService)); }, token: FlexyFormJsonMapperService, providedIn: "root" });
FlexyFormJsonMapperService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
FlexyFormJsonMapperService.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [FLEXY_FORM_VALIDATORS,] }] },
{ type: FlexyLayoutJsonMapperService },
{ type: FormBuilder },
{ type: FlexyLoggerService }
];
export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9, ɵ10, ɵ11, ɵ12, ɵ13, ɵ14, ɵ15, ɵ16, ɵ17, ɵ18, ɵ19 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1tYXBwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9zZXJ2aWNlcy9qc29uLW1hcHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdHLE9BQU8sRUFDTCx5QkFBeUIsRUFJekIsa0JBQWtCLEVBSW5CLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLDRCQUE0QixFQUE0QyxNQUFNLGtCQUFrQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7O0FBTTlELE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBRXZDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0FBQ3BDLE1BQU0sMkJBQTJCLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1dBR3pCLEdBQUcsRUFBRSxDQUFDLFVB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QUFDLENBQUM7U0FDSjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7O0FBNWhCTSx5Q0FBYyxHQUFHLENBQUMsQ0FBQzs7O1lBSjNCLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7OzRDQVdJLFFBQVEsWUFBSSxNQUFNLFNBQUMscUJBQXFCO1lBekRwQyw0QkFBNEI7WUFaQSxXQUFXO1lBZXZDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBGbGV4eUZvcm1MYXlvdXRTY2hlbWEgfSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0LXNjaGVtYS5tb2RlbCc7XG5pbXBvcnQge1xuICBDT01QTEVYX1RZUEVfSU5ERVhfTUFSS0VSLFxuICBGbGV4eUZvcm1DYWxjSnNvblNjaGVtYSxcbiAgRmxleHlGb3JtQ29tcGxleEZpZWxkTGF5b3V0SnNvblNjaGVtYSxcbiAgRmxleHlGb3JtRmllbGRMYXlvdXRKc29uU2NoZW1hLFxuICBGbGV4eUZvcm1GaWVsZFR5cGUsXG4gIEZsZXh5Rm9ybUlmSnNvblNjaGVtYSxcbiAgRmxleHlGb3JtTGF5b3V0SnNvbixcbiAgRmxleHlGb3JtTGF5b3V0SnNvblNjaGVtYVxufSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0LWpzb24tc2NoZW1hLm1vZGVsJztcbmltcG9ydCB7IEZsZXh5TGF5b3V0SnNvbk1hcHBlclNlcnZpY2UsIEZsZXh5TGF5b3V0SnNvblNjaGVtYSwgRmxleHlMYXlvdXRTY2hlbWEgfSBmcm9tICdAbmctZmxleHkvbGF5b3V0JztcbmltcG9ydCB7IGNsb25lRGVlcCwgZ2V0LCBoYXMgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRmxleHlGb3JtRGF0YSB9IGZyb20gJy4uL21vZGVscy9mb3JtLmRhdGEnO1xuaW1wb3J0IHsgRmxleHlMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnQG5nLWZsZXh5L2NvcmUnO1xuaW1wb3J0IHsgRmxleHlGb3Jtc1ZhbGlkYXRvcnMgfSBmcm9tICcuLi92YWxpZGF0b3JzL3ZhbGlkYXRvcnMudXRpbHMnO1xuaW1wb3J0IHsgRmxleHlWYWxpZGF0b3JzRGF0YSB9IGZyb20gJy4uL21vZGVscy92YWxpZGF0b3JzLmRhdGEnO1xuaW1wb3J0IHsgRmxleHlGb3JtIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHsgcGFyc2VGb3JtSnNvbiwgcmVwbGFjZU1hcmtlciB9IGZyb20gJy4vanNvbi1tYXBwZXIudXRpbHMnO1xuaW1wb3J0IHsgRkxFWFlfRk9STV9WQUxJREFUT1JTIH0gZnJvbSAnLi4vZm9ybS1vcHRpb25zLnRva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBGbGV4eUZvcm1WYWxpZGF0b3JzTWFwIHtcbiAgW25hbWU6IHN0cmluZ106IChkYXRhPykgPT4gVmFsaWRhdG9yRm47XG59XG5cbmNvbnN0IElOUFVUU19SRUFET05MWV9LRVkgPSAncmVhZG9ubHknO1xuXG5jb25zdCBTQ0hFTUFfQ09OVFJPTF9OQU1FX0tFWSA9ICduYW1lJztcbmNvbnN0IFNDSEVNQV9HUk9VUF9LRVkgPSAnZ3JvdXBLZXknO1xuY29uc3QgU0NIRU1BX0NPTVBPTkVOVF9JTlBVVFNfS0VZID0gJ3Byb3BlcnRpZXMnO1xuY29uc3QgU0NIRU1BX0RFRkFVTFRfS0VZID0gJ2RlZmF1bHQnO1xuXG5jb25zdCBERUZBVUxUX1ZBTElEQVRPUlNfTUFQOiBGbGV4eUZvcm1WYWxpZGF0b3JzTWFwID0ge1xuICByZXF1aXJlZDogKCkgPT4gVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgbWF4TGVuZ3RoOiBkYXRhID0+IFZhbGlkYXRvcnMubWF4TGVuZ3RoKGRhdGEpLFxuICBtaW5MZW5ndGg6IGRhdGEgPT4gVmFsaWRhdG9ycy5taW5MZW5ndGgoZGF0YSksXG4gIG1pbjogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5taW5WYWxpZGF0b3IoZGF0YSksXG4gIG1heDogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5tYXhWYWxpZGF0b3IoZGF0YSksXG4gIG51bWJlcjogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubnVtYmVyVmFsaWRhdG9yLFxuICBpbnRlZ2VyOiAoKSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5pbnRlZ2VyVmFsaWRhdG9yLFxuICBib29sZWFuOiAoKSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5ib29sZWFuVmFsaWRhdG9yLFxuICBlbWFpbDogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuZW1haWxWYWxpZGF0b3IsXG4gIG5vV2hpdGVzcGFjZTogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubm9XaGl0ZXNwYWNlVmFsaWRhdG9yLFxuICBub3RFbXB0eTogKCkgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubm90RW1wdHlWYWxpZGF0b3IsXG4gIHBhdHRlcm46IGRhdGEgPT4gVmFsaWRhdG9ycy5wYXR0ZXJuKGRhdGEpLFxuICBjcm9zc0ZpZWxkOiBkYXRhID0+IEZsZXh5Rm9ybXNWYWxpZGF0b3JzLmNyb3NzRmllbGRWYWxpZGF0b3IoZGF0YSksXG4gIGNyb3NzRmllbGRNaW46IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuY3Jvc3NGaWVsZE1pblZhbGlkYXRvcihkYXRhKSxcbiAgY3Jvc3NGaWVsZE1heDogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5jcm9zc0ZpZWxkTWF4VmFsaWRhdG9yKGRhdGEpLFxuICBjcm9zc0ZpZWxkQWJzb2x1dGVNaW46IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuY3Jvc3NGaWVsZEFic29sdXRlTWluVmFsaWRhdG9yKGRhdGEpLFxuICBmb3JiaWRkZW5WYWx1ZXM6IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMuZm9yYmlkZGVuVmFsdWVzVmFsaWRhdG9yKGRhdGEpLFxuICBhcnJheVVuaXF1ZUZpZWxkczogZGF0YSA9PiBGbGV4eUZvcm1zVmFsaWRhdG9ycy5hcnJheVVuaXF1ZUZpZWxkc1ZhbGlkYXRvcihkYXRhKSxcbiAgbWluSXRlbXM6IGRhdGEgPT4gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubWluTGVuZ3RoQXJyYXkoZGF0YSksXG4gIG1heEl0ZW1zOiBkYXRhID0+IEZsZXh5Rm9ybXNWYWxpZGF0b3JzLm1heExlbmd0aEFycmF5KGRhdGEpXG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGbGV4eUZvcm1Kc29uTWFwcGVyU2VydmljZSB7XG4gIHN0YXRpYyBjb250cm9sQ291bnRlciA9IDA7XG5cbiAgZ2V0IHN1cHBvcnRlZFZhbGlkYXRvcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl92YWxpZGF0b3JzTWFwKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbGlkYXRvcnNNYXAgPSBERUZBVUxUX1ZBTElEQVRPUlNfTUFQO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRkxFWFlfRk9STV9WQUxJREFUT1JTKSB2YWxpZGF0b3JzTWFwOiBGbGV4eUZvcm1WYWxpZGF0b3JzTWFwLFxuICAgIHByaXZhdGUganNvbkxheW91dE1hcHBlcjogRmxleHlMYXlvdXRKc29uTWFwcGVyU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGxvZ2dlcjogRmxleHlMb2dnZXJTZXJ2aWNlXG4gICkge1xuICAgIGlmICh2YWxpZGF0b3JzTWFwKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3ZhbGlkYXRvcnNNYXAsIHZhbGlkYXRvcnNNYXApO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUZvcm0oanNvbjogRmxleHlGb3JtTGF5b3V0SnNvbiwgcmVhZG9ubHlNb2RlID0gZmFsc2UsIGZvcm1EYXRhOiBGbGV4eUZvcm1EYXRhKTogRmxleHlGb3JtIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY3JlYXRlRm9ybScpO1xuICAgIEZsZXh5Rm9ybUpzb25NYXBwZXJTZXJ2aWNlLmNvbnRyb2xDb3VudGVyID0gMDtcblxuICAgIGNvbnN0IGpzb25TY2hlbWEgPSBwYXJzZUZvcm1Kc29uKGpzb24pO1xuXG4gICAgY29uc3Qgcm9vdEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgIGNvbnN0IGR5bmFtaWNTY2hlbWE6IEZsZXh5Rm9ybUxheW91dFNjaGVtYVtdID0gdGhpcy5tYXAoanNvblNjaGVtYSwgcmVhZG9ubHlNb2RlLCBmb3JtRGF0YSwgcm9vdEZvcm1Hcm91cCk7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY291bnRPZkNvbnRyb2xzJywgRmxleHlGb3JtSnNvbk1hcHBlclNlcnZpY2UuY29udHJvbENvdW50ZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBGbGV4eUZvcm0ocm9vdEZvcm1Hcm91cCwgZHluYW1pY1NjaGVtYSwgZm9ybURhdGEpO1xuICB9XG5cbiAgY3JlYXRlSXRlbUNvbnRyb2woaXRlbXNTY2hlbWE6IEZsZXh5Rm9ybUxheW91dEpzb25TY2hlbWEsIHJlYWRvbmx5TW9kZTogYm9vbGVhbiwgdmFsdWU6IEZsZXh5Rm9ybURhdGEpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG4gICAgaWYgKGl0ZW1zU2NoZW1hLmNoaWxkcmVuKSB7XG4gICAgICBjb250cm9sID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICB0aGlzLm1hcEl0ZW0oaXRlbXNTY2hlbWEsIHJlYWRvbmx5TW9kZSwgdmFsdWUsIGNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcbiAgICAgICAgdmFsdWUgPyB2YWx1ZSA6IGdldChpdGVtc1NjaGVtYSwgJ2NvbXBvbmVudElucHV0cy5kZWZhdWx0JyksXG4gICAgICAgIChpdGVtc1NjaGVtYSBhcyBGbGV4eUZvcm1GaWVsZExheW91dEpzb25TY2hlbWEpLnZhbGlkYXRvcnNcbiAgICAgICAgICA/IHRoaXMubWFwVmFsaWRhdG9ycygoaXRlbXNTY2hlbWEgYXMgRmxleHlGb3JtRmllbGRMYXlvdXRKc29uU2NoZW1hKS52YWxpZGF0b3JzKVxuICAgICAgICAgIDogW11cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sO1xuICB9XG5cbiAgY3JlYXRlQXJyYXlJdGVtU2NoZW1hKFxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgICBpdGVtczogRmxleHlGb3JtTGF5b3V0SnNvblNjaGVtYSxcbiAgICBpdGVtS2V5RGVmOiBzdHJpbmcsXG4gICAgcGFyZW50TmFtZTogc3RyaW5nLFxuICAgIHJlYWRvbmx5TW9kZTogYm9vbGVhbixcbiAgICBmb3JtRGF0YTogRmxleHlGb3JtRGF0YSxcbiAgICB2YWx1ZTogRmxleHlGb3JtRGF0YSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmVudFNjaGVtYTogRmxleHlGb3JtTGF5b3V0U2NoZW1hID0gbnVsbFxuICApOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSB7XG4gICAgY29uc3QgY2l0ZW1zID0gY2xvbmVEZWVwKGl0ZW1zKTtcblxuICAgIHRoaXMucG9wdWxhdGVDb21wbGV4VHlwZUluZGV4TWFya2VyKFtjaXRlbXNdLCBpbmRleCArIDEsIHZhbHVlLCBpdGVtS2V5RGVmKTtcblxuICAgIGNvbnN0IGlzQ29tcGxleCA9IGNpdGVtcyAmJiAhIWNpd