UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

160 lines 20.9 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Directive, ElementRef, EventEmitter, NgZone, Output } from '@angular/core'; import { fromEvent, Subscription } from 'rxjs'; const MIN_SWIPE_DISTANCE = 0.1; const STOP_SWIPE_DISTANCE = 0.01; const REFRESH_INTERVAL = 20; const SPEED_OFF_MULTIPLE = Math.pow(0.995, REFRESH_INTERVAL); export class NzTabScrollListDirective { constructor(ngZone, elementRef) { this.ngZone = ngZone; this.elementRef = elementRef; this.lastWheelDirection = null; this.lastWheelTimestamp = 0; this.lastTimestamp = 0; this.lastTimeDiff = 0; this.lastMixedWheel = 0; this.lastWheelPrevent = false; this.touchPosition = null; this.lastOffset = null; this.motion = -1; this.unsubscribe = () => void 0; this.offsetChange = new EventEmitter(); this.tabScroll = new EventEmitter(); this.onTouchEnd = (e) => { if (!this.touchPosition) { return; } const lastOffset = this.lastOffset; const lastTimeDiff = this.lastTimeDiff; this.lastOffset = this.touchPosition = null; if (lastOffset) { const distanceX = lastOffset.x / lastTimeDiff; const distanceY = lastOffset.y / lastTimeDiff; const absX = Math.abs(distanceX); const absY = Math.abs(distanceY); // Skip swipe if low distance if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE) { return; } let currentX = distanceX; let currentY = distanceY; this.motion = window.setInterval(() => { if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) { window.clearInterval(this.motion); return; } currentX *= SPEED_OFF_MULTIPLE; currentY *= SPEED_OFF_MULTIPLE; this.onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL, e); }, REFRESH_INTERVAL); } }; this.onTouchMove = (e) => { if (!this.touchPosition) { return; } e.preventDefault(); const { screenX, screenY } = e.touches[0]; const offsetX = screenX - this.touchPosition.x; const offsetY = screenY - this.touchPosition.y; this.onOffset(offsetX, offsetY, e); const now = Date.now(); this.lastTimeDiff = now - this.lastTimestamp; this.lastTimestamp = now; this.lastOffset = { x: offsetX, y: offsetY }; this.touchPosition = { x: screenX, y: screenY }; }; this.onTouchStart = (e) => { const { screenX, screenY } = e.touches[0]; this.touchPosition = { x: screenX, y: screenY }; window.clearInterval(this.motion); }; this.onWheel = (e) => { const { deltaX, deltaY } = e; let mixed; const absX = Math.abs(deltaX); const absY = Math.abs(deltaY); if (absX === absY) { mixed = this.lastWheelDirection === 'x' ? deltaX : deltaY; } else if (absX > absY) { mixed = deltaX; this.lastWheelDirection = 'x'; } else { mixed = deltaY; this.lastWheelDirection = 'y'; } // Optimize mac touch scroll const now = Date.now(); const absMixed = Math.abs(mixed); if (now - this.lastWheelTimestamp > 100 || absMixed - this.lastMixedWheel > 10) { this.lastWheelPrevent = false; } this.onOffset(-mixed, -mixed, e); if (e.defaultPrevented || this.lastWheelPrevent) { this.lastWheelPrevent = true; } this.lastWheelTimestamp = now; this.lastMixedWheel = absMixed; }; } ngOnInit() { this.unsubscribe = this.ngZone.runOutsideAngular(() => { const el = this.elementRef.nativeElement; const wheel$ = fromEvent(el, 'wheel'); const touchstart$ = fromEvent(el, 'touchstart'); const touchmove$ = fromEvent(el, 'touchmove'); const touchend$ = fromEvent(el, 'touchend'); const subscription = new Subscription(); subscription.add(this.subscribeWrap('wheel', wheel$, this.onWheel)); subscription.add(this.subscribeWrap('touchstart', touchstart$, this.onTouchStart)); subscription.add(this.subscribeWrap('touchmove', touchmove$, this.onTouchMove)); subscription.add(this.subscribeWrap('touchend', touchend$, this.onTouchEnd)); return () => { subscription.unsubscribe(); }; }); } subscribeWrap(type, observable, handler) { return observable.subscribe(event => { this.tabScroll.emit({ type, event }); if (!event.defaultPrevented) { handler(event); } }); } onOffset(x, y, event) { this.ngZone.run(() => { this.offsetChange.emit({ x, y, event }); }); } ngOnDestroy() { this.unsubscribe(); } } NzTabScrollListDirective.decorators = [ { type: Directive, args: [{ selector: '[nzTabScrollList]' },] } ]; NzTabScrollListDirective.ctorParameters = () => [ { type: NgZone }, { type: ElementRef } ]; NzTabScrollListDirective.propDecorators = { offsetChange: [{ type: Output }], tabScroll: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLXNjcm9sbC1saXN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS92c3RzL3dvcmsvMS9zL2NvbXBvbmVudHMvdGFicy8iLCJzb3VyY2VzIjpbInRhYi1zY3JvbGwtbGlzdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTNELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sa0JBQWtCLEdBQUcsU0FBQSxLQUFLLEVBQUksZ0JBQWdCLENBQUEsQ0FBQztBQUtyRCxNQUFNLE9BQU8sd0JBQXdCO0lBZ0JuQyxZQUFvQixNQUFjLEVBQVUsVUFBbUM7UUFBM0QsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBZi9FLHVCQUFrQixHQUFxQixJQUFJLENBQUM7UUFDNUMsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFpQyxJQUFJLENBQUM7UUFDbkQsZUFBVSxHQUFpQyxJQUFJLENBQUM7UUFDaEQsV0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRVosZ0JBQVcsR0FBZSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUE4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UyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7YUFDOUI7OztZQWI2QyxNQUFNO1lBQWhDLFVBQVU7OzsyQkEyQjNCLE1BQU07d0JBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTnpUYWJTY3JvbGxFdmVudCwgTnpUYWJTY3JvbGxFdmVudEhhbmRsZXJGdW4sIE56VGFiU2Nyb2xsTGlzdE9mZnNldCwgTnpUYWJTY3JvbGxMaXN0T2Zmc2V0RXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5jb25zdCBNSU5fU1dJUEVfRElTVEFOQ0UgPSAwLjE7XG5jb25zdCBTVE9QX1NXSVBFX0RJU1RBTkNFID0gMC4wMTtcbmNvbnN0IFJFRlJFU0hfSU5URVJWQUwgPSAyMDtcbmNvbnN0IFNQRUVEX09GRl9NVUxUSVBMRSA9IDAuOTk1ICoqIFJFRlJFU0hfSU5URVJWQUw7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuelRhYlNjcm9sbExpc3RdJ1xufSlcbmV4cG9ydCBjbGFzcyBOelRhYlNjcm9sbExpc3REaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGxhc3RXaGVlbERpcmVjdGlvbjogJ3gnIHwgJ3knIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RXaGVlbFRpbWVzdGFtcCA9IDA7XG4gIGxhc3RUaW1lc3RhbXAgPSAwO1xuICBsYXN0VGltZURpZmYgPSAwO1xuICBsYXN0TWl4ZWRXaGVlbCA9IDA7XG4gIGxhc3RXaGVlbFByZXZlbnQgPSBmYWxzZTtcbiAgdG91Y2hQb3NpdGlvbjogTnpUYWJTY3JvbGxMaXN0T2Zmc2V0IHwgbnVsbCA9IG51bGw7XG4gIGxhc3RPZmZzZXQ6IE56VGFiU2Nyb2xsTGlzdE9mZnNldCB8IG51bGwgPSBudWxsO1xuICBtb3Rpb24gPSAtMTtcblxuICB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCA9ICgpID0+IHZvaWQgMDtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgb2Zmc2V0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOelRhYlNjcm9sbExpc3RPZmZzZXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHRhYlNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8TnpUYWJTY3JvbGxFdmVudD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUgPSB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICBjb25zdCB3aGVlbCQgPSBmcm9tRXZlbnQ8V2hlZWxFdmVudD4oZWwsICd3aGVlbCcpO1xuICAgICAgY29uc3QgdG91Y2hzdGFydCQgPSBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWwsICd0b3VjaHN0YXJ0Jyk7XG4gICAgICBjb25zdCB0b3VjaG1vdmUkID0gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGVsLCAndG91Y2htb3ZlJyk7XG4gICAgICBjb25zdCB0b3VjaGVuZCQgPSBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWwsICd0b3VjaGVuZCcpO1xuXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICBzdWJzY3JpcHRpb24uYWRkKHRoaXMuc3Vic2NyaWJlV3JhcCgnd2hlZWwnLCB3aGVlbCQsIHRoaXMub25XaGVlbCkpO1xuICAgICAgc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnN1YnNjcmliZVdyYXAoJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0JCwgdGhpcy5vblRvdWNoU3RhcnQpKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGQodGhpcy5zdWJzY3JpYmVXcmFwKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmUkLCB0aGlzLm9uVG91Y2hNb3ZlKSk7XG4gICAgICBzdWJzY3JpcHRpb24uYWRkKHRoaXMuc3Vic2NyaWJlV3JhcCgndG91Y2hlbmQnLCB0b3VjaGVuZCQsIHRoaXMub25Ub3VjaEVuZCkpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzY3JpYmVXcmFwPFQgZXh0ZW5kcyBOelRhYlNjcm9sbEV2ZW50WydldmVudCddPihcbiAgICB0eXBlOiBOelRhYlNjcm9sbEV2ZW50Wyd0eXBlJ10sXG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUPixcbiAgICBoYW5kbGVyOiBOelRhYlNjcm9sbEV2ZW50SGFuZGxlckZ1bjxUPlxuICApOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiBvYnNlcnZhYmxlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICB0aGlzLnRhYlNjcm9sbC5lbWl0KHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZXZlbnRcbiAgICAgIH0gYXMgTnpUYWJTY3JvbGxFdmVudCk7XG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblRvdWNoRW5kID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMudG91Y2hQb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0T2Zmc2V0ID0gdGhpcy5sYXN0T2Zmc2V0O1xuICAgIGNvbnN0IGxhc3RUaW1lRGlmZiA9IHRoaXMubGFzdFRpbWVEaWZmO1xuXG4gICAgdGhpcy5sYXN0T2Zmc2V0ID0gdGhpcy50b3VjaFBvc2l0aW9uID0gbnVsbDtcblxuICAgIGlmIChsYXN0T2Zmc2V0KSB7XG4gICAgICBjb25zdCBkaXN0YW5jZVggPSBsYXN0T2Zmc2V0LnggLyBsYXN0VGltZURpZmY7XG4gICAgICBjb25zdCBkaXN0YW5jZVkgPSBsYXN0T2Zmc2V0LnkgLyBsYXN0VGltZURpZmY7XG4gICAgICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZGlzdGFuY2VYKTtcbiAgICAgIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkaXN0YW5jZVkpO1xuXG4gICAgICAvLyBTa2lwIHN3aXBlIGlmIGxvdyBkaXN0YW5jZVxuICAgICAgaWYgKE1hdGgubWF4KGFic1gsIGFic1kpIDwgTUlOX1NXSVBFX0RJU1RBTkNFKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGN1cnJlbnRYID0gZGlzdGFuY2VYO1xuICAgICAgbGV0IGN1cnJlbnRZID0gZGlzdGFuY2VZO1xuXG4gICAgICB0aGlzLm1vdGlvbiA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmIChNYXRoLmFicyhjdXJyZW50WCkgPCBTVE9QX1NXSVBFX0RJU1RBTkNFICYmIE1hdGguYWJzKGN1cnJlbnRZKSA8IFNUT1BfU1dJUEVfRElTVEFOQ0UpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLm1vdGlvbik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFggKj0gU1BFRURfT0ZGX01VTFRJUExFO1xuICAgICAgICBjdXJyZW50WSAqPSBTUEVFRF9PRkZfTVVMVElQTEU7XG4gICAgICAgIHRoaXMub25PZmZzZXQoY3VycmVudFggKiBSRUZSRVNIX0lOVEVSVkFMLCBjdXJyZW50WSAqIFJFRlJFU0hfSU5URVJWQUwsIGUpO1xuICAgICAgfSwgUkVGUkVTSF9JTlRFUlZBTCk7XG4gICAgfVxuICB9O1xuXG4gIG9uVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMudG91Y2hQb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7IHNjcmVlblgsIHNjcmVlblkgfSA9IGUudG91Y2hlc1swXTtcblxuICAgIGNvbnN0IG9mZnNldFggPSBzY3JlZW5YIC0gdGhpcy50b3VjaFBvc2l0aW9uLng7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IHNjcmVlblkgLSB0aGlzLnRvdWNoUG9zaXRpb24ueTtcbiAgICB0aGlzLm9uT2Zmc2V0KG9mZnNldFgsIG9mZnNldFksIGUpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICB0aGlzLmxhc3RUaW1lRGlmZiA9IG5vdyAtIHRoaXMubGFzdFRpbWVzdGFtcDtcbiAgICB0aGlzLmxhc3RUaW1lc3RhbXAgPSBub3c7XG4gICAgdGhpcy5sYXN0T2Zmc2V0ID0geyB4OiBvZmZzZXRYLCB5OiBvZmZzZXRZIH07XG4gICAgdGhpcy50b3VjaFBvc2l0aW9uID0geyB4OiBzY3JlZW5YLCB5OiBzY3JlZW5ZIH07XG4gIH07XG5cbiAgb25Ub3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IHNjcmVlblgsIHNjcmVlblkgfSA9IGUudG91Y2hlc1swXTtcbiAgICB0aGlzLnRvdWNoUG9zaXRpb24gPSB7IHg6IHNjcmVlblgsIHk6IHNjcmVlblkgfTtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLm1vdGlvbik7XG4gIH07XG5cbiAgb25XaGVlbCA9IChlOiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZTtcbiAgICBsZXQgbWl4ZWQ6IG51bWJlcjtcbiAgICBjb25zdCBhYnNYID0gTWF0aC5hYnMoZGVsdGFYKTtcbiAgICBjb25zdCBhYnNZID0gTWF0aC5hYnMoZGVsdGFZKTtcblxuICAgIGlmIChhYnNYID09PSBhYnNZKSB7XG4gICAgICBtaXhlZCA9IHRoaXMubGFzdFdoZWVsRGlyZWN0aW9uID09PSAneCcgPyBkZWx0YVggOiBkZWx0YVk7XG4gICAgfSBlbHNlIGlmIChhYnNYID4gYWJzWSkge1xuICAgICAgbWl4ZWQgPSBkZWx0YVg7XG4gICAgICB0aGlzLmxhc3RXaGVlbERpcmVjdGlvbiA9ICd4JztcbiAgICB9IGVsc2Uge1xuICAgICAgbWl4ZWQgPSBkZWx0YVk7XG4gICAgICB0aGlzLmxhc3RXaGVlbERpcmVjdGlvbiA9ICd5JztcbiAgICB9XG5cbiAgICAvLyBPcHRpbWl6ZSBtYWMgdG91Y2ggc2Nyb2xsXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBhYnNNaXhlZCA9IE1hdGguYWJzKG1peGVkKTtcblxuICAgIGlmIChub3cgLSB0aGlzLmxhc3RXaGVlbFRpbWVzdGFtcCA+IDEwMCB8fCBhYnNNaXhlZCAtIHRoaXMubGFzdE1peGVkV2hlZWwgPiAxMCkge1xuICAgICAgdGhpcy5sYXN0V2hlZWxQcmV2ZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMub25PZmZzZXQoLW1peGVkLCAtbWl4ZWQsIGUpO1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5sYXN0V2hlZWxQcmV2ZW50KSB7XG4gICAgICB0aGlzLmxhc3RXaGVlbFByZXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubGFzdFdoZWVsVGltZXN0YW1wID0gbm93O1xuICAgIHRoaXMubGFzdE1peGVkV2hlZWwgPSBhYnNNaXhlZDtcbiAgfTtcblxuICBvbk9mZnNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMub2Zmc2V0Q2hhbmdlLmVtaXQoe1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBldmVudFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==