@stratio/egeo
Version:
474 lines • 36.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-form/st-form-field/st-form-field.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { Component, Input, Output, forwardRef, ChangeDetectionStrategy, EventEmitter, ViewChild, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR, NG_VALIDATORS, NgModel } from '@angular/forms';
import { StEgeo, StRequired } from '../../decorators/require-decorators';
var StFormFieldComponent = /** @class */ (function () {
function StFormFieldComponent() {
this.required = false;
this.showTooltip = true;
this.valueChange = new EventEmitter();
this.blur = new EventEmitter();
this.disabled = false; // To check disable
// To check disable
this.focus = false;
this.errorMessage = undefined;
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) {
});
this.onTouched = (/**
* @return {?}
*/
function () {
});
}
StFormFieldComponent_1 = StFormFieldComponent;
Object.defineProperty(StFormFieldComponent.prototype, "readOnly", {
get: /**
* @return {?}
*/
function () {
return this.schema && this.schema.value && this.schema.value.readOnly === true;
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
StFormFieldComponent.prototype.setValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.onChange(value);
this.valueChange.emit(value);
};
/**
* @param {?} enabled
* @return {?}
*/
StFormFieldComponent.prototype.setSwitchValue = /**
* @param {?} enabled
* @return {?}
*/
function (enabled) {
this.onChange(enabled || undefined);
this.valueChange.emit(enabled || undefined);
};
/**
* @param {?} control
* @return {?}
*/
StFormFieldComponent.prototype.validate = /**
* @param {?} control
* @return {?}
*/
function (control) {
if (this.templateModel && this.templateModel.control && this.templateModel.control.validator) {
return this.templateModel.control.validator(control);
}
};
/**
* @return {?}
*/
StFormFieldComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.schema.value && this.schema.value.enum) {
this.selectOptions = this.getSelectOptions();
}
setTimeout((/**
* @return {?}
*/
function () {
if (_this.default !== undefined && (_this.innerValue === undefined || _this.innerValue === null)) {
_this.innerValue = _this.default;
_this.onChange(_this.innerValue);
}
if (_this.schema.value.readOnly) {
_this.setDisabledState(true);
}
}));
};
/**
* @param {?} changes
* @return {?}
*/
StFormFieldComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.schema) {
this.selectOptions = this.getSelectOptions();
}
};
Object.defineProperty(StFormFieldComponent.prototype, "errors", {
get: /**
* @return {?}
*/
function () {
if (this.errorMessages) {
return this.errorMessages;
}
return {
generic: 'Error',
required: 'This field is required',
minLength: 'The field min length is ' + this.schema.value.minLength,
maxLength: 'The field max length is ' + this.schema.value.maxLength,
min: 'The number has to be higher than ' + (this.min - this.getInputStep()),
max: 'The number has to be minor than ' + (this.max + this.getInputStep()),
pattern: 'Invalid value'
};
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "type", {
get: /**
* @return {?}
*/
function () {
switch (this.schema.value.type) {
case 'string':
if (!this.schema.value.enum) {
return 'text';
}
else {
return 'select';
}
case 'integer':
return 'number';
default:
return this.schema.value.type;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "min", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.exclusiveMinimum ? this.schema.value.minimum + this.getInputStep() : this.schema.value.minimum;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "max", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.exclusiveMaximum ? this.schema.value.maximum - this.getInputStep() : this.schema.value.maximum;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "label", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.title;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "placeholder", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.examples && this.schema.value.examples[0] ? this.schema.value.examples[0] : '';
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "default", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.default;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "description", {
get: /**
* @return {?}
*/
function () {
if (this.showTooltip) {
return this.schema.value.description;
}
else {
return undefined;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "minLength", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.minLength;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "maxLength", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.maxLength;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StFormFieldComponent.prototype, "pattern", {
get: /**
* @return {?}
*/
function () {
return this.schema.value.pattern;
},
enumerable: true,
configurable: true
});
/**
* @param {?} type
* @return {?}
*/
StFormFieldComponent.prototype.hasType = /**
* @param {?} type
* @return {?}
*/
function (type) {
switch (type) {
case 'input':
return this.type === 'text' || this.type === 'number' || this.type === 'integer';
case 'switch':
return this.type === 'boolean' && this.hasDependencies;
case 'checkbox':
return this.type === 'boolean' && !this.hasDependencies;
default:
return this.type === type;
}
};
/**
* @param {?} value
* @return {?}
*/
StFormFieldComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.innerValue = value;
this.valueChange.emit(value);
this.onChange(value);
};
/**
* @param {?} fn
* @return {?}
*/
StFormFieldComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
StFormFieldComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} disable
* @return {?}
*/
StFormFieldComponent.prototype.setDisabledState = /**
* @param {?} disable
* @return {?}
*/
function (disable) {
if (this.templateModel && this.templateModel.control) {
if (disable) {
this.templateModel.control.disable();
}
else {
this.templateModel.control.enable();
}
}
};
/**
* @return {?}
*/
StFormFieldComponent.prototype.getInputStep = /**
* @return {?}
*/
function () {
if (this.schema.value.type === 'number') {
return 0.1;
}
else {
return 1;
}
};
/**
* @return {?}
*/
StFormFieldComponent.prototype.getSelectOptions = /**
* @return {?}
*/
function () {
/** @type {?} */
var options = [];
if (this.schema.value.enum) {
options.push((/** @type {?} */ ({ label: 'Select one option', value: undefined })));
/** @type {?} */
var enumValues = this.schema.value.enum;
enumValues.forEach((/**
* @param {?} value
* @return {?}
*/
function (value) {
options.push((/** @type {?} */ ({ label: value, value: value })));
}));
}
return options;
};
/**
* @return {?}
*/
StFormFieldComponent.prototype.onBlur = /**
* @return {?}
*/
function () {
this.blur.emit();
};
var StFormFieldComponent_1;
StFormFieldComponent.decorators = [
{ type: Component, args: [{
selector: 'st-form-field',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n\n<st-input *ngIf=\"hasType('input') && (!maxWidth || (!maxLength || maxLength < maxWidth) && (!minLength || minLength < maxWidth))\"\n #templateModel=\"ngModel\"\n [forceValidations]=\"forceValidations\"\n [fieldType]=\"type\"\n [label]=\"label\"\n [name]=\"schema.key\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"innerValue\"\n (ngModelChange)=\"setValue($event)\"\n [contextualHelp]=\"description\"\n [errors]=\"errors\"\n [default]=\"default\"\n [max]=\"max\"\n [min]=\"min\"\n [minlength]=\"minLength\"\n [maxlength]=\"maxLength\"\n [required]=\"required\"\n [pattern]=\"pattern\"\n [step]=\"getInputStep()\"\n [qaTag]=\"qaTag\"\n (blur)=\"onBlur()\">\n</st-input>\n\n<st-textarea *ngIf=\"hasType('input') && maxWidth && (maxLength >= maxWidth || minLength >= maxWidth)\"\n #templateModel=\"ngModel\"\n [label]=\"label\"\n [name]=\"schema.key\"\n [default]=\"default\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"innerValue\"\n (ngModelChange)=\"setValue($event)\"\n [contextualHelp]=\"description\"\n [errors]=\"errors\"\n [minlength]=\"minLength\"\n [maxlength]=\"maxLength\"\n [required]=\"required\"\n [pattern]=\"pattern\"\n [qaTag]=\"qaTag\"\n (blur)=\"onBlur()\">\n</st-textarea>\n\n<st-checkbox *ngIf=\"hasType('checkbox')\"\n #templateModel=\"ngModel\"\n [ngModel]=\"innerValue\"\n (ngModelChange)=\"setValue($event)\"\n [checked]=\"innerValue\"\n [value]=\"innerValue\"\n [name]=\"schema.key\"\n [contextualHelp]=\"description\"\n [qaTag]=\"qaTag\"><span>{{schema.value.title}}</span>\n</st-checkbox>\n\n<st-select *ngIf=\"hasType('select')\"\n #templateModel=\"ngModel\"\n [label]=\"label\"\n [tooltip]=\"description\"\n [name]=\"schema.key\"\n [placeholder]=\"placeholder\"\n [default]=\"default\"\n [options]=\"selectOptions\"\n [ngModel]=\"innerValue\"\n (ngModelChange)=\"setValue($event)\"\n [required]=\"required\"\n [id]=\"qaTag\">\n</st-select>\n\n<st-switch *ngIf=\"hasType('switch')\"\n #templateModel=\"ngModel\"\n [label]=\"schema.value.title\"\n [name]=\"schema.key\"\n [contextualHelp]=\"description\"\n [ngModel]=\"innerValue\"\n (ngModelChange)=\"setValue($event)\"\n [value]=\"innerValue\"\n [qaTag]=\"schema.key\"\n [id]=\"qaTag\">\n</st-switch>\n",
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/**
* @return {?}
*/
function () { return StFormFieldComponent_1; })), multi: true },
{ provide: NG_VALIDATORS, useExisting: forwardRef((/**
* @return {?}
*/
function () { return StFormFieldComponent_1; })), multi: true }
],
changeDetection: ChangeDetectionStrategy.OnPush,
host: {
class: 'st-form-field'
},
styles: ["@charset \"UTF-8\";"]
}] }
];
StFormFieldComponent.propDecorators = {
schema: [{ type: Input }],
required: [{ type: Input }],
errorMessages: [{ type: Input }],
qaTag: [{ type: Input }],
name: [{ type: Input }],
value: [{ type: Input }],
hasDependencies: [{ type: Input }],
forceValidations: [{ type: Input }],
showTooltip: [{ type: Input }],
maxWidth: [{ type: Input }],
valueChange: [{ type: Output }],
blur: [{ type: Output }],
templateModel: [{ type: ViewChild, args: ['templateModel', { static: false },] }],
readOnly: [{ type: HostBinding, args: ['class.read-only',] }]
};
tslib_1.__decorate([
StRequired(),
tslib_1.__metadata("design:type", Object)
], StFormFieldComponent.prototype, "schema", void 0);
StFormFieldComponent = StFormFieldComponent_1 = tslib_1.__decorate([
StEgeo()
], StFormFieldComponent);
return StFormFieldComponent;
}());
export { StFormFieldComponent };
if (false) {
/** @type {?} */
StFormFieldComponent.prototype.schema;
/** @type {?} */
StFormFieldComponent.prototype.required;
/** @type {?} */
StFormFieldComponent.prototype.errorMessages;
/** @type {?} */
StFormFieldComponent.prototype.qaTag;
/** @type {?} */
StFormFieldComponent.prototype.name;
/** @type {?} */
StFormFieldComponent.prototype.value;
/** @type {?} */
StFormFieldComponent.prototype.hasDependencies;
/** @type {?} */
StFormFieldComponent.prototype.forceValidations;
/** @type {?} */
StFormFieldComponent.prototype.showTooltip;
/** @type {?} */
StFormFieldComponent.prototype.maxWidth;
/** @type {?} */
StFormFieldComponent.prototype.valueChange;
/** @type {?} */
StFormFieldComponent.prototype.blur;
/** @type {?} */
StFormFieldComponent.prototype.templateModel;
/** @type {?} */
StFormFieldComponent.prototype.disabled;
/** @type {?} */
StFormFieldComponent.prototype.focus;
/** @type {?} */
StFormFieldComponent.prototype.errorMessage;
/** @type {?} */
StFormFieldComponent.prototype.selectOptions;
/** @type {?} */
StFormFieldComponent.prototype.innerValue;
/** @type {?} */
StFormFieldComponent.prototype.onChange;
/** @type {?} */
StFormFieldComponent.prototype.onTouched;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3RyYXRpby9lZ2VvLyIsInNvdXJjZXMiOlsibGliL3N0LWZvcm0vc3QtZm9ybS1maWVsZC9zdC1mb3JtLWZpZWxkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFNBQVMsRUFDVCxXQUFXLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBZSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7SUFHekU7UUFpQlksYUFBUSxHQUFZLEtBQUssQ0FBQztRQU8xQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUUzQixnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pELFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUdyRCxhQUFRLEdBQVksS0FBSyxDQUFDLENBQUMsbUJBQW1COztRQUM5QyxVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQVcsU0FBUyxDQUFDO1FBU3hDLGFBQVE7Ozs7UUFBRyxVQUFDLENBQU07UUFDbEIsQ0FBQyxFQUFBO1FBRUQsY0FBUzs7O1FBQUc7UUFDWixDQUFDLEVBQUE7SUEwS0osQ0FBQzs2QkF4TVksb0JBQW9CO0lBcUI5QixzQkFDSSwwQ0FBUTs7OztRQURaO1lBRUcsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDbEYsQ0FBQzs7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Q0wsS0FBSzttQ0FDTCxLQUFLOzhCQUNMLEtBQUs7MkJBQ0wsS0FBSzs4QkFDTCxNQUFNO3VCQUNOLE1BQU07Z0NBQ04sU0FBUyxTQUFDLGVBQWUsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7MkJBUTFDLFdBQVcsU0FBQyxpQkFBaUI7O0lBcEJQO1FBQWIsVUFBVSxFQUFFOzt3REFBYTtJQUR6QixvQkFBb0I7UUFmaEMsTUFBTSxFQUFFO09BZUksb0JBQW9CLENBd01oQztJQUFELDJCQUFDO0NBQUEsSUFBQTtTQXhNWSxvQkFBb0I7OztJQUM5QixzQ0FBbUM7O0lBQ25DLHdDQUFtQzs7SUFDbkMsNkNBQXFDOztJQUNyQyxxQ0FBdUI7O0lBQ3ZCLG9DQUFzQjs7SUFDdEIscUNBQW9COztJQUNwQiwrQ0FBa0M7O0lBQ2xDLGdEQUFtQzs7SUFDbkMsMkNBQXFDOztJQUNyQyx3Q0FBMEI7O0lBQzFCLDJDQUFtRTs7SUFDbkUsb0NBQTREOztJQUM1RCw2Q0FBb0U7O0lBRXBFLHdDQUFpQzs7SUFDakMscUNBQThCOztJQUM5Qiw0Q0FBd0M7O0lBQ3hDLDZDQUEyQzs7SUFDM0MsMENBQXVCOztJQU92Qix3Q0FDQzs7SUFFRCx5Q0FDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiDCqSAyMDE3IFN0cmF0aW8gQmlnIERhdGEgSW5jLiwgU3VjdXJzYWwgZW4gRXNwYcOxYS5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZO1xuICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqIFNlZSB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMC5cbiAqL1xuaW1wb3J0IHtcbiAgIENvbXBvbmVudCxcbiAgIE9uSW5pdCxcbiAgIElucHV0LFxuICAgT3V0cHV0LFxuICAgZm9yd2FyZFJlZixcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgRXZlbnRFbWl0dGVyLFxuICAgVmlld0NoaWxkLFxuICAgSG9zdEJpbmRpbmcsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybUNvbnRyb2wsIE5HX1ZBTElEQVRPUlMsIE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdElucHV0RXJyb3IgfSBmcm9tICcuLi8uLi9zdC1pbnB1dC9zdC1pbnB1dC5lcnJvci5tb2RlbCc7XG5pbXBvcnQgeyBTdEVnZW8sIFN0UmVxdWlyZWQgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3JlcXVpcmUtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBTdERyb3BEb3duTWVudUl0ZW0gfSBmcm9tICcuLi8uLi9zdC1kcm9wZG93bi1tZW51L3N0LWRyb3Bkb3duLW1lbnUuaW50ZXJmYWNlJztcblxuQFN0RWdlbygpXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnc3QtZm9ybS1maWVsZCcsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3QtZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnLi9zdC1mb3JtLWZpZWxkLmNvbXBvbmVudC5zY3NzJ10sXG4gICBwcm92aWRlcnM6IFtcbiAgICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN0Rm9ybUZpZWxkQ29tcG9uZW50KSwgbXVsdGk6IHRydWUgfSxcbiAgICAgIHsgcHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3RGb3JtRmllbGRDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9XG4gICBdLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICBob3N0OiB7XG4gICAgICBjbGFzczogJ3N0LWZvcm0tZmllbGQnXG4gICB9XG59KVxuXG5leHBvcnQgY2xhc3MgU3RGb3JtRmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgQElucHV0KCkgQFN0UmVxdWlyZWQoKSBzY2hlbWE6IGFueTtcbiAgIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gICBASW5wdXQoKSBlcnJvck1lc3NhZ2VzOiBTdElucHV0RXJyb3I7XG4gICBASW5wdXQoKSBxYVRhZzogc3RyaW5nO1xuICAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICAgQElucHV0KCkgdmFsdWU6IGFueTtcbiAgIEBJbnB1dCgpIGhhc0RlcGVuZGVuY2llczogYm9vbGVhbjtcbiAgIEBJbnB1dCgpIGZvcmNlVmFsaWRhdGlvbnM6IGJvb2xlYW47XG4gICBASW5wdXQoKSBzaG93VG9vbHRpcDogYm9vbGVhbiA9IHRydWU7XG4gICBASW5wdXQoKSBtYXhXaWR0aDogbnVtYmVyO1xuICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICBAVmlld0NoaWxkKCd0ZW1wbGF0ZU1vZGVsJywge3N0YXRpYzogZmFsc2V9KSB0ZW1wbGF0ZU1vZGVsOiBOZ01vZGVsO1xuXG4gICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVG8gY2hlY2sgZGlzYWJsZVxuICAgcHVibGljIGZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gICBwdWJsaWMgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICBwdWJsaWMgc2VsZWN0T3B0aW9uczogU3REcm9wRG93bk1lbnVJdGVtW107XG4gICBwdWJsaWMgaW5uZXJWYWx1ZTogYW55O1xuXG4gICBASG9zdEJpbmRpbmcoJ2NsYXNzLnJlYWQtb25seScpXG4gICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEudmFsdWUgJiYgdGhpcy5zY2hlbWEudmFsdWUucmVhZE9ubHkgPT09IHRydWU7XG4gICB9XG5cbiAgIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge1xuICAgfVxuXG4gICBvblRvdWNoZWQgPSAoKSA9PiB7XG4gICB9XG5cbiAgIHNldFZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgIH1cblxuICAgc2V0U3dpdGNoVmFsdWUoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgdGhpcy5vbkNoYW5nZShlbmFibGVkIHx8IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZW5hYmxlZCB8fCB1bmRlZmluZWQpO1xuICAgfVxuXG4gICB2YWxpZGF0ZShjb250cm9sOiBGb3JtQ29udHJvbCk6IGFueSB7XG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZU1vZGVsICYmIHRoaXMudGVtcGxhdGVNb2RlbC5jb250cm9sICYmIHRoaXMudGVtcGxhdGVNb2RlbC5jb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVNb2RlbC5jb250cm9sLnZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgIH1cbiAgIH1cblxuICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zY2hlbWEudmFsdWUgJiYgdGhpcy5zY2hlbWEudmFsdWUuZW51bSkge1xuICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zID0gdGhpcy5nZXRTZWxlY3RPcHRpb25zKCk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgIGlmICh0aGlzLmRlZmF1bHQgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pbm5lclZhbHVlID09PSB1bmRlZmluZWQgfHwgdGhpcy5pbm5lclZhbHVlID09PSBudWxsKSkge1xuICAgICAgICAgICAgdGhpcy5pbm5lclZhbHVlID0gdGhpcy5kZWZhdWx0O1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmlubmVyVmFsdWUpO1xuICAgICAgICAgfVxuICAgICAgICAgaWYgKHRoaXMuc2NoZW1hLnZhbHVlLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc2FibGVkU3RhdGUodHJ1ZSk7XG4gICAgICAgICB9XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzLnNjaGVtYSkge1xuICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbnMgPSB0aGlzLmdldFNlbGVjdE9wdGlvbnMoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgZ2V0IGVycm9ycygpOiBhbnkge1xuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlcykge1xuICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgIGdlbmVyaWM6ICdFcnJvcicsXG4gICAgICAgICByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxuICAgICAgICAgbWluTGVuZ3RoOiAnVGhlIGZpZWxkIG1pbiBsZW5ndGggaXMgJyArIHRoaXMuc2NoZW1hLnZhbHVlLm1pbkxlbmd0aCxcbiAgICAgICAgIG1heExlbmd0aDogJ1RoZSBmaWVsZCBtYXggbGVuZ3RoIGlzICcgKyB0aGlzLnNjaGVtYS52YWx1ZS5tYXhMZW5ndGgsXG4gICAgICAgICBtaW46ICdUaGUgbnVtYmVyIGhhcyB0byBiZSBoaWdoZXIgdGhhbiAnICsgKHRoaXMubWluIC0gdGhpcy5nZXRJbnB1dFN0ZXAoKSksXG4gICAgICAgICBtYXg6ICdUaGUgbnVtYmVyIGhhcyB0byBiZSBtaW5vciB0aGFuICcgKyAodGhpcy5tYXggKyB0aGlzLmdldElucHV0U3RlcCgpKSxcbiAgICAgICAgIHBhdHRlcm46ICdJbnZhbGlkIHZhbHVlJ1xuICAgICAgfTtcbiAgIH1cblxuICAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHN3aXRjaCAodGhpcy5zY2hlbWEudmFsdWUudHlwZSkge1xuICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEudmFsdWUuZW51bSkge1xuICAgICAgICAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICByZXR1cm4gJ3NlbGVjdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWEudmFsdWUudHlwZTtcbiAgICAgIH1cbiAgIH1cblxuICAgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnZhbHVlLmV4Y2x1c2l2ZU1pbmltdW0gPyB0aGlzLnNjaGVtYS52YWx1ZS5taW5pbXVtICsgdGhpcy5nZXRJbnB1dFN0ZXAoKSA6IHRoaXMuc2NoZW1hLnZhbHVlLm1pbmltdW07XG4gICB9XG5cbiAgIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS52YWx1ZS5leGNsdXNpdmVNYXhpbXVtID8gdGhpcy5zY2hlbWEudmFsdWUubWF4aW11bSAtIHRoaXMuZ2V0SW5wdXRTdGVwKCkgOiB0aGlzLnNjaGVtYS52YWx1ZS5tYXhpbXVtO1xuICAgfVxuXG4gICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS52YWx1ZS50aXRsZTtcbiAgIH1cblxuICAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEudmFsdWUuZXhhbXBsZXMgJiYgdGhpcy5zY2hlbWEudmFsdWUuZXhhbXBsZXNbMF0gPyB0aGlzLnNjaGVtYS52YWx1ZS5leGFtcGxlc1swXSA6ICcnO1xuICAgfVxuXG4gICBnZXQgZGVmYXVsdCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnZhbHVlLmRlZmF1bHQ7XG4gICB9XG5cbiAgIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgICAgaWYgKHRoaXMuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYS52YWx1ZS5kZXNjcmlwdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgfVxuXG4gICBnZXQgbWluTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEudmFsdWUubWluTGVuZ3RoO1xuICAgfVxuXG4gICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEudmFsdWUubWF4TGVuZ3RoO1xuICAgfVxuXG4gICBnZXQgcGF0dGVybigpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnZhbHVlLnBhdHRlcm47XG4gICB9XG5cbiAgIGhhc1R5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICd0ZXh0JyB8fCB0aGlzLnR5cGUgPT09ICdudW1iZXInIHx8IHRoaXMudHlwZSA9PT0gJ2ludGVnZXInO1xuICAgICAgICAgY2FzZSAnc3dpdGNoJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdib29sZWFuJyAmJiB0aGlzLmhhc0RlcGVuZGVuY2llcztcbiAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdib29sZWFuJyAmJiAhdGhpcy5oYXNEZXBlbmRlbmNpZXM7XG4gICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gdHlwZTtcbiAgICAgIH1cbiAgIH1cblxuICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgICB0aGlzLmlubmVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgIH1cblxuICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgfVxuXG4gICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgIH1cblxuICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZU1vZGVsICYmIHRoaXMudGVtcGxhdGVNb2RlbC5jb250cm9sKSB7XG4gICAgICAgICBpZiAoZGlzYWJsZSkge1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZU1vZGVsLmNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVNb2RlbC5jb250cm9sLmVuYWJsZSgpO1xuICAgICAgICAgfVxuICAgICAgfVxuICAgfVxuXG4gICBnZXRJbnB1dFN0ZXAoKTogbnVtYmVyIHtcbiAgICAgIGlmICh0aGlzLnNjaGVtYS52YWx1ZS50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgcmV0dXJuIDAuMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgIH1cblxuICAgZ2V0U2VsZWN0T3B0aW9ucygpOiBTdERyb3BEb3duTWVudUl0ZW1bXSB7XG4gICAgICBsZXQgb3B0aW9uczogU3REcm9wRG93bk1lbnVJdGVtW10gPSBbXTtcbiAgICAgIGlmICh0aGlzLnNjaGVtYS52YWx1ZS5lbnVtKSB7XG4gICAgICAgICBvcHRpb25zLnB1c2goPFN0RHJvcERvd25NZW51SXRlbT4geyBsYWJlbDogJ1NlbGVjdCBvbmUgb3B0aW9uJywgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IHRoaXMuc2NoZW1hLnZhbHVlLmVudW07XG4gICAgICAgICBlbnVtVmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goPFN0RHJvcERvd25NZW51SXRlbT4geyBsYWJlbDogdmFsdWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICB9XG5cbiAgIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgIHRoaXMuYmx1ci5lbWl0KCk7XG4gICB9XG59XG4iXX0=