UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

635 lines 52.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation } from '@angular/core'; import { TimeObject } from './time-object'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { TimeI18nLabels } from './i18n/time-i18n-labels'; var TimeComponent = /** @class */ (function () { function TimeComponent(timeI18nLabels) { this.timeI18nLabels = timeI18nLabels; /** * \@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, does not set the input field to invalid state on invalid entry. */ this.validate = true; /** * \@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; /** * \@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 }; /** * @hidden */ this.focusArrowLeft = new EventEmitter(); /** * @hidden */ this.onChange = (/** * @param {?} time * @return {?} */ function (time) { }); /** * @hidden */ this.onTouched = (/** * @return {?} */ function () { }); } /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.setDisplayedHour = /** * @hidden * @return {?} */ function () { if (this.time.hour === 0) { this.displayedHour = 12; this.period = 'am'; } else if (this.time.hour > 12) { this.displayedHour = this.time.hour - 12; this.period = 'pm'; } else if (this.time.hour === 12) { this.displayedHour = 12; this.period = 'pm'; } else { this.displayedHour = this.time.hour; this.period = 'am'; } this.oldPeriod = this.period; }; /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.displayedHourChanged = /** * @hidden * @return {?} */ function () { if (this.displayedHour === null && this.time) { this.time.hour = null; } else { if (this.period === 'am') { if (this.displayedHour === 12) { this.time.hour = 0; } else { this.time.hour = this.displayedHour; } } else if (this.period === 'pm') { if (this.displayedHour === 12) { this.time.hour = this.displayedHour; } else { this.time.hour = this.displayedHour + 12; } } } this.onChange(this.time); }; /** @hidden */ /** * @hidden * @param {?} inputType * @return {?} */ TimeComponent.prototype.inputBlur = /** * @hidden * @param {?} inputType * @return {?} */ function (inputType) { if (inputType === 'hour') { if (this.meridian) { this.time.hour = Math.round(this.time.hour); if (this.displayedHour === 0) { this.time.hour = 0; this.setDisplayedHour(); this.onChange(this.time); } else if (this.displayedHour > 12 && this.displayedHour < 24) { if (this.period === 'pm') { this.time.hour = this.displayedHour - 12; } this.setDisplayedHour(); this.onChange(this.time); } else if (this.displayedHour >= 24) { this.displayedHour = this.displayedHour % 12; this.displayedHourChanged(); } else if (this.displayedHour < 0) { this.displayedHour = (this.displayedHour * -1) % 12; this.displayedHourChanged(); } } else { this.time.hour = Math.round(this.time.hour) % 24; if (this.time.hour < 0) { this.time.hour = this.time.hour * -1; this.onChange(this.time); } } } else if (inputType === 'minute') { this.time.minute = Math.round(this.time.minute) % 60; if (this.time.minute < 0) { this.time.minute = this.time.minute * -1; } this.onChange(this.time); } else if (inputType === 'second') { this.time.second = Math.round(this.time.second) % 60; if (this.time.second < 0) { this.time.second = this.time.second * -1; } this.onChange(this.time); } else if (inputType === 'period') { if (this.period !== 'am' && this.period !== 'pm') { this.setDisplayedHour(); this.onChange(this.time); } } }; /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.ngOnChanges = /** * @hidden * @return {?} */ function () { if (this.meridian) { this.setDisplayedHour(); } else { this.displayedHour = this.time.hour; } }; /** Increases the hour value by one. */ /** * Increases the hour value by one. * @return {?} */ TimeComponent.prototype.increaseHour = /** * Increases the hour value by one. * @return {?} */ function () { if (this.time.hour === null) { this.time.hour = 0; } else if (this.time.hour === 23) { this.time.hour = 0; } else { this.time.hour = this.time.hour + 1; } if (this.meridian) { this.setDisplayedHour(); } this.onChange(this.time); }; /** Decreases the hour value by one. */ /** * Decreases the hour value by one. * @return {?} */ TimeComponent.prototype.decreaseHour = /** * Decreases the hour value by one. * @return {?} */ function () { if (this.time.hour === null) { this.time.hour = 0; } else if (this.time.hour === 0) { this.time.hour = 23; } else { this.time.hour = this.time.hour - 1; } if (this.meridian) { this.setDisplayedHour(); } this.onChange(this.time); }; /** Increases the minute value by one. */ /** * Increases the minute value by one. * @return {?} */ TimeComponent.prototype.increaseMinute = /** * Increases the minute value by one. * @return {?} */ function () { if (this.time.minute === null) { this.time.minute = 0; } else if (this.time.minute === 59) { this.time.minute = 0; this.increaseHour(); } else { this.time.minute = this.time.minute + 1; } this.onChange(this.time); }; /** Decreases the minute value by one. */ /** * Decreases the minute value by one. * @return {?} */ TimeComponent.prototype.decreaseMinute = /** * Decreases the minute value by one. * @return {?} */ function () { if (this.time.minute === null) { this.time.minute = 0; } else if (this.time.minute === 0) { this.time.minute = 59; this.decreaseHour(); } else { this.time.minute = this.time.minute - 1; } this.onChange(this.time); }; /** Increases the second value by one. */ /** * Increases the second value by one. * @return {?} */ TimeComponent.prototype.increaseSecond = /** * Increases the second value by one. * @return {?} */ function () { if (this.displaySeconds) { if (this.time.second === null) { this.time.second = 0; } else if (this.time.second === 59) { this.time.second = 0; this.increaseMinute(); } else { this.time.second = this.time.second + 1; } } this.onChange(this.time); }; /** Decreases the second value by one. */ /** * Decreases the second value by one. * @return {?} */ TimeComponent.prototype.decreaseSecond = /** * Decreases the second value by one. * @return {?} */ function () { if (this.displaySeconds) { if (this.time.second === null) { this.time.second = 0; } else if (this.time.second === 0) { this.time.second = 59; this.decreaseMinute(); } else { this.time.second = this.time.second - 1; } } this.onChange(this.time); }; /** Toggles the period (am/pm). */ /** * Toggles the period (am/pm). * @return {?} */ TimeComponent.prototype.togglePeriod = /** * Toggles the period (am/pm). * @return {?} */ function () { if (this.time.hour < 24 && this.time.hour >= 0) { if (this.period === 'am') { this.period = 'pm'; this.periodModelChange(); } else if (this.period === 'pm') { this.period = 'am'; this.periodModelChange(); } } }; /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.hourModelChange = /** * @hidden * @return {?} */ function () { if (this.meridian) { if (!(this.time.hour > 12 || this.time.hour < 0) || !this.validate) { this.onChange(this.time); } } else { if (!(this.time.hour > 23 || this.time.hour < 0) || !this.validate) { this.onChange(this.time); } } }; /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.minuteModelChange = /** * @hidden * @return {?} */ function () { if (!(this.time.minute > 59 || this.time.minute < 0) || !this.validate) { this.onChange(this.time); } }; /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.secondModelChange = /** * @hidden * @return {?} */ function () { if (!(this.time.second > 59 || this.time.second < 0) || !this.validate) { this.onChange(this.time); } }; /** @hidden */ /** * @hidden * @return {?} */ TimeComponent.prototype.periodModelChange = /** * @hidden * @return {?} */ function () { this.period = this.period.toLowerCase(); if (this.period !== 'am' && this.period !== 'pm') { this.periodInvalid = true; } else if (this.time.hour < 24 && this.time.hour >= 0) { if (this.oldPeriod === 'am' && this.period === 'pm') { this.time.hour = this.time.hour + 12; } else if (this.oldPeriod === 'pm' && this.period === 'am') { if (this.time.hour === null) { this.time.hour = 0; } else { this.time.hour = this.time.hour - 12; } } this.periodInvalid = false; this.onChange(this.time); } this.setDisplayedHour(); }; /** @hidden */ /** * @hidden * @param {?} fn * @return {?} */ TimeComponent.prototype.registerOnChange = /** * @hidden * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** @hidden */ /** * @hidden * @param {?} fn * @return {?} */ TimeComponent.prototype.registerOnTouched = /** * @hidden * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** @hidden */ /** * @hidden * @param {?} isDisabled * @return {?} */ TimeComponent.prototype.setDisabledState = /** * @hidden * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.disabled = isDisabled; }; /** @hidden */ /** * @hidden * @param {?} time * @return {?} */ TimeComponent.prototype.writeValue = /** * @hidden * @param {?} time * @return {?} */ function (time) { if (!time) { return; } this.time = time; this.setDisplayedHour(); }; /** @hidden */ /** * @hidden * @param {?} event * @return {?} */ TimeComponent.prototype.lastButtonKeydown = /** * @hidden * @param {?} event * @return {?} */ function (event) { if (event.code === 'Tab' && !event.shiftKey) { event.preventDefault(); this.focusArrowLeft.emit(); } }; TimeComponent.decorators = [ { type: Component, args: [{ selector: 'fd-time', template: "<div class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseHour()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increaseHoursLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input *ngIf=\"meridian\"\n (blur)=\"inputBlur('hour')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((displayedHour > 12 || displayedHour < 0) && validate)}\"\n [(ngModel)]=\"displayedHour\"\n (keyup)=\"displayedHourChanged()\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"hh\"\n [attr.aria-label]=\"timeI18nLabels?.hoursLabel\"/>\n <input *ngIf=\"!meridian\"\n (blur)=\"inputBlur('hour')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.hour > 23 || time.hour < 0) && validate)}\"\n [(ngModel)]=\"time.hour\"\n (ngModelChange)=\"hourModelChange()\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"hh\"\n [attr.aria-label]=\"timeI18nLabels?.hoursLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseHour()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreaseHoursLabel\"></button>\n </div>\n</div>\n\n<div class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseMinute()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increaseMinutesLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"time.minute\"\n (ngModelChange)=\"minuteModelChange()\"\n (blur)=\"inputBlur('minute')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.minute > 59 || time.minute < 0) && validate)}\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"mm\"\n [attr.aria-label]=\"timeI18nLabels?.minutesLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseMinute()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreaseMinutesLabel\"></button>\n </div>\n</div>\n<div *ngIf=\"displaySeconds\"\n class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"increaseSecond()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increaseSecondsLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"time.second\"\n (ngModelChange)=\"secondModelChange()\"\n (blur)=\"inputBlur('second')\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': ((time.second > 59 || time.second < 0) && validate)}\"\n class=\"fd-form__control\"\n type=\"number\"\n placeholder=\"ss\"\n (keydown)=\"!meridian && !spinners ? lastButtonKeydown($event) : ''\"\n [attr.aria-label]=\"timeI18nLabels?.secondsLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"decreaseSecond()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreaseSecondsLabel\"\n (keydown)=\"!meridian ? lastButtonKeydown($event) : ''\"></button>\n </div>\n</div>\n<div *ngIf=\"meridian\"\n class=\"fd-time__item\">\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"togglePeriod()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-up-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.increasePeriodLabel\"></button>\n </div>\n <div class=\"fd-time__input\">\n <input [(ngModel)]=\"period\"\n [ngClass]=\"{'is-disabled': disabled, 'is-invalid': periodInvalid}\"\n class=\"fd-form__control\"\n (blur)=\"inputBlur('period')\"\n (ngModelChange)=\"periodModelChange()\"\n type=\"text\"\n placeholder=\"am\"\n [attr.aria-label]=\"timeI18nLabels?.periodLabel\"/>\n </div>\n <div class=\"fd-time__control\">\n <button *ngIf=\"spinners\"\n [ngClass]=\"{'is-disabled': disabled}\"\n (click)=\"togglePeriod()\"\n type=\"button\"\n class=\" fd-button--light fd-button--xs sap-icon--navigation-down-arrow\"\n [attr.aria-label]=\"timeI18nLabels?.decreasePeriodLabel\"\n (keydown)=\"lastButtonKeydown($event)\"></button>\n </div>\n</div>\n", host: { '(blur)': 'onTouched()', class: 'fd-time fd-has-display-block' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return TimeComponent; })), multi: true } ], encapsulation: ViewEncapsulation.None, styles: ["input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}"] }] } ]; /** @nocollapse */ TimeComponent.ctorParameters = function () { return [ { type: TimeI18nLabels } ]; }; TimeComponent.propDecorators = { meridian: [{ type: Input }], validate: [{ type: Input }], disabled: [{ type: Input }], spinners: [{ type: Input }], displaySeconds: [{ type: Input }], time: [{ type: Input }], focusArrowLeft: [{ type: Output }], setDisplayedHour: [{ type: Input }] }; return TimeComponent; }()); export { TimeComponent }; if (false) { /** * \@Input When set to true, uses the 24 hour clock (hours ranging from 0 to 23) * and does not display a period control. * @type {?} */ TimeComponent.prototype.meridian; /** * \@Input When set to false, does not set the input field to invalid state on invalid entry. * @type {?} */ TimeComponent.prototype.validate; /** * \@Input Disables the component. * @type {?} */ TimeComponent.prototype.disabled; /** * \@Input When set to false, hides the buttons that increment and decrement the corresponding input. * @type {?} */ TimeComponent.prototype.spinners; /** * \@Input When set to false, hides the input for seconds. * @type {?} */ TimeComponent.prototype.displaySeconds; /** * \@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 {?} */ TimeComponent.prototype.time; /** * @hidden * @type {?} */ TimeComponent.prototype.focusArrowLeft; /** * @hidden * @type {?} */ TimeComponent.prototype.period; /** * @hidden * @type {?} */ TimeComponent.prototype.oldPeriod; /** * @hidden * @type {?} */ TimeComponent.prototype.periodInvalid; /** * @hidden * @type {?} */ TimeComponent.prototype.displayedHour; /** * @hidden * @type {?} */ TimeComponent.prototype.onChange; /** * @hidden * @type {?} */ TimeComponent.prototype.onTouched; /** @type {?} */ TimeComponent.prototype.timeI18nLabels; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvdGltZS90aW1lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXpEO0lBeVZJLHVCQUFtQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7Ozs7O1FBcFV4QyxhQUFRLEdBQVksS0FBSyxDQUFDOzs7O1FBRzFCLGFBQVEsR0FBWSxJQUFJLENBQUM7Ozs7UUFNekIsYUFBUSxHQUFZLElBQUksQ0FBQzs7OztRQUd6QixtQkFBYyxHQUFZLElBQUksQ0FBQzs7Ozs7Ozs7OztRQVd4QyxTQUFJLEdBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O1FBSXJELG1CQUFjLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7Ozs7UUFrQzVELGFBQVE7Ozs7UUFBRyxVQUFDLElBQWdCLElBQU0sQ0FBQyxFQUFDOzs7O1FBRXBDLGNBQVM7OztRQUFHLGNBQU8sQ0FBQyxFQUFDO0lBcVErQixDQUFDO0lBM1JyRCxjQUFjOzs7OztJQUVkLHdDQUFnQjs7OztJQURoQjtRQUVJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hC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QUksRUFBRTt3QkFDRixRQUFRLEVBQUUsYUFBYTt3QkFDdkIsS0FBSyxFQUFFLDhCQUE4QjtxQkFDeEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVOzs7NEJBQUMsY0FBTSxPQUFBLGFBQWEsRUFBYixDQUFhLEVBQUM7NEJBQzVDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO29CQUNELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOztpQkFDeEM7Ozs7Z0JBcEJRLGNBQWM7OzsyQkF5QmxCLEtBQUs7MkJBR0wsS0FBSzsyQkFHTCxLQUFLOzJCQUdMLEtBQUs7aUNBR0wsS0FBSzt1QkFVTCxLQUFLO2lDQUlMLE1BQU07bUNBZ0JOLEtBQUs7O0lBMlJWLG9CQUFDO0NBQUEsQUExVkQsSUEwVkM7U0F6VVksYUFBYTs7Ozs7OztJQUl0QixpQ0FBbUM7Ozs7O0lBR25DLGlDQUFrQzs7Ozs7SUFHbEMsaUNBQTJCOzs7OztJQUczQixpQ0FBa0M7Ozs7O0lBR2xDLHVDQUF3Qzs7Ozs7Ozs7Ozs7SUFVeEMsNkJBQ3FEOzs7OztJQUdyRCx1Q0FDNEQ7Ozs7O0lBRzVELCtCQUFlOzs7OztJQUdmLGtDQUFrQjs7Ozs7SUFHbEIsc0NBQXVCOzs7OztJQUd2QixzQ0FBc0I7Ozs7O0lBc0J0QixpQ0FBb0M7Ozs7O0lBRXBDLGtDQUFxQjs7SUFxUVQsdUNBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRpbWVPYmplY3QgfSBmcm9tICcuL3RpbWUtb2JqZWN0JztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRpbWVJMThuTGFiZWxzIH0gZnJvbSAnLi9pMThuL3RpbWUtaTE4bi1sYWJlbHMnO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdFBhcnNlciB9IGZyb20gJy4uL2NhbGVuZGFyL2Zvcm1hdC9kYXRlLXBhcnNlcic7XG5pbXBvcnQgeyBUaW1lRm9ybWF0UGFyc2VyIH0gZnJvbSAnLi4vdGltZS1waWNrZXIvZm9ybWF0L3RpbWUtcGFyc2VyJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10aW1lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGltZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGltZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKScsXG4gICAgICAgIGNsYXNzOiAnZmQtdGltZSBmZC1oYXMtZGlzcGxheS1ibG9jaydcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgICAvKiogQElucHV0IFdoZW4gc2V0IHRvIHRydWUsIHVzZXMgdGhlIDI0IGhvdXIgY2xvY2sgKGhvdXJzIHJhbmdpbmcgZnJvbSAwIHRvIDIzKVxuICAgICAqIGFuZCBkb2VzIG5vdCBkaXNwbGF5IGEgcGVyaW9kIGNvbnRyb2wuICovXG4gICAgQElucHV0KCkgbWVyaWRpYW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gZmFsc2UsIGRvZXMgbm90IHNldCB0aGUgaW5wdXQgZmllbGQgdG8gaW52YWxpZCBzdGF0ZSBvbiBpbnZhbGlkIGVudHJ5LiAqL1xuICAgIEBJbnB1dCgpIHZhbGlkYXRlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBASW5wdXQgRGlzYWJsZXMgdGhlIGNvbXBvbmVudC4gKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKiBASW5wdXQgV2hlbiBzZXQgdG8gZmFsc2UsIGhpZGVzIHRoZSBidXR0b25zIHRoYXQgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQuICovXG4gICAgQElucHV0KCkgc3Bpbm5lcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBXaGVuIHNldCB0byBmYWxzZSwgaGlkZXMgdGhlIGlucHV0IGZvciBzZWNvbmRzLiAqL1xuICAgIEBJbnB1dCgpIGRpc3BsYXlTZWNvbmRzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBJbnB1dCBBbiBvYmplY3QgdGhhdCBjb250YWlucyB0aHJlZSBpbnRlZ2VyIHByb3BlcnRpZXM6ICdob3VyJyAocmFuZ2luZyBmcm9tIDAgdG8gMjMpLFxuICAgICAqICdtaW51dGUnIChyYW5naW5nIGZyb20gMCB0byA1OSksIGFuZCAnc2Vjb25kJyAocmFuZ2luZyBmcm9tIDAgdG8gNTkpLiBUaGlzIGlzIHRoZSBtb2RlbCB0aGUgY29tcG9uZW50IGNvbnN1bWVzLiBFeGFtcGxlOlxuICAgICAqXG4gICAgICogYGBganNvblxuICAgICAqIHsgaG91cjogMTIsIG1pbnV0ZTogMCwgc2Vjb25kOiAwIH1cbiAgICAgKiBgYGBcbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGltZTogVGltZU9iamVjdCA9IHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9jdXNBcnJvd0xlZnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHBlcmlvZDogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbGRQZXJpb2Q6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcGVyaW9kSW52YWxpZDogYm9vbGVhbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZGlzcGxheWVkSG91cjogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldERpc3BsYXllZEhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gMTI7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLmhvdXIgPiAxMikge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXIgLSAxMjtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kID0gJ3BtJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSG91ciA9IDEyO1xuICAgICAgICAgICAgdGhpcy5wZXJpb2QgPSAncG0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXI7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbGRQZXJpb2QgPSB0aGlzLnBlcmlvZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uQ2hhbmdlID0gKHRpbWU6IFRpbWVPYmplY3QpID0+IHt9O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGRpc3BsYXllZEhvdXJDaGFuZ2VkKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID09PSBudWxsICYmIHRoaXMudGltZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAnYW0nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheWVkSG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZS5ob3VyID0gdGhpcy5kaXNwbGF5ZWRIb3VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91cjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91ciArIDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpbnB1dEJsdXIoaW5wdXRUeXBlKSB7XG4gICAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdob3VyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IE1hdGgucm91bmQodGhpcy50aW1lLmhvdXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZEhvdXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZEhvdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ZWRIb3VyID4gMTIgJiYgdGhpcy5kaXNwbGF5ZWRIb3VyIDwgMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAncG0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMuZGlzcGxheWVkSG91ciAtIDEyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXllZEhvdXIgPj0gMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy5kaXNwbGF5ZWRIb3VyICUgMTI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSG91ckNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheWVkSG91ciA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gKHRoaXMuZGlzcGxheWVkSG91ciAqIC0xKSAlIDEyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZEhvdXJDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IE1hdGgucm91bmQodGhpcy50aW1lLmhvdXIpICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZS5ob3VyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IHRoaXMudGltZS5ob3VyICogLTE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAnbWludXRlJykge1xuICAgICAgICAgICAgdGhpcy50aW1lLm1pbnV0ZSA9IE1hdGgucm91bmQodGhpcy50aW1lLm1pbnV0ZSkgJSA2MDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWUubWludXRlIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSB0aGlzLnRpbWUubWludXRlICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAnc2Vjb25kJykge1xuICAgICAgICAgICAgdGhpcy50aW1lLnNlY29uZCA9IE1hdGgucm91bmQodGhpcy50aW1lLnNlY29uZCkgJSA2MDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWUuc2Vjb25kIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSB0aGlzLnRpbWUuc2Vjb25kICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSAncGVyaW9kJykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kICE9PSAnYW0nICYmIHRoaXMucGVyaW9kICE9PSAncG0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRIb3VyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIb3VyID0gdGhpcy50aW1lLmhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW5jcmVhc2VzIHRoZSBob3VyIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBpbmNyZWFzZUhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5ob3VyID09PSAyMykge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSB0aGlzLnRpbWUuaG91ciArIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogRGVjcmVhc2VzIHRoZSBob3VyIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBkZWNyZWFzZUhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWUuaG91ciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5ob3VyID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUuaG91ciA9IDIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lLmhvdXIgPSB0aGlzLnRpbWUuaG91ciAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkSG91cigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogSW5jcmVhc2VzIHRoZSBtaW51dGUgdmFsdWUgYnkgb25lLiAqL1xuICAgIGluY3JlYXNlTWludXRlKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lLm1pbnV0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50aW1lLm1pbnV0ZSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLm1pbnV0ZSA9PT0gNTkpIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSAwO1xuICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSB0aGlzLnRpbWUubWludXRlICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIERlY3JlYXNlcyB0aGUgbWludXRlIHZhbHVlIGJ5IG9uZS4gKi9cbiAgICBkZWNyZWFzZU1pbnV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZS5taW51dGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZS5taW51dGUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudGltZS5taW51dGUgPSA1OTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVhc2VIb3VyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWUubWludXRlID0gdGhpcy50aW1lLm1pbnV0ZSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnRpbWUpO1xuICAgIH1cblxuICAgIC8qKiBJbmNyZWFzZXMgdGhlIHNlY29uZCB2YWx1ZSBieSBvbmUuICovXG4gICAgaW5jcmVhc2VTZWNvbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlTZWNvbmRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lLnNlY29uZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWUuc2Vjb25kID09PSA1OSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VNaW51dGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lLnNlY29uZCA9IHRoaXMudGltZS5zZWNvbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICAvKiogRGVjcmVhc2VzIHRoZSBzZWNvbmQgdmFsdWUgYnkgb25lLiAqL1xuICAgIGRlY3JlYXNlU2Vjb25kKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5U2Vjb25kcykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZS5zZWNvbmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWUuc2Vjb25kID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lLnNlY29uZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSA1OTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY3JlYXNlTWludXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZS5zZWNvbmQgPSB0aGlzLnRpbWUuc2Vjb25kIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgfVxuXG4gICAgLyoqIFRvZ2dsZXMgdGhlIHBlcmlvZCAoYW0vcG0pLiAqL1xuICAgIHRvZ2dsZVBlcmlvZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZS5ob3VyIDwgMjQgJiYgdGhpcy50aW1lLmhvdXIgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGVyaW9kID09PSAnYW0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJpb2QgPSAncG0nO1xuICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kTW9kZWxDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZCA9ICdhbSc7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJpb2RNb2RlbENoYW5nZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBob3VyTW9kZWxDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lcmlkaWFuKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLnRpbWUuaG91ciA+IDEyIHx8IHRoaXMudGltZS5ob3VyIDwgMCkgfHwgIXRoaXMudmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudGltZSk7XG4gICAgICAgICAgIC