UNPKG

ngx-virtual-swiper

Version:
150 lines 22.6 kB
import { Directionality } from '@angular/cdk/bidi'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { Directive, HostListener, Inject, Input, Optional } from '@angular/core'; import { Subscription } from 'rxjs'; import { NgxVirtualSwiperOptions } from './options'; import { getClickPositions, getTouchPositions, isNumber } from './utils'; const VERTICAL_ORIENTATION = 'vertical'; const HORIZONTAL_ORIENTATION = 'horizontal'; const RIGHT_TO_LEFT = 'rtl'; export class NgxVirtualSwiperDirective { constructor(options, /** to lean more see https://material.angular.io/cdk/scrolling/api */ cdk, dir) { this.options = options; this.cdk = cdk; this.dir = dir; this.subscription = new Subscription(); // eslint-disable-next-line @typescript-eslint/member-ordering this.onMousedown = (e) => this.start(getClickPositions(e)); this.onTouchstart = (e) => this.start(getTouchPositions(e)); this.onMousemove = (e) => this.move(getClickPositions(e)); this.onTouchmove = (e) => this.move(getTouchPositions(e)); this.onFinish = () => { if (this.swiped) { this.toggleSwiped(false); this.finalize(); } }; /** the bug-fix to prevent dragging images while swiping */ this.onDragstart = (e) => e.preventDefault(); this.mousemoveX = (e) => { if (e) { const offset = this.cdk.measureScrollOffset(); const c = this.rtl ? -1 : 1; const delta = (this.clientX - e.clientX) * c; const value = offset + delta; if (value >= 0 && value <= this.scrollSize) { this.cdk.scrollToOffset(Math.abs(value)); this.clientX = e.clientX; } } }; this.mousemoveY = (e) => { if (e) { const offset = this.cdk.measureScrollOffset(); const value = offset - e.clientY + this.clientY; if (value >= 0 && value <= this.scrollSize) { this.cdk.scrollToOffset(value); this.clientY = e.clientY; } } }; this.start = (e) => { this.toggleSwiped(true); this.clientX = e.clientX; this.clientY = e.clientY; this.prevClientX = e.clientX; this.prevClientY = e.clientY; }; this.move = (e) => { if (this.swiped) { if (this.cdk.orientation === HORIZONTAL_ORIENTATION) { this.mousemoveX(e); } else if (this.cdk.orientation === VERTICAL_ORIENTATION) { this.mousemoveY(e); } } }; this.toggleSwiped = (value) => { this.swiped = value; }; this.finalize = () => { if (this.options.finalize) { this.scrollToNearestIndex(); } }; this.scrollToNearestIndex = () => { const delta = this.cdk.orientation === HORIZONTAL_ORIENTATION ? this.prevClientX - this.clientX : this.cdk.orientation === VERTICAL_ORIENTATION ? this.prevClientY - this.clientY : null; if (isNumber(delta)) { const directionDelta = this.rtl ? delta * -1 : delta; const index = directionDelta > 0 && Math.abs(directionDelta) >= this.options.threshold ? this.index + 1 : this.index; this.cdk.scrollToIndex(index, 'smooth'); } }; this.addEventListener = () => { this.cdk.elementRef.nativeElement.addEventListener('click', this.preventClicks, true); }; this.removeEventListener = () => { this.cdk.elementRef.nativeElement.removeEventListener('click', this.preventClicks, true); }; /** prevent all type of clicks (e.g. click on links, Angular`s click) */ this.preventClicks = (e) => { if (this.changed && this.options.preventClicks) { e.stopPropagation(); e.preventDefault(); e.stopImmediatePropagation(); } }; } ngOnInit() { this.addEventListener(); this.subscription.add(this.cdk.scrolledIndexChange.subscribe(i => this.index = i)); } ngOnDestroy() { this.removeEventListener(); this.subscription.unsubscribe(); } get changed() { let result = false; if (isNumber(this.prevClientX) && isNumber(this.options.threshold)) { const deltaX = Math.abs(this.prevClientX - this.clientX); result = deltaX >= this.options.threshold; } if (isNumber(this.prevClientY) && isNumber(this.options.threshold)) { const deltaY = Math.abs(this.prevClientY - this.clientY); result = result || deltaY >= this.options.threshold; } return result; } get rtl() { var _a; return ((_a = this.dir) === null || _a === void 0 ? void 0 : _a.value) === RIGHT_TO_LEFT; } get scrollSize() { return this.cdk.getDataLength() * this.itemSize; } } NgxVirtualSwiperDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxVirtualSwiper]' },] } ]; NgxVirtualSwiperDirective.ctorParameters = () => [ { type: NgxVirtualSwiperOptions, decorators: [{ type: Inject, args: [NgxVirtualSwiperOptions,] }] }, { type: CdkVirtualScrollViewport, decorators: [{ type: Inject, args: [CdkVirtualScrollViewport,] }] }, { type: Directionality, decorators: [{ type: Optional }, { type: Inject, args: [Directionality,] }] } ]; NgxVirtualSwiperDirective.propDecorators = { itemSize: [{ type: Input }], onMousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }], onTouchstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }], onMousemove: [{ type: HostListener, args: ['mousemove', ['$event'],] }], onTouchmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }], onFinish: [{ type: HostListener, args: ['document:mouseup',] }, { type: HostListener, args: ['touchend',] }], onDragstart: [{ type: HostListener, args: ['document:dragstart', ['$event'],] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXZpcnR1YWwtc3dpcGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12aXJ0dWFsLXN3aXBlci9zcmMvbGliL25neC12aXJ0dWFsLXN3aXBlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXpFLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztBQUs1QixNQUFNLE9BQU8seUJBQXlCO0lBV2xDLFlBQzZDLE9BQWdDO0lBQ3pFLHFFQUFxRTtJQUMzQixHQUE2QixFQUMzQixHQUFvQjtRQUh2QixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUUvQixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFpQjtRQVpwRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUF5QmxELDhEQUE4RDtRQUV2RCxnQkFBVyxHQUFHLENBQUMsQ0FBaUIsRUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FB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QnZCLE1BQU0sU0FBQyx1QkFBdUI7WUExQjlCLHdCQUF3Qix1QkE0QnhCLE1BQU0sU0FBQyx3QkFBd0I7WUE3Qi9CLGNBQWMsdUJBOEJkLFFBQVEsWUFBSSxNQUFNLFNBQUMsY0FBYzs7O3VCQWJyQyxLQUFLOzBCQTJCTCxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOzJCQUdwQyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQUdyQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQUdwQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO3VCQUdwQyxZQUFZLFNBQUMsa0JBQWtCLGNBQy9CLFlBQVksU0FBQyxVQUFVOzBCQVN2QixZQUFZLFNBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ3hWaXJ0dWFsU3dpcGVyT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBJUG9zaXRpb25FdmVudCB9IGZyb20gJy4vcG9zaXRpb24tZXZlbnQnO1xuaW1wb3J0IHsgZ2V0Q2xpY2tQb3NpdGlvbnMsIGdldFRvdWNoUG9zaXRpb25zLCBpc051bWJlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBWRVJUSUNBTF9PUklFTlRBVElPTiA9ICd2ZXJ0aWNhbCc7XG5jb25zdCBIT1JJWk9OVEFMX09SSUVOVEFUSU9OID0gJ2hvcml6b250YWwnO1xuY29uc3QgUklHSFRfVE9fTEVGVCA9ICdydGwnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tuZ3hWaXJ0dWFsU3dpcGVyXSdcbn0pXG5leHBvcnQgY2xhc3MgTmd4VmlydHVhbFN3aXBlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtU2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyByZWFkb25seSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcHVibGljIGluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIHN3aXBlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgY2xpZW50WDogbnVtYmVyO1xuICAgIHB1YmxpYyBjbGllbnRZOiBudW1iZXI7XG4gICAgcHVibGljIHByZXZDbGllbnRYOiBudW1iZXI7XG4gICAgcHVibGljIHByZXZDbGllbnRZOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoTmd4VmlydHVhbFN3aXBlck9wdGlvbnMpIHByaXZhdGUgb3B0aW9uczogTmd4VmlydHVhbFN3aXBlck9wdGlvbnMsXG4gICAgICAgIC8qKiB0byBsZWFuIG1vcmUgc2VlIGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9jZGsvc2Nyb2xsaW5nL2FwaSAqL1xuICAgICAgICBASW5qZWN0KENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgcHJpdmF0ZSBjZGs6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXJlY3Rpb25hbGl0eSkgcHJpdmF0ZSBkaXI/OiBEaXJlY3Rpb25hbGl0eVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5jZGsuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoaSA9PiB0aGlzLmluZGV4ID0gaSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbk1vdXNlZG93biA9IChlOiBJUG9zaXRpb25FdmVudCk6IHZvaWQgPT4gdGhpcy5zdGFydChnZXRDbGlja1Bvc2l0aW9ucyhlKSk7XG5cbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Ub3VjaHN0YXJ0ID0gKGU6IHsgdG91Y2hlczogSVBvc2l0aW9uRXZlbnRbXSB9KTogdm9pZCA9PiB0aGlzLnN0YXJ0KGdldFRvdWNoUG9zaXRpb25zKGUpKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uTW91c2Vtb3ZlID0gKGU6IElQb3NpdGlvbkV2ZW50KTogdm9pZCA9PiB0aGlzLm1vdmUoZ2V0Q2xpY2tQb3NpdGlvbnMoZSkpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Ub3VjaG1vdmUgPSAoZTogeyB0b3VjaGVzOiBJUG9zaXRpb25FdmVudFtdIH0pOiB2b2lkID0+IHRoaXMubW92ZShnZXRUb3VjaFBvc2l0aW9ucyhlKSk7XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJylcbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcpXG4gICAgcHVibGljIG9uRmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5zd2lwZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU3dpcGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogdGhlIGJ1Zy1maXggdG8gcHJldmVudCBkcmFnZ2luZyBpbWFnZXMgd2hpbGUgc3dpcGluZyAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmRyYWdzdGFydCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uRHJhZ3N0YXJ0ID0gKGU6IHsgcHJldmVudERlZmF1bHQ6IGFueSB9KTogdm9pZCA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBwdWJsaWMgZ2V0IGNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzTnVtYmVyKHRoaXMucHJldkNsaWVudFgpICYmIGlzTnVtYmVyKHRoaXMub3B0aW9ucy50aHJlc2hvbGQpKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBNYXRoLmFicyh0aGlzLnByZXZDbGllbnRYIC0gdGhpcy5jbGllbnRYKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlbHRhWCA+PSB0aGlzLm9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcih0aGlzLnByZXZDbGllbnRZKSAmJiBpc051bWJlcih0aGlzLm9wdGlvbnMudGhyZXNob2xkKSkge1xuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnModGhpcy5wcmV2Q2xpZW50WSAtIHRoaXMuY2xpZW50WSk7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwgZGVsdGFZID49IHRoaXMub3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ0bCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyPy52YWx1ZSA9PT0gUklHSFRfVE9fTEVGVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNjcm9sbFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2RrLmdldERhdGFMZW5ndGgoKSAqIHRoaXMuaXRlbVNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIG1vdXNlbW92ZVggPSAoZTogSVBvc2l0aW9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY2RrLm1lYXN1cmVTY3JvbGxPZmZzZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0aGlzLnJ0bCA/IC0xIDogMTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gKHRoaXMuY2xpZW50WCAtIGUuY2xpZW50WCkgKiBjO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvZmZzZXQgKyBkZWx0YTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IHRoaXMuc2Nyb2xsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrLnNjcm9sbFRvT2Zmc2V0KE1hdGguYWJzKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGllbnRYID0gZS5jbGllbnRYO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBtb3VzZW1vdmVZID0gKGU6IElQb3NpdGlvbkV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmNkay5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9mZnNldCAtIGUuY2xpZW50WSArIHRoaXMuY2xpZW50WTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IHRoaXMuc2Nyb2xsU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrLnNjcm9sbFRvT2Zmc2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXJ0ID0gKGU6IElQb3NpdGlvbkV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMudG9nZ2xlU3dpcGVkKHRydWUpO1xuICAgICAgICB0aGlzLmNsaWVudFggPSBlLmNsaWVudFg7XG4gICAgICAgIHRoaXMuY2xpZW50WSA9IGUuY2xpZW50WTtcbiAgICAgICAgdGhpcy5wcmV2Q2xpZW50WCA9IGUuY2xpZW50WDtcbiAgICAgICAgdGhpcy5wcmV2Q2xpZW50WSA9IGUuY2xpZW50WTtcbiAgICB9O1xuXG4gICAgcHVibGljIG1vdmUgPSAoZTogSVBvc2l0aW9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3dpcGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZGsub3JpZW50YXRpb24gPT09IEhPUklaT05UQUxfT1JJRU5UQVRJT04pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlbW92ZVgoZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2RrLm9yaWVudGF0aW9uID09PSBWRVJUSUNBTF9PUklFTlRBVElPTikge1xuICAgICAgICAgICAgICAgIHRoaXMubW91c2Vtb3ZlWShlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgdG9nZ2xlU3dpcGVkID0gKHZhbHVlOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc3dpcGVkID0gdmFsdWU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBmaW5hbGl6ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maW5hbGl6ZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb05lYXJlc3RJbmRleCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBzY3JvbGxUb05lYXJlc3RJbmRleCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmNkay5vcmllbnRhdGlvbiA9PT0gSE9SSVpPTlRBTF9PUklFTlRBVElPTiA/IHRoaXMucHJldkNsaWVudFggLSB0aGlzLmNsaWVudFggOlxuICAgICAgICAgICAgdGhpcy5jZGsub3JpZW50YXRpb24gPT09IFZFUlRJQ0FMX09SSUVOVEFUSU9OID8gdGhpcy5wcmV2Q2xpZW50WSAtIHRoaXMuY2xpZW50WSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGRlbHRhKSkge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uRGVsdGEgPSB0aGlzLnJ0bCA/IGRlbHRhICogLTEgOiBkZWx0YTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlyZWN0aW9uRGVsdGEgPiAwICYmIE1hdGguYWJzKGRpcmVjdGlvbkRlbHRhKSA+PSB0aGlzLm9wdGlvbnMudGhyZXNob2xkID8gdGhpcy5pbmRleCArIDEgOiB0aGlzLmluZGV4O1xuICAgICAgICAgICAgdGhpcy5jZGsuc2Nyb2xsVG9JbmRleChpbmRleCwgJ3Ntb290aCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmNkay5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnByZXZlbnRDbGlja3MsIHRydWUpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5jZGsuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5wcmV2ZW50Q2xpY2tzLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqIHByZXZlbnQgYWxsIHR5cGUgb2YgY2xpY2tzIChlLmcuIGNsaWNrIG9uIGxpbmtzLCBBbmd1bGFyYHMgY2xpY2spICovXG4gICAgcHVibGljIHByZXZlbnRDbGlja3MgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkICYmIHRoaXMub3B0aW9ucy5wcmV2ZW50Q2xpY2tzKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iXX0=