@eternalheart/ngx-file-preview
Version:
A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.
125 lines • 21.4 kB
JavaScript
import { Component, Directive, HostListener, Input } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "../services";
export class TooltipDirective {
constructor(el, renderer, viewContainer, previewService) {
this.el = el;
this.renderer = renderer;
this.viewContainer = viewContainer;
this.previewService = previewService;
this.delay = 500;
this.positions = ['top', 'bottom', 'left', 'right'];
this.currentPosition = 'top';
}
onMouseEnter() {
this.clearTimers();
this.showTimeout = setTimeout(() => this.show(), this.delay);
}
onMouseLeave() {
this.clearTimers();
this.hideTimeout = setTimeout(() => this.hide(), 100);
}
show() {
if (!this.content)
return;
if (!this.tooltip) {
// 动态创建组件
const factory = this.viewContainer.createComponent(TooltipComponent);
this.tooltip = factory.location.nativeElement;
factory.instance.content = this.content;
// 立即显示内容
this.renderer.addClass(this.tooltip, 'visible');
this.previewService.modalElement?.querySelector('.nfp-modal__overlay').appendChild(this.tooltip);
factory.changeDetectorRef.detectChanges();
}
// 计算最佳位置
const hostRect = this.el.nativeElement.getBoundingClientRect();
const tooltipRect = this.tooltip.getBoundingClientRect();
const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight;
// 检查每个位置的可用空间
const spaces = {
top: hostRect.top,
bottom: viewportHeight - (hostRect.bottom),
left: hostRect.left,
right: viewportWidth - (hostRect.right)
};
// 找到最佳位置
this.currentPosition = this.positions.reduce((best, current) => spaces[current] > spaces[best] ? current : best);
// 根据位置设置样式类
this.positions.forEach(pos => this.renderer.removeClass(this.tooltip, pos));
this.renderer.addClass(this.tooltip, this.currentPosition);
// 根据位置计算坐标
let top, left;
switch (this.currentPosition) {
case 'top':
top = hostRect.top - tooltipRect.height - 8;
left = hostRect.left + (hostRect.width - tooltipRect.width) / 2;
break;
case 'bottom':
top = hostRect.bottom + 8;
left = hostRect.left + (hostRect.width - tooltipRect.width) / 2;
break;
case 'left':
top = hostRect.top + (hostRect.height - tooltipRect.height) / 2;
left = hostRect.left - tooltipRect.width - 8;
break;
case 'right':
top = hostRect.top + (hostRect.height - tooltipRect.height) / 2;
left = hostRect.right + 8;
break;
}
// 确保tooltip不超出视口
top = Math.max(8, Math.min(viewportHeight - tooltipRect.height - 8, top));
left = Math.max(8, Math.min(viewportWidth - tooltipRect.width - 8, left));
this.renderer.setStyle(this.tooltip, 'top', `${top}px`);
this.renderer.setStyle(this.tooltip, 'left', `${left}px`);
}
hide() {
if (this.tooltip) {
this.renderer.removeClass(this.tooltip, 'visible');
setTimeout(() => {
this.viewContainer.clear();
this.tooltip = null;
}, 300); // 增加动画时间
}
}
clearTimers() {
clearTimeout(this.showTimeout);
clearTimeout(this.hideTimeout);
}
ngOnDestroy() {
this.viewContainer.clear();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TooltipDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i1.PreviewService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TooltipDirective, isStandalone: true, selector: "[tooltip]", inputs: { content: ["tooltip", "content"], delay: "delay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TooltipDirective, decorators: [{
type: Directive,
args: [{ selector: '[tooltip]', standalone: true }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i1.PreviewService }], propDecorators: { content: [{
type: Input,
args: ['tooltip']
}], delay: [{
type: Input
}], onMouseEnter: [{
type: HostListener,
args: ['mouseenter']
}], onMouseLeave: [{
type: HostListener,
args: ['mouseleave']
}] } });
export class TooltipComponent {
constructor() {
this.content = "";
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TooltipComponent, isStandalone: true, selector: "ngx-file-tooltip", inputs: { content: "content" }, ngImport: i0, template: `{{ content }}`, isInline: true, styles: [":host{position:absolute;background:#000000d9;color:#fff;font-size:14px;padding:6px 8px;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;max-width:250px;min-height:24px;word-wrap:break-word;z-index:999;pointer-events:none;opacity:0;display:flex;justify-content:center;align-items:center;transform:scale(.8);transform-origin:center;transition:opacity .2s ease-in-out,transform .2s ease-in-out}:host.visible{opacity:1;transform:scale(1)}:host:after{content:\"\";position:absolute;width:0;height:0;border:5px solid transparent}:host.top:after{border-top-color:#000000d9;bottom:-10px;left:50%;transform:translate(-50%)}:host.bottom:after{border-bottom-color:#000000d9;top:-10px;left:50%;transform:translate(-50%)}:host.left:after{border-left-color:#000000d9;right:-10px;top:50%;transform:translateY(-50%)}:host.right:after{border-right-color:#000000d9;left:-10px;top:50%;transform:translateY(-50%)}\n"] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TooltipComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-file-tooltip', template: `{{ content }}`, standalone: true, styles: [":host{position:absolute;background:#000000d9;color:#fff;font-size:14px;padding:6px 8px;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;max-width:250px;min-height:24px;word-wrap:break-word;z-index:999;pointer-events:none;opacity:0;display:flex;justify-content:center;align-items:center;transform:scale(.8);transform-origin:center;transition:opacity .2s ease-in-out,transform .2s ease-in-out}:host.visible{opacity:1;transform:scale(1)}:host:after{content:\"\";position:absolute;width:0;height:0;border:5px solid transparent}:host.top:after{border-top-color:#000000d9;bottom:-10px;left:50%;transform:translate(-50%)}:host.bottom:after{border-bottom-color:#000000d9;top:-10px;left:50%;transform:translate(-50%)}:host.left:after{border-left-color:#000000d9;right:-10px;top:50%;transform:translateY(-50%)}:host.right:after{border-right-color:#000000d9;left:-10px;top:50%;transform:translateY(-50%)}\n"] }]
}], propDecorators: { content: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJldGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWZpbGUtcHJldmlldy9zcmMvbGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJldGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlOLE1BQU0sZUFBZSxDQUFDOzs7QUFJdkIsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQixZQUNVLEVBQWMsRUFDZCxRQUFtQixFQUNuQixhQUErQixFQUMvQixjQUE2QjtRQUg3QixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFaOUIsVUFBSyxHQUFXLEdBQUcsQ0FBQztRQUtyQixjQUFTLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztJQU83QixDQUFDO0lBRXdCLFlBQVk7UUFDdEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUUyQixZQUFZO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLElBQUk7UUFDVixJQUFHLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBQyxPQUFP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QUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUssQ0FBQTtZQUN0QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRU8sV0FBVztRQUNqQixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9CLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7K0dBN0dVLGdCQUFnQjttR0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDO21LQUVqQyxPQUFPO3NCQUF4QixLQUFLO3VCQUFDLFNBQVM7Z0JBQ1AsS0FBSztzQkFBYixLQUFLO2dCQWVzQixZQUFZO3NCQUF2QyxZQUFZO3VCQUFDLFlBQVk7Z0JBS0UsWUFBWTtzQkFBdkMsWUFBWTt1QkFBQyxZQUFZOztBQThKNUIsTUFBTSxPQUFPLGdCQUFnQjtJQXJFN0I7UUFzRVcsWUFBTyxHQUFXLEVBQUUsQ0FBQztLQUMvQjsrR0FGWSxnQkFBZ0I7bUdBQWhCLGdCQUFnQiw0R0FuRWpCLGVBQWU7OzRGQW1FZCxnQkFBZ0I7a0JBckU1QixTQUFTOytCQUNFLGtCQUFrQixZQUNsQixlQUFlLGNBQ2IsSUFBSTs4QkFtRVAsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1ByZXZpZXdTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXNcIjtcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3Rvb2x0aXBdJyAsc3RhbmRhbG9uZTogdHJ1ZX0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgndG9vbHRpcCcpIGNvbnRlbnQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlbGF5OiBudW1iZXIgPSA1MDA7XG5cbiAgcHJpdmF0ZSB0b29sdGlwITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgc2hvd1RpbWVvdXQ/OiBhbnk7XG4gIHByaXZhdGUgaGlkZVRpbWVvdXQ/OiBhbnk7XG4gIHByaXZhdGUgcG9zaXRpb25zID0gWyd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnXTtcbiAgcHJpdmF0ZSBjdXJyZW50UG9zaXRpb24gPSAndG9wJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBwcmV2aWV3U2VydmljZTpQcmV2aWV3U2VydmljZVxuICApIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpIG9uTW91c2VFbnRlcigpIHtcbiAgICB0aGlzLmNsZWFyVGltZXJzKCk7XG4gICAgdGhpcy5zaG93VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93KCksIHRoaXMuZGVsYXkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpIG9uTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLmNsZWFyVGltZXJzKCk7XG4gICAgdGhpcy5oaWRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlKCksIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIHNob3coKSB7XG4gICAgaWYoIXRoaXMuY29udGVudClyZXR1cm47XG4gICAgaWYgKCF0aGlzLnRvb2x0aXApIHtcbiAgICAgIC8vIOWKqOaAgeWIm+W7uue7hOS7tlxuICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoVG9vbHRpcENvbXBvbmVudCk7XG4gICAgICB0aGlzLnRvb2x0aXAgPSBmYWN0b3J5LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBmYWN0b3J5Lmluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG4gICAgICAvLyDnq4vljbPmmL7npLrlhoXlrrlcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy50b29sdGlwLCAndmlzaWJsZScpO1xuICAgICAgdGhpcy5wcmV2aWV3U2VydmljZS5tb2RhbEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoJy5uZnAtbW9kYWxfX292ZXJsYXknKS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXApO1xuICAgICAgZmFjdG9yeS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICB9XG5cbiAgICAvLyDorqHnrpfmnIDkvbPkvY3nva5cbiAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRoaXMudG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAvLyDmo4Dmn6Xmr4/kuKrkvY3nva7nmoTlj6/nlKjnqbrpl7RcbiAgICBjb25zdCBzcGFjZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICAgICB0b3A6IGhvc3RSZWN0LnRvcCxcbiAgICAgIGJvdHRvbTogdmlld3BvcnRIZWlnaHQgLSAoaG9zdFJlY3QuYm90dG9tKSxcbiAgICAgIGxlZnQ6IGhvc3RSZWN0LmxlZnQsXG4gICAgICByaWdodDogdmlld3BvcnRXaWR0aCAtIChob3N0UmVjdC5yaWdodClcbiAgICB9O1xuXG4gICAgLy8g5om+5Yiw5pyA5L2z5L2N572uXG4gICAgdGhpcy5jdXJyZW50UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9ucy5yZWR1Y2UoKGJlc3QsIGN1cnJlbnQpID0+XG4gICAgICBzcGFjZXNbY3VycmVudF0gPiBzcGFjZXNbYmVzdF0gPyBjdXJyZW50IDogYmVzdFxuICAgICk7XG5cbiAgICAvLyDmoLnmja7kvY3nva7orr7nva7moLflvI/nsbtcbiAgICB0aGlzLnBvc2l0aW9ucy5mb3JFYWNoKHBvcyA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMudG9vbHRpcCwgcG9zKSk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2x0aXAsIHRoaXMuY3VycmVudFBvc2l0aW9uKTtcblxuICAgIC8vIOagueaNruS9jee9ruiuoeeul+WdkOagh1xuICAgIGxldCB0b3AsIGxlZnQ7XG4gICAgc3dpdGNoKHRoaXMuY3VycmVudFBvc2l0aW9uKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB0b3AgPSBob3N0UmVjdC50b3AgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSA4O1xuICAgICAgICBsZWZ0ID0gaG9zdFJlY3QubGVmdCArIChob3N0UmVjdC53aWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoKSAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdG9wID0gaG9zdFJlY3QuYm90dG9tICsgODtcbiAgICAgICAgbGVmdCA9IGhvc3RSZWN0LmxlZnQgKyAoaG9zdFJlY3Qud2lkdGggLSB0b29sdGlwUmVjdC53aWR0aCkgLyAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0b3AgPSBob3N0UmVjdC50b3AgKyAoaG9zdFJlY3QuaGVpZ2h0IC0gdG9vbHRpcFJlY3QuaGVpZ2h0KSAvIDI7XG4gICAgICAgIGxlZnQgPSBob3N0UmVjdC5sZWZ0IC0gdG9vbHRpcFJlY3Qud2lkdGggLSA4O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgdG9wID0gaG9zdFJlY3QudG9wICsgKGhvc3RSZWN0LmhlaWdodCAtIHRvb2x0aXBSZWN0LmhlaWdodCkgLyAyO1xuICAgICAgICBsZWZ0ID0gaG9zdFJlY3QucmlnaHQgKyA4O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyDnoa7kv510b29sdGlw5LiN6LaF5Ye66KeG5Y+jXG4gICAgdG9wID0gTWF0aC5tYXgoOCwgTWF0aC5taW4odmlld3BvcnRIZWlnaHQgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSA4LCB0b3ApKTtcbiAgICBsZWZ0ID0gTWF0aC5tYXgoOCwgTWF0aC5taW4odmlld3BvcnRXaWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gOCwgbGVmdCkpO1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2x0aXAsICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbHRpcCwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gIH1cblxuICBwcml2YXRlIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMudG9vbHRpcCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLnRvb2x0aXAsICd2aXNpYmxlJyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKClcbiAgICAgICAgdGhpcy50b29sdGlwID0gbnVsbCFcbiAgICAgIH0sIDMwMCk7IC8vIOWinuWKoOWKqOeUu+aXtumXtFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJUaW1lcnMoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lb3V0KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICB9XG59XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZmlsZS10b29sdGlwJyxcbiAgdGVtcGxhdGU6IGB7eyBjb250ZW50IH19YCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44NSk7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICBib3gtc2hhZG93OiAwIDNweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMTIpLCAwIDZweCAxNnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA4KSwgMCA5cHggMjhweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAgIG1heC13aWR0aDogMjUwcHg7XG4gICAgICBtaW4taGVpZ2h0OiAyNHB4O1xuICAgICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgICAgei1pbmRleDogOTk5O1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KTtcbiAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLWluLW91dCwgdHJhbnNmb3JtIDAuMnMgZWFzZS1pbi1vdXQ7XG4gICAgfVxuXG4gICAgOmhvc3QudmlzaWJsZSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICB9XG5cbiAgICA6aG9zdDo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMDtcbiAgICAgIGhlaWdodDogMDtcbiAgICAgIGJvcmRlcjogNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIDpob3N0LnRvcDo6YWZ0ZXIge1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg1KTtcbiAgICAgIGJvdHRvbTogLTEwcHg7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgfVxuXG4gICAgOmhvc3QuYm90dG9tOjphZnRlciB7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODUpO1xuICAgICAgdG9wOiAtMTBweDtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICB9XG5cbiAgICA6aG9zdC5sZWZ0OjphZnRlciB7XG4gICAgICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg1KTtcbiAgICAgIHJpZ2h0OiAtMTBweDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgIH1cblxuICAgIDpob3N0LnJpZ2h0OjphZnRlciB7XG4gICAgICBib3JkZXItcmlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44NSk7XG4gICAgICBsZWZ0OiAtMTBweDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG59XG4iXX0=