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
231 lines (230 loc) • 19.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, forwardRef, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ActionRegistry } from '../model/actionregistry';
import { ValidatorRegistry } from '../model/validatorregistry';
import { SchemaPropertyType } from '../schema';
import { SchemaValidatorFactory } from '../schemavalidatorfactory';
import { WidgetFactory } from '../widgetfactory';
import { FormPropertyFactory } from '../model/form-property-factory';
import { TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry';
/**
* @param {?} schemaValidatorFactory
* @param {?} validatorRegistry
* @return {?}
*/
export function useFactory(schemaValidatorFactory, validatorRegistry) {
return new FormPropertyFactory(schemaValidatorFactory, validatorRegistry);
}
var FormComponent = /** @class */ (function () {
function FormComponent(changeDetectorRef, formPropertyFactory, actionRegistry, validatorRegistry) {
this.changeDetectorRef = changeDetectorRef;
this.formPropertyFactory = formPropertyFactory;
this.actionRegistry = actionRegistry;
this.validatorRegistry = validatorRegistry;
this.schema = null;
this.actions = {};
this.validators = {};
this.rootFormProperty = null;
}
/**
* @param {?} value
* @return {?}
*/
FormComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
// value should be object
if (this.rootFormProperty && value) {
this.rootFormProperty.patchValue(value);
}
};
/**
* @param {?} fn
* @return {?}
*/
FormComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
if (this.rootFormProperty) {
this.rootFormProperty.nonEmptyValueChanges.subscribe(fn);
}
};
// TODO implement
/**
* @param {?} fn
* @return {?}
*/
FormComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) { };
/**
* @param {?} isDisabled
* @return {?}
*/
FormComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
if (!this.rootFormProperty) {
return;
}
if (isDisabled) {
this.rootFormProperty.disable();
}
else {
this.rootFormProperty.enable();
}
};
/**
* @param {?} changes
* @return {?}
*/
FormComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes["validators"]) {
this.registerValidators();
}
if (changes["actions"]) {
this.registerActions();
}
if (this.schema && !this.schema.type) {
this.schema.type = SchemaPropertyType.Object;
}
if (this.schema && changes["schema"]) {
/** @type {?} */
var value = void 0;
if (this.rootFormProperty) {
// TODO validate model against schema
value = this.rootFormProperty.nonEmptyValue;
}
// force component destruction
this.rootFormProperty = null;
this.changeDetectorRef.detectChanges();
/** @type {?} */
var rootFormProperty = this.formPropertyFactory.createProperty(this.schema);
// registerOnChange for changes after init
if (this.onChangeCallback) {
rootFormProperty.nonEmptyValueChanges.subscribe(this.onChangeCallback);
if (value) {
rootFormProperty.patchValue(value);
}
}
this.rootFormProperty = rootFormProperty;
}
};
/**
* @return {?}
*/
FormComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
FormComponent.prototype.registerValidators = /**
* @return {?}
*/
function () {
this.validatorRegistry.clear();
if (!this.validators) {
return;
}
for (var propertyPath in this.validators) {
if (this.validators.hasOwnProperty(propertyPath)) {
this.validatorRegistry.register(propertyPath, this.validators[propertyPath]);
}
}
};
/**
* @return {?}
*/
FormComponent.prototype.registerActions = /**
* @return {?}
*/
function () {
this.actionRegistry.clear();
if (!this.actions) {
return;
}
for (var actionId in this.actions) {
if (this.actions.hasOwnProperty(actionId)) {
this.actionRegistry.register(actionId, this.actions[actionId]);
}
}
};
FormComponent.decorators = [
{ type: Component, args: [{
selector: 'sf-form',
template: "\n <form #form=\"ngForm\">\n <sf-form-element *ngIf=\"rootFormProperty; else noSchema\" [formProperty]=\"rootFormProperty\">\n </sf-form-element>\n <ng-template #noSchema>\n You need to provide a json or a template schema!\n </ng-template>\n </form>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return FormComponent; }),
multi: true
},
ActionRegistry,
ValidatorRegistry,
WidgetFactory,
{
provide: FormPropertyFactory,
useFactory: useFactory,
deps: [SchemaValidatorFactory, ValidatorRegistry]
},
TemplateSchemaElementRegistry
],
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
FormComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef },
{ type: FormPropertyFactory },
{ type: ActionRegistry },
{ type: ValidatorRegistry }
]; };
FormComponent.propDecorators = {
schema: [{ type: Input }],
actions: [{ type: Input }],
validators: [{ type: Input }]
};
return FormComponent;
}());
export { FormComponent };
if (false) {
/** @type {?} */
FormComponent.prototype.schema;
/** @type {?} */
FormComponent.prototype.actions;
/** @type {?} */
FormComponent.prototype.validators;
/** @type {?} */
FormComponent.prototype.rootFormProperty;
/** @type {?} */
FormComponent.prototype.onChangeCallback;
/** @type {?} */
FormComponent.prototype.changeDetectorRef;
/** @type {?} */
FormComponent.prototype.formPropertyFactory;
/** @type {?} */
FormComponent.prototype.actionRegistry;
/** @type {?} */
FormComponent.prototype.validatorRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2NoZW1hLWZvcm1zLyIsInNvdXJjZXMiOlsibGliL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUVMLFVBQVUsRUFDVixpQkFBaUIsRUFJakIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7Ozs7OztBQUU3RCxNQUFNLHFCQUFxQixzQkFBc0IsRUFBRSxpQkFBaUI7SUFDbEUsTUFBTSxDQUFDLElBQUksbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztDQUMzRTs7SUErQ0MsdUJBQ1UsbUJBQ0EscUJBQ0EsZ0JBQ0E7UUFIQSxzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLHdCQUFtQixHQUFuQixtQkFBbUI7UUFDbkIsbUJBQWMsR0FBZCxjQUFjO1FBQ2Qsc0JBQWlCLEdBQWpCLGlCQUFpQjtzQkFoQmIsSUFBSTt1QkFHd0IsRUFBRTswQkFHa0IsRUFBRTtnQ0FFL0IsSUFBSTtLQVNqQzs7Ozs7SUFFSixrQ0FBVTs7OztJ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dEIsSUFBSSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUM7eUJBQ2xEO3dCQUNELDZCQUE2QjtxQkFDOUI7b0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ3RDOzs7O2dCQTFEQyxpQkFBaUI7Z0JBbUJWLG1CQUFtQjtnQkFMbkIsY0FBYztnQkFDZCxpQkFBaUI7Ozt5QkE4Q3ZCLEtBQUs7MEJBR0wsS0FBSzs2QkFHTCxLQUFLOzt3QkF6RVI7O1NBaUVhLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5wdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRvckZuLFxuICBOZ0Zvcm1cbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi9tb2RlbC9hY3Rpb24nO1xuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gJy4uL21vZGVsL3ZhbGlkYXRvcnJlZ2lzdHJ5JztcbmltcG9ydCB7IFNjaGVtYVByb3BlcnR5VHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQgeyBTY2hlbWFWYWxpZGF0b3JGYWN0b3J5IH0gZnJvbSAnLi4vc2NoZW1hdmFsaWRhdG9yZmFjdG9yeSc7XG5pbXBvcnQgeyBXaWRnZXRGYWN0b3J5IH0gZnJvbSAnLi4vd2lkZ2V0ZmFjdG9yeSc7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHlGYWN0b3J5IH0gZnJvbSAnLi4vbW9kZWwvZm9ybS1wcm9wZXJ0eS1mYWN0b3J5JztcbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4uL21vZGVsL2Zvcm0tcHJvcGVydHknO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZhY3Rvcnkoc2NoZW1hVmFsaWRhdG9yRmFjdG9yeSwgdmFsaWRhdG9yUmVnaXN0cnkpIHtcbiAgcmV0dXJuIG5ldyBGb3JtUHJvcGVydHlGYWN0b3J5KHNjaGVtYVZhbGlkYXRvckZhY3RvcnksIHZhbGlkYXRvclJlZ2lzdHJ5KTtcbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZi1mb3JtJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8Zm9ybSAjZm9ybT1cIm5nRm9ybVwiPlxuICAgICAgPHNmLWZvcm0tZWxlbWVudCAqbmdJZj1cInJvb3RGb3JtUHJvcGVydHk7IGVsc2Ugbm9TY2hlbWFcIiBbZm9ybVByb3BlcnR5XT1cInJvb3RGb3JtUHJvcGVydHlcIj5cbiAgICAgIDwvc2YtZm9ybS1lbGVtZW50PlxuICAgICAgPG5nLXRlbXBsYXRlICNub1NjaGVtYT5cbiAgICAgICAgWW91IG5lZWQgdG8gcHJvdmlkZSBhIGpzb24gb3IgYSB0ZW1wbGF0ZSBzY2hlbWEhXG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZm9ybT5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICBBY3Rpb25SZWdpc3RyeSxcbiAgICBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICBXaWRnZXRGYWN0b3J5LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEZvcm1Qcm9wZXJ0eUZhY3RvcnksXG4gICAgICB1c2VGYWN0b3J5OiB1c2VGYWN0b3J5LFxuICAgICAgZGVwczogW1NjaGVtYVZhbGlkYXRvckZhY3RvcnksIFZhbGlkYXRvclJlZ2lzdHJ5XVxuICAgIH0sXG4gICAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbiAgXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASW5wdXQoKVxuICBzY2hlbWE6IGFueSA9IG51bGw7XG5cbiAgQElucHV0KClcbiAgYWN0aW9uczogeyBbYWN0aW9uSWQ6IHN0cmluZ106IEFjdGlvbiB9ID0ge307XG5cbiAgQElucHV0KClcbiAgdmFsaWRhdG9yczogeyBbcGF0aDogc3RyaW5nXTogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdIH0gPSB7fTtcblxuICByb290Rm9ybVByb3BlcnR5OiBGb3JtUHJvcGVydHkgPSBudWxsO1xuXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZm9ybVByb3BlcnR5RmFjdG9yeTogRm9ybVByb3BlcnR5RmFjdG9yeSxcbiAgICBwcml2YXRlIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHZhbGlkYXRvclJlZ2lzdHJ5OiBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIC8vIHZhbHVlIHNob3VsZCBiZSBvYmplY3RcbiAgICBpZiAodGhpcy5yb290Rm9ybVByb3BlcnR5ICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgaWYgKHRoaXMucm9vdEZvcm1Qcm9wZXJ0eSkge1xuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5Lm5vbkVtcHR5VmFsdWVDaGFuZ2VzLnN1YnNjcmliZShmbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyBpbXBsZW1lbnRcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge31cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMucm9vdEZvcm1Qcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkuZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnZhbGlkYXRvcnMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuYWN0aW9ucykge1xuICAgICAgdGhpcy5yZWdpc3RlckFjdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWEgJiYgIXRoaXMuc2NoZW1hLnR5cGUpIHtcbiAgICAgIHRoaXMuc2NoZW1hLnR5cGUgPSBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0O1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuc2NoZW1hICYmIGNoYW5nZXMuc2NoZW1hKSB7XG4gICAgICBsZXQgdmFsdWU6IGFueTtcbiAgICAgIGlmICh0aGlzLnJvb3RGb3JtUHJvcGVydHkpIHtcbiAgICAgICAgLy8gVE9ETyB2YWxpZGF0ZSBtb2RlbCBhZ2FpbnN0IHNjaGVtYVxuICAgICAgICB2YWx1ZSA9IHRoaXMucm9vdEZvcm1Qcm9wZXJ0eS5ub25FbXB0eVZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3JjZSBjb21wb25lbnQgZGVzdHJ1Y3Rpb25cbiAgICAgIHRoaXMucm9vdEZvcm1Qcm9wZXJ0eSA9IG51bGw7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgLy8gU2NoZW1hUHJlcHJvY2Vzc29yIGlzIG5vdyBkb25lIGluIGZvcm1Qcm9wZXJ0eUZhY3RvcnkgdXNpbmcgcHJvcGVydHlcbiAgICAgIC8vIGNyZWF0aW9uIHJlY3Vyc2lvbiwgdGhpcyByZW1vdmVzIHRoZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSB0cmVlIHR3aWNlLlxuICAgICAgLy8gVE9ETyB0ZXN0IHNjaGVtYSBwcmVwcm9jZXNzaW5nIG1vdmVcbiAgICAgIGNvbnN0IHJvb3RGb3JtUHJvcGVydHkgPSB0aGlzLmZvcm1Qcm9wZXJ0eUZhY3RvcnkuY3JlYXRlUHJvcGVydHkoXG4gICAgICAgIHRoaXMuc2NoZW1hXG4gICAgICApO1xuXG4gICAgICAvLyByZWdpc3Rlck9uQ2hhbmdlIGZvciBjaGFuZ2VzIGFmdGVyIGluaXRcbiAgICAgIGlmICh0aGlzLm9uQ2hhbmdlQ2FsbGJhY2spIHtcbiAgICAgICAgcm9vdEZvcm1Qcm9wZXJ0eS5ub25FbXB0eVZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrXG4gICAgICAgICk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJvb3RGb3JtUHJvcGVydHkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5ID0gcm9vdEZvcm1Qcm9wZXJ0eTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclZhbGlkYXRvcnMoKSB7XG4gICAgdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy52YWxpZGF0b3JzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gdGhpcy52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAodGhpcy52YWxpZGF0b3JzLmhhc093blByb3BlcnR5KHByb3BlcnR5UGF0aCkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5yZWdpc3RlcihcbiAgICAgICAgICBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgdGhpcy52YWxpZGF0b3JzW3Byb3BlcnR5UGF0aF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQWN0aW9ucygpIHtcbiAgICB0aGlzLmFjdGlvblJlZ2lzdHJ5LmNsZWFyKCk7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGlvbklkIGluIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMuYWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShhY3Rpb25JZCkpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25SZWdpc3RyeS5yZWdpc3RlcihhY3Rpb25JZCwgdGhpcy5hY3Rpb25zW2FjdGlvbklkXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=