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
310 lines (309 loc) • 27 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, ContentChildren, QueryList, ElementRef, EventEmitter } from '@angular/core';
import { merge } from 'rxjs';
import { filter } from 'rxjs/operators';
import { ActionRegistry } from '../../model/actionregistry';
import { SchemaPropertyType } from '../../schema';
import { TemplateSchemaService } from '../template-schema.service';
import { ButtonComponent } from '../button/button.component';
import { FieldParent } from './field-parent';
import { ItemComponent } from './item/item.component';
import { TemplateSchemaElementRegistry } from '../template-schema-element-registry';
var FieldComponent = /** @class */ (function (_super) {
tslib_1.__extends(FieldComponent, _super);
function FieldComponent(elementRef, templateSchemaService, templateRegistry, actionRegistry) {
var _this = _super.call(this) || this;
_this.elementRef = elementRef;
_this.templateSchemaService = templateSchemaService;
_this.templateRegistry = templateRegistry;
_this.actionRegistry = actionRegistry;
_this.schema = {};
// changes that can be reflected in the widget components without rebuild
_this.changes = new EventEmitter();
return _this;
}
/**
* @return {?}
*/
FieldComponent.prototype.getSchema = /**
* @return {?}
*/
function () {
var _this = this;
var _a = this.getFieldsSchema(this.childFields.filter(function (field) { return field !== _this; })), properties = _a.properties, items = _a.items, required = _a.required;
/** @type {?} */
var oneOf = this.getOneOf();
/** @type {?} */
var type;
if (!this.type && properties) {
type = SchemaPropertyType.Object;
}
else if (!this.type) {
type = SchemaPropertyType.String;
}
else {
type = this.type;
}
/** @type {?} */
var schema = /** @type {?} */ ({
type: type
});
if (this.title !== undefined) {
schema.title = this.title;
}
if (properties !== undefined) {
schema.properties = properties;
}
if (items !== undefined) {
schema.items = items;
}
// requried child fields
if (required !== undefined) {
schema.required = required;
}
if (oneOf !== undefined) {
schema.oneOf = oneOf;
}
if (this.description !== undefined) {
schema.description = this.description;
}
if (this.placeholder !== undefined) {
schema.placeholder = this.placeholder;
}
if (this.format !== undefined) {
schema.format = this.format;
}
if (this.widget !== undefined) {
schema.widget = this.widget;
}
if (this.readOnly !== undefined) {
schema.readOnly = this.readOnly;
}
/** @type {?} */
var buttons = this.getButtons();
if (buttons.length > 0) {
schema.buttons = buttons;
}
// @Input schema takes precedence
return Object.assign(schema, this.schema);
};
/**
* @return {?}
*/
FieldComponent.prototype.getValidators = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var childValidators = this.getFieldsValidators(/** @type {?} */ (this.childFields.filter(function (field) { return field !== _this; })));
/** @type {?} */
var _validators = childValidators.map(function (_a) {
var path = _a.path, validators = _a.validators;
return {
path: _this.path + path,
validators: validators
};
});
if (!this.validators) {
return _validators;
}
_validators.push({ path: this.path, validators: this.validators });
return _validators;
};
/**
* @param {?=} parentFieldPath
* @return {?}
*/
FieldComponent.prototype.register = /**
* @param {?=} parentFieldPath
* @return {?}
*/
function (parentFieldPath) {
var _this = this;
if (parentFieldPath === void 0) { parentFieldPath = ''; }
/** @type {?} */
var path = parentFieldPath + this.path;
this.templateRegistry.register(path, this);
if (this.childFields.length) {
this.childFields.forEach(function (field) {
if (field === _this) {
return;
}
field.register(path);
});
}
};
/**
* @param {?} changes
* @return {?}
*/
FieldComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
// TODO check for particular properties change (widget.id, validator, etc.)
if (changes["type"] || changes["name"] || changes["format"] || changes["validators"]) {
this.templateSchemaService.changed();
}
else {
// changes that dont need to rebuild the schema
if (this.childFields) {
/** @type {?} */
var schema = this.getSchema();
delete schema.name;
delete schema.format;
if (typeof schema.widget === 'string') {
delete schema.widget;
}
else if (schema.widget && schema.width.id) {
delete schema.widget.id;
}
this.changes.emit(schema);
}
}
/*
// this is old way to update controls on field input changes,
// now we have the to types, changes that need rebuild of schema and the
// ones that not rebuilding schema
const keys = Object.keys(changes);
for (const key of keys) {
if (!changes[key].isFirstChange()) {
// on any input change, force schema change generation
this.templateSchemaService.changed();
break;
}
}
*/
};
/**
* @return {?}
*/
FieldComponent.prototype.getOneOf = /**
* @return {?}
*/
function () {
if (this.childItems.length === 0) {
return;
}
/** @type {?} */
var items = this.childItems.map(function (_a) {
var value = _a.value, description = _a.description;
if (!Array.isArray(value)) {
return { enum: [value], description: description };
}
return { enum: value, description: description };
});
if (items.length === 0) {
return;
}
return items;
};
/**
* @return {?}
*/
FieldComponent.prototype.setTitleFromContent = /**
* @return {?}
*/
function () {
/** @type {?} */
var textContent = this.getTextContent(this.elementRef);
// title as @Input takes priority over content text
if (textContent && !this.title) {
this.title = textContent;
}
};
/**
* @return {?}
*/
FieldComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
// cache it
this.setTitleFromContent();
merge(this.childFields.changes, this.childItems.changes, this.childButtons.changes)
.pipe(filter(function (value) { return Boolean(value); }))
.subscribe(function () {
_this.templateSchemaService.changed();
});
};
FieldComponent.decorators = [
{ type: Component, args: [{
selector: 'sf-field',
template: "<ng-content ></ng-content>\n"
}] }
];
/** @nocollapse */
FieldComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: TemplateSchemaService },
{ type: TemplateSchemaElementRegistry },
{ type: ActionRegistry }
]; };
FieldComponent.propDecorators = {
childFields: [{ type: ContentChildren, args: [FieldComponent,] }],
childItems: [{ type: ContentChildren, args: [ItemComponent,] }],
childButtons: [{ type: ContentChildren, args: [ButtonComponent,] }],
name: [{ type: Input }],
type: [{ type: Input }],
format: [{ type: Input }],
required: [{ type: Input }],
readOnly: [{ type: Input }],
title: [{ type: Input }],
description: [{ type: Input }],
placeholder: [{ type: Input }],
widget: [{ type: Input }],
validators: [{ type: Input }],
schema: [{ type: Input }]
};
return FieldComponent;
}(FieldParent));
export { FieldComponent };
if (false) {
/** @type {?} */
FieldComponent.prototype.childFields;
/** @type {?} */
FieldComponent.prototype.childItems;
/** @type {?} */
FieldComponent.prototype.childButtons;
/** @type {?} */
FieldComponent.prototype.name;
/** @type {?} */
FieldComponent.prototype.type;
/** @type {?} */
FieldComponent.prototype.format;
/** @type {?} */
FieldComponent.prototype.required;
/** @type {?} */
FieldComponent.prototype.readOnly;
/** @type {?} */
FieldComponent.prototype.title;
/** @type {?} */
FieldComponent.prototype.description;
/** @type {?} */
FieldComponent.prototype.placeholder;
/** @type {?} */
FieldComponent.prototype.widget;
/** @type {?} */
FieldComponent.prototype.validators;
/** @type {?} */
FieldComponent.prototype.schema;
/** @type {?} */
FieldComponent.prototype.changes;
/** @type {?} */
FieldComponent.prototype.elementRef;
/** @type {?} */
FieldComponent.prototype.templateSchemaService;
/** @type {?} */
FieldComponent.prototype.templateRegistry;
/** @type {?} */
FieldComponent.prototype.actionRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi90ZW1wbGF0ZS1zY2hlbWEvZmllbGQvZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBSUwsZUFBZSxFQUVmLFNBQVMsRUFDVCxVQUFVLEVBS1YsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUNMLDZCQUE2QixFQUM5QixNQUFNLHFDQUFxQyxDQUFDOztJQVNULDBDQUFXO0lBZ0Q3Qyx3QkFDVSxZQUNBLHVCQUNFLGdCQUErQyxFQUMvQyxjQUE4QjtRQUoxQyxZQU1FLGlCQUFPLFNBQ1I7UUFOUyxnQkFBVSxHQUFWLFVBQVU7UUFDViwyQkFBcUIsR0FBckIscUJBQXFCO1FBQ25CLHNCQUFnQixHQUFoQixnQkFBZ0IsQ0FBK0I7UUFDL0Msb0JBQWMsR0FBZCxjQUFjLENBQWdCO3VCQVQ1QixFQUFHOzt3QkFHUCxJQUFJLFlBQVksRUFBRTs7S0FTM0I7Ozs7SUFFRCxrQ0FBUzs7O0lBQVQ7UUFBQSxpQkFzRUM7UUFwRUMsc0dBQVEsMEJBQVUsRUFBRSxnQkFBSyxFQUFFLHNCQUFRLENBRWpDOztRQUVGLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7UUFFOUIsSUFBSSxJQUFJLENBQVM7UUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztTQUNsQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7U0FDbEM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xCOztRQUVELElBQU0sTUFBTSxxQkFBUTtZQUNsQixJQUFJLE1BQUE7U0FDTCxFQUFDO1FBRUYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUMzQjtRQUVELEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1NBQ2hDO1FBRUQsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDdEI7O1FBR0QsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDNUI7UUFFRCxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN0QjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDdkM7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3ZDO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUM3QjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDN0I7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2pDOztRQUVELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDMUI7O1FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUUzQzs7OztJQUVELHNDQUFhOzs7SUFBYjtRQUFBLGlCQW1CQzs7UUFoQkMsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixtQkFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLEtBQUssS0FBSSxFQUFkLENBQWMsQ0FBQyxFQUMxRCxDQUFDOztRQUNGLElBQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBQyxFQUFvQjtnQkFBbEIsY0FBSSxFQUFFLDBCQUFVO1lBQ3pELE1BQU0sQ0FBQztnQkFDTCxJQUFJLEVBQUUsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJO2dCQUN0QixVQUFVLFlBQUE7YUFDWCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsV0FBVyxDQUFDO1NBQ3BCO1FBRUQsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNuRSxNQUFNLENBQUMsV0FBVyxDQUFDO0tBQ3BCOzs7OztJQUVELGlDQUFROzs7O0lBQVIsVUFBUyxlQUFvQjtRQUE3QixpQkFZQztRQVpRLGdDQUFBLEVBQUEsb0JBQW9COztRQUMzQixJQUFNLElBQUksR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLO2dCQUM3QixFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSSxDQUFDLENBQUMsQ0FBQztvQkFDbkIsTUFBTSxDQUFDO2lCQUNSO2dCQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEIsQ0FBQyxDQUFDO1NBQ0o7S0FDRjs7Ozs7SUFFRCxvQ0FBVzs7OztJQUFYLFVBQVksT0FBc0I7O1FBR2hDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sWUFBUyxPQUFPLFFBQUssSUFBSSxPQUFPLFVBQU8sSUFBSSxPQUFPLGNBQVcsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RDO1FBQUMsSUFBSSxDQUFDLENBQUM7O1lBRU4sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7O2dCQUNyQixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDdEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUN0QjtnQkFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7aUJBQ3pCO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7Ozs7Ozs7Ozs7Ozs7O0tBaUJGOzs7O0lBR08saUNBQVE7Ozs7UUFFZCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQztTQUNSOztRQUVELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBc0I7Z0JBQXBCLGdCQUFLLEVBQUUsNEJBQVc7WUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxhQUFBLEVBQUUsQ0FBQzthQUN2QztZQUVELE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxhQUFBLEVBQUUsQ0FBQztTQUNyQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxDQUFDO1NBQ1I7UUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDOzs7OztJQUlQLDRDQUFtQjs7Ozs7UUFDekIsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7O1FBR3pELEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1NBQzFCOzs7OztJQUdILDJDQUFrQjs7O0lBQWxCO1FBQUEsaUJBY0M7O1FBWEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IsS0FBSyxDQUNILElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQzFCO2FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEtBQUssSUFBSyxPQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBZCxDQUFjLENBQUMsQ0FBQzthQUN2QyxTQUFTLENBQUM7WUFDVCxLQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEMsQ0FBQyxDQUFDO0tBQ0o7O2dCQTVQRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFFBQVEsRUFBRSw4QkFDWDtpQkFDQTs7OztnQkFoQ0MsVUFBVTtnQkFnQkgscUJBQXFCO2dCQU81Qiw2QkFBNkI7Z0JBWHRCLGNBQWM7Ozs4QkF3QnBCLGVBQWUsU0FBQyxjQUFjOzZCQUc5QixlQUFlLFNBQUMsYUFBYTsrQkFHN0IsZUFBZSxTQUFDLGVBQWU7dUJBRy9CLEtBQUs7dUJBR0wsS0FBSzt5QkFHTCxLQUFLOzJCQUdMLEtBQUs7MkJBR0wsS0FBSzt3QkFHTCxLQUFLOzhCQUdMLEtBQUs7OEJBR0wsS0FBSzt5QkFHTCxLQUFLOzZCQUdMLEtBQUs7eUJBR0wsS0FBSzs7eUJBcEZSO0VBMENvQyxXQUFXO1NBQWxDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBWaWV3Q2hpbGQsXG4gIFF1ZXJ5TGlzdCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlLFxuICBPbkNoYW5nZXMsXG4gIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvYWN0aW9uJztcbmltcG9ydCB7IEFjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWwvYWN0aW9ucmVnaXN0cnknO1xuaW1wb3J0IHsgU2NoZW1hUHJvcGVydHlUeXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hJztcblxuaW1wb3J0IHsgVGVtcGxhdGVTY2hlbWFFbGVtZW50IH0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hLWVsZW1lbnQnO1xuaW1wb3J0IHsgVGVtcGxhdGVTY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBGaWVsZFBhcmVudCB9IGZyb20gJy4vZmllbGQtcGFyZW50JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgeyBJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9pdGVtL2l0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG59IGZyb20gJy4uL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcblxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NmLWZpZWxkJyxcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudCA+PC9uZy1jb250ZW50PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZENvbXBvbmVudCBleHRlbmRzIEZpZWxkUGFyZW50XG5pbXBsZW1lbnRzIEZpZWxkLCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRmllbGRDb21wb25lbnQpXG4gIGNoaWxkRmllbGRzOiBRdWVyeUxpc3Q8RmllbGRDb21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSXRlbUNvbXBvbmVudClcbiAgY2hpbGRJdGVtczogUXVlcnlMaXN0PEl0ZW1Db21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnV0dG9uQ29tcG9uZW50KVxuICBjaGlsZEJ1dHRvbnM6IFF1ZXJ5TGlzdDxCdXR0b25Db21wb25lbnQ+O1xuXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICB0eXBlOiBTY2hlbWFQcm9wZXJ0eVR5cGU7XG5cbiAgQElucHV0KClcbiAgZm9ybWF0OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgdGl0bGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgd2lkZ2V0OiBzdHJpbmcgfCBvYmplY3Q7XG5cbiAgQElucHV0KClcbiAgdmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdO1xuXG4gIEBJbnB1dCgpXG4gIHNjaGVtYTogYW55ID0geyB9O1xuXG4gIC8vIGNoYW5nZXMgdGhhdCBjYW4gYmUgcmVmbGVjdGVkIGluIHRoZSB3aWRnZXQgY29tcG9uZW50cyB3aXRob3V0IHJlYnVpbGRcbiAgY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVNjaGVtYVNlcnZpY2U6IFRlbXBsYXRlU2NoZW1hU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdGVtcGxhdGVSZWdpc3RyeTogVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnksXG4gICAgcHJvdGVjdGVkIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldFNjaGVtYSgpOiBhbnkge1xuXG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzLCBpdGVtcywgcmVxdWlyZWQgfSA9IHRoaXMuZ2V0RmllbGRzU2NoZW1hKFxuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQgIT09IHRoaXMpXG4gICAgKTtcblxuICAgIGNvbnN0IG9uZU9mID0gdGhpcy5nZXRPbmVPZigpO1xuXG4gICAgbGV0IHR5cGU6IHN0cmluZztcbiAgICBpZiAoIXRoaXMudHlwZSAmJiBwcm9wZXJ0aWVzKSB7XG4gICAgICB0eXBlID0gU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnR5cGUpIHtcbiAgICAgIHR5cGUgPSBTY2hlbWFQcm9wZXJ0eVR5cGUuU3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gdGhpcy50eXBlO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IDxhbnk+e1xuICAgICAgdHlwZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEudGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICBpZiAoaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLml0ZW1zID0gaXRlbXM7XG4gICAgfVxuXG4gICAgLy8gcmVxdXJpZWQgY2hpbGQgZmllbGRzXG4gICAgaWYgKHJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5yZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgIH1cblxuICAgIGlmIChvbmVPZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEub25lT2YgPSBvbmVPZjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5mb3JtYXQgPSB0aGlzLmZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLndpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuZ2V0QnV0dG9ucygpO1xuICAgIGlmIChidXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHNjaGVtYS5idXR0b25zID0gYnV0dG9ucztcbiAgICB9XG5cbiAgICAvLyBASW5wdXQgc2NoZW1hIHRha2VzIHByZWNlZGVuY2VcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzY2hlbWEsIHRoaXMuc2NoZW1hKTtcblxuICB9XG5cbiAgZ2V0VmFsaWRhdG9ycygpOiB7IHBhdGg6IHN0cmluZywgdmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdIH1bXSB7XG5cbiAgICAvLyByZWdpc3RlcmluZyB2YWxpZGF0b3IgaGVyZSBpcyBub3QgcG9zc2libGUgc2luY2UgcHJvcCBmdWxsIHBhdGggaXMgbmVlZGVkXG4gICAgY29uc3QgY2hpbGRWYWxpZGF0b3JzID0gdGhpcy5nZXRGaWVsZHNWYWxpZGF0b3JzKFxuICAgICAgPEZpZWxkW10+dGhpcy5jaGlsZEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQgIT09IHRoaXMpXG4gICAgKTtcbiAgICBjb25zdCBfdmFsaWRhdG9ycyA9IGNoaWxkVmFsaWRhdG9ycy5tYXAoKHsgcGF0aCwgdmFsaWRhdG9ycyB9KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiB0aGlzLnBhdGggKyBwYXRoLFxuICAgICAgICB2YWxpZGF0b3JzXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRvcnMpIHtcbiAgICAgIHJldHVybiBfdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBfdmFsaWRhdG9ycy5wdXNoKHsgcGF0aDogdGhpcy5wYXRoLCB2YWxpZGF0b3JzOiB0aGlzLnZhbGlkYXRvcnMgfSk7XG4gICAgcmV0dXJuIF92YWxpZGF0b3JzO1xuICB9XG5cbiAgcmVnaXN0ZXIocGFyZW50RmllbGRQYXRoID0gJycpIHtcbiAgICBjb25zdCBwYXRoID0gcGFyZW50RmllbGRQYXRoICsgdGhpcy5wYXRoO1xuICAgIHRoaXMudGVtcGxhdGVSZWdpc3RyeS5yZWdpc3RlcihwYXRoLCB0aGlzKTtcbiAgICBpZiAodGhpcy5jaGlsZEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hpbGRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkID09PSB0aGlzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQucmVnaXN0ZXIocGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cbiAgICAvLyBUT0RPIGNoZWNrIGZvciBwYXJ0aWN1bGFyIHByb3BlcnRpZXMgY2hhbmdlICh3aWRnZXQuaWQsIHZhbGlkYXRvciwgZXRjLilcbiAgICBpZiAoY2hhbmdlcy50eXBlIHx8IGNoYW5nZXMubmFtZSB8fCBjaGFuZ2VzLmZvcm1hdCB8fCBjaGFuZ2VzLnZhbGlkYXRvcnMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hhbmdlcyB0aGF0IGRvbnQgbmVlZCB0byByZWJ1aWxkIHRoZSBzY2hlbWFcbiAgICAgIGlmICh0aGlzLmNoaWxkRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlbWEubmFtZTtcbiAgICAgICAgZGVsZXRlIHNjaGVtYS5mb3JtYXQ7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLndpZGdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZWxldGUgc2NoZW1hLndpZGdldDtcbiAgICAgICAgfSBlbHNlIGlmIChzY2hlbWEud2lkZ2V0ICYmIHNjaGVtYS53aWR0aC5pZCkge1xuICAgICAgICAgIGRlbGV0ZSBzY2hlbWEud2lkZ2V0LmlkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAvLyB0aGlzIGlzIG9sZCB3YXkgdG8gdXBkYXRlIGNvbnRyb2xzIG9uIGZpZWxkIGlucHV0IGNoYW5nZXMsXG4gICAgLy8gbm93IHdlIGhhdmUgdGhlIHRvIHR5cGVzLCBjaGFuZ2VzIHRoYXQgbmVlZCByZWJ1aWxkIG9mIHNjaGVtYSBhbmQgdGhlXG4gICAgLy8gb25lcyB0aGF0IG5vdCByZWJ1aWxkaW5nIHNjaGVtYVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjaGFuZ2VzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIWNoYW5nZXNba2V5XS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgLy8gb24gYW55IGlucHV0IGNoYW5nZSwgZm9yY2Ugc2NoZW1hIGNoYW5nZSBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgICAqL1xuXG5cbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRPbmVPZigpIHtcblxuICAgIGlmICh0aGlzLmNoaWxkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmNoaWxkSXRlbXMubWFwKCh7IHZhbHVlLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGVudW06IFt2YWx1ZV0sIGRlc2NyaXB0aW9uIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGVudW06IHZhbHVlLCBkZXNjcmlwdGlvbiB9O1xuICAgIH0pO1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG5cbiAgcHJpdmF0ZSBzZXRUaXRsZUZyb21Db250ZW50KCkge1xuICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGhpcy5nZXRUZXh0Q29udGVudCh0aGlzLmVsZW1lbnRSZWYpO1xuXG4gICAgLy8gIHRpdGxlIGFzIEBJbnB1dCB0YWtlcyBwcmlvcml0eSBvdmVyIGNvbnRlbnQgdGV4dFxuICAgIGlmICh0ZXh0Q29udGVudCAmJiAhdGhpcy50aXRsZSkge1xuICAgICAgdGhpcy50aXRsZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcblxuICAgIC8vIGNhY2hlIGl0XG4gICAgdGhpcy5zZXRUaXRsZUZyb21Db250ZW50KCk7XG5cbiAgICBtZXJnZShcbiAgICAgIHRoaXMuY2hpbGRGaWVsZHMuY2hhbmdlcyxcbiAgICAgIHRoaXMuY2hpbGRJdGVtcy5jaGFuZ2VzLFxuICAgICAgdGhpcy5jaGlsZEJ1dHRvbnMuY2hhbmdlc1xuICAgIClcbiAgICAucGlwZShmaWx0ZXIoKHZhbHVlKSA9PiBCb29sZWFuKHZhbHVlKSkpXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlU2NoZW1hU2VydmljZS5jaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cblxufVxuIl19