UNPKG

ngx-scrollbar-v8

Version:

Custom overlay-scrollbars with native scrolling mechanism.

331 lines 22.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Inject, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { supportsScrollBehavior } from '@angular/cdk/platform'; import { from, of, animationFrameScheduler } from 'rxjs'; /** * @record */ export function SmoothScrollOptions() { } if (false) { /** @type {?|undefined} */ SmoothScrollOptions.prototype.top; /** @type {?|undefined} */ SmoothScrollOptions.prototype.left; /** @type {?} */ SmoothScrollOptions.prototype.offsetTop; /** @type {?} */ SmoothScrollOptions.prototype.offsetLeft; /** @type {?} */ SmoothScrollOptions.prototype.duration; /** @type {?} */ SmoothScrollOptions.prototype.scrollFunc; /** @type {?} */ SmoothScrollOptions.prototype.easeFunc; } /** * @record */ export function ScrollToOptions() { } if (false) { /** @type {?|undefined} */ ScrollToOptions.prototype.top; /** @type {?|undefined} */ ScrollToOptions.prototype.left; /** @type {?|undefined} */ ScrollToOptions.prototype.duration; /** @type {?|undefined} */ ScrollToOptions.prototype.easeFunc; } var SmoothScroll = /** @class */ (function () { function SmoothScroll(_platform, el) { this._platform = _platform; this.view = el.nativeElement; } /** * @private * @param {?} left * @param {?} top * @return {?} */ SmoothScroll.prototype.scrollFunc = /** * @private * @param {?} left * @param {?} top * @return {?} */ function (left, top) { if (supportsScrollBehavior()) { this.view.scrollTo({ top: top, left: left }); } else { this.view.scrollTop = top; this.view.scrollLeft = left; } }; /** * @param {?} options * @return {?} */ SmoothScroll.prototype.scrollTo = /** * @param {?} options * @return {?} */ function (options) { var _this = this; // Avoid SSR error if (isPlatformBrowser(this._platform)) { /** @type {?} */ var scrollFunc = (/** * @param {?} left * @param {?} top * @return {?} */ function (left, top) { if (supportsScrollBehavior()) { _this.view.scrollTo({ top: top, left: left }); } else { _this.view.scrollTop = top; _this.view.scrollLeft = left; } }); if (options.duration) { /** @type {?} */ var smoothScrollOptions = { top: options.top, left: options.left, duration: options.duration, easeFunc: options.easeFunc || easeInOutQuad, offsetTop: this.view.scrollTop, offsetLeft: this.view.scrollLeft, scrollFunc: scrollFunc }; return from(smoothScroll(smoothScrollOptions)); } this.scrollFunc(options.left, options.top); } return of(); }; /** * @param {?} selector * @param {?=} offset * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollToElement = /** * @param {?} selector * @param {?=} offset * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (selector, offset, duration, easeFunc) { if (offset === void 0) { offset = 0; } /** @type {?} */ var target = this.view.querySelector(selector); return target ? this.scrollTo({ left: target.offsetLeft, top: target.offsetTop - offset, duration: duration, easeFunc: easeFunc }) : of(); }; /** * @param {?} left * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollXTo = /** * @param {?} left * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (left, duration, easeFunc) { return this.scrollTo({ left: left, duration: duration, easeFunc: easeFunc }); }; /** * @param {?} top * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollYTo = /** * @param {?} top * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (top, duration, easeFunc) { return this.scrollTo({ top: top, duration: duration, easeFunc: easeFunc }); }; /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollToTop = /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (duration, easeFunc) { return this.scrollYTo(0, duration, easeFunc); }; /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollToBottom = /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (duration, easeFunc) { return this.scrollYTo(this.view.scrollHeight - this.view.clientHeight, duration, easeFunc); }; /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollToRight = /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (duration, easeFunc) { return this.scrollXTo(this.view.scrollWidth, duration, easeFunc); }; /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ SmoothScroll.prototype.scrollToLeft = /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ function (duration, easeFunc) { return this.scrollXTo(0, duration, easeFunc); }; SmoothScroll.decorators = [ { type: Directive, args: [{ selector: '[smoothScroll], [smooth-scroll]' },] } ]; /** @nocollapse */ SmoothScroll.ctorParameters = function () { return [ { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: ElementRef } ]; }; return SmoothScroll; }()); export { SmoothScroll }; if (false) { /** * @type {?} * @private */ SmoothScroll.prototype.view; /** * @type {?} * @private */ SmoothScroll.prototype._platform; } /** * @param {?} options * @return {?} */ export function smoothScroll(options) { return new Promise((/** * @param {?} resolve * @return {?} */ function (resolve) { /** @type {?} */ var currentTime = 0; /** @type {?} */ var increment = 10; /** @type {?} */ var valX = options.offsetLeft; /** @type {?} */ var valY = options.offsetTop; /** @type {?} */ var animateScroll = (/** * @return {?} */ function () { // increment the time currentTime += increment; // find the value with the easing function if (typeof options.left !== 'undefined') { /** @type {?} */ var deltaX = options.left - options.offsetLeft; valX = options.easeFunc(currentTime, options.offsetLeft, deltaX, options.duration); } if (typeof options.top !== 'undefined') { /** @type {?} */ var deltaY = options.top - options.offsetTop; valY = options.easeFunc(currentTime, options.offsetTop, deltaY, options.duration); } // scroll to position options.scrollFunc(valX, valY); // do the animation unless its over if (currentTime < options.duration) { animationFrameScheduler.schedule(animateScroll); } else { resolve(); } }); animateScroll(); })); } // easing functions http://goo.gl/5HLl8 /** * @param {?} t * @param {?} b * @param {?} c * @param {?} d * @return {?} */ export function easeInOutQuad(t, b, c, d) { t /= d / 2; if (t < 1) { return (c / 2) * t * t + b; } t--; return (-c / 2) * (t * (t - 2) - 1) + b; } /** * @param {?} t * @param {?} b * @param {?} c * @param {?} d * @return {?} */ export function easeInCubic(t, b, c, d) { /** @type {?} */ var tc = (t /= d) * t * t; return b + c * tc; } /** * @param {?} t * @param {?} b * @param {?} c * @param {?} d * @return {?} */ export function inOutQuintic(t, b, c, d) { /** @type {?} */ var ts = (t /= d) * t; /** @type {?} */ var tc = ts * t; return b + c * (6 * tc * ts + -15 * ts * ts + 10 * tc); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXNjcm9sbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY3JvbGxiYXIvIiwic291cmNlcyI6WyJzbW9vdGgtc2Nyb2xsL3Ntb290aC1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFjLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFJckUseUNBUUM7OztJQVBDLGtDQUFhOztJQUNiLG1DQUFjOztJQUNkLHdDQUFrQjs7SUFDbEIseUNBQW1COztJQUNuQix1Q0FBaUI7O0lBQ2pCLHlDQUFnRDs7SUFDaEQsdUNBQStCOzs7OztBQUdqQyxxQ0FLQzs7O0lBSkMsOEJBQWE7O0lBQ2IsK0JBQWM7O0lBQ2QsbUNBQWtCOztJQUNsQixtQ0FBZ0M7O0FBR2xDO0lBT0Usc0JBQXlDLFNBQWlCLEVBQzlDLEVBQWM7UUFEZSxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBRXhELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztJQUMvQixDQUFDOzs7Ozs7O0lBRU8saUNBQVU7Ozs7OztJQUFsQixVQUFtQixJQUFZLEVBQUUsR0FBVztRQUMxQyxJQUFJLHNCQUFzQixFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxHQUFHLEtBQUEsRUFBRSxJQUFJLE1BQUEsRUFBQyxDQUFDLENBQUM7U0FDakM7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxD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Ozs7Ozs7OztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUzs7UUFDOUQsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsQ0FBQzs7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7O1FBQy9ELEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDOztRQUNyQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBzdXBwb3J0c1Njcm9sbEJlaGF2aW9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIG9mLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBTbW9vdGhTY3JvbGxFYXNlRnVuYyA9ICh0OiBudW1iZXIsIHM6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpID0+IG51bWJlcjtcblxuZXhwb3J0IGludGVyZmFjZSBTbW9vdGhTY3JvbGxPcHRpb25zIHtcbiAgdG9wPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xuICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBzY3JvbGxGdW5jOiAodG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgZWFzZUZ1bmM6IFNtb290aFNjcm9sbEVhc2VGdW5jO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbFRvT3B0aW9ucyB7XG4gIHRvcD86IG51bWJlcjtcbiAgbGVmdD86IG51bWJlcjtcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmM7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzbW9vdGhTY3JvbGxdLCBbc21vb3RoLXNjcm9sbF0nXG59KVxuZXhwb3J0IGNsYXNzIFNtb290aFNjcm9sbCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIF9wbGF0Zm9ybTogT2JqZWN0LFxuICAgICAgICAgICAgICBlbDogRWxlbWVudFJlZikge1xuICAgIHRoaXMudmlldyA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEZ1bmMobGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcikge1xuICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHtcbiAgICAgIHRoaXMudmlldy5zY3JvbGxUbyh7dG9wLCBsZWZ0fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlldy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICB0aGlzLnZpZXcuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG8ob3B0aW9uczogU2Nyb2xsVG9PcHRpb25zKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgLy8gQXZvaWQgU1NSIGVycm9yXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMuX3BsYXRmb3JtKSkge1xuICAgICAgY29uc3Qgc2Nyb2xsRnVuYyA9IChsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHtcbiAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsVG8oe3RvcCwgbGVmdH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgdGhpcy52aWV3LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMuZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3Qgc21vb3RoU2Nyb2xsT3B0aW9uczogU21vb3RoU2Nyb2xsT3B0aW9ucyA9IHtcbiAgICAgICAgICB0b3A6IG9wdGlvbnMudG9wLFxuICAgICAgICAgIGxlZnQ6IG9wdGlvbnMubGVmdCxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlRnVuYzogb3B0aW9ucy5lYXNlRnVuYyB8fCBlYXNlSW5PdXRRdWFkLFxuICAgICAgICAgIG9mZnNldFRvcDogdGhpcy52aWV3LnNjcm9sbFRvcCxcbiAgICAgICAgICBvZmZzZXRMZWZ0OiB0aGlzLnZpZXcuc2Nyb2xsTGVmdCxcbiAgICAgICAgICBzY3JvbGxGdW5jXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmcm9tKHNtb290aFNjcm9sbChzbW9vdGhTY3JvbGxPcHRpb25zKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjcm9sbEZ1bmMob3B0aW9ucy5sZWZ0LCBvcHRpb25zLnRvcCk7XG4gICAgfVxuICAgIHJldHVybiBvZjx2b2lkPigpO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcsIG9mZnNldCA9IDAsIGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0OiBIVE1MRWxlbWVudCA9IHRoaXMudmlldy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gdGFyZ2V0ID8gdGhpcy5zY3JvbGxUbyh7bGVmdDogdGFyZ2V0Lm9mZnNldExlZnQsIHRvcDogdGFyZ2V0Lm9mZnNldFRvcCAtIG9mZnNldCwgZHVyYXRpb24sIGVhc2VGdW5jfSkgOiBvZjx2b2lkPigpO1xuICB9XG5cbiAgc2Nyb2xsWFRvKGxlZnQ6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxUbyh7bGVmdCwgZHVyYXRpb24sIGVhc2VGdW5jfSk7XG4gIH1cblxuICBzY3JvbGxZVG8odG9wOiBudW1iZXIsIGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG8oe3RvcCwgZHVyYXRpb24sIGVhc2VGdW5jfSk7XG4gIH1cblxuICBzY3JvbGxUb1RvcChkdXJhdGlvbj86IG51bWJlciwgZWFzZUZ1bmM/OiBTbW9vdGhTY3JvbGxFYXNlRnVuYyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFlUbygwLCBkdXJhdGlvbiwgZWFzZUZ1bmMpO1xuICB9XG5cbiAgc2Nyb2xsVG9Cb3R0b20oZHVyYXRpb24/OiBudW1iZXIsIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxZVG8odGhpcy52aWV3LnNjcm9sbEhlaWdodCAtIHRoaXMudmlldy5jbGllbnRIZWlnaHQsIGR1cmF0aW9uLCBlYXNlRnVuYyk7XG4gIH1cblxuICBzY3JvbGxUb1JpZ2h0KGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsWFRvKHRoaXMudmlldy5zY3JvbGxXaWR0aCwgZHVyYXRpb24sIGVhc2VGdW5jKTtcbiAgfVxuXG4gIHNjcm9sbFRvTGVmdChkdXJhdGlvbj86IG51bWJlciwgZWFzZUZ1bmM/OiBTbW9vdGhTY3JvbGxFYXNlRnVuYyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFhUbygwLCBkdXJhdGlvbiwgZWFzZUZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbW9vdGhTY3JvbGwob3B0aW9uczogU21vb3RoU2Nyb2xsT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgbGV0IGN1cnJlbnRUaW1lID0gMDtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSAxMDtcbiAgICBsZXQgdmFsWCA9IG9wdGlvbnMub2Zmc2V0TGVmdDtcbiAgICBsZXQgdmFsWSA9IG9wdGlvbnMub2Zmc2V0VG9wO1xuXG4gICAgY29uc3QgYW5pbWF0ZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIC8vIGluY3JlbWVudCB0aGUgdGltZVxuICAgICAgY3VycmVudFRpbWUgKz0gaW5jcmVtZW50O1xuICAgICAgLy8gZmluZCB0aGUgdmFsdWUgd2l0aCB0aGUgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMubGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gb3B0aW9ucy5sZWZ0IC0gb3B0aW9ucy5vZmZzZXRMZWZ0O1xuICAgICAgICB2YWxYID0gb3B0aW9ucy5lYXNlRnVuYyhjdXJyZW50VGltZSwgb3B0aW9ucy5vZmZzZXRMZWZ0LCBkZWx0YVgsIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRvcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gb3B0aW9ucy50b3AgLSBvcHRpb25zLm9mZnNldFRvcDtcbiAgICAgICAgdmFsWSA9IG9wdGlvbnMuZWFzZUZ1bmMoY3VycmVudFRpbWUsIG9wdGlvbnMub2Zmc2V0VG9wLCBkZWx0YVksIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gc2Nyb2xsIHRvIHBvc2l0aW9uXG4gICAgICBvcHRpb25zLnNjcm9sbEZ1bmModmFsWCwgdmFsWSk7XG4gICAgICAvLyBkbyB0aGUgYW5pbWF0aW9uIHVubGVzcyBpdHMgb3ZlclxuICAgICAgaWYgKGN1cnJlbnRUaW1lIDwgb3B0aW9ucy5kdXJhdGlvbikge1xuICAgICAgICBhbmltYXRpb25GcmFtZVNjaGVkdWxlci5zY2hlZHVsZShhbmltYXRlU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGFuaW1hdGVTY3JvbGwoKTtcbiAgfSk7XG59XG5cbi8vIGVhc2luZyBmdW5jdGlvbnMgaHR0cDovL2dvby5nbC81SExsOFxuZXhwb3J0IGZ1bmN0aW9uIGVhc2VJbk91dFF1YWQodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZCAvIDI7XG4gIGlmICh0IDwgMSkge1xuICAgIHJldHVybiAoYyAvIDIpICogdCAqIHQgKyBiO1xuICB9XG4gIHQtLTtcbiAgcmV0dXJuICgtYyAvIDIpICogKHQgKiAodCAtIDIpIC0gMSkgKyBiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFzZUluQ3ViaWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIGNvbnN0IHRjID0gKHQgLz0gZCkgKiB0ICogdDtcbiAgcmV0dXJuIGIgKyBjICogdGM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbk91dFF1aW50aWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIGNvbnN0IHRzID0gKHQgLz0gZCkgKiB0LFxuICAgIHRjID0gdHMgKiB0O1xuICByZXR1cm4gYiArIGMgKiAoNiAqIHRjICogdHMgKyAtMTUgKiB0cyAqIHRzICsgMTAgKiB0Yyk7XG59XG4iXX0=