UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

558 lines (557 loc) 47.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractHasFormatterInputDataView } from './AbstractHasFormatterInputDataView'; import { DateFormatter } from '../../../share/formatter/DateFormatter'; import { DateTimeUtils } from '../../../share/utils/DateTimeUtils'; import { Option } from '../../../decorator/Option.decorator'; import { EventUtils } from '../../../share/utils/EventUtils'; import { BEFORE_VIEW_SHOW_EVENT, VIEW_SHOW_EVENT, BEFORE_VIEW_HIDE_EVENT, VIEW_HIDE_EVENT } from '../../../share/CustomEventType'; /** * @abstract */ var AbstractDateTimePicker = /** @class */ (function (_super) { tslib_1.__extends(AbstractDateTimePicker, _super); function AbstractDateTimePicker(elementRef, formatterFactory, phloxAppInfoService, needFocusService) { var _this = _super.call(this, elementRef, formatterFactory, needFocusService) || this; _this.beforeViewShowEvent = new EventEmitter(); _this.viewShowEvent = new EventEmitter(); _this.beforeViewHideEvent = new EventEmitter(); _this.viewHideEvent = new EventEmitter(); phloxAppInfoService.getAppInfo().then(function (info) { _this.phloxAppInfo = info; }); _this._useDataPattern = false; return _this; } /** * @return {?} */ AbstractDateTimePicker.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); // Set DateFormatter as default value. if ((this.formatter === null || this.formatter === undefined) && (this.formatterName === null || this.formatterName === undefined)) { this.setFormatterName(DateFormatter.NAME); } // Set default fomatter's pattern if not specified. if (this.formatter !== null && this.formatter !== undefined && this.formatter.getName() === DateFormatter.NAME) { var /** @type {?} */ df = /** @type {?} */ (this.formatter); if (df.getPattern() === null || df.getPattern() === undefined) { // Use display format the same as data's pattern. df.setPattern(this.getDataPattern()); this._useDataPattern = true; } } if (!this.getDate()) { // Set default data value = current date time. var /** @type {?} */ now = new Date(); // Ignore milliseconds by default. now.setMilliseconds(0); this.setDate(now); } // We've to explicitly call this method even if it has been called in super.ngOnInt() // since the default date may be initialized after the super.ngOnInit() is called. this.selfSaveData(this.data); }; /** * @param {?=} $event * @return {?} */ AbstractDateTimePicker.prototype.emitBeforeViewShowEvent = /** * @param {?=} $event * @return {?} */ function ($event) { var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_SHOW_EVENT, this, data, $event); this.beforeViewShowEvent.emit(ev); }; /** * @param {?=} $event * @return {?} */ AbstractDateTimePicker.prototype.emitViewShowEvent = /** * @param {?=} $event * @return {?} */ function ($event) { var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_SHOW_EVENT, this, data, $event); this.viewShowEvent.emit(ev); }; /** * @param {?=} $event * @return {?} */ AbstractDateTimePicker.prototype.emitBeforeViewHideEvent = /** * @param {?=} $event * @return {?} */ function ($event) { var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_HIDE_EVENT, this, data, $event); this.beforeViewHideEvent.emit(ev); }; /** * @param {?=} $event * @return {?} */ AbstractDateTimePicker.prototype.emitViewHideEvent = /** * @param {?=} $event * @return {?} */ function ($event) { var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_HIDE_EVENT, this, data, $event); this.viewHideEvent.emit(ev); }; /** * @param {?} data * @return {?} */ AbstractDateTimePicker.prototype.selfSaveData = /** * @param {?} data * @return {?} */ function (data) { this.originalDate = this.getDate(); }; /** * @return {?} */ AbstractDateTimePicker.prototype.isSelfDataDirty = /** * @return {?} */ function () { var /** @type {?} */ date = this.getDate(); if (this.originalDate !== null && date === null || this.originalDate === null && date !== null) { return true; } if (typeof this.originalDate !== typeof date) { return true; } if (this.originalDate !== undefined && this.originalDate instanceof Date) { return this.compareDate(this.originalDate, date) !== 0; } else { try { return JSON.stringify(this.originalDate) !== JSON.stringify(date); } catch (/** @type {?} */ e) { return false; } } }; /** * @return {?} */ AbstractDateTimePicker.prototype.selfResetData = /** * @return {?} */ function () { this.setDate(this.originalDate); }; /** * @param {?} a * @param {?} b * @return {?} */ AbstractDateTimePicker.prototype.compareDate = /** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { if (!a && b) { return -1; } if (a && !b) { return 1; } if (!a && !b) { return 0; } return a.compareTo(b); }; /** * @param {?} data * @return {?} */ AbstractDateTimePicker.prototype.getTimeZoneDiff = /** * @param {?} data * @return {?} */ function (data) { if (this.formatter instanceof DateFormatter) { var /** @type {?} */ df = /** @type {?} */ (this.formatter); if (df.getTimeZone() !== null && typeof df.getTimeZone() !== 'undefined') { var /** @type {?} */ offsetHours = Math.floor(-data.getTimezoneOffset() / 60); var /** @type {?} */ offsetMins = -data.getTimezoneOffset() % 60; var /** @type {?} */ diff = (offsetHours * 100 + offsetMins); var /** @type {?} */ tzDiff = 0; if (typeof df.getTimeZone() === 'number') { tzDiff = diff - df.getTimeZone(); } else if (typeof df.getTimeZone() === 'string') { tzDiff = diff - DateTimeUtils.parseTimeZone(df.getTimeZone()); } return tzDiff; } } return 0; }; /** * @return {?} */ AbstractDateTimePicker.prototype.getDate = /** * @return {?} */ function () { // Get value from "this.data". var /** @type {?} */ obj = this.getInputValue(); if (obj === null || obj === undefined) { return obj; } if (this.typeOfData === null || this.typeOfData === undefined || this.typeOfData.toLowerCase() === AbstractDateTimePicker.TYPE_AUTO) { // Try to resolve "typeOfData" automatically. this.typeOfData = typeof obj; } if (this.typeOfData === 'string') { try { return Date.parseExact(obj, this.getDataPattern()); } catch (/** @type {?} */ err) { } try { // Try to parse using Date.parse() return Date.parse(obj); } catch (/** @type {?} */ err) { } } else if (this.typeOfData === 'number') { try { return new Date(obj); } catch (/** @type {?} */ err) { } } else if (this.typeOfData === 'object') { if (obj instanceof Date) { return new Date(obj.getTime()); } } // Could not parse data in any cases. return null; }; /** * @param {?} data * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractDateTimePicker.prototype.setDate = /** * @param {?} data * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function (data, $event, fireEvent) { var /** @type {?} */ date; // We accept these kinds of "data" and parse it into date. if (typeof data === 'string') { try { date = Date.parseExact(data, this.getDataPattern()); } catch (/** @type {?} */ err) { } if (date === null || typeof date === 'undefined') { try { date = Date.parse(data); } catch (/** @type {?} */ err) { } } } else if (typeof data === 'number') { try { date = new Date(data); } catch (/** @type {?} */ err) { } } else if (typeof data === 'object') { if (data instanceof Date) { date = new Date(data.getTime()); } } // Then, convert parsed "date" into "typeOfData". var /** @type {?} */ newData = date; if (newData !== null && newData !== undefined) { if (this.typeOfData === null || this.typeOfData === undefined || this.typeOfData.toLowerCase() === AbstractDateTimePicker.TYPE_AUTO) { // Try to resolve "typeOfData" automatically. this.typeOfData = typeof newData; } if (this.typeOfData === 'string') { newData = date.toString(this.getDataPattern()); } else if (this.typeOfData === 'number') { newData = date.getTime(); } else if (this.typeOfData === 'object') { newData = date; } } // Save it into "this.data". this.setInputValue(newData, $event, fireEvent); }; /** * @return {?} */ AbstractDateTimePicker.prototype.getBeforeViewShowEvent = /** * @return {?} */ function () { return this.beforeViewShowEvent; }; /** * @param {?} event * @return {?} */ AbstractDateTimePicker.prototype.setBeforeViewShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeViewShowEvent = event; }; /** * @return {?} */ AbstractDateTimePicker.prototype.getViewShowEvent = /** * @return {?} */ function () { return this.viewShowEvent; }; /** * @param {?} event * @return {?} */ AbstractDateTimePicker.prototype.setViewShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.viewShowEvent = event; }; /** * @return {?} */ AbstractDateTimePicker.prototype.getBeforeViewHideEvent = /** * @return {?} */ function () { return this.beforeViewHideEvent; }; /** * @param {?} event * @return {?} */ AbstractDateTimePicker.prototype.setBeforeViewHideEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeViewHideEvent = event; }; /** * @return {?} */ AbstractDateTimePicker.prototype.getViewHideEvent = /** * @return {?} */ function () { return this.viewHideEvent; }; /** * @param {?} event * @return {?} */ AbstractDateTimePicker.prototype.setViewHideEvent = /** * @param {?} event * @return {?} */ function (event) { this.viewHideEvent = event; }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractDateTimePicker.prototype.show = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeViewShowEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.doShow(); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeViewShowEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitViewShowEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractDateTimePicker.prototype.hide = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeViewHideEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.doHide(); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeViewHideEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitViewHideEvent($event); }, function ($event) { // doPrevented }); }; /** * @return {?} */ AbstractDateTimePicker.prototype.getDataPattern = /** * @return {?} */ function () { if (this.dataPattern === null || this.dataPattern === undefined) { return this.getDataPatternFromSetting(); } return this.dataPattern; }; /** * @param {?} dataPattern * @return {?} */ AbstractDateTimePicker.prototype.setDataPattern = /** * @param {?} dataPattern * @return {?} */ function (dataPattern) { this.dataPattern = dataPattern; }; /** * @return {?} */ AbstractDateTimePicker.prototype.getOriginalDate = /** * @return {?} */ function () { return this.originalDate; }; /** * @return {?} */ AbstractDateTimePicker.prototype.getDataPatternFromSetting = /** * @return {?} */ function () { if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) { return "yyyy-MM-dd"; } if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) { return "yyyy-MM-dd"; } if (this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN === null || this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN === undefined) { return "yyyy-MM-dd"; } return this.phloxAppInfo.settings.DEFAULT_DATA_DATE_PATTERN; }; tslib_1.__decorate([ Option('beforeViewShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "beforeViewShowEvent", void 0); tslib_1.__decorate([ Option('viewShow'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "viewShowEvent", void 0); tslib_1.__decorate([ Option('beforeViewHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "beforeViewHideEvent", void 0); tslib_1.__decorate([ Option('viewHide'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractDateTimePicker.prototype, "viewHideEvent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractDateTimePicker.prototype, "dataPattern", void 0); return AbstractDateTimePicker; }(AbstractHasFormatterInputDataView)); export { AbstractDateTimePicker }; function AbstractDateTimePicker_tsickle_Closure_declarations() { /** @type {?} */ AbstractDateTimePicker.prototype.beforeViewShowEvent; /** @type {?} */ AbstractDateTimePicker.prototype.viewShowEvent; /** @type {?} */ AbstractDateTimePicker.prototype.beforeViewHideEvent; /** @type {?} */ AbstractDateTimePicker.prototype.viewHideEvent; /** @type {?} */ AbstractDateTimePicker.prototype.dataPattern; /** @type {?} */ AbstractDateTimePicker.prototype.phloxAppInfo; /** @type {?} */ AbstractDateTimePicker.prototype.originalDate; /** @type {?} */ AbstractDateTimePicker.prototype._useDataPattern; /** * @abstract * @return {?} */ AbstractDateTimePicker.prototype.doHide = function () { }; /** * @abstract * @return {?} */ AbstractDateTimePicker.prototype.doShow = function () { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRlVGltZVBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdERhdGVUaW1lUGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUF5QixZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFHaEYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFNN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7O0lBRTdFLGtEQUFpQztJQWlCcEYsZ0NBQVksVUFBc0IsRUFBRSxnQkFBa0MsRUFBRSxtQkFBd0MsRUFDNUcsZ0JBQWtDO1FBRHRDLFlBRUUsa0JBQU0sVUFBVSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLFNBWXREO1FBVkMsS0FBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsS0FBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3hDLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlDLEtBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV4QyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxJQUFJO1lBQ3pDLEtBQUksQ0FBQyxZ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LE1BQU0sQ0FBQyxVQUFVLENBQUM7MENBQ00sWUFBWTs7O1FBQ3BDLE1BQU0sRUFBRTs7O2lDQTFCWDtFQWdCcUQsaUNBQWlDO1NBQWhFLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0SW5wdXREYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3RJbnB1dERhdGFWaWV3JztcclxuaW1wb3J0IHsgSUZvcm1hdHRlciB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL2Zvcm1hdHRlci9JRm9ybWF0dGVyJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3IH0gZnJvbSAnLi9BYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvZm9ybWF0dGVyL0RhdGVGb3JtYXR0ZXInO1xyXG5pbXBvcnQgeyBEYXRlVGltZVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRGF0ZVRpbWVVdGlscyc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgRGF0YVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRGF0YVV0aWxzJztcclxuaW1wb3J0IHsgcmVhZCB9IGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XHJcbmltcG9ydCB7IFBobG94QXBwSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL1BobG94QXBwSW5mb1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcclxuaW1wb3J0IHsgQkVGT1JFX1ZJRVdfU0hPV19FVkVOVCwgVklFV19TSE9XX0VWRU5ULCBCRUZPUkVfVklFV19ISURFX0VWRU5ULCBWSUVXX0hJREVfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0ZVRpbWVQaWNrZXIgZXh0ZW5kcyBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBAT3B0aW9uKCdiZWZvcmVWaWV3U2hvdycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZVZpZXdTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3ZpZXdTaG93JylcclxuICBwcm90ZWN0ZWQgdmlld1Nob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlVmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3B0aW9uKCd2aWV3SGlkZScpXHJcbiAgcHJvdGVjdGVkIHZpZXdIaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGF0dGVybjogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XHJcbiAgcHJvdGVjdGVkIG9yaWdpbmFsRGF0ZTogRGF0ZTtcclxuICBwcm90ZWN0ZWQgX3VzZURhdGFQYXR0ZXJuOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBmb3JtYXR0ZXJGYWN0b3J5OiBGb3JtYXR0ZXJGYWN0b3J5LCBwaGxveEFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlXHJcbiAgICAsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGZvcm1hdHRlckZhY3RvcnksIG5lZWRGb2N1c1NlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlVmlld1Nob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMudmlld1Nob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlVmlld0hpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMudmlld0hpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBwaGxveEFwcEluZm9TZXJ2aWNlLmdldEFwcEluZm8oKS50aGVuKChpbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMucGhsb3hBcHBJbmZvID0gaW5mbztcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3VzZURhdGFQYXR0ZXJuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIC8vIFNldCBEYXRlRm9ybWF0dGVyIGFzIGRlZmF1bHQgdmFsdWUuXHJcbiAgICBpZiAoKHRoaXMuZm9ybWF0dGVyID09PSBudWxsIHx8IHRoaXMuZm9ybWF0dGVyID09PSB1bmRlZmluZWQpICYmICh0aGlzLmZvcm1hdHRlck5hbWUgPT09IG51bGwgfHwgdGhpcy5mb3JtYXR0ZXJOYW1lID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgIHRoaXMuc2V0Rm9ybWF0dGVyTmFtZShEYXRlRm9ybWF0dGVyLk5BTUUpO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGRlZmF1bHQgZm9tYXR0ZXIncyBwYXR0ZXJuIGlmIG5vdCBzcGVjaWZpZWQuXHJcbiAgICBpZiAodGhpcy5mb3JtYXR0ZXIgIT09IG51bGwgJiYgdGhpcy5mb3JtYXR0ZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZvcm1hdHRlci5nZXROYW1lKCkgPT09IERhdGVGb3JtYXR0ZXIuTkFNRSkge1xyXG4gICAgICBsZXQgZGY6IERhdGVGb3JtYXR0ZXIgPSA8RGF0ZUZvcm1hdHRlcj50aGlzLmZvcm1hdHRlcjtcclxuXHJcbiAgICAgIGlmIChkZi5nZXRQYXR0ZXJuKCkgPT09IG51bGwgfHwgZGYuZ2V0UGF0dGVybigpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBVc2UgZGlzcGxheSBmb3JtYXQgdGhlIHNhbWUgYXMgZGF0YSdzIHBhdHRlcm4uXHJcbiAgICAgICAgZGYuc2V0UGF0dGVybih0aGlzLmdldERhdGFQYXR0ZXJuKCkpO1xyXG5cclxuICAgICAgICB0aGlzLl91c2VEYXRhUGF0dGVybiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZ2V0RGF0ZSgpKSB7XHJcbiAgICAgIC8vIFNldCBkZWZhdWx0IGRhdGEgdmFsdWUgPSBjdXJyZW50IGRhdGUgdGltZS5cclxuICAgICAgbGV0IG5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAvLyBJZ25vcmUgbWlsbGlzZWNvbmRzIGJ5IGRlZmF1bHQuXHJcbiAgICAgIG5vdy5zZXRNaWxsaXNlY29uZHMoMCk7XHJcblxyXG4gICAgICB0aGlzLnNldERhdGUobm93KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSd2ZSB0byBleHBsaWNpdGx5IGNhbGwgdGhpcyBtZXRob2QgZXZlbiBpZiBpdCBoYXMgYmVlbiBjYWxsZWQgaW4gc3VwZXIubmdPbkludCgpXHJcbiAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCBkYXRlIG1heSBiZSBpbml0aWFsaXplZCBhZnRlciB0aGUgc3VwZXIubmdPbkluaXQoKSBpcyBjYWxsZWQuXHJcbiAgICB0aGlzLnNlbGZTYXZlRGF0YSh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0QmVmb3JlVmlld1Nob3dFdmVudCgkZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9WSUVXX1NIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVWaWV3U2hvd0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0Vmlld1Nob3dFdmVudCgkZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFZJRVdfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLnZpZXdTaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRCZWZvcmVWaWV3SGlkZUV2ZW50KCRldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1ZJRVdfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVZpZXdIaWRlRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRWaWV3SGlkZUV2ZW50KCRldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoVklFV19ISURFX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMudmlld0hpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIC8vIE92ZXJyaWRlXHJcbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub3JpZ2luYWxEYXRlID0gdGhpcy5nZXREYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBPdmVycmlkZVxyXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZGF0ZTogRGF0ZSA9IHRoaXMuZ2V0RGF0ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9yaWdpbmFsRGF0ZSAhPT0gbnVsbCAmJiBkYXRlID09PSBudWxsIHx8IHRoaXMub3JpZ2luYWxEYXRlID09PSBudWxsICYmIGRhdGUgIT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luYWxEYXRlICE9PSB0eXBlb2YgZGF0ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcmlnaW5hbERhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9yaWdpbmFsRGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZURhdGUodGhpcy5vcmlnaW5hbERhdGUsIGRhdGUpICE9PSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5vcmlnaW5hbERhdGUpICE9PSBKU09OLnN0cmluZ2lmeShkYXRlKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT3ZlcnJpZGVcclxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0RGF0ZSh0aGlzLm9yaWdpbmFsRGF0ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBTdWIgY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGlnbm9yZSBpcnJlbGV2YW50IGF0dHJpYnV0ZXMuXHJcbiAgLy8gRm9yIGV4YW1wbGUsIGEgdGltZSBwaWNrZXIgc2hvdWxkIG9ubHkgY29tcGFyZSB3aXRoIEhIOm1tOnNzIGlnbm9yaW5nIERvTSBvciBtcy5cclxuICBwdWJsaWMgY29tcGFyZURhdGUoYTogRGF0ZSwgYjogRGF0ZSk6IG51bWJlciB7XHJcbiAgICBpZiAoIWEgJiYgYikge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBpZiAoYSAmJiAhYikge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGlmICghYSAmJiAhYikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGltZVpvbmVEaWZmKGRhdGE6IERhdGUpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZm9ybWF0dGVyIGluc3RhbmNlb2YgRGF0ZUZvcm1hdHRlcikge1xyXG4gICAgICBsZXQgZGY6IERhdGVGb3JtYXR0ZXIgPSA8RGF0ZUZvcm1hdHRlcj50aGlzLmZvcm1hdHRlcjtcclxuXHJcbiAgICAgIGlmIChkZi5nZXRUaW1lWm9uZSgpICE9PSBudWxsICYmIHR5cGVvZiBkZi5nZXRUaW1lWm9uZSgpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGxldCBvZmZzZXRIb3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigtZGF0YS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjApO1xyXG4gICAgICAgIGxldCBvZmZzZXRNaW5zOiBudW1iZXIgPSAtZGF0YS5nZXRUaW1lem9uZU9mZnNldCgpICUgNjA7XHJcbiAgICAgICAgbGV0IGRpZmYgPSAob2Zmc2V0SG91cnMgKiAxMDAgKyBvZmZzZXRNaW5zKTtcclxuICAgICAgICBsZXQgdHpEaWZmOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRmLmdldFRpbWVab25lKCkgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICB0ekRpZmYgPSBkaWZmIC0gZGYuZ2V0VGltZVpvbmUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZi5nZXRUaW1lWm9uZSgpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdHpEaWZmID0gZGlmZiAtIERhdGVUaW1lVXRpbHMucGFyc2VUaW1lWm9uZShkZi5nZXRUaW1lWm9uZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHR6RGlmZjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGUoKTogRGF0ZSB7XHJcbiAgICAvLyBHZXQgdmFsdWUgZnJvbSBcInRoaXMuZGF0YVwiLlxyXG4gICAgbGV0IG9iajogYW55ID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XHJcblxyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09IG51bGwgfHwgdGhpcy50eXBlT2ZEYXRhID09PSB1bmRlZmluZWQgfHwgdGhpcy50eXBlT2ZEYXRhLnRvTG93ZXJDYXNlKCkgPT09IEFic3RyYWN0RGF0ZVRpbWVQaWNrZXIuVFlQRV9BVVRPKSB7XHJcbiAgICAgIC8vIFRyeSB0byByZXNvbHZlIFwidHlwZU9mRGF0YVwiIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgIHRoaXMudHlwZU9mRGF0YSA9IHR5cGVvZiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZUV4YWN0KG9iaiwgdGhpcy5nZXREYXRhUGF0dGVybigpKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHVzaW5nIERhdGUucGFyc2UoKVxyXG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKG9iaik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUob2JqKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlT2ZEYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmouZ2V0VGltZSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvdWxkIG5vdCBwYXJzZSBkYXRhIGluIGFueSBjYXNlcy5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERhdGUoZGF0YTogYW55LCAkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGRhdGU6IERhdGU7XHJcblxyXG4gICAgLy8gV2UgYWNjZXB0IHRoZXNlIGtpbmRzIG9mIFwiZGF0YVwiIGFuZCBwYXJzZSBpdCBpbnRvIGRhdGUuXHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZGF0ZSA9IERhdGUucGFyc2VFeGFjdChkYXRhLCB0aGlzLmdldERhdGFQYXR0ZXJuKCkpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGUgPT09IG51bGwgfHwgdHlwZW9mIGRhdGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGRhdGUgPSBEYXRlLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0YSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0YS5nZXRUaW1lKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlbiwgY29udmVydCBwYXJzZWQgXCJkYXRlXCIgaW50byBcInR5cGVPZkRhdGFcIi5cclxuICAgIGxldCBuZXdEYXRhOiBhbnkgPSBkYXRlO1xyXG5cclxuICAgIGlmIChuZXdEYXRhICE9PSBudWxsICYmIG5ld0RhdGEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy50eXBlT2ZEYXRhID09PSBudWxsIHx8IHRoaXMudHlwZU9mRGF0YSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudHlwZU9mRGF0YS50b0xvd2VyQ2FzZSgpID09PSBBYnN0cmFjdERhdGVUaW1lUGlja2VyLlRZUEVfQVVUTykge1xyXG4gICAgICAgIC8vIFRyeSB0byByZXNvbHZlIFwidHlwZU9mRGF0YVwiIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgICAgdGhpcy50eXBlT2ZEYXRhID0gdHlwZW9mIG5ld0RhdGE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbmV3RGF0YSA9IGRhdGUudG9TdHJpbmcodGhpcy5nZXREYXRhUGF0dGVybigpKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGVPZkRhdGEgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgbmV3RGF0YSA9IGRhdGUuZ2V0VGltZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZU9mRGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBuZXdEYXRhID0gZGF0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNhdmUgaXQgaW50byBcInRoaXMuZGF0YVwiLlxyXG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5ld0RhdGEsICRldmVudCwgZmlyZUV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCZWZvcmVWaWV3U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmJlZm9yZVZpZXdTaG93RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0QmVmb3JlVmlld1Nob3dFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuYmVmb3JlVmlld1Nob3dFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFZpZXdTaG93RXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld1Nob3dFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3U2hvd0V2ZW50ID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmVmb3JlVmlld0hpZGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVWaWV3SGlkZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJlZm9yZVZpZXdIaWRlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLmJlZm9yZVZpZXdIaWRlRXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaWV3SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdIaWRlRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Vmlld0hpZGVFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0hpZGVFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlVmlld1Nob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuZG9TaG93KCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlVmlld1Nob3dFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdFZpZXdTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVZpZXdIaWRlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLmRvSGlkZSgpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZVZpZXdIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRWaWV3SGlkZUV2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YVBhdHRlcm4oKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRhdGFQYXR0ZXJuID09PSBudWxsIHx8IHRoaXMuZGF0YVBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRhUGF0dGVybkZyb21TZXR0aW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhUGF0dGVybjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhUGF0dGVybihkYXRhUGF0dGVybjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFQYXR0ZXJuID0gZGF0YVBhdHRlcm47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0T3JpZ2luYWxEYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxEYXRlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldERhdGFQYXR0ZXJuRnJvbVNldHRpbmcoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mbyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5ERUZBVUxUX0RBVEFfREFURV9QQVRURVJOID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLkRFRkFVTFRfREFUQV9EQVRFX1BBVFRFUk4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gXCJ5eXl5LU1NLWRkXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLkRFRkFVTFRfREFUQV9EQVRFX1BBVFRFUk47XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9IaWRlKCk6IHZvaWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBkb1Nob3coKTogdm9pZDtcclxufVxyXG4iXX0=