UNPKG

@ngx-gallery/gallerize

Version:

Angular gallery directive that hooks the lightbox with the images automatically.

245 lines 21.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, Inject, Optional, Self, Host, NgZone, ElementRef, Renderer2, PLATFORM_ID } from '@angular/core'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { Gallery, ImageItem, GalleryComponent } from '@ngx-gallery/core'; import { Lightbox } from '@ngx-gallery/lightbox'; import { Subject, from, EMPTY } from 'rxjs'; import { tap, map, switchMap, finalize, debounceTime } from 'rxjs/operators'; /** @enum {string} */ const GallerizeMode = { Detector: 'detector', Gallery: 'gallery', }; export class GallerizeDirective { /** * @param {?} _zone * @param {?} _el * @param {?} _gallery * @param {?} _lightbox * @param {?} _renderer * @param {?} platform * @param {?} _document * @param {?} _galleryCmp */ constructor(_zone, _el, _gallery, _lightbox, _renderer, platform, _document, _galleryCmp) { this._zone = _zone; this._el = _el; this._gallery = _gallery; this._lightbox = _lightbox; this._renderer = _renderer; this._document = _document; this._galleryCmp = _galleryCmp; /** * Default gallery id */ this._galleryId = 'lightbox'; /** * The selector used to query images elements */ this.selector = 'img'; // Set gallerize mode if (isPlatformBrowser(platform)) { this._mode = _galleryCmp ? "gallery" /* Gallery */ : "detector" /* Detector */; } } /** * @return {?} */ ngOnInit() { this._zone.runOutsideAngular(() => { this._galleryId = this.gallerize || this._galleryId; /** @type {?} */ const ref = this._gallery.ref(this._galleryId); switch (this._mode) { case "detector" /* Detector */: this.detectorMode(ref); break; case "gallery" /* Gallery */: this.galleryMode(ref); } }); } /** * @return {?} */ ngOnDestroy() { switch (this._mode) { case "detector" /* Detector */: this._detector$.complete(); this._observer$.disconnect(); break; case "gallery" /* Gallery */: this._itemClick$.unsubscribe(); this._itemChange$.unsubscribe(); } } /** * Gallery mode: means `gallerize` directive is used on `<gallery>` component * Adds a click event to each gallery item so it opens in lightbox * @private * @param {?} galleryRef * @return {?} */ galleryMode(galleryRef) { // Clone its items to the new gallery instance this._itemClick$ = this._galleryCmp.galleryRef.itemClick.subscribe((i) => this._lightbox.open(i, this._galleryId)); this._itemChange$ = this._galleryCmp.galleryRef.itemsChanged.subscribe((state) => galleryRef.load(state.items)); } /** * Detector mode: means `gallerize` directive is used on a normal HTMLElement * Detects images and adds a click event to each image so it opens in the lightbox * @private * @param {?} galleryRef * @return {?} */ detectorMode(galleryRef) { this._detector$ = new Subject(); // Query image elements this._detector$.pipe(debounceTime(300), switchMap(() => { /** * get all img elements from content * @type {?} */ const imageElements = this._el.nativeElement.querySelectorAll(this.selector); if (imageElements && imageElements.length) { /** @type {?} */ const images = []; return from(imageElements).pipe(map((el, i) => { // Add click event to the image this._renderer.setStyle(el, 'cursor', 'pointer'); this._renderer.setProperty(el, 'onclick', () => this._zone.run(() => this._lightbox.open(i, this._galleryId))); if (el instanceof HTMLImageElement) { // If element is type of img use the src property return { src: el.getAttribute('imageSrc') || el.src, thumb: el.getAttribute('thumbSrc') || el.src }; } else { // Otherwise, use element background-image url /** @type {?} */ const elStyle = el.currentStyle || this._document.defaultView.getComputedStyle(el, null); /** @type {?} */ const background = elStyle.backgroundImage.slice(4, -1).replace(/"/g, ''); return { src: el.getAttribute('imageSrc') || background, thumb: el.getAttribute('thumbSrc') || background }; } }), tap((data) => images.push(new ImageItem(data))), finalize(() => galleryRef.load(images))); } else { return EMPTY; } })).subscribe(); // Observe content changes this._observer$ = new MutationObserver(() => this._detector$.next()); this._observer$.observe(this._el.nativeElement, { childList: true, subtree: true }); } } GallerizeDirective.decorators = [ { type: Directive, args: [{ selector: '[gallerize]' },] } ]; /** @nocollapse */ GallerizeDirective.ctorParameters = () => [ { type: NgZone }, { type: ElementRef }, { type: Gallery }, { type: Lightbox }, { type: Renderer2 }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: GalleryComponent, decorators: [{ type: Host }, { type: Self }, { type: Optional }] } ]; GallerizeDirective.propDecorators = { gallerize: [{ type: Input }], selector: [{ type: Input }] }; if (false) { /** * Default gallery id * @type {?} * @private */ GallerizeDirective.prototype._galleryId; /** * Gallerize mode * @type {?} * @private */ GallerizeDirective.prototype._mode; /** * Stream that emits to fire the detection stream the image elements has changed * @type {?} * @private */ GallerizeDirective.prototype._observer$; /** * Stream that emits when image is discover * @type {?} * @private */ GallerizeDirective.prototype._detector$; /** * Gallery events (if used on a gallery component) * @type {?} * @private */ GallerizeDirective.prototype._itemClick$; /** * @type {?} * @private */ GallerizeDirective.prototype._itemChange$; /** * If set, it will become the gallery id * @type {?} */ GallerizeDirective.prototype.gallerize; /** * The selector used to query images elements * @type {?} */ GallerizeDirective.prototype.selector; /** * @type {?} * @private */ GallerizeDirective.prototype._zone; /** * @type {?} * @private */ GallerizeDirective.prototype._el; /** * @type {?} * @private */ GallerizeDirective.prototype._gallery; /** * @type {?} * @private */ GallerizeDirective.prototype._lightbox; /** * @type {?} * @private */ GallerizeDirective.prototype._renderer; /** * @type {?} * @private */ GallerizeDirective.prototype._document; /** * @type {?} * @private */ GallerizeDirective.prototype._galleryCmp; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZ3gtZ2FsbGVyeS9nYWxsZXJpemUvIiwic291cmNlcyI6WyJsaWIvZ2FsbGVyaXplLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBR0wsTUFBTSxFQUNOLFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxFQUNKLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLE9BQU8sRUFBYyxTQUFTLEVBQUUsZ0JBQWdCLEVBQTZCLE1BQU0sbUJBQW1CLENBQUM7QUFDaEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpELE9BQU8sRUFBRSxPQUFPLEVBQWdCLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBUzNFLFVBQVcsVUFBVTtJQUNyQixTQUFVLFNBQVM7O0FBTXJCLE1BQU0sT0FBTyxrQkFBa0I7Ozs7Ozs7Ozs7O0lBOEI3QixZQUFvQixLQUFhLEVBQ2IsR0FBZSxFQUNmLFFBQWlCLEVBQ2pCLFNBQW1CLEVBQ25CLFNBQW9CLEVBQ1AsUUFBZ0IsRUFDWCxTQUFjLEVBQ0osV0FBNkI7UUFQekQsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUVGLGNBQVMsR0FB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QUNILENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxFQUFFLENBQUM7UUFFZCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQzs7O1lBdklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsYUFBYTthQUN4Qjs7OztZQTFCQyxNQUFNO1lBQ04sVUFBVTtZQU1ILE9BQU87WUFDUCxRQUFRO1lBTmYsU0FBUztZQTREa0MsTUFBTSx1QkFBcEMsTUFBTSxTQUFDLFdBQVc7NENBQ2xCLE1BQU0sU0FBQyxRQUFRO1lBeERXLGdCQUFnQix1QkF5RDFDLElBQUksWUFBSSxJQUFJLFlBQUksUUFBUTs7O3dCQVpwQyxLQUFLO3VCQUdMLEtBQUs7Ozs7Ozs7O0lBekJOLHdDQUFnQzs7Ozs7O0lBR2hDLG1DQUFzQzs7Ozs7O0lBS3RDLHdDQUF3Qjs7Ozs7O0lBR3hCLHdDQUFpQzs7Ozs7O0lBS2pDLHlDQUFrQzs7Ozs7SUFDbEMsMENBQW1DOzs7OztJQUtuQyx1Q0FBMkI7Ozs7O0lBRzNCLHNDQUEwQjs7Ozs7SUFFZCxtQ0FBcUI7Ozs7O0lBQ3JCLGlDQUF1Qjs7Ozs7SUFDdkIsc0NBQXlCOzs7OztJQUN6Qix1Q0FBMkI7Ozs7O0lBQzNCLHVDQUE0Qjs7Ozs7SUFFNUIsdUNBQXdDOzs7OztJQUN4Qyx5Q0FBaUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5qZWN0LFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgSG9zdCxcbiAgTmdab25lLFxuICBFbGVtZW50UmVmLFxuICBSZW5kZXJlcjIsXG4gIFBMQVRGT1JNX0lEXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgR2FsbGVyeSwgR2FsbGVyeVJlZiwgSW1hZ2VJdGVtLCBHYWxsZXJ5Q29tcG9uZW50LCBHYWxsZXJ5U3RhdGUsIEdhbGxlcnlJdGVtIH0gZnJvbSAnQG5neC1nYWxsZXJ5L2NvcmUnO1xuaW1wb3J0IHsgTGlnaHRib3ggfSBmcm9tICdAbmd4LWdhbGxlcnkvbGlnaHRib3gnO1xuXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZyb20sIEVNUFRZIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIG1hcCwgc3dpdGNoTWFwLCBmaW5hbGl6ZSwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGhhcyAyIG1vZGVzOlxuICogMSAtIElmIGhvc3QgZWxlbWVudCBpcyBhIEhUTUxFbGVtZW50LCBpdCBkZXRlY3RzIHRoZSBpbWFnZXMgYW5kIGhvb2tzIHRoZWlyIGNsaWNrcyB0byBsaWdodGJveFxuICogMiAtIElmIGhvc3QgZWxlbWVudCBpcyBhIEdhbGxlcnlDb21wb25lbnQsIGl0IGhvb2tzIHRoZSBpbWFnZXMgY2xpY2sgdG8gdGhlIGxpZ2h0Ym94XG4gKi9cblxuY29uc3QgZW51bSBHYWxsZXJpemVNb2RlIHtcbiAgRGV0ZWN0b3IgPSAnZGV0ZWN0b3InLFxuICBHYWxsZXJ5ID0gJ2dhbGxlcnknXG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tnYWxsZXJpemVdJ1xufSlcbmV4cG9ydCBjbGFzcyBHYWxsZXJpemVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqIERlZmF1bHQgZ2FsbGVyeSBpZCAqL1xuICBwcml2YXRlIF9nYWxsZXJ5SWQgPSAnbGlnaHRib3gnO1xuXG4gIC8qKiBHYWxsZXJpemUgbW9kZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tb2RlOiBHYWxsZXJpemVNb2RlO1xuXG4gIC8qKiBJZiBob3N0IGVsZW1lbnQgaXMgYSBIVE1MRWxlbWVudCwgd2lsbCB1c2UgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6ICovXG5cbiAgLyoqIFN0cmVhbSB0aGF0IGVtaXRzIHRvIGZpcmUgdGhlIGRldGVjdGlvbiBzdHJlYW0gdGhlIGltYWdlIGVsZW1lbnRzIGhhcyBjaGFuZ2VkICovXG4gIHByaXZhdGUgX29ic2VydmVyJDogYW55O1xuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGltYWdlIGlzIGRpc2NvdmVyICovXG4gIHByaXZhdGUgX2RldGVjdG9yJDogU3ViamVjdDxhbnk+O1xuXG4gIC8qKiBJZiBob3N0IGVsZW1lbnQgaXMgYSBHYWxsZXJ5Q29tcG9uZW50LCB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczogKi9cblxuICAvKiogR2FsbGVyeSBldmVudHMgKGlmIHVzZWQgb24gYSBnYWxsZXJ5IGNvbXBvbmVudCkgKi9cbiAgcHJpdmF0ZSBfaXRlbUNsaWNrJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9pdGVtQ2hhbmdlJDogU3Vic2NyaXB0aW9uO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBJZiBzZXQsIGl0IHdpbGwgYmVjb21lIHRoZSBnYWxsZXJ5IGlkICovXG4gIEBJbnB1dCgpIGdhbGxlcml6ZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgc2VsZWN0b3IgdXNlZCB0byBxdWVyeSBpbWFnZXMgZWxlbWVudHMgKi9cbiAgQElucHV0KCkgc2VsZWN0b3IgPSAnaW1nJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF96b25lOiBOZ1pvbmUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2VsOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIF9nYWxsZXJ5OiBHYWxsZXJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIF9saWdodGJveDogTGlnaHRib3gsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtOiBPYmplY3QsXG4gICAgICAgICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnksXG4gICAgICAgICAgICAgIEBIb3N0KCkgQFNlbGYoKSBAT3B0aW9uYWwoKSBwcml2YXRlIF9nYWxsZXJ5Q21wOiBHYWxsZXJ5Q29tcG9uZW50KSB7XG5cbiAgICAvLyBTZXQgZ2FsbGVyaXplIG1vZGVcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm0pKSB7XG4gICAgICB0aGlzLl9tb2RlID0gX2dhbGxlcnlDbXAgPyBHYWxsZXJpemVNb2RlLkdhbGxlcnkgOiBHYWxsZXJpemVNb2RlLkRldGVjdG9yO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5fZ2FsbGVyeUlkID0gdGhpcy5nYWxsZXJpemUgfHwgdGhpcy5fZ2FsbGVyeUlkO1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5fZ2FsbGVyeS5yZWYodGhpcy5fZ2FsbGVyeUlkKTtcblxuICAgICAgc3dpdGNoICh0aGlzLl9tb2RlKSB7XG4gICAgICAgIGNhc2UgR2FsbGVyaXplTW9kZS5EZXRlY3RvcjpcbiAgICAgICAgICB0aGlzLmRldGVjdG9yTW9kZShyZWYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdhbGxlcml6ZU1vZGUuR2FsbGVyeTpcbiAgICAgICAgICB0aGlzLmdhbGxlcnlNb2RlKHJlZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX21vZGUpIHtcbiAgICAgIGNhc2UgR2FsbGVyaXplTW9kZS5EZXRlY3RvcjpcbiAgICAgICAgdGhpcy5fZGV0ZWN0b3IkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX29ic2VydmVyJC5kaXNjb25uZWN0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBHYWxsZXJpemVNb2RlLkdhbGxlcnk6XG4gICAgICAgIHRoaXMuX2l0ZW1DbGljayQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5faXRlbUNoYW5nZSQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogR2FsbGVyeSBtb2RlOiBtZWFucyBgZ2FsbGVyaXplYCBkaXJlY3RpdmUgaXMgdXNlZCBvbiBgPGdhbGxlcnk+YCBjb21wb25lbnRcbiAgICogQWRkcyBhIGNsaWNrIGV2ZW50IHRvIGVhY2ggZ2FsbGVyeSBpdGVtIHNvIGl0IG9wZW5zIGluIGxpZ2h0Ym94ICovXG4gIHByaXZhdGUgZ2FsbGVyeU1vZGUoZ2FsbGVyeVJlZjogR2FsbGVyeVJlZikge1xuICAgIC8vIENsb25lIGl0cyBpdGVtcyB0byB0aGUgbmV3IGdhbGxlcnkgaW5zdGFuY2VcbiAgICB0aGlzLl9pdGVtQ2xpY2skID0gdGhpcy5fZ2FsbGVyeUNtcC5nYWxsZXJ5UmVmLml0ZW1DbGljay5zdWJzY3JpYmUoKGk6IG51bWJlcikgPT4gdGhpcy5fbGlnaHRib3gub3BlbihpLCB0aGlzLl9nYWxsZXJ5SWQpKTtcbiAgICB0aGlzLl9pdGVtQ2hhbmdlJCA9IHRoaXMuX2dhbGxlcnlDbXAuZ2FsbGVyeVJlZi5pdGVtc0NoYW5nZWQuc3Vic2NyaWJlKChzdGF0ZTogR2FsbGVyeVN0YXRlKSA9PiBnYWxsZXJ5UmVmLmxvYWQoc3RhdGUuaXRlbXMpKTtcbiAgfVxuXG4gIC8qKiBEZXRlY3RvciBtb2RlOiBtZWFucyBgZ2FsbGVyaXplYCBkaXJlY3RpdmUgaXMgdXNlZCBvbiBhIG5vcm1hbCBIVE1MRWxlbWVudFxuICAgKiAgRGV0ZWN0cyBpbWFnZXMgYW5kIGFkZHMgYSBjbGljayBldmVudCB0byBlYWNoIGltYWdlIHNvIGl0IG9wZW5zIGluIHRoZSBsaWdodGJveCAqL1xuICBwcml2YXRlIGRldGVjdG9yTW9kZShnYWxsZXJ5UmVmOiBHYWxsZXJ5UmVmKSB7XG4gICAgdGhpcy5fZGV0ZWN0b3IkID0gbmV3IFN1YmplY3QoKTtcbiAgICAvLyBRdWVyeSBpbWFnZSBlbGVtZW50c1xuICAgIHRoaXMuX2RldGVjdG9yJC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuXG4gICAgICAgIC8qKiBnZXQgYWxsIGltZyBlbGVtZW50cyBmcm9tIGNvbnRlbnQgKi9cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50cyA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cyAmJiBpbWFnZUVsZW1lbnRzLmxlbmd0aCkge1xuXG4gICAgICAgICAgY29uc3QgaW1hZ2VzOiBHYWxsZXJ5SXRlbVtdID0gW107XG5cbiAgICAgICAgICByZXR1cm4gZnJvbShpbWFnZUVsZW1lbnRzKS5waXBlKFxuICAgICAgICAgICAgbWFwKChlbDogYW55LCBpKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkZCBjbGljayBldmVudCB0byB0aGUgaW1hZ2VcbiAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdjdXJzb3InLCAncG9pbnRlcicpO1xuICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eShlbCwgJ29uY2xpY2snLCAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuX2xpZ2h0Ym94Lm9wZW4oaSwgdGhpcy5fZ2FsbGVyeUlkKSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyB0eXBlIG9mIGltZyB1c2UgdGhlIHNyYyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzcmM6IGVsLmdldEF0dHJpYnV0ZSgnaW1hZ2VTcmMnKSB8fCBlbC5zcmMsXG4gICAgICAgICAgICAgICAgICB0aHVtYjogZWwuZ2V0QXR0cmlidXRlKCd0aHVtYlNyYycpIHx8IGVsLnNyY1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB1c2UgZWxlbWVudCBiYWNrZ3JvdW5kLWltYWdlIHVybFxuICAgICAgICAgICAgICAgIGNvbnN0IGVsU3R5bGUgPSBlbC5jdXJyZW50U3R5bGUgfHwgdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IGVsU3R5bGUuYmFja2dyb3VuZEltYWdlLnNsaWNlKDQsIC0xKS5yZXBsYWNlKC9cIi9nLCAnJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHNyYzogZWwuZ2V0QXR0cmlidXRlKCdpbWFnZVNyYycpIHx8IGJhY2tncm91bmQsXG4gICAgICAgICAgICAgICAgICB0aHVtYjogZWwuZ2V0QXR0cmlidXRlKCd0aHVtYlNyYycpIHx8IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoZGF0YTogYW55KSA9PiBpbWFnZXMucHVzaChuZXcgSW1hZ2VJdGVtKGRhdGEpKSksXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiBnYWxsZXJ5UmVmLmxvYWQoaW1hZ2VzKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gT2JzZXJ2ZSBjb250ZW50IGNoYW5nZXNcbiAgICB0aGlzLl9vYnNlcnZlciQgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB0aGlzLl9kZXRlY3RvciQubmV4dCgpKTtcbiAgICB0aGlzLl9vYnNlcnZlciQub2JzZXJ2ZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7XG4gIH1cbn1cbiJdfQ==