UNPKG

ngx-schema-forms

Version:

New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo

200 lines (199 loc) 19.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { startWith } from 'rxjs/operators'; import { SchemaPropertyType } from '../schema'; import { GenericProperty } from './generic-property'; import { NumberProperty } from './number-property'; import { BooleanProperty } from './boolean-property'; import { StringProperty } from './string-property'; import { ArrayProperty } from './array-property'; import { ObjectProperty } from './object-property'; import { SchemaPreprocessor } from './schemapreprocessor'; /** @typedef {?} */ var PropertyParent; export { PropertyParent }; var FormPropertyFactory = /** @class */ (function () { function FormPropertyFactory(schemaValidatorFactory, validatorRegistry) { this.schemaValidatorFactory = schemaValidatorFactory; this.validatorRegistry = validatorRegistry; } /** * @param {?} schema * @param {?=} propertyParent * @param {?=} propertyKey * @return {?} */ FormPropertyFactory.prototype.createProperty = /** * @param {?} schema * @param {?=} propertyParent * @param {?=} propertyKey * @return {?} */ function (schema, propertyParent, propertyKey) { /** @type {?} */ var property; /** @type {?} */ var path = this.generatePath(propertyParent, propertyKey); SchemaPreprocessor.preprocess(schema, path); // TODO test for parsing for reference schema if (schema["$ref"]) { /** @type {?} */ var refSchema = this.schemaValidatorFactory.getSchema((/** @type {?} */ (propertyParent.root)).schema, schema["$ref"]); property = this.createProperty(refSchema, propertyParent, propertyKey || path); } else { switch (schema["type"]) { case SchemaPropertyType.Integer: case SchemaPropertyType.Number: property = new NumberProperty(path, schema); break; case SchemaPropertyType.String: property = new StringProperty(path, schema); break; case SchemaPropertyType.Boolean: property = new BooleanProperty(path, schema); break; case SchemaPropertyType.Object: property = new ObjectProperty(path, schema); break; case SchemaPropertyType.Array: if (schema["widget"].id === 'array') { property = new ArrayProperty(this, path, schema); } else { schema["default"] = []; property = new GenericProperty(path, schema); } break; default: throw new TypeError("Undefined type " + schema["type"]); } } this.initializeFormProperty(property, propertyParent); return property; }; /** * @param {?} property * @param {?=} propertyParent * @return {?} */ FormPropertyFactory.prototype.initializeFormProperty = /** * @param {?} property * @param {?=} propertyParent * @return {?} */ function (property, propertyParent) { if (propertyParent) { property.setParent(propertyParent); } this.bindCustomValidator(property); if (property instanceof ObjectProperty) { for (var key in property.schema["properties"]) { if (property.schema["properties"].hasOwnProperty(key)) { /** @type {?} */ var _schema = property.schema["properties"][key]; /** @type {?} */ var _property = this.createProperty(_schema, property, key); property.addControl(key, _property); } } } if (property.isRoot) { this.bindSchemaValidator(property); // needs to run after entire property tree is built property.bindVisibility(); } }; /** * @param {?} property * @return {?} */ FormPropertyFactory.prototype.bindSchemaValidator = /** * @param {?} property * @return {?} */ function (property) { /** @type {?} */ var validate = this.schemaValidatorFactory.createValidatorFn(property.schema); // TODO use pipe startWith to do initial run property.valueChanges .pipe(startWith(null)) .subscribe(function () { /** @type {?} */ var value = property.nonEmptyValue; property.nonEmptyValueChanges.emit(value); /** @type {?} */ var errors = validate(value); if (!errors) { return; } Object.keys(errors).forEach(function (path) { /** @type {?} */ var control = property.get(path); if (control) { // set error to specific control control.setErrors(errors[path], { emitEvent: true }); } }); }); }; /** * @param {?} property * @return {?} */ FormPropertyFactory.prototype.bindCustomValidator = /** * @param {?} property * @return {?} */ function (property) { /** @type {?} */ var validators = this.validatorRegistry.get(property.path); if (validators) { property.setValidators(validators); } }; /** * @param {?=} propertyParent * @param {?=} propertyKey * @return {?} */ FormPropertyFactory.prototype.generatePath = /** * @param {?=} propertyParent * @param {?=} propertyKey * @return {?} */ function (propertyParent, propertyKey) { if (!propertyParent) { return '/'; } /** @type {?} */ var path = ''; path += propertyParent.path; if (propertyParent.parent !== undefined) { path += '/'; } switch (propertyParent.schema["type"]) { case SchemaPropertyType.Object: path += propertyKey; break; case SchemaPropertyType.Array: path += (/** @type {?} */ (propertyParent)).controls.length; break; default: // TODO move to class throw new Error('Instantiation of a FormProperty with an unknown parent type: ' + propertyParent.schema["type"]); } return path; }; return FormPropertyFactory; }()); export { FormPropertyFactory }; if (false) { /** @type {?} */ FormPropertyFactory.prototype.schemaValidatorFactory; /** @type {?} */ FormPropertyFactory.prototype.validatorRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wcm9wZXJ0eS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbC9mb3JtLXByb3BlcnR5LWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQVUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFNMUQsSUFBQTtJQUVFLDZCQUNVLHdCQUNBO1FBREEsMkJBQXNCLEdBQXRCLHNCQUFzQjtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCO0tBQ3RCOzs7Ozs7O0lBRUwsNENBQWM7Ozs7OztJQUFkLFVBQ0UsTUFBYyxFQUNkLGNBQStCLEVBQy9CLFdBQW9COztRQUlwQixJQUFJLFFBQVEsQ0FBZTs7UUFDM0IsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFNUQsa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQzs7UUFHNUMsRUFBRSxDQUFDLENBQUMsTUFBTSxVQUFPLENBQUM7O1lBQ2hCLElBQU0sU0FBUyxHQUFHLElB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Ozs7Ozs7SUFHSywwQ0FBWTs7Ozs7Y0FDbEIsY0FBK0IsRUFDL0IsV0FBb0I7UUFHcEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDWjs7UUFFRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQztRQUc1QixFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxJQUFJLEdBQUcsQ0FBQztTQUNiO1FBRUQsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sVUFBTyxDQUFDO1lBQ25DLEtBQUssa0JBQWtCLENBQUMsTUFBTTtnQkFDNUIsSUFBSSxJQUFJLFdBQVcsQ0FBQztnQkFDcEIsS0FBSyxDQUFDO1lBRVIsS0FBSyxrQkFBa0IsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLElBQUksbUJBQWdCLGNBQWMsRUFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hELEtBQUssQ0FBQztZQUVSOztnQkFFRSxNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxHQUM3RCxjQUFjLENBQUMsTUFBTSxRQUFLLENBQzdCLENBQUM7U0FDTDtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUM7OzhCQWpNaEI7SUFtTUMsQ0FBQTtBQXRLRCwrQkFzS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUFycmF5LFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5cbmltcG9ydCB7IFNjaGVtYVZhbGlkYXRvckZhY3RvcnkgfSBmcm9tICcuLi9zY2hlbWF2YWxpZGF0b3JmYWN0b3J5JztcbmltcG9ydCB7IFZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSAnLi4vbW9kZWwvdmFsaWRhdG9ycmVnaXN0cnknO1xuaW1wb3J0IHsgU2NoZW1hLCBTY2hlbWFQcm9wZXJ0eVR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuXG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuL2Zvcm0tcHJvcGVydHknO1xuaW1wb3J0IHsgR2VuZXJpY1Byb3BlcnR5IH0gZnJvbSAnLi9nZW5lcmljLXByb3BlcnR5JztcbmltcG9ydCB7IE51bWJlclByb3BlcnR5IH0gZnJvbSAnLi9udW1iZXItcHJvcGVydHknO1xuaW1wb3J0IHsgQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnLi9ib29sZWFuLXByb3BlcnR5JztcbmltcG9ydCB7IFN0cmluZ1Byb3BlcnR5IH0gZnJvbSAnLi9zdHJpbmctcHJvcGVydHknO1xuaW1wb3J0IHsgQXJyYXlQcm9wZXJ0eSB9IGZyb20gJy4vYXJyYXktcHJvcGVydHknO1xuaW1wb3J0IHsgT2JqZWN0UHJvcGVydHkgfSBmcm9tICcuL29iamVjdC1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBTY2hlbWFQcmVwcm9jZXNzb3IgfSBmcm9tICcuL3NjaGVtYXByZXByb2Nlc3Nvcic7XG5cblxuZXhwb3J0IHR5cGUgUHJvcGVydHlQYXJlbnQgPSBPYmplY3RQcm9wZXJ0eSB8IEFycmF5UHJvcGVydHk7XG5cblxuZXhwb3J0IGNsYXNzIEZvcm1Qcm9wZXJ0eUZhY3Rvcnkge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2NoZW1hVmFsaWRhdG9yRmFjdG9yeTogU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSxcbiAgICBwcml2YXRlIHZhbGlkYXRvclJlZ2lzdHJ5OiBWYWxpZGF0b3JSZWdpc3RyeVxuICApIHsgfVxuXG4gIGNyZWF0ZVByb3BlcnR5KFxuICAgIHNjaGVtYTogU2NoZW1hLFxuICAgIHByb3BlcnR5UGFyZW50PzogUHJvcGVydHlQYXJlbnQsXG4gICAgcHJvcGVydHlLZXk/OiBzdHJpbmdcbiAgKTogRm9ybVByb3BlcnR5IHtcblxuXG4gICAgbGV0IHByb3BlcnR5OiBGb3JtUHJvcGVydHk7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZ2VuZXJhdGVQYXRoKHByb3BlcnR5UGFyZW50LCBwcm9wZXJ0eUtleSk7XG5cbiAgICBTY2hlbWFQcmVwcm9jZXNzb3IucHJlcHJvY2VzcyhzY2hlbWEsIHBhdGgpO1xuXG4gICAgLy8gVE9ETyB0ZXN0IGZvciBwYXJzaW5nIGZvciByZWZlcmVuY2Ugc2NoZW1hXG4gICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICBjb25zdCByZWZTY2hlbWEgPSB0aGlzLnNjaGVtYVZhbGlkYXRvckZhY3RvcnkuZ2V0U2NoZW1hKFxuICAgICAgICAoPEZvcm1Qcm9wZXJ0eT5wcm9wZXJ0eVBhcmVudC5yb290KS5zY2hlbWEsXG4gICAgICAgIHNjaGVtYS4kcmVmXG4gICAgICApO1xuXG4gICAgICBwcm9wZXJ0eSA9IHRoaXMuY3JlYXRlUHJvcGVydHkoXG4gICAgICAgIHJlZlNjaGVtYSxcbiAgICAgICAgcHJvcGVydHlQYXJlbnQsXG4gICAgICAgIHByb3BlcnR5S2V5IHx8IHBhdGhcbiAgICAgICk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChzY2hlbWEudHlwZSkge1xuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5JbnRlZ2VyOlxuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5OdW1iZXI6XG4gICAgICAgICAgcHJvcGVydHkgPSBuZXcgTnVtYmVyUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eVR5cGUuU3RyaW5nOlxuICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFN0cmluZ1Byb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkJvb2xlYW46XG4gICAgICAgICAgcHJvcGVydHkgPSBuZXcgQm9vbGVhblByb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDpcbiAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBPYmplY3RQcm9wZXJ0eShwYXRoLCBzY2hlbWEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5BcnJheTpcbiAgICAgICAgICBpZiAoc2NoZW1hLndpZGdldC5pZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgQXJyYXlQcm9wZXJ0eSh0aGlzLCBwYXRoLCBzY2hlbWEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY2hlbWEuZGVmYXVsdCA9IFtdO1xuICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgR2VuZXJpY1Byb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuZGVmaW5lZCB0eXBlICR7c2NoZW1hLnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB0aGlzLmluaXRpYWxpemVGb3JtUHJvcGVydHkocHJvcGVydHksIHByb3BlcnR5UGFyZW50KTtcblxuXG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybVByb3BlcnR5KFxuICAgIHByb3BlcnR5OiBGb3JtUHJvcGVydHksXG4gICAgcHJvcGVydHlQYXJlbnQ/OiBQcm9wZXJ0eVBhcmVudCxcbiAgKSB7XG5cbiAgICBpZiAocHJvcGVydHlQYXJlbnQpIHtcbiAgICAgIHByb3BlcnR5LnNldFBhcmVudChwcm9wZXJ0eVBhcmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kQ3VzdG9tVmFsaWRhdG9yKHByb3BlcnR5KTtcblxuICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIE9iamVjdFByb3BlcnR5KSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0eS5zY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBpZiAocHJvcGVydHkuc2NoZW1hLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF9zY2hlbWEgPSBwcm9wZXJ0eS5zY2hlbWEucHJvcGVydGllc1trZXldO1xuICAgICAgICAgIGNvbnN0IF9wcm9wZXJ0eSA9IHRoaXMuY3JlYXRlUHJvcGVydHkoX3NjaGVtYSwgcHJvcGVydHksIGtleSk7XG4gICAgICAgICAgcHJvcGVydHkuYWRkQ29udHJvbChrZXksIF9wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHkuaXNSb290KSB7XG4gICAgICB0aGlzLmJpbmRTY2hlbWFWYWxpZGF0b3IocHJvcGVydHkpO1xuICAgICAgLy8gbmVlZHMgdG8gcnVuIGFmdGVyIGVudGlyZSBwcm9wZXJ0eSB0cmVlIGlzIGJ1aWx0XG4gICAgICBwcm9wZXJ0eS5iaW5kVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZFNjaGVtYVZhbGlkYXRvcihwcm9wZXJ0eTogRm9ybVByb3BlcnR5KSB7XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yRmFjdG9yeS5jcmVhdGVWYWxpZGF0b3JGbihcbiAgICAgIHByb3BlcnR5LnNjaGVtYVxuICAgICk7XG5cbiAgICAvLyBUT0RPIHVzZSBwaXBlIHN0YXJ0V2l0aCB0byBkbyBpbml0aWFsIHJ1blxuICAgIHByb3BlcnR5LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkubm9uRW1wdHlWYWx1ZTtcbiAgICAgICAgcHJvcGVydHkubm9uRW1wdHlWYWx1ZUNoYW5nZXMuZW1pdCh2YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGUodmFsdWUpO1xuICAgICAgICBpZiAoIWVycm9ycykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaCgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHByb3BlcnR5LmdldChwYXRoKTtcbiAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgLy8gc2V0IGVycm9yIHRvIHNwZWNpZmljIGNvbnRyb2xcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9yc1twYXRoXSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kQ3VzdG9tVmFsaWRhdG9yKHByb3BlcnR5OiBGb3JtUHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5nZXQocHJvcGVydHkucGF0aCk7XG4gICAgaWYgKHZhbGlkYXRvcnMpIHtcbiAgICAgIHByb3BlcnR5LnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVBhdGgoXG4gICAgcHJvcGVydHlQYXJlbnQ/OiBQcm9wZXJ0eVBhcmVudCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuXG4gICAgaWYgKCFwcm9wZXJ0eVBhcmVudCkge1xuICAgICAgcmV0dXJuICcvJztcbiAgICB9XG5cbiAgICBsZXQgcGF0aCA9ICcnO1xuICAgIHBhdGggKz0gcHJvcGVydHlQYXJlbnQucGF0aDtcblxuXG4gICAgaWYgKHByb3BlcnR5UGFyZW50LnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXRoICs9ICcvJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5UGFyZW50LnNjaGVtYS50eXBlKSB7XG4gICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5PYmplY3Q6XG4gICAgICAgIHBhdGggKz0gcHJvcGVydHlLZXk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5BcnJheTpcbiAgICAgICAgcGF0aCArPSAoPEFycmF5UHJvcGVydHk+cHJvcGVydHlQYXJlbnQpLmNvbnRyb2xzLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRPRE8gbW92ZSB0byBjbGFzc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0luc3RhbnRpYXRpb24gb2YgYSBGb3JtUHJvcGVydHkgd2l0aCBhbiB1bmtub3duIHBhcmVudCB0eXBlOiAnICtcbiAgICAgICAgICAgIHByb3BlcnR5UGFyZW50LnNjaGVtYS50eXBlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cbn1cbiJdfQ==