fundamental-ngx
Version:
SAP Fundamentals, implemented in Angular
373 lines • 25.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, forwardRef, HostBinding, Input, ViewChild, ViewEncapsulation } from '@angular/core';
import { TimeObject } from '../time/time-object';
import { TimeComponent } from '../time/time.component';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { TimeFormatParser } from './format/time-parser';
export class TimePickerComponent {
/**
* @hidden
* @param {?} cd
* @param {?} timeAdapter
*/
constructor(cd, timeAdapter) {
this.cd = cd;
this.timeAdapter = timeAdapter;
/**
* @hidden
*/
this.timepickerclass = true;
/**
* \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23),
* 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example:
*
* ```json
* { hour: 12, minute: 0, second: 0 }
* ```
*/
this.time = { hour: 0, minute: 0, second: 0 };
/**
* \@Input Uses compact time picker.
*/
this.compact = false;
/**
* \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23)
* and does not display a period control.
*/
this.meridian = false;
/**
* \@Input When set to false, hides the buttons that increment and decrement the corresponding input.
*/
this.spinners = true;
/**
* \@Input When set to false, hides the input for seconds.
*/
this.displaySeconds = true;
/**
* Whether to perform visual validation on the picker input.
*/
this.validate = true;
/**
* Aria label for the time picker input.
*/
this.timePickerInputLabel = 'Time picker input';
/**
* Whether a null input is considered valid.
*/
this.allowNull = true;
/**
* @hidden Whether the input time is valid. Internal use.
*/
this.isInvalidTimeInput = false;
/**
* @hidden
*/
this.onChange = (/**
* @return {?}
*/
() => { });
/**
* @hidden
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
}
/**
* @hidden
* @return {?}
*/
ngOnInit() {
this.placeholder = this.getPlaceholder();
}
/**
* Returns the current value of the time input.
* @return {?}
*/
getTime() {
return this.time;
}
/**
* @hidden
* @return {?}
*/
getFormattedTime() {
/** @type {?} */
const formattedTime = this.timeAdapter.format(this.time, this.meridian);
return formattedTime !== undefined ? formattedTime : '';
}
/**
* @hidden
* @param {?} timeFromInput
* @return {?}
*/
timeInputChanged(timeFromInput) {
/** @type {?} */
const time = this.timeAdapter.parse(timeFromInput, this.displaySeconds, this.meridian);
if (time) {
this.isInvalidTimeInput = false;
this.child.setDisplayedHour();
this.time = Object.assign(this.time, time);
this.onChange(time);
}
else {
if (this.allowNull && timeFromInput === '') {
this.isInvalidTimeInput = false;
this.child.setDisplayedHour();
this.onChange({ hour: null, minutes: null, seconds: null });
}
else {
this.isInvalidTimeInput = true;
}
}
}
/**
* @hidden
* @param {?} $event
* @return {?}
*/
inputGroupClicked($event) {
if (!this.isOpen && !this.disabled) {
$event.stopPropagation();
this.isOpen = true;
}
}
/**
* @hidden
* @return {?}
*/
onFocusHandler() {
if (!this.isOpen) {
this.isOpen = true;
}
}
/**
* @hidden
* @return {?}
*/
addOnButtonClicked() {
if (!this.disabled) {
this.isOpen = !this.isOpen;
}
}
/**
* @hidden
* @return {?}
*/
popoverClosed() {
this.isOpen = false;
}
/**
* @hidden
* @return {?}
*/
getPlaceholder() {
/** @type {?} */
let retVal;
if (this.displaySeconds) {
if (this.meridian) {
retVal = 'hh' + ':' + 'mm' + ':' + 'ss am/pm';
}
else {
retVal = 'hh' + ':' + 'mm' + ':' + 'ss';
}
}
else {
if (this.meridian) {
retVal = 'hh' + ':' + 'mm' + ' am/pm';
}
else {
retVal = 'hh' + ':' + 'mm';
}
}
return retVal;
}
/**
* @hidden
* @return {?}
*/
timeFromTimeComponentChanged() {
this.cd.detectChanges();
this.onChange(this.time);
}
/**
* @hidden
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @hidden
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* @hidden
* @param {?} time
* @return {?}
*/
writeValue(time) {
if (!time) {
return;
}
this.time = time;
}
}
TimePickerComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-time-picker',
template: "<fd-popover [(isOpen)]=\"isOpen\"\n [triggers]=\"[]\">\n <fd-popover-control>\n <!--fd-input-group *ngIf=\"!meridian\" (timeInputChanged)=\"timeInputChanged($event)\" [type]=\"'time'\"\n [placement]=\"'after'\" [button]=\"true\" (click)=\"inputGroupClicked($event)\" [glyph]=\"'fob-watch'\"\n [placeholder]=\"getPlaceholder()\" [inputText]=\"getFormattedTime()\" [disabled]=\"disabled\"\n (addOnButtonClicked)=\"addOnButtonClicked($event)\"></fd-input-group>\n <fd-input-group *ngIf=\"meridian\" (timeInputChanged)=\"timeInputChanged($event)\" [type]=\"'time'\"\n [placement]=\"'after'\" [button]=\"true\" (click)=\"inputGroupClicked($event)\" [glyph]=\"'fob-watch'\"\n [placeholder]=\"getPlaceholder()\" [inputText]=\"getFormattedTime()\" [disabled]=\"disabled\"\n (addOnButtonClicked)=\"addOnButtonClicked($event)\"></fd-input-group-->\n <div class=\"fd-input-group fd-input-group--after\"\n [ngClass]=\"{'fd-input-group--compact' : compact}\">\n <input [value]=\"getFormattedTime()\"\n (keyup)=\"timeInputChanged($event.currentTarget.value)\"\n (focus)=\"onFocusHandler()\"\n (click)=\"inputGroupClicked($event)\"\n [disabled]=\"disabled\"\n type=\"text\"\n [ngClass]=\"{ 'fd-input--compact': compact, 'is-invalid': isInvalidTimeInput && validate }\"\n [placeholder]=\"placeholder\"\n [attr.aria-label]=\"timePickerInputLabel\">\n <span class=\"fd-input-group__addon fd-input-group__addon--button fd-input-group__addon--after\">\n <button [disabled]=\"disabled\" type=\"button\"\n [ngClass]=\"{ 'fd-button--compact' : compact }\" (click)=\"addOnButtonClicked()\"\n class=\"fd-button--icon fd-button--light sap-icon--fob-watch\"></button>\n </span>\n </div>\n </fd-popover-control>\n <fd-popover-body>\n <fd-time [disabled]=\"disabled\"\n [meridian]=\"meridian\"\n [(ngModel)]=\"time\"\n (ngModelChange)=\"timeFromTimeComponentChanged()\"\n [spinners]=\"spinners\"\n [displaySeconds]=\"displaySeconds\"></fd-time>\n </fd-popover-body>\n</fd-popover>\n",
host: {
'(blur)': 'onTouched()',
class: 'fd-timepicker-custom'
},
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => TimePickerComponent)),
multi: true
}
],
encapsulation: ViewEncapsulation.None,
styles: [".fd-timepicker-custom{display:inline-block}.fd-timepicker-custom fd-popover{display:block}.fd-timepicker-custom fd-time{width:auto}"]
}] }
];
/** @nocollapse */
TimePickerComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: TimeFormatParser }
];
TimePickerComponent.propDecorators = {
timepickerclass: [{ type: HostBinding, args: ['class.fd-time-picker',] }],
time: [{ type: Input }],
compact: [{ type: Input }],
meridian: [{ type: Input }],
disabled: [{ type: Input }],
spinners: [{ type: Input }],
displaySeconds: [{ type: Input }],
validate: [{ type: Input }],
timePickerInputLabel: [{ type: Input }],
allowNull: [{ type: Input }],
child: [{ type: ViewChild, args: [TimeComponent,] }]
};
if (false) {
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.timepickerclass;
/**
* \@Input An object that contains three integer properties: 'hour' (ranging from 0 to 23),
* 'minute' (ranging from 0 to 59), and 'second' (ranging from 0 to 59). This is the model the component consumes. Example:
*
* ```json
* { hour: 12, minute: 0, second: 0 }
* ```
* @type {?}
*/
TimePickerComponent.prototype.time;
/**
* \@Input Uses compact time picker.
* @type {?}
*/
TimePickerComponent.prototype.compact;
/**
* \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23)
* and does not display a period control.
* @type {?}
*/
TimePickerComponent.prototype.meridian;
/**
* \@Input Disables the component.
* @type {?}
*/
TimePickerComponent.prototype.disabled;
/**
* \@Input When set to false, hides the buttons that increment and decrement the corresponding input.
* @type {?}
*/
TimePickerComponent.prototype.spinners;
/**
* \@Input When set to false, hides the input for seconds.
* @type {?}
*/
TimePickerComponent.prototype.displaySeconds;
/**
* Whether to perform visual validation on the picker input.
* @type {?}
*/
TimePickerComponent.prototype.validate;
/**
* Aria label for the time picker input.
* @type {?}
*/
TimePickerComponent.prototype.timePickerInputLabel;
/**
* Whether a null input is considered valid.
* @type {?}
*/
TimePickerComponent.prototype.allowNull;
/**
* @hidden Whether the input time is valid. Internal use.
* @type {?}
*/
TimePickerComponent.prototype.isInvalidTimeInput;
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.child;
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.period;
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.isOpen;
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.placeholder;
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.onChange;
/**
* @hidden
* @type {?}
*/
TimePickerComponent.prototype.onTouched;
/**
* @type {?}
* @private
*/
TimePickerComponent.prototype.cd;
/** @type {?} */
TimePickerComponent.prototype.timeAdapter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZnVuZGFtZW50YWwtbmd4LyIsInNvdXJjZXMiOlsibGliL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFtQnhELE1BQU0sT0FBTyxtQkFBbUI7Ozs7OztJQXlMNUIsWUFBb0IsRUFBcUIsRUFDdEIsV0FBNkI7UUFENUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCOzs7O1FBdExoRCxvQkFBZSxHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7O1FBV3ZCLFNBQUksR0FBZSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7UUFJckQsWUFBTyxHQUFZLEtBQUssQ0FBQzs7Ozs7UUFLekIsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQVExQixhQUFRLEdBQVksSUFBSSxDQUFDOzs7O1FBSXpCLG1CQUFjLEdBQVksSUFBSSxDQUFDOzs7O1FBSS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7Ozs7UUFJekIseUJBQW9CLEdBQVcsbUJBQW1CLENBQUM7Ozs7UUFJbkQsY0FBUyxHQUFZLElBQUksQ0FBQzs7OztR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QUNkO2lCQUNKO2dCQUVELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN4Qzs7OztZQXRCUSxpQkFBaUI7WUFJakIsZ0JBQWdCOzs7OEJBc0JwQixXQUFXLFNBQUMsc0JBQXNCO21CQVdsQyxLQUFLO3NCQUlMLEtBQUs7dUJBS0wsS0FBSzt1QkFJTCxLQUFLO3VCQUlMLEtBQUs7NkJBSUwsS0FBSzt1QkFJTCxLQUFLO21DQUlMLEtBQUs7d0JBSUwsS0FBSztvQkFPTCxTQUFTLFNBQUMsYUFBYTs7Ozs7OztJQW5EeEIsOENBQ3VCOzs7Ozs7Ozs7O0lBVXZCLG1DQUNxRDs7Ozs7SUFHckQsc0NBQ3lCOzs7Ozs7SUFJekIsdUNBQzBCOzs7OztJQUcxQix1Q0FDa0I7Ozs7O0lBR2xCLHVDQUN5Qjs7Ozs7SUFHekIsNkNBQytCOzs7OztJQUcvQix1Q0FDeUI7Ozs7O0lBR3pCLG1EQUNtRDs7Ozs7SUFHbkQsd0NBQzBCOzs7OztJQUcxQixpREFBb0M7Ozs7O0lBR3BDLG9DQUNxQjs7Ozs7SUFHckIscUNBQWU7Ozs7O0lBR2YscUNBQWdCOzs7OztJQUdoQiwwQ0FBb0I7Ozs7O0lBR3BCLHVDQUE4Qjs7Ozs7SUFFOUIsd0NBQStCOzs7OztJQW9IbkIsaUNBQTZCOztJQUM3QiwwQ0FBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGltZU9iamVjdCB9IGZyb20gJy4uL3RpbWUvdGltZS1vYmplY3QnO1xuaW1wb3J0IHsgVGltZUNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUvdGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGltZUZvcm1hdFBhcnNlciB9IGZyb20gJy4vZm9ybWF0L3RpbWUtcGFyc2VyJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10aW1lLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknLFxuICAgICAgICBjbGFzczogJ2ZkLXRpbWVwaWNrZXItY3VzdG9tJ1xuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXSxcbiAgICBzdHlsZVVybHM6IFsnLi90aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGltZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZkLXRpbWUtcGlja2VyJylcbiAgICB0aW1lcGlja2VyY2xhc3MgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQElucHV0IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRocmVlIGludGVnZXIgcHJvcGVydGllczogJ2hvdXInIChyYW5naW5nIGZyb20gMCB0byAyMyksXG4gICAgICogJ21pbnV0ZScgKHJhbmdpbmcgZnJvbSAwIHRvIDU5KSwgYW5kICdzZWNvbmQnIChyYW5naW5nIGZyb20gMCB0byA1OSkuIFRoaXMgaXMgdGhlIG1vZGVsIHRoZSBjb21wb25lbnQgY29uc3VtZXMuIEV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBqc29uXG4gICAgICogeyBob3VyOiAxMiwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGltZTogVGltZU9iamVjdCA9IHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfTtcblxuICAgIC8qKiBASW5wdXQgVXNlcyBjb21wYWN0IHRpbWUgcGlja2VyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29tcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byB0cnVlLCB1c2VzIHRoZSAyNCBob3VyIGNsb2NrIChob3VycyByYW5naW5nIGZyb20gMCB0byAyMylcbiAgICAgKiBhbmQgZG9lcyBub3QgZGlzcGxheSBhIHBlcmlvZCBjb250cm9sLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWVyaWRpYW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgRGlzYWJsZXMgdGhlIGNvbXBvbmVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkOiBib29sZWFuO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byBmYWxzZSwgaGlkZXMgdGhlIGJ1dHRvbnMgdGhhdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNwaW5uZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gZmFsc2UsIGhpZGVzIHRoZSBpbnB1dCBmb3Igc2Vjb25kcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlTZWNvbmRzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIHBlcmZvcm0gdmlzdWFsIHZhbGlkYXRpb24gb24gdGhlIHBpY2tlciBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbGlkYXRlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgdGltZSBwaWNrZXIgaW5wdXQuICovXG4gICAgQElucHV0KClcbiAgICB0aW1lUGlja2VySW5wdXRMYWJlbDogc3RyaW5nID0gJ1RpbWUgcGlja2VyIGlucHV0JztcblxuICAgIC8qKiBXaGV0aGVyIGEgbnVsbCBpbnB1dCBpcyBjb25zaWRlcmVkIHZhbGlkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dOdWxsOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBAaGlkZGVuIFdoZXRoZXIgdGhlIGlucHV0IHRpbWUgaXMgdmFsaWQuIEludGVybmFsIHVzZS4gKi9cbiAgICBpc0ludmFsaWRUaW1lSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChUaW1lQ29tcG9uZW50KVxuICAgIGNoaWxkOiBUaW1lQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwZXJpb2Q6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNPcGVuOiBib29sZWFuO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdGltZSBpbnB1dC5cbiAgICAgKi9cbiAgICBnZXRUaW1lKCk6IFRpbWVPYmplY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0Rm9ybWF0dGVkVGltZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRUaW1lID0gdGhpcy50aW1lQWRhcHRlci5mb3JtYXQodGhpcy50aW1lLCB0aGlzLm1lcmlkaWFuKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFRpbWUgIT09IHVuZGVmaW5lZCA/IGZvcm1hdHRlZFRpbWUgOiAnJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRpbWVJbnB1dENoYW5nZWQodGltZUZyb21JbnB1dCkge1xuICAgICAgICBjb25zdCB0aW1lID0gdGhpcy50aW1lQWRhcHRlci5wYXJzZSh0aW1lRnJvbUlucHV0LCB0aGlzLmRpc3BsYXlTZWNvbmRzLCB0aGlzLm1lcmlkaWFuKTtcbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNJbnZhbGlkVGltZUlucHV0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLnNldERpc3BsYXllZEhvdXIoKTtcbiAgICAgICAgICAgIHRoaXMudGltZSA9IE9iamVjdC5hc3NpZ24odGhpcy50aW1lLCB0aW1lKTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd051bGwgJiYgdGltZUZyb21JbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzSW52YWxpZFRpbWVJbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGQuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2Uoe2hvdXI6IG51bGwsIG1pbnV0ZXM6IG51bGwsIHNlY29uZHM6IG51bGx9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0ludmFsaWRUaW1lSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpbnB1dEdyb3VwQ2xpY2tlZCgkZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbiAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkZvY3VzSGFuZGxlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBhZGRPbkJ1dHRvbkNsaWNrZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBvcG92ZXJDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsO1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5U2Vjb25kcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSAnaGgnICsgJzonICsgJ21tJyArICc6JyArICdzcyBhbS9wbSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9ICdoaCcgKyAnOicgKyAnbW0nICsgJzonICsgJ3NzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lcmlkaWFuKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gJ2hoJyArICc6JyArICdtbScgKyAnIGFtL3BtJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gJ2hoJyArICc6JyArICdtbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgdGltZUZyb21UaW1lQ29tcG9uZW50Q2hhbmdlZCgpIHtcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh0aW1lOiBUaW1lT2JqZWN0KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUodGltZTogVGltZU9iamVjdCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIHRpbWVBZGFwdGVyOiBUaW1lRm9ybWF0UGFyc2VyKSB7fVxufVxuIl19