UNPKG

@ngx-kit/core

Version:

ngx-kit - core module

347 lines 28.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ElementRef, Injectable } from '@angular/core'; import { HammerGestureConfig } from '@angular/platform-browser'; import { BehaviorSubject } from 'rxjs'; import { KitHammerProvider } from '../kit-hammer/kit-hammer-provider'; import { KitHammerTypes } from '../kit-hammer/meta'; import { KitPlatformService } from '../kit-platform/kit-platform.service'; /** * Scroll area helpers. * Should be provided on component. */ var KitScrollService = /** @class */ (function () { function KitScrollService(platform, elRef, hammerProvider) { this.platform = platform; this.elRef = elRef; this.hammerProvider = hammerProvider; this._state = new BehaviorSubject({ nativeScrollbarWidth: 0, dragging: false, vBar: { active: false, size: 0, position: 0, }, hBar: { active: false, size: 0, position: 0, }, }); this._state.next(tslib_1.__assign({}, this.state, { nativeScrollbarWidth: this.platform.getScrollbarWidth() })); } Object.defineProperty(KitScrollService.prototype, "state", { get: /** * @return {?} */ function () { return this._state.value; }, enumerable: true, configurable: true }); Object.defineProperty(KitScrollService.prototype, "stateChanges", { get: /** * @return {?} */ function () { return this._state.asObservable(); }, enumerable: true, configurable: true }); /** * @return {?} */ KitScrollService.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.mutationObserver) { this.mutationObserver.disconnect(); } }; /** * @param {?} refs * @return {?} */ KitScrollService.prototype.registerRefs = /** * @param {?} refs * @return {?} */ function (refs) { this.refs = refs; if (this.hammerProvider.hammer) { this.initVListeners(); this.initHListeners(); this.initMutationObserver(); } }; /** * @return {?} */ KitScrollService.prototype.update = /** * @return {?} */ function () { this.updateVBar(); this.updateHBar(); }; /** * @return {?} */ KitScrollService.prototype.updateVBar = /** * @return {?} */ function () { /** @type {?} */ var state = this.calcBar(this.refs.vWrapper.scrollHeight - this.state.nativeScrollbarWidth, this.elRef.nativeElement.offsetHeight, this.refs.vBarWrapper.offsetHeight, this.refs.vWrapper.scrollTop); this._state.next(tslib_1.__assign({}, this.state, { vBar: state })); }; /** * @return {?} */ KitScrollService.prototype.updateHBar = /** * @return {?} */ function () { /** @type {?} */ var state = this.calcBar(this.refs.hWrapper.scrollWidth, this.elRef.nativeElement.offsetWidth, this.refs.hBarWrapper.offsetWidth, this.refs.hWrapper.scrollLeft); this._state.next(tslib_1.__assign({}, this.state, { hBar: state })); }; /** * @private * @param {?} contentSize * @param {?} hostSize * @param {?} barWrapperSize * @param {?} scrollPosition * @return {?} */ KitScrollService.prototype.calcBar = /** * @private * @param {?} contentSize * @param {?} hostSize * @param {?} barWrapperSize * @param {?} scrollPosition * @return {?} */ function (contentSize, hostSize, barWrapperSize, scrollPosition) { if (contentSize > hostSize) { /** @type {?} */ var size = Math.round(Math.max((hostSize / contentSize) * barWrapperSize, 30)); return { active: true, size: size, position: Math.round((barWrapperSize - size) * (scrollPosition / (contentSize - hostSize))), }; } else { return { active: false, size: 0, position: 0, }; } }; /** * @private * @return {?} */ KitScrollService.prototype.initVListeners = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var vBarHammerConfig = new HammerGestureConfig(); vBarHammerConfig.overrides = { pan: { direction: KitHammerTypes.DIRECTION_VERTICAL, threshold: 1, }, }; /** @type {?} */ var vBarHammer = vBarHammerConfig.buildHammer(this.refs.vBar); /** @type {?} */ var scrollStart = null; // Pan vBarHammer.on('pan', (/** * @param {?} event * @return {?} */ function (event) { // Start if (scrollStart === null) { scrollStart = _this.refs.vWrapper.scrollTop; _this._state.next(tslib_1.__assign({}, _this.state, { dragging: true })); } // Calc /** @type {?} */ var contentHeight = _this.refs.hWrapper.scrollHeight; /** @type {?} */ var hostHeight = _this.elRef.nativeElement.offsetHeight; /** @type {?} */ var coef = contentHeight / hostHeight; if (scrollStart !== null) { _this.refs.vWrapper.scrollTop = Math.round(scrollStart + event.deltaY * coef); } // Final if (event.isFinal) { scrollStart = null; _this._state.next(tslib_1.__assign({}, _this.state, { dragging: false })); } })); // Tap /** @type {?} */ var vBarWrapperHammer = vBarHammerConfig.buildHammer(this.refs.vBarWrapper); vBarWrapperHammer.on('tap', (/** * @param {?} event * @return {?} */ function (event) { if (event.target === _this.refs.vBarWrapper) { /** @type {?} */ var pos = _this.hammerProvider.calcRelatedPosition(_this.refs.vBarWrapper, event.center); // Calc _this.refs.vWrapper.scrollTop += pos.y > _this.state.vBar.position ? 200 : -200; } })); }; /** * @private * @return {?} */ KitScrollService.prototype.initHListeners = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var hBarHammerConfig = new HammerGestureConfig(); hBarHammerConfig.overrides = { pan: { direction: KitHammerTypes.DIRECTION_HORIZONTAL, threshold: 1, }, }; /** @type {?} */ var hBarHammer = hBarHammerConfig.buildHammer(this.refs.hBar); /** @type {?} */ var scrollStart = null; // Pan hBarHammer.on('pan', (/** * @param {?} event * @return {?} */ function (event) { // Start if (scrollStart === null) { scrollStart = _this.refs.hWrapper.scrollLeft; _this._state.next(tslib_1.__assign({}, _this.state, { dragging: true })); } // Calc /** @type {?} */ var contentWidth = _this.refs.hWrapper.scrollWidth; /** @type {?} */ var hostWidth = _this.elRef.nativeElement.offsetWidth; /** @type {?} */ var coef = contentWidth / hostWidth; if (scrollStart !== null) { _this.refs.hWrapper.scrollLeft = Math.round(scrollStart + event.deltaX * coef); } // Final if (event.isFinal) { scrollStart = null; _this._state.next(tslib_1.__assign({}, _this.state, { dragging: false })); } })); // Tap /** @type {?} */ var hBarWrapperHammer = hBarHammerConfig.buildHammer(this.refs.hBarWrapper); hBarWrapperHammer.on('tap', (/** * @param {?} event * @return {?} */ function (event) { if (event.target === _this.refs.hBarWrapper) { /** @type {?} */ var pos = _this.hammerProvider.calcRelatedPosition(_this.refs.hBarWrapper, event.center); // Calc _this.refs.hWrapper.scrollLeft += pos.x > _this.state.hBar.position ? 200 : -200; } })); }; /** * @private * @return {?} */ KitScrollService.prototype.initMutationObserver = /** * @private * @return {?} */ function () { var _this = this; this.mutationObserver = new MutationObserver((/** * @param {?} mutations * @return {?} */ function (mutations) { if (mutations.length > 0) { _this.update(); } })); this.mutationObserver.observe(this.refs.hWrapper, { attributes: true, childList: true, characterData: true, subtree: true, }); }; KitScrollService.decorators = [ { type: Injectable } ]; /** @nocollapse */ KitScrollService.ctorParameters = function () { return [ { type: KitPlatformService }, { type: ElementRef }, { type: KitHammerProvider } ]; }; return KitScrollService; }()); export { KitScrollService }; if (false) { /** @type {?} */ KitScrollService.prototype.refs; /** * @type {?} * @private */ KitScrollService.prototype._state; /** * @type {?} * @private */ KitScrollService.prototype.mutationObserver; /** * @type {?} * @private */ KitScrollService.prototype.platform; /** * @type {?} * @private */ KitScrollService.prototype.elRef; /** * @type {?} * @private */ KitScrollService.prototype.hammerProvider; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0LXNjcm9sbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1raXQvY29yZS8iLCJzb3VyY2VzIjpbInNyYy9raXQtc2Nyb2xsL2tpdC1zY3JvbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7OztBQU8xRTtJQXFCRSwwQkFDVSxRQUE0QixFQUM1QixLQUFpQixFQUNqQixjQUFzQztRQUZ0QyxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQXBCeEMsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFpQjtZQUNuRCxvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRSxLQUFLO2dCQUNiLElBQUksRUFBRSxDQUFDO2dCQUNQLFFBQVEsRUFBRSxDQUFDO2FBQ1o7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsUUFBUSxFQUFFLENBQUM7YUFDWjtTQUNGLENBQUMsQ0FBQztRQVNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFDWCxJQUFJLENBQUMsS0FBSyxJQUNiLG9CQUFvQixFQUFFLElBQUksQ0FBQyxRQUFR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QUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUN4RixPQUFPO2dCQUNQLEtBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUNoRjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFTywrQ0FBb0I7Ozs7SUFBNUI7UUFBQSxpQkFZQztRQVhDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQjs7OztRQUFDLFVBQUEsU0FBUztZQUNwRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDZjtRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoRCxVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLGFBQWEsRUFBRSxJQUFJO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBak5GLFVBQVU7Ozs7Z0JBUEYsa0JBQWtCO2dCQUxsQixVQUFVO2dCQUdWLGlCQUFpQjs7SUEyTjFCLHVCQUFDO0NBQUEsQUFsTkQsSUFrTkM7U0FqTlksZ0JBQWdCOzs7SUFDM0IsZ0NBQW9COzs7OztJQUVwQixrQ0FhRzs7Ozs7SUFFSCw0Q0FBMkM7Ozs7O0lBR3pDLG9DQUFvQzs7Ozs7SUFDcEMsaUNBQXlCOzs7OztJQUN6QiwwQ0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSGFtbWVyR2VzdHVyZUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgS2l0SGFtbWVyUHJvdmlkZXIgfSBmcm9tICcuLi9raXQtaGFtbWVyL2tpdC1oYW1tZXItcHJvdmlkZXInO1xyXG5pbXBvcnQgeyBLaXRIYW1tZXJUeXBlcyB9IGZyb20gJy4uL2tpdC1oYW1tZXIvbWV0YSc7XHJcbmltcG9ydCB7IEtpdFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uL2tpdC1wbGF0Zm9ybS9raXQtcGxhdGZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IEtpdFNjcm9sbFJlZnMsIEtpdFNjcm9sbFN0YXRlIH0gZnJvbSAnLi9tZXRhJztcclxuXHJcbi8qKlxyXG4gKiBTY3JvbGwgYXJlYSBoZWxwZXJzLlxyXG4gKiBTaG91bGQgYmUgcHJvdmlkZWQgb24gY29tcG9uZW50LlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgS2l0U2Nyb2xsU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcmVmczogS2l0U2Nyb2xsUmVmcztcclxuXHJcbiAgcHJpdmF0ZSBfc3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtpdFNjcm9sbFN0YXRlPih7XHJcbiAgICBuYXRpdmVTY3JvbGxiYXJXaWR0aDogMCxcclxuICAgIGRyYWdnaW5nOiBmYWxzZSxcclxuICAgIHZCYXI6IHtcclxuICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgc2l6ZTogMCxcclxuICAgICAgcG9zaXRpb246IDAsXHJcbiAgICB9LFxyXG4gICAgaEJhcjoge1xyXG4gICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICBzaXplOiAwLFxyXG4gICAgICBwb3NpdGlvbjogMCxcclxuICAgIH0sXHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBLaXRQbGF0Zm9ybVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBoYW1tZXJQcm92aWRlcjogS2l0SGFtbWVyUHJvdmlkZXI8YW55PixcclxuICApIHtcclxuICAgIHRoaXMuX3N0YXRlLm5leHQoe1xyXG4gICAgICAuLi50aGlzLnN0YXRlLFxyXG4gICAgICBuYXRpdmVTY3JvbGxiYXJXaWR0aDogdGhpcy5wbGF0Zm9ybS5nZXRTY3JvbGxiYXJXaWR0aCgpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdGUoKTogS2l0U2Nyb2xsU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXRlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPEtpdFNjcm9sbFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyUmVmcyhyZWZzOiBLaXRTY3JvbGxSZWZzKSB7XHJcbiAgICB0aGlzLnJlZnMgPSByZWZzO1xyXG4gICAgaWYgKHRoaXMuaGFtbWVyUHJvdmlkZXIuaGFtbWVyKSB7XHJcbiAgICAgIHRoaXMuaW5pdFZMaXN0ZW5lcnMoKTtcclxuICAgICAgdGhpcy5pbml0SExpc3RlbmVycygpO1xyXG4gICAgICB0aGlzLmluaXRNdXRhdGlvbk9ic2VydmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVZCYXIoKTtcclxuICAgIHRoaXMudXBkYXRlSEJhcigpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVkJhcigpIHtcclxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jYWxjQmFyKFxyXG4gICAgICB0aGlzLnJlZnMudldyYXBwZXIuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5zdGF0ZS5uYXRpdmVTY3JvbGxiYXJXaWR0aCxcclxuICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCxcclxuICAgICAgdGhpcy5yZWZzLnZCYXJXcmFwcGVyLm9mZnNldEhlaWdodCxcclxuICAgICAgdGhpcy5yZWZzLnZXcmFwcGVyLnNjcm9sbFRvcCxcclxuICAgICk7XHJcbiAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgLi4udGhpcy5zdGF0ZSxcclxuICAgICAgdkJhcjogc3RhdGUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUhCYXIoKSB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY2FsY0JhcihcclxuICAgICAgdGhpcy5yZWZzLmhXcmFwcGVyLnNjcm9sbFdpZHRoLFxyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXHJcbiAgICAgIHRoaXMucmVmcy5oQmFyV3JhcHBlci5vZmZzZXRXaWR0aCxcclxuICAgICAgdGhpcy5yZWZzLmhXcmFwcGVyLnNjcm9sbExlZnQsXHJcbiAgICApO1xyXG4gICAgdGhpcy5fc3RhdGUubmV4dCh7XHJcbiAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgIGhCYXI6IHN0YXRlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGNCYXIoY29udGVudFNpemU6IG51bWJlciwgaG9zdFNpemU6IG51bWJlciwgYmFyV3JhcHBlclNpemU6IG51bWJlciwgc2Nyb2xsUG9zaXRpb246IG51bWJlcikge1xyXG4gICAgaWYgKGNvbnRlbnRTaXplID4gaG9zdFNpemUpIHtcclxuICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgucm91bmQoTWF0aC5tYXgoKGhvc3RTaXplIC8gY29udGVudFNpemUpICogYmFyV3JhcHBlclNpemUsIDMwKSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxyXG4gICAgICAgIHNpemUsXHJcbiAgICAgICAgcG9zaXRpb246IE1hdGgucm91bmQoKGJhcldyYXBwZXJTaXplIC0gc2l6ZSkgKiAoc2Nyb2xsUG9zaXRpb24gLyAoY29udGVudFNpemUgLSBob3N0U2l6ZSkpKSxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBzaXplOiAwLFxyXG4gICAgICAgIHBvc2l0aW9uOiAwLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Vkxpc3RlbmVycygpIHtcclxuICAgIGNvbnN0IHZCYXJIYW1tZXJDb25maWcgPSBuZXcgSGFtbWVyR2VzdHVyZUNvbmZpZygpO1xyXG4gICAgdkJhckhhbW1lckNvbmZpZy5vdmVycmlkZXMgPSB7XHJcbiAgICAgIHBhbjoge1xyXG4gICAgICAgIGRpcmVjdGlvbjogS2l0SGFtbWVyVHlwZXMuRElSRUNUSU9OX1ZFUlRJQ0FMLFxyXG4gICAgICAgIHRocmVzaG9sZDogMSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICBjb25zdCB2QmFySGFtbWVyID0gdkJhckhhbW1lckNvbmZpZy5idWlsZEhhbW1lcih0aGlzLnJlZnMudkJhcik7XHJcbiAgICBsZXQgc2Nyb2xsU3RhcnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLy8gUGFuXHJcbiAgICB2QmFySGFtbWVyLm9uKCdwYW4nLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBTdGFydFxyXG4gICAgICBpZiAoc2Nyb2xsU3RhcnQgPT09IG51bGwpIHtcclxuICAgICAgICBzY3JvbGxTdGFydCA9IHRoaXMucmVmcy52V3JhcHBlci5zY3JvbGxUb3A7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUubmV4dCh7XHJcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLFxyXG4gICAgICAgICAgZHJhZ2dpbmc6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2FsY1xyXG4gICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gdGhpcy5yZWZzLmhXcmFwcGVyLnNjcm9sbEhlaWdodDtcclxuICAgICAgY29uc3QgaG9zdEhlaWdodCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGNvZWYgPSBjb250ZW50SGVpZ2h0IC8gaG9zdEhlaWdodDtcclxuICAgICAgaWYgKHNjcm9sbFN0YXJ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5yZWZzLnZXcmFwcGVyLnNjcm9sbFRvcCA9IE1hdGgucm91bmQoc2Nyb2xsU3RhcnQgKyBldmVudC5kZWx0YVkgKiBjb2VmKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBGaW5hbFxyXG4gICAgICBpZiAoZXZlbnQuaXNGaW5hbCkge1xyXG4gICAgICAgIHNjcm9sbFN0YXJ0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgICAgICBkcmFnZ2luZzogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gVGFwXHJcbiAgICBjb25zdCB2QmFyV3JhcHBlckhhbW1lciA9IHZCYXJIYW1tZXJDb25maWcuYnVpbGRIYW1tZXIodGhpcy5yZWZzLnZCYXJXcmFwcGVyKTtcclxuICAgIHZCYXJXcmFwcGVySGFtbWVyLm9uKCd0YXAnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnJlZnMudkJhcldyYXBwZXIpIHtcclxuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmhhbW1lclByb3ZpZGVyLmNhbGNSZWxhdGVkUG9zaXRpb24odGhpcy5yZWZzLnZCYXJXcmFwcGVyLCBldmVudC5jZW50ZXIpO1xyXG4gICAgICAgIC8vIENhbGNcclxuICAgICAgICB0aGlzLnJlZnMudldyYXBwZXIuc2Nyb2xsVG9wICs9IHBvcy55ID4gdGhpcy5zdGF0ZS52QmFyLnBvc2l0aW9uID8gMjAwIDogLTIwMDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRITGlzdGVuZXJzKCkge1xyXG4gICAgY29uc3QgaEJhckhhbW1lckNvbmZpZyA9IG5ldyBIYW1tZXJHZXN0dXJlQ29uZmlnKCk7XHJcbiAgICBoQmFySGFtbWVyQ29uZmlnLm92ZXJyaWRlcyA9IHtcclxuICAgICAgcGFuOiB7XHJcbiAgICAgICAgZGlyZWN0aW9uOiBLaXRIYW1tZXJUeXBlcy5ESVJFQ1RJT05fSE9SSVpPTlRBTCxcclxuICAgICAgICB0aHJlc2hvbGQ6IDEsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgY29uc3QgaEJhckhhbW1lciA9IGhCYXJIYW1tZXJDb25maWcuYnVpbGRIYW1tZXIodGhpcy5yZWZzLmhCYXIpO1xyXG4gICAgbGV0IHNjcm9sbFN0YXJ0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIC8vIFBhblxyXG4gICAgaEJhckhhbW1lci5vbigncGFuJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgLy8gU3RhcnRcclxuICAgICAgaWYgKHNjcm9sbFN0YXJ0ID09PSBudWxsKSB7XHJcbiAgICAgICAgc2Nyb2xsU3RhcnQgPSB0aGlzLnJlZnMuaFdyYXBwZXIuc2Nyb2xsTGVmdDtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgICAgICBkcmFnZ2luZzogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBDYWxjXHJcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHRoaXMucmVmcy5oV3JhcHBlci5zY3JvbGxXaWR0aDtcclxuICAgICAgY29uc3QgaG9zdFdpZHRoID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICBjb25zdCBjb2VmID0gY29udGVudFdpZHRoIC8gaG9zdFdpZHRoO1xyXG4gICAgICBpZiAoc2Nyb2xsU3RhcnQgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLnJlZnMuaFdyYXBwZXIuc2Nyb2xsTGVmdCA9IE1hdGgucm91bmQoc2Nyb2xsU3RhcnQgKyBldmVudC5kZWx0YVggKiBjb2VmKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBGaW5hbFxyXG4gICAgICBpZiAoZXZlbnQuaXNGaW5hbCkge1xyXG4gICAgICAgIHNjcm9sbFN0YXJ0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgICAgICBkcmFnZ2luZzogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gVGFwXHJcbiAgICBjb25zdCBoQmFyV3JhcHBlckhhbW1lciA9IGhCYXJIYW1tZXJDb25maWcuYnVpbGRIYW1tZXIodGhpcy5yZWZzLmhCYXJXcmFwcGVyKTtcclxuICAgIGhCYXJXcmFwcGVySGFtbWVyLm9uKCd0YXAnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnJlZnMuaEJhcldyYXBwZXIpIHtcclxuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmhhbW1lclByb3ZpZGVyLmNhbGNSZWxhdGVkUG9zaXRpb24odGhpcy5yZWZzLmhCYXJXcmFwcGVyLCBldmVudC5jZW50ZXIpO1xyXG4gICAgICAgIC8vIENhbGNcclxuICAgICAgICB0aGlzLnJlZnMuaFdyYXBwZXIuc2Nyb2xsTGVmdCArPSBwb3MueCA+IHRoaXMuc3RhdGUuaEJhci5wb3NpdGlvbiA/IDIwMCA6IC0yMDA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0TXV0YXRpb25PYnNlcnZlcigpIHtcclxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XHJcbiAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5yZWZzLmhXcmFwcGVyLCB7XHJcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXHJcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=