UNPKG

angular-gallery

Version:

Responsive gallery for Angular with touch screen support.

179 lines 20.1 kB
import { __decorate } from "tslib"; import { Component, OnInit, HostBinding, HostListener, ViewChild, ElementRef, Input, ComponentFactoryResolver } from '@angular/core'; import { EventService } from './event.service'; import { AdDirective } from './ad.directive'; let OverlayContainerComponent = class OverlayContainerComponent { constructor(componentFactoryResolver, elementRef, eventService) { this.componentFactoryResolver = componentFactoryResolver; this.elementRef = elementRef; this.eventService = eventService; this.overlayBackdrop = true; this.minTimeout = 30; this._hostOpacity = 0; this.globalEventsSubscription = this.eventService.emitter.subscribe((event) => { this.handleGlobalEvents(event); }); } get hostOpacity() { return this.properties.fadeIn ? this._hostOpacity : 1; } set hostOpacity(value) { this._hostOpacity = value; } get hostTransition() { const duration = this.properties.animationDuration + 'ms '; const esing = this.properties.animationTimingFunction; return 'opacity ' + duration + esing + ', transform ' + duration + esing; } get hostZIndex() { return this.properties.zIndex; } get hostWidth() { return this.properties.wrapperWidth; } get hostHeight() { return this.properties.wrapperHeight; } get hostPosition() { return this.properties.position; } onClick(event) { if (!this.elementRef.nativeElement.contains(event.target)) { if (this.hostShown) { this.closeOverlay(); } } } transitionEnd(event) { if (event.target.tagName.toLowerCase() != "overlay") { return; } if (event.propertyName != "opacity") { return; } if (this.hostShown) { this.closeOverlayEnd(); //this.stateEvents.emit("shown"); } else { this.hostShown = true; //this.stateEvents.emit("hidden"); } } get popoverClass() { if (this.properties.metadata) { return this.properties.metadata.popoverClass; } } ngOnInit() { this.loadComponent(); this.initialOverlay(); setTimeout(() => { this.isInitial = true; }, this.minTimeout); // Note: not good } ngAfterViewInit() { setTimeout(() => { this.showOverlayAnimation(); }, this.minTimeout); } ngOnDestroy() { if (this.globalEventsSubscription) { this.globalEventsSubscription.unsubscribe(); } } initialOverlay() { this.hostTransform = 'translateY(' + this.properties.animationTranslateY + ')'; } showOverlayAnimation() { this.hostOpacity = 1; this.hostTransform = 'translateY(0px)'; } loadComponent() { let adItem = this.properties; let componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.mainComponent); let viewContainerRef = this.adHost.viewContainerRef; viewContainerRef.clear(); let componentRef = viewContainerRef.createComponent(componentFactory); let componentRefElement = componentRef.location.nativeElement; // Set styles componentRefElement.style.width = this.properties.width; componentRefElement.style.height = this.properties.height; // Set classes if (typeof this.popoverClass === 'string') { componentRefElement.classList.add(this.popoverClass); } if (typeof this.popoverClass === 'object') { this.popoverClass.forEach(function (className) { componentRefElement.classList.add(className); }); } // Pass properties componentRef.instance.overlayProperties = this.properties; } closeOverlay() { this.hostOpacity = 0; this.hostTransform = 'translateY(' + this.properties.animationTranslateY + ')'; } closeOverlayEnd() { this.hostShown = false; this.eventService.emitChangeEvent({ type: '[Overlay] Hide' }); } handleGlobalEvents(event) { if (event.type === 'Hide') { this.closeOverlay(); } } }; OverlayContainerComponent.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: ElementRef }, { type: EventService } ]; __decorate([ ViewChild(AdDirective, { static: true }) ], OverlayContainerComponent.prototype, "adHost", void 0); __decorate([ Input() ], OverlayContainerComponent.prototype, "properties", void 0); __decorate([ HostBinding('style.opacity') ], OverlayContainerComponent.prototype, "hostOpacity", null); __decorate([ HostBinding('style.transition') ], OverlayContainerComponent.prototype, "hostTransition", null); __decorate([ HostBinding('style.transform') ], OverlayContainerComponent.prototype, "hostTransform", void 0); __decorate([ HostBinding('style.z-index') ], OverlayContainerComponent.prototype, "hostZIndex", null); __decorate([ HostBinding('style.width') ], OverlayContainerComponent.prototype, "hostWidth", null); __decorate([ HostBinding('style.height') ], OverlayContainerComponent.prototype, "hostHeight", null); __decorate([ HostBinding('style.position') ], OverlayContainerComponent.prototype, "hostPosition", null); __decorate([ HostBinding('class.overlay-shown') ], OverlayContainerComponent.prototype, "hostShown", void 0); __decorate([ HostListener('document:click', ['$event']) ], OverlayContainerComponent.prototype, "onClick", null); __decorate([ HostListener('transitionend', ['$event']) ], OverlayContainerComponent.prototype, "transitionEnd", null); OverlayContainerComponent = __decorate([ Component({ selector: 'overlay', template: "<!--\n<div class=\"overlay-backdrop\" \n\t*ngIf=\"properties.overlayBackdrop\" \n\t(click)=\"onBackdropClick()\" \n\t[ngClass]=\"properties.backdropClass\"></div>\n-->\n<!--\n<div class=\"overlay-container\"\n\t[ngStyle]=\"containerStyles\" \n\t[ngClass]=\"properties.overlayClass\">\n\n\t<ng-template ad-host></ng-template>\n</div>\n-->\n\n<ng-template ad-host></ng-template>", styles: [":host{position:absolute;top:0;left:0}:host .overlay-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#000;opacity:0;z-index:1000;pointer-events:auto}"] }) ], OverlayContainerComponent); export { OverlayContainerComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1nYWxsZXJ5LyIsInNvdXJjZXMiOlsibGliL292ZXJsYXkvb3ZlcmxheS1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUM1RyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUzdDLElBQWEseUJBQXlCLEdBQXRDLE1BQWEseUJBQXlCO0lBa0ZsQyxZQUNZLHdCQUFrRCxFQUNuRCxVQUFzQixFQUNyQixZQUEwQjtRQUYxQiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ25ELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFsRi9CLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3ZDLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFpRnJCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQy9ELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBL0VELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0Qs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LFFBQVEsRUFBRSxTQUFTO1FBQ25CLG9ZQUFpRDs7S0FFcEQsQ0FBQztHQUVXLHlCQUF5QixDQXdLckM7U0F4S1kseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4vZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBZERpcmVjdGl2ZSB9IGZyb20gJy4vYWQuZGlyZWN0aXZlJztcbmltcG9ydCB7IENvbXBvbmVudFByb3BlcnRpZXMsIE92ZXJsYXlQcm9wZXJ0aWVzIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdvdmVybGF5JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3ZlcmxheS1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL292ZXJsYXktY29udGFpbmVyLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBPdmVybGF5Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwdWJsaWMgaXNJbml0aWFsOiBib29sZWFuO1xuICAgIGdsb2JhbEV2ZW50c1N1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgb3ZlcmxheUJhY2tkcm9wOiBib29sZWFuID0gdHJ1ZTtcbiAgICBtaW5UaW1lb3V0OiBudW1iZXIgPSAzMDtcbiAgICBfaG9zdE9wYWNpdHk6IG51bWJlciA9IDA7XG5cbiAgICBAVmlld0NoaWxkKEFkRGlyZWN0aXZlLCB7c3RhdGljOiB0cnVlfSkgYWRIb3N0OiBBZERpcmVjdGl2ZTtcblxuICAgIEBJbnB1dCgpIHByb3BlcnRpZXM6IE92ZXJsYXlQcm9wZXJ0aWVzO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5vcGFjaXR5JylcbiAgICBnZXQgaG9zdE9wYWNpdHkoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5mYWRlSW4gPyB0aGlzLl9ob3N0T3BhY2l0eSA6IDE7XG4gICAgfVxuICAgIHNldCBob3N0T3BhY2l0eSh2YWx1ZSl7XG4gICAgICAgIHRoaXMuX2hvc3RPcGFjaXR5ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50cmFuc2l0aW9uJylcbiAgICBnZXQgaG9zdFRyYW5zaXRpb24oKXtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLnByb3BlcnRpZXMuYW5pbWF0aW9uRHVyYXRpb24rJ21zICc7XG4gICAgICAgIGNvbnN0IGVzaW5nID0gdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO1xuICAgICAgICByZXR1cm4gJ29wYWNpdHkgJysgZHVyYXRpb24gKyBlc2luZyArICcsIHRyYW5zZm9ybSAnKyBkdXJhdGlvbiArIGVzaW5nO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNmb3JtJykgaG9zdFRyYW5zZm9ybTogc3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuei1pbmRleCcpIFxuICAgIGdldCBob3N0WkluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuekluZGV4O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKSBcbiAgICBnZXQgaG9zdFdpZHRoKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMud3JhcHBlcldpZHRoO1xuICAgIH1cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodCcpIFxuICAgIGdldCBob3N0SGVpZ2h0KCl7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMud3JhcHBlckhlaWdodDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgXG4gICAgZ2V0IGhvc3RQb3NpdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBvc2l0aW9uO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mub3ZlcmxheS1zaG93bicpIGhvc3RTaG93bjogYm9vbGVhbjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgICBvbkNsaWNrKGV2ZW50KXtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ob3N0U2hvd24pe1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VPdmVybGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgWyckZXZlbnQnXSlcbiAgICB0cmFuc2l0aW9uRW5kKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwib3ZlcmxheVwiKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5wcm9wZXJ0eU5hbWUgIT0gXCJvcGFjaXR5XCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhvc3RTaG93bikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU92ZXJsYXlFbmQoKTtcbiAgICAgICAgICAgIC8vdGhpcy5zdGF0ZUV2ZW50cy5lbWl0KFwic2hvd25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvc3RTaG93biA9IHRydWU7XG4gICAgICAgICAgICAvL3RoaXMuc3RhdGVFdmVudHMuZW1pdChcImhpZGRlblwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBwb3BvdmVyQ2xhc3MoKXtcbiAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5tZXRhZGF0YSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm1ldGFkYXRhLnBvcG92ZXJDbGFzcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSkge1xuICAgICAgICB0aGlzLmdsb2JhbEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRTZXJ2aWNlLmVtaXR0ZXIuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHbG9iYWxFdmVudHMoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsT3ZlcmxheSgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWwgPSB0cnVlO1xuICAgICAgICB9LCB0aGlzLm1pblRpbWVvdXQpOyAvLyBOb3RlOiBub3QgZ29vZFxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dPdmVybGF5QW5pbWF0aW9uKCk7XG4gICAgICAgIH0sIHRoaXMubWluVGltZW91dCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmdsb2JhbEV2ZW50c1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxFdmVudHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxPdmVybGF5KCl7XG4gICAgICAgIHRoaXMuaG9zdFRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKCcrdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvblRyYW5zbGF0ZVkrJyknO1xuICAgIH1cblxuICAgIHNob3dPdmVybGF5QW5pbWF0aW9uKCl7XG4gICAgICAgIHRoaXMuaG9zdE9wYWNpdHkgPSAxO1xuICAgICAgICB0aGlzLmhvc3RUcmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgwcHgpJztcbiAgICB9XG5cbiAgICBsb2FkQ29tcG9uZW50KCkge1xuICAgICAgICBsZXQgYWRJdGVtID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICBsZXQgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGFkSXRlbS5tYWluQ29tcG9uZW50KTtcbiAgICAgICAgbGV0IHZpZXdDb250YWluZXJSZWYgPSB0aGlzLmFkSG9zdC52aWV3Q29udGFpbmVyUmVmO1xuXG4gICAgICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcblxuICAgICAgICBsZXQgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XG4gICAgICAgIGxldCBjb21wb25lbnRSZWZFbGVtZW50ID0gKDxDb21wb25lbnRQcm9wZXJ0aWVzPmNvbXBvbmVudFJlZi5sb2NhdGlvbikubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyBTZXQgc3R5bGVzXG4gICAgICAgIGNvbXBvbmVudFJlZkVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnByb3BlcnRpZXMud2lkdGg7XG4gICAgICAgIGNvbXBvbmVudFJlZkVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5wcm9wZXJ0aWVzLmhlaWdodDtcblxuICAgICAgICAvLyBTZXQgY2xhc3Nlc1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9wb3ZlckNsYXNzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmRWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMucG9wb3ZlckNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9wb3ZlckNsYXNzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyQ2xhc3MuZm9yRWFjaChmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWZFbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH0pOyBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhc3MgcHJvcGVydGllc1xuICAgICAgICAoPENvbXBvbmVudFByb3BlcnRpZXM+Y29tcG9uZW50UmVmLmluc3RhbmNlKS5vdmVybGF5UHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllcztcbiAgICB9XG5cbiAgICBjbG9zZU92ZXJsYXkoKXtcbiAgICAgICAgdGhpcy5ob3N0T3BhY2l0eSA9IDA7XG4gICAgICAgIHRoaXMuaG9zdFRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKCcrdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvblRyYW5zbGF0ZVkrJyknO1xuICAgIH1cblxuICAgIGNsb3NlT3ZlcmxheUVuZCgpIHtcbiAgICAgICAgdGhpcy5ob3N0U2hvd24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZW1pdENoYW5nZUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdbT3ZlcmxheV0gSGlkZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlR2xvYmFsRXZlbnRzKGV2ZW50KXtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdIaWRlJyl7XG4gICAgICAgICAgICB0aGlzLmNsb3NlT3ZlcmxheSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19