ng-image-slider-v17
Version:
Angular Image slider with lightbox. An Angular responsive image slider with lightbox popup. Also support youtube url, image base64 string and mp4 video urls and base64 string.
123 lines • 21.8 kB
JavaScript
import { Component, Input, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "./../ng-image-slider.service";
import * as i2 from "@angular/platform-browser";
import * as i3 from "@angular/common";
const youtubeRegExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/, validFileExtensions = ['jpeg', 'jpg', 'gif', 'png'], validVideoExtensions = ['mp4'];
export class SliderCustomImageComponent {
constructor(imageSliderService, sanitizer, document) {
this.imageSliderService = imageSliderService;
this.sanitizer = sanitizer;
this.YOUTUBE = 'youtube';
this.IMAGE = 'image';
this.VIDEO = 'video';
this.fileUrl = '';
this.fileExtension = '';
this.type = this.IMAGE;
this.imageLoading = true;
// @inputs
this.showVideo = false;
this.videoAutoPlay = false;
this.showVideoControls = 1;
this.speed = 1;
this.isVideo = false;
this.alt = '';
this.title = '';
this.direction = 'ltr';
this.ratio = false;
this.lazy = false;
}
ngOnChanges(changes) {
if (this.imageUrl
&& this.imageUrl
&& this.imageUrl
&& typeof (this.imageUrl) === 'string'
&& ((changes.imageUrl && changes.imageUrl.firstChange)
||
(this.videoAutoPlay))) {
this.setUrl();
}
}
setUrl() {
const url = this.imageUrl;
this.imageLoading = true;
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
this.fileExtension = url.split('.').pop().split(/\#|\?/)[0];
if (this.imageSliderService.base64FileExtension(url)
&& (validFileExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1
|| validVideoExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1)) {
this.fileExtension = this.imageSliderService.base64FileExtension(url);
}
// verify for youtube url
const match = url.match(youtubeRegExp);
if (match && match[2].length === 11) {
if (this.showVideo) {
this.type = this.YOUTUBE;
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`${'https://www.youtube.com/embed/'}${match[2]}${this.videoAutoPlay ? '?autoplay=1&enablejsapi=1' : '?autoplay=0&enablejsapi=1'}${'&controls='}${this.showVideoControls}`);
}
else {
this.type = this.IMAGE;
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`https://img.youtube.com/vi/${match[2]}/0.jpg`);
}
}
else if (this.fileExtension && validFileExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) {
this.type = this.IMAGE;
}
else if (this.fileExtension && validVideoExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) {
this.type = this.VIDEO;
if (this.videoAutoPlay && document.getElementById(`video_${this.imageIndex}`)) {
const videoObj = document.getElementById(`video_${this.imageIndex}`);
setTimeout(() => {
videoObj.play();
}, this.speed * 1000);
}
}
}
videoClickHandler(event) {
if (event && event.srcElement && !this.showVideoControls) {
if (event.srcElement.paused) {
event.srcElement.play();
}
else {
event.srcElement.pause();
}
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: SliderCustomImageComponent, deps: [{ token: i1.NgImageSliderService }, { token: i2.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: SliderCustomImageComponent, selector: "custom-img", inputs: { showVideo: "showVideo", videoAutoPlay: "videoAutoPlay", showVideoControls: "showVideoControls", currentImageIndex: "currentImageIndex", imageIndex: "imageIndex", speed: "speed", imageUrl: "imageUrl", isVideo: "isVideo", alt: "alt", title: "title", direction: "direction", ratio: "ratio", lazy: "lazy" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"fileUrl\" class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\r\n <img class=\"image\"\r\n (load)=\"imageLoading = false\"\r\n [ngClass]=\"{'ratio': ratio}\"\r\n *ngIf=\"type === IMAGE && fileUrl\"\r\n [src]=\"fileUrl\"\r\n [alt]=\"alt\"\r\n [title]=\"title\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\">\r\n <iframe class=\"youtube\"\r\n *ngIf=\"type === YOUTUBE && fileUrl\"\r\n [src]=\"fileUrl\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\"\r\n frameborder=\"0\"\r\n allow=\"autoplay\"\r\n allowfullscreen></iframe>\r\n <video class=\"video\"\r\n [id]=\"'video_' + imageIndex\"\r\n [ngClass]=\"{'ratio': ratio}\"\r\n (click)=\"videoClickHandler($event)\"\r\n [autoplay]=\"videoAutoPlay\"\r\n *ngIf=\"type === VIDEO\"\r\n type=\"video/mp4\"\r\n [attr.controls]=\"showVideoControls ? showVideoControls : null\"\r\n controlsList=\"nodownload\">\r\n <source [src]=\"fileUrl\" type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n <div [dir]=\"direction\" *ngIf=\"!fileUrl\" class=\"invalid-msg\">Invalid file format</div>\r\n <span *ngIf=\"type === YOUTUBE || type === VIDEO || isVideo\" class=\"youtube-icon\"></span>\r\n</div>", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: SliderCustomImageComponent, decorators: [{
type: Component,
args: [{ selector: 'custom-img', template: "<div *ngIf=\"fileUrl\" class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\r\n <img class=\"image\"\r\n (load)=\"imageLoading = false\"\r\n [ngClass]=\"{'ratio': ratio}\"\r\n *ngIf=\"type === IMAGE && fileUrl\"\r\n [src]=\"fileUrl\"\r\n [alt]=\"alt\"\r\n [title]=\"title\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\">\r\n <iframe class=\"youtube\"\r\n *ngIf=\"type === YOUTUBE && fileUrl\"\r\n [src]=\"fileUrl\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\"\r\n frameborder=\"0\"\r\n allow=\"autoplay\"\r\n allowfullscreen></iframe>\r\n <video class=\"video\"\r\n [id]=\"'video_' + imageIndex\"\r\n [ngClass]=\"{'ratio': ratio}\"\r\n (click)=\"videoClickHandler($event)\"\r\n [autoplay]=\"videoAutoPlay\"\r\n *ngIf=\"type === VIDEO\"\r\n type=\"video/mp4\"\r\n [attr.controls]=\"showVideoControls ? showVideoControls : null\"\r\n controlsList=\"nodownload\">\r\n <source [src]=\"fileUrl\" type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n <div [dir]=\"direction\" *ngIf=\"!fileUrl\" class=\"invalid-msg\">Invalid file format</div>\r\n <span *ngIf=\"type === YOUTUBE || type === VIDEO || isVideo\" class=\"youtube-icon\"></span>\r\n</div>" }]
}], ctorParameters: () => [{ type: i1.NgImageSliderService }, { type: i2.DomSanitizer }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { showVideo: [{
type: Input
}], videoAutoPlay: [{
type: Input
}], showVideoControls: [{
type: Input
}], currentImageIndex: [{
type: Input
}], imageIndex: [{
type: Input
}], speed: [{
type: Input
}], imageUrl: [{
type: Input
}], isVideo: [{
type: Input
}], alt: [{
type: Input
}], title: [{
type: Input
}], direction: [{
type: Input
}], ratio: [{
type: Input
}], lazy: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1pbWFnZS1zbGlkZXIvc3JjL2xpYi9zbGlkZXItY3VzdG9tLWltYWdlL3NsaWRlci1jdXN0b20taW1hZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaW1hZ2Utc2xpZGVyL3NyYy9saWIvc2xpZGVyLWN1c3RvbS1pbWFnZS9zbGlkZXItY3VzdG9tLWltYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUdMLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBSTNDLE1BQU0sYUFBYSxHQUFHLHNFQUFzRSxFQUN4RixtQkFBbUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUNuRCxvQkFBb0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBTW5DLE1BQU0sT0FBTywwQkFBMEI7SUF3Qm5DLFlBQ1csa0JBQXdDLEVBQ3ZDLFNBQXVCLEVBQ2IsUUFBUTtRQUZuQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBQ3ZDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUF6Qm5DLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDcEIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ2hCLFlBQU8sR0FBb0IsRUFBRSxDQUFDO1FBQzlCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFNBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBRTVCLFVBQVU7UUFDRCxjQUFTLEdBQVksS0FBSyxD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LFNBQVM7K0JBQ0ksWUFBWTs7MEJBOEJqQixNQUFNOzJCQUFDLFFBQVE7eUNBakJYLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIEluamVjdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IE5nSW1hZ2VTbGlkZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi9uZy1pbWFnZS1zbGlkZXIuc2VydmljZSc7XHJcblxyXG5jb25zdCB5b3V0dWJlUmVnRXhwID0gL14uKih5b3V0dS5iZVxcL3x2XFwvfHVcXC9cXHdcXC98ZW1iZWRcXC98d2F0Y2hcXD92PXxcXCZ2PXxcXD92PSkoW14jXFwmXFw/XSopLiovLFxyXG4gICAgdmFsaWRGaWxlRXh0ZW5zaW9ucyA9IFsnanBlZycsICdqcGcnLCAnZ2lmJywgJ3BuZyddLFxyXG4gICAgdmFsaWRWaWRlb0V4dGVuc2lvbnMgPSBbJ21wNCddO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2N1c3RvbS1pbWcnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci1jdXN0b20taW1hZ2UuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbGlkZXJDdXN0b21JbWFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgICBZT1VUVUJFID0gJ3lvdXR1YmUnO1xyXG4gICAgSU1BR0UgPSAnaW1hZ2UnO1xyXG4gICAgVklERU8gPSAndmlkZW8nO1xyXG4gICAgZmlsZVVybDogU2FmZVJlc291cmNlVXJsID0gJyc7XHJcbiAgICBmaWxlRXh0ZW5zaW9uID0gJyc7XHJcbiAgICB0eXBlID0gdGhpcy5JTUFHRTtcclxuICAgIGltYWdlTG9hZGluZzpib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBAaW5wdXRzXHJcbiAgICBASW5wdXQoKSBzaG93VmlkZW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHZpZGVvQXV0b1BsYXk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHNob3dWaWRlb0NvbnRyb2xzOiBudW1iZXIgPSAxO1xyXG4gICAgQElucHV0KCkgY3VycmVudEltYWdlSW5kZXg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGltYWdlSW5kZXg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHNwZWVkOiBudW1iZXIgPSAxO1xyXG4gICAgQElucHV0KCkgaW1hZ2VVcmw7XHJcbiAgICBASW5wdXQoKSBpc1ZpZGVvID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBhbHQ6IFN0cmluZyA9ICcnO1xyXG4gICAgQElucHV0KCkgdGl0bGU6IFN0cmluZyA9ICcnO1xyXG4gICAgQElucHV0KCkgZGlyZWN0aW9uOiBzdHJpbmcgPSAnbHRyJztcclxuICAgIEBJbnB1dCgpIHJhdGlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIGltYWdlU2xpZGVyU2VydmljZTogTmdJbWFnZVNsaWRlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudCkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAodGhpcy5pbWFnZVVybFxyXG4gICAgICAgICAgICAmJiB0aGlzLmltYWdlVXJsXHJcbiAgICAgICAgICAgICYmIHRoaXMuaW1hZ2VVcmxcclxuICAgICAgICAgICAgJiYgdHlwZW9mICh0aGlzLmltYWdlVXJsKSA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgJiYgKFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZXMuaW1hZ2VVcmwgJiYgY2hhbmdlcy5pbWFnZVVybC5maXJzdENoYW5nZSlcclxuICAgICAgICAgICAgICAgIHx8XHJcbiAgICAgICAgICAgICAgICAodGhpcy52aWRlb0F1dG9QbGF5KVxyXG4gICAgICAgICAgICAgICApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VXJsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFVybCgpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmltYWdlVXJsO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZpbGVVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcclxuICAgICAgICB0aGlzLmZpbGVFeHRlbnNpb24gPSB1cmwuc3BsaXQoJy4nKS5wb3AoKS5zcGxpdCgvXFwjfFxcPy8pWzBdO1xyXG4gICAgICAgIGlmICh0aGlzLmltYWdlU2xpZGVyU2VydmljZS5iYXNlNjRGaWxlRXh0ZW5zaW9uKHVybClcclxuICAgICAgICAmJiAodmFsaWRGaWxlRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpKSA+IC0xIFxyXG4gICAgICAgIHx8IHZhbGlkVmlkZW9FeHRlbnNpb25zLmluZGV4T2YodGhpcy5pbWFnZVNsaWRlclNlcnZpY2UuYmFzZTY0RmlsZUV4dGVuc2lvbih1cmwpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdmVyaWZ5IGZvciB5b3V0dWJlIHVybFxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKHlvdXR1YmVSZWdFeHApO1xyXG4gICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsyXS5sZW5ndGggPT09IDExKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dWaWRlbykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5ZT1VUVUJFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGAkeydodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nfSR7bWF0Y2hbMl19JHt0aGlzLnZpZGVvQXV0b1BsYXkgPyAnP2F1dG9wbGF5PTEmZW5hYmxlanNhcGk9MScgOiAnP2F1dG9wbGF5PTAmZW5hYmxlanNhcGk9MSd9JHsnJmNvbnRyb2xzPSd9JHt0aGlzLnNob3dWaWRlb0NvbnRyb2xzfWApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5JTUFHRTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChgaHR0cHM6Ly9pbWcueW91dHViZS5jb20vdmkvJHttYXRjaFsyXX0vMC5qcGdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWxlRXh0ZW5zaW9uICYmIHZhbGlkRmlsZUV4dGVuc2lvbnMuaW5kZXhPZih0aGlzLmZpbGVFeHRlbnNpb24udG9Mb3dlckNhc2UoKSkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWxlRXh0ZW5zaW9uICYmIHZhbGlkVmlkZW9FeHRlbnNpb25zLmluZGV4T2YodGhpcy5maWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5WSURFTztcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlkZW9BdXRvUGxheSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdmlkZW9fJHt0aGlzLmltYWdlSW5kZXh9YCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvT2JqOmFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB2aWRlb18ke3RoaXMuaW1hZ2VJbmRleH1gKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvT2JqLnBsYXkoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMuc3BlZWQgKiAxMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2aWRlb0NsaWNrSGFuZGxlcihldmVudCkge1xyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5zcmNFbGVtZW50ICYmICF0aGlzLnNob3dWaWRlb0NvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zcmNFbGVtZW50LnBhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3JjRWxlbWVudC5wbGF5KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zcmNFbGVtZW50LnBhdXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZpbGVVcmxcIiBjbGFzcz1cImN1c3RvbS1pbWFnZS1tYWluXCIgW25nQ2xhc3NdPVwieyduZy1mdWxsaW1hZ2UtbG9hZGluZyc6IGltYWdlTG9hZGluZ31cIj5cclxuICAgIDxpbWcgY2xhc3M9XCJpbWFnZVwiXHJcbiAgICAgICAgKGxvYWQpPVwiaW1hZ2VMb2FkaW5nID0gZmFsc2VcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsncmF0aW8nOiByYXRpb31cIlxyXG4gICAgICAgICpuZ0lmPVwidHlwZSA9PT0gSU1BR0UgJiYgZmlsZVVybFwiXHJcbiAgICAgICAgW3NyY109XCJmaWxlVXJsXCJcclxuICAgICAgICBbYWx0XT1cImFsdFwiXHJcbiAgICAgICAgW3RpdGxlXT1cInRpdGxlXCJcclxuICAgICAgICBbYXR0ci5sb2FkaW5nXT1cImxhenkgPT0gdHJ1ZSA/ICdsYXp5JyA6IG51bGxcIj5cclxuICAgIDxpZnJhbWUgY2xhc3M9XCJ5b3V0dWJlXCJcclxuICAgICAgICAqbmdJZj1cInR5cGUgPT09IFlPVVRVQkUgJiYgZmlsZVVybFwiXHJcbiAgICAgICAgW3NyY109XCJmaWxlVXJsXCJcclxuICAgICAgICBbYXR0ci5sb2FkaW5nXT1cImxhenkgPT0gdHJ1ZSA/ICdsYXp5JyA6IG51bGxcIlxyXG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXHJcbiAgICAgICAgYWxsb3c9XCJhdXRvcGxheVwiXHJcbiAgICAgICAgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPlxyXG4gICAgPHZpZGVvIGNsYXNzPVwidmlkZW9cIlxyXG4gICAgICAgIFtpZF09XCIndmlkZW9fJyArIGltYWdlSW5kZXhcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsncmF0aW8nOiByYXRpb31cIlxyXG4gICAgICAgIChjbGljayk9XCJ2aWRlb0NsaWNrSGFuZGxlcigkZXZlbnQpXCJcclxuICAgICAgICBbYXV0b3BsYXldPVwidmlkZW9BdXRvUGxheVwiXHJcbiAgICAgICAgKm5nSWY9XCJ0eXBlID09PSBWSURFT1wiXHJcbiAgICAgICAgdHlwZT1cInZpZGVvL21wNFwiXHJcbiAgICAgICAgW2F0dHIuY29udHJvbHNdPVwic2hvd1ZpZGVvQ29udHJvbHMgPyBzaG93VmlkZW9Db250cm9scyA6IG51bGxcIlxyXG4gICAgICAgIGNvbnRyb2xzTGlzdD1cIm5vZG93bmxvYWRcIj5cclxuICAgICAgICA8c291cmNlIFtzcmNdPVwiZmlsZVVybFwiIHR5cGU9XCJ2aWRlby9tcDRcIj5cclxuICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxyXG4gICAgPC92aWRlbz5cclxuICAgIDxkaXYgW2Rpcl09XCJkaXJlY3Rpb25cIiAqbmdJZj1cIiFmaWxlVXJsXCIgY2xhc3M9XCJpbnZhbGlkLW1zZ1wiPkludmFsaWQgZmlsZSBmb3JtYXQ8L2Rpdj5cclxuICAgIDxzcGFuICpuZ0lmPVwidHlwZSA9PT0gWU9VVFVCRSB8fCB0eXBlID09PSBWSURFTyB8fCBpc1ZpZGVvXCIgY2xhc3M9XCJ5b3V0dWJlLWljb25cIj48L3NwYW4+XHJcbjwvZGl2PiJdfQ==