igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
652 lines • 39.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* This file contains all the directives used by the @link IgxTimePickerComponent.
* You should generally not use them directly.
* @preferred
*/
import { Directive, ElementRef, HostBinding, HostListener, Inject, Input, TemplateRef } from '@angular/core';
import { IGX_TIME_PICKER_COMPONENT } from './time-picker.common';
import { InteractionMode } from '../core/enums';
/**
* @hidden
*/
var IgxItemListDirective = /** @class */ (function () {
function IgxItemListDirective(timePicker, elementRef) {
this.timePicker = timePicker;
this.elementRef = elementRef;
this.tabindex = 0;
}
Object.defineProperty(IgxItemListDirective.prototype, "defaultCSS", {
get: /**
* @return {?}
*/
function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxItemListDirective.prototype, "hourCSS", {
get: /**
* @return {?}
*/
function () {
return this.type === 'hourList';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxItemListDirective.prototype, "minuteCSS", {
get: /**
* @return {?}
*/
function () {
return this.type === 'minuteList';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxItemListDirective.prototype, "ampmCSS", {
get: /**
* @return {?}
*/
function () {
return this.type === 'ampmList';
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
IgxItemListDirective.prototype.onFocus = /**
* @return {?}
*/
function () {
this.isActive = true;
};
/**
* @return {?}
*/
IgxItemListDirective.prototype.onBlur = /**
* @return {?}
*/
function () {
this.isActive = false;
};
/**
* @private
* @return {?}
*/
IgxItemListDirective.prototype.nextItem = /**
* @private
* @return {?}
*/
function () {
switch (this.type) {
case 'hourList': {
this.timePicker.nextHour();
break;
}
case 'minuteList': {
this.timePicker.nextMinute();
break;
}
case 'ampmList': {
this.timePicker.nextAmPm();
break;
}
}
};
/**
* @private
* @return {?}
*/
IgxItemListDirective.prototype.prevItem = /**
* @private
* @return {?}
*/
function () {
switch (this.type) {
case 'hourList': {
this.timePicker.prevHour();
break;
}
case 'minuteList': {
this.timePicker.prevMinute();
break;
}
case 'ampmList': {
this.timePicker.prevAmPm();
break;
}
}
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onKeydownArrowDown = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
this.nextItem();
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onKeydownArrowUp = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
this.prevItem();
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onKeydownArrowRight = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
/** @type {?} */
var listName = ((/** @type {?} */ (event.target))).className;
if (listName.indexOf('hourList') !== -1) {
this.timePicker.minuteList.nativeElement.focus();
}
else if (listName.indexOf('minuteList') !== -1 && this.timePicker._ampmItems.length !== 0) {
this.timePicker.ampmList.nativeElement.focus();
}
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onKeydownArrowLeft = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
/** @type {?} */
var listName = ((/** @type {?} */ (event.target))).className;
if (listName.indexOf('minuteList') !== -1) {
this.timePicker.hourList.nativeElement.focus();
}
else if (listName.indexOf('ampmList') !== -1) {
this.timePicker.minuteList.nativeElement.focus();
}
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onKeydownEnter = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
if (this.timePicker.mode === InteractionMode.DropDown) {
this.timePicker.hideOverlay();
return;
}
this.timePicker.okButtonClick();
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onKeydownEscape = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
this.timePicker.cancelButtonClick();
};
/**
* @hidden
*/
/**
* @hidden
* @return {?}
*/
IgxItemListDirective.prototype.onHover = /**
* @hidden
* @return {?}
*/
function () {
this.elementRef.nativeElement.focus();
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onScroll = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
event.stopPropagation();
if (event.deltaY > 0) {
this.nextItem();
}
else if (event.deltaY < 0) {
this.prevItem();
}
};
/**
* @hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxItemListDirective.prototype.onPanMove = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
if (event.deltaY < 0) {
this.nextItem();
}
else if (event.deltaY > 0) {
this.prevItem();
}
};
IgxItemListDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxItemList]'
},] }
];
/** @nocollapse */
IgxItemListDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: ElementRef }
]; };
IgxItemListDirective.propDecorators = {
type: [{ type: Input, args: ['igxItemList',] }],
tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__column',] }],
hourCSS: [{ type: HostBinding, args: ['class.igx-time-picker__hourList',] }],
minuteCSS: [{ type: HostBinding, args: ['class.igx-time-picker__minuteList',] }],
ampmCSS: [{ type: HostBinding, args: ['class.igx-time-picker__ampmList',] }],
onFocus: [{ type: HostListener, args: ['focus',] }],
onBlur: [{ type: HostListener, args: ['blur',] }],
onKeydownArrowDown: [{ type: HostListener, args: ['keydown.arrowdown', ['$event'],] }],
onKeydownArrowUp: [{ type: HostListener, args: ['keydown.arrowup', ['$event'],] }],
onKeydownArrowRight: [{ type: HostListener, args: ['keydown.arrowright', ['$event'],] }],
onKeydownArrowLeft: [{ type: HostListener, args: ['keydown.arrowleft', ['$event'],] }],
onKeydownEnter: [{ type: HostListener, args: ['keydown.enter', ['$event'],] }],
onKeydownEscape: [{ type: HostListener, args: ['keydown.escape', ['$event'],] }],
onHover: [{ type: HostListener, args: ['mouseover',] }],
onScroll: [{ type: HostListener, args: ['wheel', ['$event'],] }],
onPanMove: [{ type: HostListener, args: ['panmove', ['$event'],] }]
};
return IgxItemListDirective;
}());
export { IgxItemListDirective };
if (false) {
/** @type {?} */
IgxItemListDirective.prototype.type;
/** @type {?} */
IgxItemListDirective.prototype.isActive;
/** @type {?} */
IgxItemListDirective.prototype.tabindex;
/** @type {?} */
IgxItemListDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxItemListDirective.prototype.elementRef;
}
/**
* @hidden
*/
var IgxHourItemDirective = /** @class */ (function () {
function IgxHourItemDirective(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
Object.defineProperty(IgxHourItemDirective.prototype, "defaultCSS", {
get: /**
* @return {?}
*/
function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxHourItemDirective.prototype, "selectedCSS", {
get: /**
* @return {?}
*/
function () {
return this.isSelectedHour;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxHourItemDirective.prototype, "activeCSS", {
get: /**
* @return {?}
*/
function () {
return this.isSelectedHour && this.itemList.isActive;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxHourItemDirective.prototype, "isSelectedHour", {
get: /**
* @return {?}
*/
function () {
return this.timePicker.selectedHour === this.value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} item
* @return {?}
*/
IgxHourItemDirective.prototype.onClick = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (item !== '') {
this.timePicker.scrollHourIntoView(item);
}
};
IgxHourItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxHourItem]'
},] }
];
/** @nocollapse */
IgxHourItemDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
]; };
IgxHourItemDirective.propDecorators = {
value: [{ type: Input, args: ['igxHourItem',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }],
selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }],
activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }],
onClick: [{ type: HostListener, args: ['click', ['value'],] }]
};
return IgxHourItemDirective;
}());
export { IgxHourItemDirective };
if (false) {
/** @type {?} */
IgxHourItemDirective.prototype.value;
/** @type {?} */
IgxHourItemDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxHourItemDirective.prototype.itemList;
}
/**
* @hidden
*/
var IgxMinuteItemDirective = /** @class */ (function () {
function IgxMinuteItemDirective(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
Object.defineProperty(IgxMinuteItemDirective.prototype, "defaultCSS", {
get: /**
* @return {?}
*/
function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxMinuteItemDirective.prototype, "selectedCSS", {
get: /**
* @return {?}
*/
function () {
return this.isSelectedMinute;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxMinuteItemDirective.prototype, "activeCSS", {
get: /**
* @return {?}
*/
function () {
return this.isSelectedMinute && this.itemList.isActive;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxMinuteItemDirective.prototype, "isSelectedMinute", {
get: /**
* @return {?}
*/
function () {
return this.timePicker.selectedMinute === this.value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} item
* @return {?}
*/
IgxMinuteItemDirective.prototype.onClick = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (item !== '') {
this.timePicker.scrollMinuteIntoView(item);
}
};
IgxMinuteItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxMinuteItem]'
},] }
];
/** @nocollapse */
IgxMinuteItemDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
]; };
IgxMinuteItemDirective.propDecorators = {
value: [{ type: Input, args: ['igxMinuteItem',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }],
selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }],
activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }],
onClick: [{ type: HostListener, args: ['click', ['value'],] }]
};
return IgxMinuteItemDirective;
}());
export { IgxMinuteItemDirective };
if (false) {
/** @type {?} */
IgxMinuteItemDirective.prototype.value;
/** @type {?} */
IgxMinuteItemDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxMinuteItemDirective.prototype.itemList;
}
/**
* @hidden
*/
var IgxAmPmItemDirective = /** @class */ (function () {
function IgxAmPmItemDirective(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
Object.defineProperty(IgxAmPmItemDirective.prototype, "defaultCSS", {
get: /**
* @return {?}
*/
function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxAmPmItemDirective.prototype, "selectedCSS", {
get: /**
* @return {?}
*/
function () {
return this.isSelectedAmPm;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxAmPmItemDirective.prototype, "activeCSS", {
get: /**
* @return {?}
*/
function () {
return this.isSelectedAmPm && this.itemList.isActive;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxAmPmItemDirective.prototype, "isSelectedAmPm", {
get: /**
* @return {?}
*/
function () {
return this.timePicker.selectedAmPm === this.value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} item
* @return {?}
*/
IgxAmPmItemDirective.prototype.onClick = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (item !== '') {
this.timePicker.scrollAmPmIntoView(item);
}
};
IgxAmPmItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxAmPmItem]'
},] }
];
/** @nocollapse */
IgxAmPmItemDirective.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
]; };
IgxAmPmItemDirective.propDecorators = {
value: [{ type: Input, args: ['igxAmPmItem',] }],
defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }],
selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }],
activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }],
onClick: [{ type: HostListener, args: ['click', ['value'],] }]
};
return IgxAmPmItemDirective;
}());
export { IgxAmPmItemDirective };
if (false) {
/** @type {?} */
IgxAmPmItemDirective.prototype.value;
/** @type {?} */
IgxAmPmItemDirective.prototype.timePicker;
/**
* @type {?}
* @private
*/
IgxAmPmItemDirective.prototype.itemList;
}
/**
* This directive should be used to mark which ng-template will be used from IgxTimePicker when re-templating its input group.
*/
var IgxTimePickerTemplateDirective = /** @class */ (function () {
function IgxTimePickerTemplateDirective(template) {
this.template = template;
}
IgxTimePickerTemplateDirective.decorators = [
{ type: Directive, args: [{
selector: '[igxTimePickerTemplate]'
},] }
];
/** @nocollapse */
IgxTimePickerTemplateDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return IgxTimePickerTemplateDirective;
}());
export { IgxTimePickerTemplateDirective };
if (false) {
/** @type {?} */
IgxTimePickerTemplateDirective.prototype.template;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIuZGlyZWN0aXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBR2hEO0lBVUksOEJBQ08sVUFBNkIsRUFDeEIsVUFBc0I7UUFEM0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUczQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBSGtCLENBQUM7SUFLdkMsc0JBQ0ksNENBQVU7Ozs7UUFEZDtZQUVJLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7OztPQUFBO0lBRUQsc0JBQ0kseUNBQU87Ozs7UUFEWDtZQUVJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7UUFDcEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFDSSwyQ0FBUzs7OztRQURiO1lBRUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQztRQUN0QyxDQUFDOzs7T0FBQTtJQUVELHNCQUNJLHlDQUFPOzs7O1FBRFg7WUFFSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO1FBQ3BDLENBQUM7OztPQUFBOzs7O0lBR00sc0NBQU87OztJQURkO1FBRUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQzs7OztJQUdNLHFDQUFNOzs7SUFEYjtRQUVJLElBQUks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RUFBRSx5QkFBeUI7aUJBQ3RDOzs7O2dCQTFVRyxXQUFXOztJQTZVZixxQ0FBQztDQUFBLEFBTEQsSUFLQztTQUZZLDhCQUE4Qjs7O0lBQzNCLGtEQUFpQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgZGlyZWN0aXZlcyB1c2VkIGJ5IHRoZSBAbGluayBJZ3hUaW1lUGlja2VyQ29tcG9uZW50LlxuICogWW91IHNob3VsZCBnZW5lcmFsbHkgbm90IHVzZSB0aGVtIGRpcmVjdGx5LlxuICogQHByZWZlcnJlZFxuICovXG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJR1hfVElNRV9QSUNLRVJfQ09NUE9ORU5ULCBJZ3hUaW1lUGlja2VyQmFzZSB9IGZyb20gJy4vdGltZS1waWNrZXIuY29tbW9uJztcbmltcG9ydCB7IEludGVyYWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvcmUvZW51bXMnO1xuXG4vKiogQGhpZGRlbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SXRlbUxpc3RdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hJdGVtTGlzdERpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEl0ZW1MaXN0JylcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xuXG4gICAgcHVibGljIGlzQWN0aXZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChJR1hfVElNRV9QSUNLRVJfQ09NUE9ORU5UKVxuICAgIHB1YmxpYyB0aW1lUGlja2VyOiBJZ3hUaW1lUGlja2VyQmFzZSxcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19jb2x1bW4nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faG91ckxpc3QnKVxuICAgIGdldCBob3VyQ1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnaG91ckxpc3QnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19taW51dGVMaXN0JylcbiAgICBnZXQgbWludXRlQ1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnbWludXRlTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2FtcG1MaXN0JylcbiAgICBnZXQgYW1wbUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2FtcG1MaXN0JztcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5leHRJdGVtKCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaG91ckxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm5leHRIb3VyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtaW51dGVMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0TWludXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbXBtTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dEFtUG0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJldkl0ZW0oKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdob3VyTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldkhvdXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZUxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZNaW51dGUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2FtcG1MaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5wcmV2QW1QbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93dXAnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd1VwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93cmlnaHQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd1JpZ2h0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgbGlzdE5hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ2hvdXJMaXN0JykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubWludXRlTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobGlzdE5hbWUuaW5kZXhPZignbWludXRlTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIuX2FtcG1JdGVtcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5hbXBtTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBsaXN0TmFtZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTmFtZTtcblxuICAgICAgICBpZiAobGlzdE5hbWUuaW5kZXhPZignbWludXRlTGlzdCcpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLmhvdXJMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaXN0TmFtZS5pbmRleE9mKCdhbXBtTGlzdCcpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25FbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIubW9kZSA9PT0gSW50ZXJhY3Rpb25Nb2RlLkRyb3BEb3duKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuaGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVQaWNrZXIub2tCdXR0b25DbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVzY2FwZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMudGltZVBpY2tlci5jYW5jZWxCdXR0b25DbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZW92ZXInKVxuICAgIHB1YmxpYyBvbkhvdmVyKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aGVlbCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uU2Nyb2xsKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhbm1vdmUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbk1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZJdGVtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hIb3VySXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneEhvdXJJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4SG91ckl0ZW0nKVxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbS0tc2VsZWN0ZWQnKVxuICAgIGdldCBzZWxlY3RlZENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEhvdXI7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEhvdXIgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZEhvdXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRIb3VyID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsSG91ckludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4TWludXRlSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneE1pbnV0ZUl0ZW1EaXJlY3RpdmUge1xuXG4gICAgQElucHV0KCdpZ3hNaW51dGVJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRNaW51dGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZE1pbnV0ZSAmJiB0aGlzLml0ZW1MaXN0LmlzQWN0aXZlO1xuICAgIH1cblxuICAgIGdldCBpc1NlbGVjdGVkTWludXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkTWludXRlID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsTWludXRlSW50b1ZpZXcoaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hBbVBtSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneEFtUG1JdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4QW1QbUl0ZW0nKVxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbS0tc2VsZWN0ZWQnKVxuICAgIGdldCBzZWxlY3RlZENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEFtUG07XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEFtUG0gJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZEFtUG0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRBbVBtID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsQW1QbUludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIHNob3VsZCBiZSB1c2VkIHRvIG1hcmsgd2hpY2ggbmctdGVtcGxhdGUgd2lsbCBiZSB1c2VkIGZyb20gSWd4VGltZVBpY2tlciB3aGVuIHJlLXRlbXBsYXRpbmcgaXRzIGlucHV0IGdyb3VwLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hUaW1lUGlja2VyVGVtcGxhdGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hUaW1lUGlja2VyVGVtcGxhdGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XG59XG5cbiJdfQ==