UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

533 lines (532 loc) 48.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import { TimePicker } from '../../../../../component/dataview/input/TimePicker.component'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; import { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { FormatterFactory } from '../../../../../service/FormatterFactory.service'; import { PhloxAppInfoService } from '../../../../../service/PhloxAppInfoService.service'; var /** @type {?} */ TYPE_NAME = "material-time-picker"; var /** @type {?} */ DEFAULT_BUTTON_ICON = 'access_time'; var /** @type {?} */ DEFAULT_BUTTON_POSITION = 'suffix'; var MaterialTimePicker = /** @class */ (function (_super) { tslib_1.__extends(MaterialTimePicker, _super); function MaterialTimePicker(elementRef, needFocusService, formatterFactory, phloxAppInfoService) { var _this = _super.call(this, elementRef, needFocusService, formatterFactory, phloxAppInfoService) || this; _this.buttonIcon = DEFAULT_BUTTON_ICON; _this.buttonPosition = DEFAULT_BUTTON_POSITION; return _this; } /** * @return {?} */ MaterialTimePicker.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); }; /** * @return {?} */ MaterialTimePicker.prototype.getClassMatFocused = /** * @return {?} */ function () { return this.isReadOnly() ? { 'mat-focused': this.isClassFocused() } : {}; }; /** * @param {?} $event * @return {?} */ MaterialTimePicker.prototype.doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { // Super will always hide popup in doLostFocus(). _super.prototype.doLostFocus.call(this, $event); this._classFocused = false; }; /** * @param {?} $event * @return {?} */ MaterialTimePicker.prototype.onClick = /** * @param {?} $event * @return {?} */ function ($event) { this._btnIconClick = true; }; /** * @param {?} event * @return {?} */ MaterialTimePicker.prototype.onFocus = /** * @param {?} event * @return {?} */ function (event) { _super.prototype.onFocus.call(this, event); this._classFocused = true; }; /** * @param {?} $event * @return {?} */ MaterialTimePicker.prototype.onFocusing = /** * @param {?} $event * @return {?} */ function ($event) { if (this._btnIconClick) { _super.prototype.onFocusing.call(this, $event); } }; /** * @param {?} $event * @return {?} */ MaterialTimePicker.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { if (this._btnIconClick || this.isActive()) { this._btnIconClick = false; _super.prototype.onLostFocusing.call(this, $event); } }; /** * @return {?} */ MaterialTimePicker.prototype.isClassFocused = /** * @return {?} */ function () { return this._classFocused; }; /** * @return {?} */ MaterialTimePicker.prototype.getButtonIcon = /** * @return {?} */ function () { return (!this.buttonIcon ? DEFAULT_BUTTON_ICON : this.buttonIcon); ; }; /** * @param {?} buttonIcon * @return {?} */ MaterialTimePicker.prototype.setButtonIcon = /** * @param {?} buttonIcon * @return {?} */ function (buttonIcon) { this.buttonIcon = buttonIcon; }; /** * @return {?} */ MaterialTimePicker.prototype.getButtonPosition = /** * @return {?} */ function () { return (!this.buttonPosition ? DEFAULT_BUTTON_POSITION : this.buttonPosition); }; /** * @param {?} buttonPosition * @return {?} */ MaterialTimePicker.prototype.setButtonPosition = /** * @param {?} buttonPosition * @return {?} */ function (buttonPosition) { this.buttonPosition = buttonPosition; }; /** * @return {?} */ MaterialTimePicker.prototype.getLabel = /** * @return {?} */ function () { return this.label; }; /** * @param {?} label * @return {?} */ MaterialTimePicker.prototype.setLabel = /** * @param {?} label * @return {?} */ function (label) { this.label = label; }; /** * @return {?} */ MaterialTimePicker.prototype.getDescription = /** * @return {?} */ function () { return this.description; }; /** * @param {?} description * @return {?} */ MaterialTimePicker.prototype.setDescription = /** * @param {?} description * @return {?} */ function (description) { this.description = description; }; MaterialTimePicker.TYPE_NAME = TYPE_NAME; MaterialTimePicker.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"material-input material-time-picker\" [style.width]=\"getWidth()\" [style.height]=\"getHeight()\">\n <div class=\"time-picker-wrapper\" [class.active]=\"isActive()\">\n <div class=\"time-picker-table\">\n <div>\n <div class=\"table-wrapper\">\n <mat-form-field [ngClass]=\"getClassMatFocused()\">\n <input matInput type=\"text\" placeholder=\"{{getLabel() | phx_text}}\" class=\"form-control\" [class.focus]=\"isActive()\" [disabled]=\"isDisabled()\"\n [class.dirty]=\"isDataDirty()\" [readonly]=\"isReadOnly()\" [value]=\"formattedData | phx_text\" (focus)=\"onFocusing($event)\" (blur)=\"onLostFocusing($event)\"\n (change)=\"onValueChanged($event)\" [class.normal]=\"isNormal()\" [class.success]=\"isSuccess()\" [class.warning]=\"isWarning()\" [class.error]=\"isError()\">\n <button mat-button *ngIf=\"getButtonIcon() && (formattedData && getButtonPosition() === 'suffix' && !(isDisabled() || isReadOnly()))\" (click)=\"onClick($event)\" matSuffix mat-icon-button>\n \t\t\t<mat-icon>{{getButtonIcon()}}</mat-icon>\n \t\t\t\t</button>\n \t\t\t\t<button mat-button *ngIf=\"getButtonIcon() && (formattedData && getButtonPosition() === 'prefix' && !(isDisabled() || isReadOnly()))\" (click)=\"onClick($event)\" matPrefix mat-icon-button>\n \t\t\t<mat-icon>{{getButtonIcon()}}</mat-icon>\n \t\t\t\t</button>\n \t\t\t\t<button mat-button *ngIf=\"getButtonIcon() && (formattedData && getButtonPosition() === 'suffix' && (isDisabled() || isReadOnly()))\" (click)=\"onClick($event)\" disabled matSuffix mat-icon-button>\n \t\t\t<mat-icon>{{getButtonIcon()}}</mat-icon>\n \t\t\t\t</button>\n \t\t\t\t<button mat-button *ngIf=\"getButtonIcon() && (formattedData && getButtonPosition() === 'prefix' && (isDisabled() || isReadOnly()))\" (click)=\"onClick($event)\" disabled matPrefix mat-icon-button>\n \t\t\t<mat-icon>{{getButtonIcon()}}</mat-icon>\n \t\t\t\t</button>\n </mat-form-field>\n <div class=\"time-picker-view\" [class.show]=\"isActive()\" [style.top]=\"getPopupPositionTop() ? getPopupPositionTop() + 'px' : undefined\" [style.left]=\"getPopupPositionLeft() ? getPopupPositionLeft() + 'px' : undefined\">\n <div class=\"time-view-wrapper\">\n <div class=\"time-view\" [class.not-open-sec]=\"_isNotOpenSecShow()\">\n <div class=\"icon-arrow-up\" (mousedown)=\"onUpArrow($event, HOUR)\"></div>\n <div *ngFor=\"let hour of getRangeHour(); let i = index;\" class=\"time-number\" [class.selected]=\"_isCurrentHourTime(hour)\" (mousedown)=\"onTimeClicked($event, hour, HOUR)\">\n {{hour | number:'2.0-0'}}\n </div>\n <div class=\"icon-arrow-down\" (mousedown)=\"onDownArrow($event, HOUR)\"></div>\n </div>\n <div class=\"time-view\" [class.not-open-sec]=\"_isNotOpenSecShow()\">\n <div class=\"icon-arrow-up\" (mousedown)=\"onUpArrow($event, MIN)\"></div>\n <div *ngFor=\"let min of getRangeMin(); let i = index;\" class=\"time-number\" [class.selected]=\"_isCurrentMinTime(min)\" (mousedown)=\"onTimeClicked($event, min, MIN)\">\n {{min | number:'2.0-0'}}\n </div>\n <div class=\"icon-arrow-down\" (mousedown)=\"onDownArrow($event, MIN)\"></div>\n </div>\n <div class=\"time-view\" [class.not-open-sec]=\"_isNotOpenSecShow()\">\n <div class=\"icon-arrow-up\" (mousedown)=\"onUpArrow($event, SEC)\"></div>\n <div *ngFor=\"let sec of getRangeSec(); let i = index;\" class=\"time-number\" [class.selected]=\"_isCurrentSecTime(sec)\" (mousedown)=\"onTimeClicked($event, sec, SEC)\">\n {{sec | number:'2.0-0'}}\n </div>\n <div class=\"icon-arrow-down\" (mousedown)=\"onDownArrow($event, SEC)\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div>\n <div class=\"table-wrapper description-wrapper\">\n <div class=\"validation\" [style.display]=\"getValidationResultMessage() ? undefined : 'none'\" [class.normal]=\"isNormal() && !isDisabled()\" [class.success]=\"isSuccess() && !isDisabled()\" [class.warning]=\"isWarning() && !isDisabled()\" [class.error]=\"isError() && !isDisabled()\">\n <ng-template [ngIf]=\"getValidationResultMessage()\" [ngIfElse]=\"validation_else\">\n {{getValidationResultMessage() | phx_text}}\n </ng-template>\n <ng-template #validation_else>\n <!-- We've to put whitespace if there is no validation msg to prevent empty dom -->\n <!-- since if validate msg's <div> dom is empty, the component positioning -->\n <!-- will be misplaced. -->\n {{ '&nbsp;' }}\n </ng-template>\n </div>\n <div class=\"description\" [style.display]=\"getValidationResultMessage() ? 'none' : undefined\" [class.normal]=\"isNormal() && !isDisabled()\" [class.success]=\"isSuccess() && !isDisabled()\" [class.warning]=\"isWarning() && !isDisabled()\" [class.error]=\"isError() && !isDisabled()\">\n <ng-template [ngIf]=\"getDescription()\" [ngIfElse]=\"description_else\">\n {{ getDescription() | phx_text }}\n </ng-template>\n <ng-template #description_else>\n <!-- We've to put whitespace if there is no description to prevent empty dom -->\n <!-- since if description's <div> dom is empty, the component positioning -->\n <!-- will be misplaced. -->\n {{ '&nbsp;' }}\n </ng-template>\n </div>\n </div>\n </div>\n <div>\n <div class=\"table-wrapper help-wrapper\">\n <div class=\"help\">{{getHelp() | phx_text}}</div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" },] }, ]; /** @nocollapse */ MaterialTimePicker.ctorParameters = function () { return [ { type: ElementRef, }, { type: NeedFocusService, }, { type: FormatterFactory, }, { type: PhloxAppInfoService, }, ]; }; MaterialTimePicker.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',] },], "dataPattern": [{ type: Input },], "range": [{ type: Input },], "hideSecond": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "label": [{ type: Input },], "description": [{ type: Input },], "buttonIcon": [{ type: Input },], "buttonPosition": [{ type: Input },], "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',] },], "beforeViewShowEvent": [{ type: Output, args: ['phxBeforeViewShow',] },], "viewShowEvent": [{ type: Output, args: ['phxViewShow',] },], "beforeViewHideEvent": [{ type: Output, args: ['phxBeforeViewHide',] },], "viewHideEvent": [{ type: Output, args: ['phxViewHide',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialTimePicker.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialTimePicker.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "help", void 0); tslib_1.__decorate([ Option('formatter.instance'), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "formatter", void 0); tslib_1.__decorate([ Option('formatter.name'), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "formatterName", void 0); tslib_1.__decorate([ Option('formatter.options'), tslib_1.__metadata("design:type", Object) ], MaterialTimePicker.prototype, "formatterOptions", void 0); tslib_1.__decorate([ Option('formatter.usePropertyValue'), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "formatterUsePropertyValue", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "dataPattern", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialTimePicker.prototype, "range", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTimePicker.prototype, "hideSecond", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "height", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "label", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "description", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "buttonIcon", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTimePicker.prototype, "buttonPosition", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeViewShow'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeViewShowEvent", void 0); tslib_1.__decorate([ Option('viewShow'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "viewShowEvent", void 0); tslib_1.__decorate([ Option('beforeViewHide'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "beforeViewHideEvent", void 0); tslib_1.__decorate([ Option('viewHide'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTimePicker.prototype, "viewHideEvent", void 0); return MaterialTimePicker; }(TimePicker)); export { MaterialTimePicker }; function MaterialTimePicker_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialTimePicker.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialTimePicker.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialTimePicker.propDecorators; /** @type {?} */ MaterialTimePicker.TYPE_NAME; /** @type {?} */ MaterialTimePicker.prototype.dataParent; /** @type {?} */ MaterialTimePicker.prototype.ignoreParentData; /** @type {?} */ MaterialTimePicker.prototype.data; /** @type {?} */ MaterialTimePicker.prototype.ignoreParentDisabled; /** @type {?} */ MaterialTimePicker.prototype.delegateHistory; /** @type {?} */ MaterialTimePicker.prototype.onDisabled; /** @type {?} */ MaterialTimePicker.prototype.onEnabled; /** @type {?} */ MaterialTimePicker.prototype.loadingEnabled; /** @type {?} */ MaterialTimePicker.prototype.i18nKey; /** @type {?} */ MaterialTimePicker.prototype.bypass; /** @type {?} */ MaterialTimePicker.prototype.options; /** @type {?} */ MaterialTimePicker.prototype.disabled; /** @type {?} */ MaterialTimePicker.prototype.field; /** @type {?} */ MaterialTimePicker.prototype.name; /** @type {?} */ MaterialTimePicker.prototype.typeOfData; /** @type {?} */ MaterialTimePicker.prototype.readOnly; /** @type {?} */ MaterialTimePicker.prototype.help; /** @type {?} */ MaterialTimePicker.prototype.formatter; /** @type {?} */ MaterialTimePicker.prototype.formatterName; /** @type {?} */ MaterialTimePicker.prototype.formatterOptions; /** @type {?} */ MaterialTimePicker.prototype.formatterUsePropertyValue; /** @type {?} */ MaterialTimePicker.prototype.dataPattern; /** @type {?} */ MaterialTimePicker.prototype.range; /** @type {?} */ MaterialTimePicker.prototype.hideSecond; /** @type {?} */ MaterialTimePicker.prototype.width; /** @type {?} */ MaterialTimePicker.prototype.height; /** @type {?} */ MaterialTimePicker.prototype.label; /** @type {?} */ MaterialTimePicker.prototype.description; /** @type {?} */ MaterialTimePicker.prototype.buttonIcon; /** @type {?} */ MaterialTimePicker.prototype.buttonPosition; /** @type {?} */ MaterialTimePicker.prototype.loadEvent; /** @type {?} */ MaterialTimePicker.prototype.startValidateEvent; /** @type {?} */ MaterialTimePicker.prototype.endValidateEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeFocusEvent; /** @type {?} */ MaterialTimePicker.prototype.focusEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialTimePicker.prototype.lostFocusEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeChangeEvent; /** @type {?} */ MaterialTimePicker.prototype.changeEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeViewShowEvent; /** @type {?} */ MaterialTimePicker.prototype.viewShowEvent; /** @type {?} */ MaterialTimePicker.prototype.beforeViewHideEvent; /** @type {?} */ MaterialTimePicker.prototype.viewHideEvent; /** @type {?} */ MaterialTimePicker.prototype._classFocused; /** @type {?} */ MaterialTimePicker.prototype._btnIconClick; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxUaW1lUGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRpbWVQaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBRTFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRW5GLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFekYscUJBQU0sU0FBUyxHQUFXLHNCQUFzQixDQUFDO0FBRWpELHFCQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztBQUMxQyxxQkFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7O0lBMkZELDhDQUFVO0lBMkpoRCw0QkFBWSxVQUFzQixFQUFFLGdCQUFrQyxFQUFFLGdCQUFrQyxFQUFFLG1CQUF3QztRQUFwSixZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxTQUkzRTtRQUZDLEtBQUksQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUM7UUFDdEMsS0FBSSxDQUFDLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQzs7S0FDL0M7Ozs7SUFFTSxxQ0FBUTs7OztRQUNiLGlCQUFNLFFB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TSxDQUFDLG1CQUFtQixDQUFDOzs7O1FBRzNCLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQzs7OztRQUlwQyxNQUFNLEVBQUU7Ozs7UUFJUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFJUixJQUFJLEVBQUU7UUFDTixNQUFNLEVBQUU7Ozs7UUFHUixJQUFJLEVBQUU7UUFDTixNQUFNLEVBQUU7Ozs7UUFJUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFNUixNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUloQyxNQUFNLENBQUMsZUFBZSxDQUFDOzBDQUNNLFlBQVk7OztRQUV6QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUV2QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUV2QyxNQUFNLENBQUMsT0FBTyxDQUFDOzBDQUNNLFlBQVk7OztRQUVqQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7MENBQ00sWUFBWTs7O1FBRTNDLE1BQU0sQ0FBQyxXQUFXLENBQUM7MENBQ00sWUFBWTs7O1FBRXJDLE1BQU0sQ0FBQyxjQUFjLENBQUM7MENBQ00sWUFBWTs7O1FBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7MENBQ00sWUFBWTs7O1FBSWxDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFMUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFcEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzBDQUNNLFlBQVk7OztRQUUxQyxNQUFNLENBQUMsVUFBVSxDQUFDOzBDQUNNLFlBQVk7OzZCQS9QdkM7RUF5R3dDLFVBQVU7U0FBckMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L1RpbWVQaWNrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JTmVlZEZvY3VzJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUZvcm1hdHRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL2Zvcm1hdHRlci9JRm9ybWF0dGVyJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQaGxveEFwcEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9QaGxveEFwcEluZm9TZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcIm1hdGVyaWFsLXRpbWUtcGlja2VyXCI7XHJcblxyXG5jb25zdCBERUZBVUxUX0JVVFRPTl9JQ09OID0gJ2FjY2Vzc190aW1lJztcclxuY29uc3QgREVGQVVMVF9CVVRUT05fUE9TSVRJT04gPSAnc3VmZml4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dCBtYXRlcmlhbC10aW1lLXBpY2tlclwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci13cmFwcGVyXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0FjdGl2ZSgpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItdGFibGVcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtuZ0NsYXNzXT1cImdldENsYXNzTWF0Rm9jdXNlZCgpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwie3tnZXRMYWJlbCgpIHwgcGh4X3RleHR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmZvY3VzXT1cImlzQWN0aXZlKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmRpcnR5XT1cImlzRGF0YURpcnR5KClcIiBbcmVhZG9ubHldPVwiaXNSZWFkT25seSgpXCIgW3ZhbHVlXT1cImZvcm1hdHRlZERhdGEgfCBwaHhfdGV4dFwiIChmb2N1cyk9XCJvbkZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKClcIiBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3MoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAnc3VmZml4JyAmJiAhKGlzRGlzYWJsZWQoKSB8fCBpc1JlYWRPbmx5KCkpKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgXHRcdFx0PG1hdC1pY29uPnt7Z2V0QnV0dG9uSWNvbigpfX08L21hdC1pY29uPlxyXG4gICAgICBcdFx0XHRcdDwvYnV0dG9uPlxyXG4gICAgICBcdFx0XHRcdDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAncHJlZml4JyAmJiAhKGlzRGlzYWJsZWQoKSB8fCBpc1JlYWRPbmx5KCkpKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBtYXRQcmVmaXggbWF0LWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgXHRcdFx0PG1hdC1pY29uPnt7Z2V0QnV0dG9uSWNvbigpfX08L21hdC1pY29uPlxyXG4gICAgICBcdFx0XHRcdDwvYnV0dG9uPlxyXG4gICAgICBcdFx0XHRcdDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAnc3VmZml4JyAmJiAoaXNEaXNhYmxlZCgpIHx8IGlzUmVhZE9ubHkoKSkpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiIGRpc2FibGVkIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICBcdFx0XHQ8bWF0LWljb24+e3tnZXRCdXR0b25JY29uKCl9fTwvbWF0LWljb24+XHJcbiAgICAgIFx0XHRcdFx0PC9idXR0b24+XHJcbiAgICAgIFx0XHRcdFx0PGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiZ2V0QnV0dG9uSWNvbigpICYmIChmb3JtYXR0ZWREYXRhICYmIGdldEJ1dHRvblBvc2l0aW9uKCkgPT09ICdwcmVmaXgnICYmIChpc0Rpc2FibGVkKCkgfHwgaXNSZWFkT25seSgpKSlcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgZGlzYWJsZWQgbWF0UHJlZml4IG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICAgIFx0XHRcdDxtYXQtaWNvbj57e2dldEJ1dHRvbkljb24oKX19PC9tYXQtaWNvbj5cclxuICAgICAgXHRcdFx0XHQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItdmlld1wiIFtjbGFzcy5zaG93XT1cImlzQWN0aXZlKClcIiBbc3R5bGUudG9wXT1cImdldFBvcHVwUG9zaXRpb25Ub3AoKSA/IGdldFBvcHVwUG9zaXRpb25Ub3AoKSArICdweCcgOiB1bmRlZmluZWRcIiBbc3R5bGUubGVmdF09XCJnZXRQb3B1cFBvc2l0aW9uTGVmdCgpID8gZ2V0UG9wdXBQb3NpdGlvbkxlZnQoKSArICdweCcgOiB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlldy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIEhPVVIpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBob3VyIG9mIGdldFJhbmdlSG91cigpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudEhvdXJUaW1lKGhvdXIpXCIgKG1vdXNlZG93bik9XCJvblRpbWVDbGlja2VkKCRldmVudCwgaG91ciwgSE9VUilcIj5cclxuICAgICAgICAgICAgICAgICAge3tob3VyIHwgbnVtYmVyOicyLjAtMCd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1hcnJvdy1kb3duXCIgKG1vdXNlZG93bik9XCJvbkRvd25BcnJvdygkZXZlbnQsIEhPVVIpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIE1JTilcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1pbiBvZiBnZXRSYW5nZU1pbigpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudE1pblRpbWUobWluKVwiIChtb3VzZWRvd24pPVwib25UaW1lQ2xpY2tlZCgkZXZlbnQsIG1pbiwgTUlOKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e21pbiB8IG51bWJlcjonMi4wLTAnfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiIChtb3VzZWRvd24pPVwib25Eb3duQXJyb3coJGV2ZW50LCBNSU4pXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIFNFQylcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlYyBvZiBnZXRSYW5nZVNlYygpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudFNlY1RpbWUoc2VjKVwiIChtb3VzZWRvd24pPVwib25UaW1lQ2xpY2tlZCgkZXZlbnQsIHNlYywgU0VDKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3NlYyB8IG51bWJlcjonMi4wLTAnfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiIChtb3VzZWRvd24pPVwib25Eb3duQXJyb3coJGV2ZW50LCBTRUMpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGRlc2NyaXB0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/IHVuZGVmaW5lZCA6ICdub25lJ1wiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKClcIiBbbmdJZkVsc2VdPVwidmFsaWRhdGlvbl9lbHNlXCI+XHJcbiAgICAgICAgICAgICAge3tnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpIHwgcGh4X3RleHR9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbGlkYXRpb25fZWxzZT5cclxuICAgICAgICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbXNnIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gc2luY2UgaWYgdmFsaWRhdGUgbXNnJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gd2lsbCBiZSBtaXNwbGFjZWQuIC0tPlxyXG4gICAgICAgICAgICAgIHt7ICcmbmJzcDsnIH19XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtzdHlsZS5kaXNwbGF5XT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgPyAnbm9uZScgOiB1bmRlZmluZWRcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Mud2FybmluZ109XCJpc1dhcm5pbmcoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKSAmJiAhaXNEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXREZXNjcmlwdGlvbigpXCIgW25nSWZFbHNlXT1cImRlc2NyaXB0aW9uX2Vsc2VcIj5cclxuICAgICAgICAgICAgICB7eyBnZXREZXNjcmlwdGlvbigpIHwgcGh4X3RleHQgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbl9lbHNlPlxyXG4gICAgICAgICAgICAgIDwhLS0gV2UndmUgdG8gcHV0IHdoaXRlc3BhY2UgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24gdG8gcHJldmVudCBlbXB0eSBkb20gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSBzaW5jZSBpZiBkZXNjcmlwdGlvbidzIDxkaXY+IGRvbSBpcyBlbXB0eSwgdGhlIGNvbXBvbmVudCBwb3NpdGlvbmluZyAtLT5cclxuICAgICAgICAgICAgICA8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cclxuICAgICAgICAgICAgICB7eyAnJm5ic3A7JyB9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGhlbHAtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlbHBcIj57e2dldEhlbHAoKSB8IHBoeF90ZXh0fX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbmBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFRpbWVQaWNrZXIgZXh0ZW5kcyBUaW1lUGlja2VyIGltcGxlbWVudHMgT25Jbml0LCBJTmVlZEZvY3VzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBuYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdHlwZU9mRGF0YTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHJlYWRPbmx5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3XHJcbiAgQElucHV0KCdmb3JtYXR0ZXInKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5pbnN0YW5jZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlcjogSUZvcm1hdHRlcjtcclxuICBASW5wdXQoJ2Zvcm1hdHRlck5hbWUnKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5uYW1lJylcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyTmFtZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnZm9ybWF0dGVyT3B0aW9ucycpXHJcbiAgQE9wdGlvbignZm9ybWF0dGVyLm9wdGlvbnMnKVxyXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJPcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KCdmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlJylcclxuICBAT3B0aW9uKCdmb3JtYXR0ZXIudXNlUHJvcGVydHlWYWx1ZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlclVzZVByb3BlcnR5VmFsdWU6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRlVGltZVBpY2tlciBcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGF0dGVybjogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIFRpbWVQaWNrZXJcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByYW5nZTogbnVtYmVyO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhpZGVTZWNvbmQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuXHJcbiAgLy8gLS0tIHNlbGZcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgbGFiZWw6IHN0cmluZztcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBidXR0b25JY29uOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgYnV0dG9uUG9zaXRpb246IHN0cmluZztcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcclxuICBAT3B0aW9uKCdmb2N1cycpXHJcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXHJcbiAgQE9wdGlvbignY2hhbmdlJylcclxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0ZVRpbWVQaWNrZXJcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVWaWV3U2hvdycpXHJcbiAgQE9wdGlvbignYmVmb3JlVmlld1Nob3cnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3U2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhWaWV3U2hvdycpXHJcbiAgQE9wdGlvbigndmlld1Nob3cnKVxyXG4gIHByb3RlY3RlZCB2aWV3U2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVWaWV3SGlkZScpXHJcbiAgQE9wdGlvbignYmVmb3JlVmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhWaWV3SGlkZScpXHJcbiAgQE9wdGlvbigndmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCB2aWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBfY2xhc3NGb2N1c2VkOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2J0bkljb25DbGljazogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZm9ybWF0dGVyRmFjdG9yeTogRm9ybWF0dGVyRmFjdG9yeSwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSwgZm9ybWF0dGVyRmFjdG9yeSwgcGhsb3hBcHBJbmZvU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5idXR0b25JY29uID0gREVGQVVMVF9CVVRUT05fSUNPTjtcclxuICAgIHRoaXMuYnV0dG9uUG9zaXRpb24gPSBERUZBVUxUX0JVVFRPTl9QT1NJVElPTjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfSBcclxuXHJcbiAgcHVibGljIGdldENsYXNzTWF0Rm9jdXNlZCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkT25seSgpID8geyAnbWF0LWZvY3VzZWQnOiB0aGlzLmlzQ2xhc3NGb2N1c2VkKCkgfSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIFN1cGVyIHdpbGwgYWx3YXlzIGhpZGUgcG9wdXAgaW4gZG9Mb3N0Rm9jdXMoKS5cclxuICAgIHN1cGVyLmRvTG9zdEZvY3VzKCRldmVudCk7XHJcbiAgICB0aGlzLl9jbGFzc0ZvY3VzZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2J0bkljb25DbGljayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBzdXBlci5vbkZvY3VzKGV2ZW50KTtcclxuICAgIHRoaXMuX2NsYXNzRm9jdXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2J0bkljb25DbGljaykge1xyXG4gICAgICBzdXBlci5vbkZvY3VzaW5nKCRldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9idG5JY29uQ2xpY2sgfHwgdGhpcy5pc0FjdGl2ZSgpKSB7XHJcbiAgICAgIHRoaXMuX2J0bkljb25DbGljayA9IGZhbHNlO1xyXG5cclxuICAgICAgc3VwZXIub25Mb3N0Rm9jdXNpbmcoJGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0NsYXNzRm9jdXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGFzc0ZvY3VzZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QnV0dG9uSWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICghdGhpcy5idXR0b25JY29uID8gREVGQVVMVF9CVVRUT05fSUNPTiA6IHRoaXMuYnV0dG9uSWNvbik7O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJ1dHRvbkljb24oYnV0dG9uSWNvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1dHRvbkljb24gPSBidXR0b25JY29uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJ1dHRvblBvc2l0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKCF0aGlzLmJ1dHRvblBvc2l0aW9uID8gREVGQVVMVF9CVVRUT05fUE9TSVRJT04gOiB0aGlzLmJ1dHRvblBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRCdXR0b25Qb3NpdGlvbihidXR0b25Qb3NpdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1dHRvblBvc2l0aW9uID0gYnV0dG9uUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xyXG4gIH1cclxufVxyXG4iXX0=