UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

893 lines (892 loc) 59.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core'; import { AbstractHasFormatterInputDataView } from './AbstractHasFormatterInputDataView'; import { BEFORE_KEY_UP_EVENT, KEY_UP_EVENT, BEFORE_KEY_DOWN_EVENT, KEY_DOWN_EVENT } from '../../../share/CustomEventType'; import { Option } from '../../../decorator/Option.decorator'; import { I18N } from '../../../decorator/I18N.decorator'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; import { EventUtils } from '../../../share/utils/EventUtils'; import { FormatterFactory } from '../../../service/FormatterFactory.service'; var /** @type {?} */ TYPE_NAME = "phx-text-box"; var TextBox = /** @class */ (function (_super) { tslib_1.__extends(TextBox, _super); function TextBox(elementRef, formatterFactory, needFocusService) { var _this = _super.call(this, elementRef, formatterFactory, needFocusService) || this; _this.beforeKeyUpEvent = new EventEmitter(); _this.keyUpEvent = new EventEmitter(); _this.beforeKeyDownEvent = new EventEmitter(); _this.keyDownEvent = new EventEmitter(); return _this; } /** * @return {?} */ TextBox.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); this.checkType(); }; /** * @return {?} */ TextBox.prototype.revertOriginalToData = /** * @return {?} */ function () { this.formattedData = this.originalValue; }; /** * @return {?} */ TextBox.prototype.checkType = /** * @return {?} */ function () { if (this.type === null || this.type === undefined || typeof this.type !== 'string' || this.type === '') { this.type = 'text'; } if (this.type.trim().toLowerCase() !== 'text' && this.type.trim().toLowerCase() !== 'password' && this.type.trim().toLowerCase() !== 'number') { // Only allow to possible values. // If not, use default value as "text". this.type = 'text'; } }; /** * @param {?} inputValue * @param {?} results * @return {?} */ TextBox.prototype.onValidationEnd = /** * @param {?} inputValue * @param {?} results * @return {?} */ function (inputValue, results) { //! do sthing }; /** * @param {?} data * @param {?} inputVal * @return {?} */ TextBox.prototype.onDataChange = /** * @param {?} data * @param {?} inputVal * @return {?} */ function (data, inputVal) { }; /** * @param {?} $event * @return {?} */ TextBox.prototype.doFocus = /** * @param {?} $event * @return {?} */ function ($event) { if (this.elementRef) { $(this.elementRef.nativeElement).find('input').focus(); } }; /** * @param {?} inputVal * @param {?=} $event * @param {?=} fireEvent * @return {?} */ TextBox.prototype.setInputValue = /** * @param {?} inputVal * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function (inputVal, $event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } var /** @type {?} */ oldValue = this.getInputValue(); EventUtils.handleBrowserEvent(this, 'beforeChangeEvent', $event, fireEvent, function ($event) { // doEvent // Set input value into data object. // doEvent // Set input value into data object. _this._setValueToData(inputVal); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeChangeEvent(oldValue, inputVal, true, $event); }, function ($event) { // emitAfterEvent // emitAfterEvent _this.emitChangeEvent(oldValue, inputVal, true, $event); }, function ($event) { // doPrevented if ($event !== null && $event !== undefined) { (/** @type {?} */ ($event.target)).value = (oldValue !== null && oldValue !== undefined) ? oldValue : ""; } }, 'inputValue'); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @param {?} $event * @return {?} */ TextBox.prototype.doKeyUp = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @param {?} $event * @return {?} */ TextBox.prototype.doKeyDown = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @param {?} $event * @return {?} */ TextBox.prototype.emitBeforeKeyUpEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } var /** @type {?} */ data = { data: this.data, value: inputText }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_KEY_UP_EVENT, this, data, $event); this.beforeKeyUpEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.emitKeyUpEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } var /** @type {?} */ data = { data: this.data, value: inputText }; var /** @type {?} */ ev = EventUtils.newCustomEvent(KEY_UP_EVENT, this, data, $event); this.keyUpEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.emitBeforeKeyDownEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } var /** @type {?} */ data = { data: this.data, value: inputText }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_KEY_DOWN_EVENT, this, data, $event); this.beforeKeyDownEvent.emit(ev); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.emitKeyDownEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } var /** @type {?} */ data = { data: this.data, value: inputText }; var /** @type {?} */ ev = EventUtils.newCustomEvent(KEY_DOWN_EVENT, this, data, $event); this.keyDownEvent.emit(ev); }; /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ TextBox.prototype.onKeyUp = /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeKeyUpEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.doKeyUp($event); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeKeyUpEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitKeyUpEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ TextBox.prototype.onKeyDown = /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeKeyDownEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.doKeyDown($event); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeKeyDownEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitKeyDownEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.onValueChanged = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } this.setFormattedData(inputText, $event); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.onFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.setFocusingComponent(this, $event); }; /** * @param {?} $event * @return {?} */ TextBox.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.resetFocusingComponent($event); }; /** * @return {?} */ TextBox.prototype.isSelfDataDirty = /** * @return {?} */ function () { var /** @type {?} */ d1 = (this.originalValue === null || typeof this.originalValue === 'undefined') ? '' : this.originalValue; var /** @type {?} */ d2 = (this.formattedData === null || typeof this.formattedData === 'undefined') ? '' : this.formattedData; // check array open this is u want to check array try { var /** @type {?} */ jsonD1 = JSON.stringify(d1); var /** @type {?} */ jsonD2 = JSON.stringify(d2); if (jsonD1 !== jsonD2) { return true; } else { return false; } } catch (/** @type {?} */ error) { // error } if (d1 !== d2) { return true; } return false; }; /** * @param {?} data * @return {?} */ TextBox.prototype.setData = /** * @param {?} data * @return {?} */ function (data) { _super.prototype.setData.call(this, data); if (!this._isSetOriginal) { this.originalValue = AbstractHasFormatterInputDataView.resolveFormattedData(this.formatter, AbstractHasFormatterInputDataView.resolveInputValue(this.field, data)); this._isSetOriginal = true; } }; /** * @param {?} data * @return {?} */ TextBox.prototype.selfSaveData = /** * @param {?} data * @return {?} */ function (data) { this.originalValue = AbstractHasFormatterInputDataView.resolveFormattedData(this.formatter, AbstractHasFormatterInputDataView.resolveInputValue(this.field, data)); }; /** * @return {?} */ TextBox.prototype.selfResetData = /** * @return {?} */ function () { this.revertOriginalToData(); }; /** * @return {?} */ TextBox.prototype.resetOriginalData = /** * @return {?} */ function () { this._isSetOriginal = false; this.originalValue = undefined; }; /** * @param {?} options * @return {?} */ TextBox.prototype.setOptions = /** * @param {?} options * @return {?} */ function (options) { _super.prototype.setOptions.call(this, options); this.checkType(); }; /** * @return {?} */ TextBox.prototype.getType = /** * @return {?} */ function () { return this.type; }; /** * @param {?} type * @return {?} */ TextBox.prototype.setType = /** * @param {?} type * @return {?} */ function (type) { this.type = type; this.checkType(); }; /** * @return {?} */ TextBox.prototype.getWidth = /** * @return {?} */ function () { return this.width; }; /** * @param {?} width * @return {?} */ TextBox.prototype.setWidth = /** * @param {?} width * @return {?} */ function (width) { this.width = width; }; /** * @return {?} */ TextBox.prototype.getHeight = /** * @return {?} */ function () { return this.height; }; /** * @param {?} height * @return {?} */ TextBox.prototype.setHeight = /** * @param {?} height * @return {?} */ function (height) { this.height = height; }; /** * @return {?} */ TextBox.prototype.getBeforeKeyDownEvent = /** * @return {?} */ function () { return this.beforeKeyDownEvent; }; /** * @param {?} event * @return {?} */ TextBox.prototype.setBeforeKeyDownEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeKeyDownEvent = event; }; /** * @return {?} */ TextBox.prototype.getKeyDownEvent = /** * @return {?} */ function () { return this.keyDownEvent; }; /** * @param {?} event * @return {?} */ TextBox.prototype.setKeyDownEvent = /** * @param {?} event * @return {?} */ function (event) { this.keyDownEvent = event; }; /** * @return {?} */ TextBox.prototype.getBeforeKeyUpEvent = /** * @return {?} */ function () { return this.beforeKeyUpEvent; }; /** * @param {?} event * @return {?} */ TextBox.prototype.setBeforeKeyUpEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeKeyUpEvent = event; }; /** * @return {?} */ TextBox.prototype.getKeyUpEvent = /** * @return {?} */ function () { return this.keyUpEvent; }; /** * @param {?} event * @return {?} */ TextBox.prototype.setKeyUpEvent = /** * @param {?} event * @return {?} */ function (event) { this.keyUpEvent = event; }; /** * @return {?} */ TextBox.prototype.getMaxLength = /** * @return {?} */ function () { return this.maxLength; }; TextBox.TYPE_NAME = TYPE_NAME; TextBox.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phx-text-box\">\n\t<div class=\"table-wrapper\">\n\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t<input [attr.maxlength]=\"getMaxLength()\" [style.width]=\"getWidth()\" [style.height]=\"getHeight()\" (keyup)=\"onKeyUp($event)\" (keydown)=\"onKeyDown($event)\" type=\"{{getType()}}\" class=\"form-control\" [disabled]=\"isDisabled()\" [readonly]=\"isReadOnly()\" [class.dirty]=\"isDataDirty()\" (focusin)=\"onFocusing($event)\" (blur)=\"onLostFocusing($event)\" (change)=\"onValueChanged($event)\" [value]=\"(formattedData === undefined || formattedData === null) ? '' : formattedData\">\n\t\t</div>\n\t</div>\n</div>\n" },] }, ]; /** @nocollapse */ TextBox.ctorParameters = function () { return [ { type: ElementRef, }, { type: FormatterFactory, }, { type: NeedFocusService, }, ]; }; TextBox.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "field": [{ type: Input },], "name": [{ type: Input },], "typeOfData": [{ type: Input },], "readOnly": [{ type: Input },], "help": [{ type: Input },], "formatter": [{ type: Input, args: ['formatter',] },], "formatterName": [{ type: Input, args: ['formatterName',] },], "formatterOptions": [{ type: Input, args: ['formatterOptions',] },], "formatterUsePropertyValue": [{ type: Input, args: ['formatterUsePropertyValue',] },], "type": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "maxLength": [{ type: Input, args: ['maxLength',] },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },], "endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeKeyUpEvent": [{ type: Output, args: ['phxBeforeKeyUp',] },], "keyUpEvent": [{ type: Output, args: ['phxKeyUp',] },], "beforeKeyDownEvent": [{ type: Output, args: ['phxBeforeKeyDown',] },], "keyDownEvent": [{ type: Output, args: ['phxKeyDown',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], TextBox.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], TextBox.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "help", void 0); tslib_1.__decorate([ Option('formatter.instance'), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "formatter", void 0); tslib_1.__decorate([ Option('formatter.name'), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "formatterName", void 0); tslib_1.__decorate([ Option('formatter.options'), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "formatterOptions", void 0); tslib_1.__decorate([ Option('formatter.usePropertyValue'), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "formatterUsePropertyValue", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "type", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "height", void 0); tslib_1.__decorate([ Option('maxLength'), tslib_1.__metadata("design:type", Number) ], TextBox.prototype, "maxLength", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeKeyUp'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeKeyUpEvent", void 0); tslib_1.__decorate([ Option('keyUp'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "keyUpEvent", void 0); tslib_1.__decorate([ Option('beforeKeyDown'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeKeyDownEvent", void 0); tslib_1.__decorate([ Option('keyDown'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "keyDownEvent", void 0); return TextBox; }(AbstractHasFormatterInputDataView)); export { TextBox }; function TextBox_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ TextBox.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ TextBox.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ TextBox.propDecorators; /** @type {?} */ TextBox.TYPE_NAME; /** @type {?} */ TextBox.prototype.dataParent; /** @type {?} */ TextBox.prototype.ignoreParentData; /** @type {?} */ TextBox.prototype.data; /** @type {?} */ TextBox.prototype.ignoreParentDisabled; /** @type {?} */ TextBox.prototype.delegateHistory; /** @type {?} */ TextBox.prototype.onDisabled; /** @type {?} */ TextBox.prototype.onEnabled; /** @type {?} */ TextBox.prototype.loadingEnabled; /** @type {?} */ TextBox.prototype.i18nKey; /** @type {?} */ TextBox.prototype.bypass; /** @type {?} */ TextBox.prototype.options; /** @type {?} */ TextBox.prototype.disabled; /** @type {?} */ TextBox.prototype.field; /** @type {?} */ TextBox.prototype.name; /** @type {?} */ TextBox.prototype.typeOfData; /** @type {?} */ TextBox.prototype.readOnly; /** @type {?} */ TextBox.prototype.help; /** @type {?} */ TextBox.prototype.formatter; /** @type {?} */ TextBox.prototype.formatterName; /** @type {?} */ TextBox.prototype.formatterOptions; /** @type {?} */ TextBox.prototype.formatterUsePropertyValue; /** @type {?} */ TextBox.prototype.type; /** @type {?} */ TextBox.prototype.width; /** @type {?} */ TextBox.prototype.height; /** @type {?} */ TextBox.prototype.maxLength; /** @type {?} */ TextBox.prototype.loadEvent; /** @type {?} */ TextBox.prototype.startValidateEvent; /** @type {?} */ TextBox.prototype.endValidateEvent; /** @type {?} */ TextBox.prototype.beforeFocusEvent; /** @type {?} */ TextBox.prototype.focusEvent; /** @type {?} */ TextBox.prototype.beforeLostFocusEvent; /** @type {?} */ TextBox.prototype.lostFocusEvent; /** @type {?} */ TextBox.prototype.beforeChangeEvent; /** @type {?} */ TextBox.prototype.changeEvent; /** @type {?} */ TextBox.prototype.beforeKeyUpEvent; /** @type {?} */ TextBox.prototype.keyUpEvent; /** @type {?} */ TextBox.prototype.beforeKeyDownEvent; /** @type {?} */ TextBox.prototype.keyDownEvent; /** @type {?} */ TextBox.prototype.originalValue; /** @type {?} */ TextBox.prototype._isSetOriginal; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dEJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvVGV4dEJveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRTdFLHFCQUFNLFNBQVMsR0FBVyxjQUFjLENBQUM7O0lBY1osbUNBQWlDO0lBc0k1RCxpQkFBWSxVQUFzQixFQUFFLGdCQUFrQyxFQUFFLGdCQUFrQztRQUExRyxZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxTQU10RDtRQUpDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3QyxLQUFJLENBQUMsWUFBWSxHQUFH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Q0FBQzswQ0FDTSxZQUFZOzs7UUFFM0MsTUFBTSxDQUFDLFdBQVcsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFckMsTUFBTSxDQUFDLGNBQWMsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQzswQ0FDTSxZQUFZOzs7UUFHbEMsTUFBTSxDQUFDLGFBQWEsQ0FBQzswQ0FFTSxZQUFZOzs7UUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQzswQ0FFTSxZQUFZOzs7UUFDakMsTUFBTSxDQUFDLGVBQWUsQ0FBQzswQ0FFTSxZQUFZOzs7UUFDekMsTUFBTSxDQUFDLFNBQVMsQ0FBQzswQ0FFTSxZQUFZOztrQkE1SnRDO0VBMEI2QixpQ0FBaUM7U0FBakQsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgQkVGT1JFX0tFWV9VUF9FVkVOVCwgS0VZX1VQX0VWRU5ULCBCRUZPUkVfS0VZX0RPV05fRVZFTlQsIEtFWV9ET1dOX0VWRU5UIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9WYWxpZGF0aW9uUmVzdWx0JztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7IElGb3JtYXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9mb3JtYXR0ZXIvSUZvcm1hdHRlcic7XG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXRleHQtYm94XCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtdGV4dC1ib3hcIj5cblx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0PGlucHV0IFthdHRyLm1heGxlbmd0aF09XCJnZXRNYXhMZW5ndGgoKVwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIHR5cGU9XCJ7e2dldFR5cGUoKX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgW3JlYWRvbmx5XT1cImlzUmVhZE9ubHkoKVwiIFtjbGFzcy5kaXJ0eV09XCJpc0RhdGFEaXJ0eSgpXCIgKGZvY3VzaW4pPVwib25Gb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIFt2YWx1ZV09XCIoZm9ybWF0dGVkRGF0YSA9PT0gdW5kZWZpbmVkIHx8IGZvcm1hdHRlZERhdGEgPT09IG51bGwpID8gJycgOiBmb3JtYXR0ZWREYXRhXCI+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFRleHRCb3ggZXh0ZW5kcyBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xuICBASW5wdXQoJ2Zvcm1hdHRlcicpXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5pbnN0YW5jZScpXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXI6IElGb3JtYXR0ZXI7XG4gIEBJbnB1dCgnZm9ybWF0dGVyTmFtZScpXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5uYW1lJylcbiAgcHJvdGVjdGVkIGZvcm1hdHRlck5hbWU6IHN0cmluZztcbiAgQElucHV0KCdmb3JtYXR0ZXJPcHRpb25zJylcbiAgQE9wdGlvbignZm9ybWF0dGVyLm9wdGlvbnMnKVxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyT3B0aW9uczogYW55O1xuICBASW5wdXQoJ2Zvcm1hdHRlclVzZVByb3BlcnR5VmFsdWUnKVxuICBAT3B0aW9uKCdmb3JtYXR0ZXIudXNlUHJvcGVydHlWYWx1ZScpXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlOiBib29sZWFuO1xuICAvLyAtLS0gc2VsZlxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHR5cGU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB3aWR0aDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGhlaWdodDogc3RyaW5nO1xuICBASW5wdXQoJ21heExlbmd0aCcpXG4gIEBPcHRpb24oJ21heExlbmd0aCcpXG4gIHByb3RlY3RlZCBtYXhMZW5ndGg6IG51bWJlcjtcblxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxuICBAT3B0aW9uKCdsb2FkJylcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxuICBAT3B0aW9uKCdzdGFydFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcbiAgQE9wdGlvbignZW5kVmFsaWRhdGUnKVxuICBwcm90ZWN0ZWQgZW5kVmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxuICBwcm90ZWN0ZWQgYmVmb3JlRm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcbiAgQE9wdGlvbignZm9jdXMnKVxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXG4gIEBPcHRpb24oJ2NoYW5nZScpXG4gIHByb3RlY3RlZCBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xuICAvLyAtLS0gc2VsZlxuICBAT3B0aW9uKCdiZWZvcmVLZXlVcCcpXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUtleVVwJylcbiAgcHJvdGVjdGVkIGJlZm9yZUtleVVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdrZXlVcCcpXG4gIEBPdXRwdXQoJ3BoeEtleVVwJylcbiAgcHJvdGVjdGVkIGtleVVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVLZXlEb3duJylcbiAgQE91dHB1dCgncGh4QmVmb3JlS2V5RG93bicpXG4gIHByb3RlY3RlZCBiZWZvcmVLZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdrZXlEb3duJylcbiAgQE91dHB1dCgncGh4S2V5RG93bicpXG4gIHByb3RlY3RlZCBrZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgb3JpZ2luYWxWYWx1ZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2lzU2V0T3JpZ2luYWw6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZm9ybWF0dGVyRmFjdG9yeTogRm9ybWF0dGVyRmFjdG9yeSwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGZvcm1hdHRlckZhY3RvcnksIG5lZWRGb2N1c1NlcnZpY2UpO1xuXG4gICAgdGhpcy5iZWZvcmVLZXlVcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMua2V5VXBFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUtleURvd25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmtleURvd25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5jaGVja1R5cGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2ZXJ0T3JpZ2luYWxUb0RhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtYXR0ZWREYXRhID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gbnVsbCB8fCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdGhpcy50eXBlICE9PSAnc3RyaW5nJyB8fCB0aGlzLnR5cGUgPT09ICcnKSB7XG4gICAgICB0aGlzLnR5cGUgPSAndGV4dCc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT09ICd0ZXh0J1xuICAgICAgJiYgdGhpcy50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9PSAncGFzc3dvcmQnXG4gICAgICAmJiB0aGlzLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBPbmx5IGFsbG93IHRvIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgIC8vIElmIG5vdCwgdXNlIGRlZmF1bHQgdmFsdWUgYXMgXCJ0ZXh0XCIuXG4gICAgICB0aGlzLnR5cGUgPSAndGV4dCdcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XG4gICAgLy8hIGRvIHN0aGluZ1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmKSB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcnJpZGUgUHJldmVudERlZmF1bHRcbiAgcHVibGljIHNldElucHV0VmFsdWUoaW5wdXRWYWw6IGFueSwgJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBvbGRWYWx1ZTogY