com.phloxui
Version:
PhloxUI Ng2+ Framework
558 lines (557 loc) • 47.6 kB
JavaScript
/**
* @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=