ngx-slice-kit
Version:
[](https://badge.fury.io/js/ngx-slice-kit)
182 lines • 24 kB
JavaScript
import { Directive, HostListener, Input } from '@angular/core';
import { timer } from 'rxjs';
import { first } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class TooltipDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.showOnClick = false;
this.position = 'top';
this.offset = 12;
}
onMouseEnter() {
if (!this.tooltip && !this.showOnClick) {
this.show();
}
}
onClick() {
if (!this.tooltip && this.showOnClick) {
this.show();
}
}
onMouseLeave() {
if (this.tooltip) {
this.hide();
}
else {
if (this.sub && !this.sub.closed) {
this.sub.unsubscribe();
}
}
}
show() {
this.showTimeout = timer(Number(this.delay));
this.sub = this.showTimeout.pipe(first()).subscribe(() => {
this.create();
this.setPosition();
this.renderer.addClass(this.tooltip, 'sdk-tooltip-show');
this.showTimeout = null;
});
}
hide() {
this.renderer.removeClass(this.tooltip, 'sdk-tooltip-show');
this.renderer.removeChild(document.body, this.tooltip);
this.tooltip = null;
// window.setTimeout(() => {
// this.renderer.removeChild(document.body, this.tooltip);
// this.tooltip = null;
// }, Number(this.delay));
}
create() {
this.tooltip = this.renderer.createElement('div');
this.tooltipContent = this.renderer.createElement('p');
this.renderer.appendChild(this.tooltipContent, this.renderer.createText(this.message));
this.renderer.appendChild(this.tooltip, this.tooltipContent);
this.renderer.appendChild(document.body, this.tooltip);
this.renderer.addClass(this.tooltip, 'sdk-tooltip');
this.renderer.addClass(this.tooltip, `sdk-tooltip--${this.position}`);
this.renderer.addClass(this.tooltipContent, 'sdk-tooltip__content');
}
setPosition() {
const hostPos = this.triggerElement.getBoundingClientRect();
const tooltipPos = this.tooltip.getBoundingClientRect();
const tooltipHeight = this.tooltip.offsetHeight;
const tooltipWidth = this.tooltip.offsetWidth;
const scrollPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
let top;
let left;
this.offset = Number(this.offset);
if (this.position === 'top') {
const options = {
hostPosition: hostPos.top,
hostSize: hostPos.height,
tooltipSize: tooltipHeight
};
left = hostPos.left + (hostPos.width - tooltipPos.width) / 2;
if (this.checkOversize(options, 'height', false)) {
top = hostPos.top - tooltipHeight - this.offset;
}
else {
this.changePosition('top', 'bottom');
this.setPosition();
}
}
if (this.position === 'bottom') {
const options = {
hostPosition: hostPos.top,
hostSize: hostPos.height,
tooltipSize: tooltipHeight
};
left = hostPos.left + (hostPos.width - tooltipPos.width) / 2;
if (this.checkOversize(options, 'height')) {
top = hostPos.bottom + this.offset;
}
else {
this.changePosition('bottom', 'top');
this.setPosition();
}
}
if (this.position === 'left') {
const options = {
hostPosition: hostPos.left,
hostSize: hostPos.width,
tooltipSize: tooltipWidth
};
top = hostPos.top + (hostPos.height - tooltipHeight) / 2;
if (this.checkOversize(options, 'width', false)) {
left = hostPos.left - tooltipWidth - this.offset;
}
else {
this.changePosition('left', 'right');
this.setPosition();
}
}
if (this.position === 'right') {
const options = {
hostPosition: hostPos.left,
hostSize: hostPos.width,
tooltipSize: tooltipWidth
};
top = hostPos.top + (hostPos.height - tooltipHeight) / 2;
if (this.checkOversize(options, 'width')) {
left = hostPos.right + this.offset;
}
else {
this.changePosition('right', 'left');
this.setPosition();
}
}
this.renderer.setStyle(this.tooltip, 'top', `${top + scrollPos}px`);
this.renderer.setStyle(this.tooltip, 'left', `${left}px`);
}
changePosition(oldPosition, newPosition) {
this.position = newPosition;
this.renderer.removeClass(this.tooltip, `sdk-tooltip--${oldPosition}`);
this.renderer.addClass(this.tooltip, `sdk-tooltip--${newPosition}`);
}
checkOversize(options, dimension, isDirectionForward = true) {
const documentPos = document.body.getBoundingClientRect();
if (isDirectionForward) {
return options.hostPosition + options.hostSize + options.tooltipSize + this.offset <= documentPos[dimension];
}
else {
return options.hostPosition - options.hostSize - options.tooltipSize - this.offset > 0;
}
}
ngOnInit() {
this.triggerElement = this.el.nativeElement || this.el;
}
}
TooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TooltipDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
TooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.3", type: TooltipDirective, selector: "[sdkTooltip]", inputs: { showOnClick: "showOnClick", delay: "delay", message: ["sdkTooltip", "message"], position: "position", offset: "offset" }, host: { listeners: { "mouseenter": "onMouseEnter()", "click": "onClick()", "mousewheel": "onMouseLeave()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TooltipDirective, decorators: [{
type: Directive,
args: [{
selector: '[sdkTooltip]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { showOnClick: [{
type: Input
}], delay: [{
type: Input
}], message: [{
type: Input,
args: ['sdkTooltip']
}], position: [{
type: Input
}], offset: [{
type: Input
}], onMouseEnter: [{
type: HostListener,
args: ['mouseenter']
}], onClick: [{
type: HostListener,
args: ['click']
}], onMouseLeave: [{
type: HostListener,
args: ['mousewheel']
}, {
type: HostListener,
args: ['mouseleave']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1zbGljZS1raXQvc3JjL2xpYi9tb2RhbHMvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQzVGLE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sZ0JBQWdCO0lBZXpCLFlBQ1ksRUFBYyxFQUNkLFFBQW1CO1FBRG5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBaEJmLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRzdCLGFBQVEsR0FBVyxLQUFLLENBQUM7UUFDekIsV0FBTSxHQUFXLEVBQUUsQ0FBQztJQWNwQyxDQUFDO0lBR00sWUFBWTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDZjtJQUNMLENBQUM7SUFHTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDZjtJQUNMLENBQUM7SUFJTSxZQUFZO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUM5QixJQUFJLENB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LE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDMUY7SUFDTCxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxDQUFDOzs2R0FsTFEsZ0JBQWdCO2lHQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFINUIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsY0FBYztpQkFDM0I7eUhBRW1CLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDc0IsT0FBTztzQkFBbEMsS0FBSzt1QkFBQyxZQUFZO2dCQUNILFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFpQkMsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyxZQUFZO2dCQVFuQixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTztnQkFTZCxZQUFZO3NCQUZsQixZQUFZO3VCQUFDLFlBQVk7O3NCQUN6QixZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb24sIHRpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Zmlyc3R9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbc2RrVG9vbHRpcF0nXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93T25DbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWxheTogc3RyaW5nIHwgbnVtYmVyO1xuICAgIEBJbnB1dCgnc2RrVG9vbHRpcCcpIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHBvc2l0aW9uOiBzdHJpbmcgPSAndG9wJztcbiAgICBASW5wdXQoKSBwdWJsaWMgb2Zmc2V0OiBudW1iZXIgPSAxMjtcblxuICAgIHB1YmxpYyB0b29sdGlwOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgdG9vbHRpcENvbnRlbnQ6IEhUTUxFbGVtZW50O1xuICAgIHB1YmxpYyB0cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwdWJsaWMgc2hvd1RpbWVvdXQ7XG5cbiAgICBwdWJsaWMgc3ViOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICAgKSB7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gICAgcHVibGljIG9uTW91c2VFbnRlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnRvb2x0aXAgJiYgIXRoaXMuc2hvd09uQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICAgIHB1YmxpYyBvbkNsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudG9vbHRpcCAmJiB0aGlzLnNob3dPbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNld2hlZWwnKVxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXApIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3ViICYmICF0aGlzLnN1Yi5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd1RpbWVvdXQgPSB0aW1lcihOdW1iZXIodGhpcy5kZWxheSkpO1xuXG4gICAgICAgIHRoaXMuc3ViID0gdGhpcy5zaG93VGltZW91dC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2x0aXAsICdzZGstdG9vbHRpcC1zaG93Jyk7XG4gICAgICAgICAgICB0aGlzLnNob3dUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhpZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy50b29sdGlwLCAnc2RrLXRvb2x0aXAtc2hvdycpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMudG9vbHRpcCk7XG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XG4gICAgICAgIC8vIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgdGhpcy50b29sdGlwKTtcbiAgICAgICAgLy8gICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XG4gICAgICAgIC8vIH0sIE51bWJlcih0aGlzLmRlbGF5KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b29sdGlwID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy50b29sdGlwQ29udGVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgdGhpcy50b29sdGlwQ29udGVudCxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0aGlzLm1lc3NhZ2UpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXAsIHRoaXMudG9vbHRpcENvbnRlbnQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMudG9vbHRpcCk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2x0aXAsICdzZGstdG9vbHRpcCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMudG9vbHRpcCwgYHNkay10b29sdGlwLS0ke3RoaXMucG9zaXRpb259YCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy50b29sdGlwQ29udGVudCwgJ3Nkay10b29sdGlwX19jb250ZW50Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBvc2l0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3N0UG9zID0gdGhpcy50cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdG9vbHRpcFBvcyA9IHRoaXMudG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdG9vbHRpcEhlaWdodCA9IHRoaXMudG9vbHRpcC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHRvb2x0aXBXaWR0aCA9IHRoaXMudG9vbHRpcC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUG9zID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgMDtcblxuICAgICAgICBsZXQgdG9wO1xuICAgICAgICBsZXQgbGVmdDtcblxuICAgICAgICB0aGlzLm9mZnNldCA9IE51bWJlcih0aGlzLm9mZnNldCk7XG5cbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGhvc3RQb3NpdGlvbjogaG9zdFBvcy50b3AsXG4gICAgICAgICAgICAgICAgaG9zdFNpemU6IGhvc3RQb3MuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHRvb2x0aXBTaXplOiB0b29sdGlwSGVpZ2h0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZWZ0ID0gaG9zdFBvcy5sZWZ0ICsgKGhvc3RQb3Mud2lkdGggLSB0b29sdGlwUG9zLndpZHRoKSAvIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja092ZXJzaXplKG9wdGlvbnMsICdoZWlnaHQnLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICB0b3AgPSBob3N0UG9zLnRvcCAtIHRvb2x0aXBIZWlnaHQgLSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VQb3NpdGlvbigndG9wJywgJ2JvdHRvbScpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBob3N0UG9zaXRpb246IGhvc3RQb3MudG9wLFxuICAgICAgICAgICAgICAgIGhvc3RTaXplOiBob3N0UG9zLmhlaWdodCxcbiAgICAgICAgICAgICAgICB0b29sdGlwU2l6ZTogdG9vbHRpcEhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxlZnQgPSBob3N0UG9zLmxlZnQgKyAoaG9zdFBvcy53aWR0aCAtIHRvb2x0aXBQb3Mud2lkdGgpIC8gMjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrT3ZlcnNpemUob3B0aW9ucywgJ2hlaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgdG9wID0gaG9zdFBvcy5ib3R0b20gKyB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VQb3NpdGlvbignYm90dG9tJywgJ3RvcCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgaG9zdFBvc2l0aW9uOiBob3N0UG9zLmxlZnQsXG4gICAgICAgICAgICAgICAgaG9zdFNpemU6IGhvc3RQb3Mud2lkdGgsXG4gICAgICAgICAgICAgICAgdG9vbHRpcFNpemU6IHRvb2x0aXBXaWR0aFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRvcCA9IGhvc3RQb3MudG9wICsgKGhvc3RQb3MuaGVpZ2h0IC0gdG9vbHRpcEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tPdmVyc2l6ZShvcHRpb25zLCAnd2lkdGgnLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gaG9zdFBvcy5sZWZ0IC0gdG9vbHRpcFdpZHRoIC0gdGhpcy5vZmZzZXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlUG9zaXRpb24oJ2xlZnQnLCAncmlnaHQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBob3N0UG9zaXRpb246IGhvc3RQb3MubGVmdCxcbiAgICAgICAgICAgICAgICBob3N0U2l6ZTogaG9zdFBvcy53aWR0aCxcbiAgICAgICAgICAgICAgICB0b29sdGlwU2l6ZTogdG9vbHRpcFdpZHRoXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdG9wID0gaG9zdFBvcy50b3AgKyAoaG9zdFBvcy5oZWlnaHQgLSB0b29sdGlwSGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja092ZXJzaXplKG9wdGlvbnMsICd3aWR0aCcpKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IGhvc3RQb3MucmlnaHQgKyB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VQb3NpdGlvbigncmlnaHQnLCAnbGVmdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sdGlwLCAndG9wJywgYCR7dG9wICsgc2Nyb2xsUG9zfXB4YCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sdGlwLCAnbGVmdCcsIGAke2xlZnR9cHhgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlUG9zaXRpb24ob2xkUG9zaXRpb24sIG5ld1Bvc2l0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXAsIGBzZGstdG9vbHRpcC0tJHtvbGRQb3NpdGlvbn1gKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2x0aXAsIGBzZGstdG9vbHRpcC0tJHtuZXdQb3NpdGlvbn1gKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tPdmVyc2l6ZShvcHRpb25zLCBkaW1lbnNpb24sIGlzRGlyZWN0aW9uRm9yd2FyZCA9IHRydWUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRQb3MgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoaXNEaXJlY3Rpb25Gb3J3YXJkKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5ob3N0UG9zaXRpb24gKyBvcHRpb25zLmhvc3RTaXplICsgb3B0aW9ucy50b29sdGlwU2l6ZSArIHRoaXMub2Zmc2V0IDw9IGRvY3VtZW50UG9zW2RpbWVuc2lvbl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5ob3N0UG9zaXRpb24gLSBvcHRpb25zLmhvc3RTaXplIC0gb3B0aW9ucy50b29sdGlwU2l6ZSAtIHRoaXMub2Zmc2V0ID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudCB8fCB0aGlzLmVsO1xuICAgIH1cbn1cbiJdfQ==