UNPKG

ngx-crystal-gallery

Version:

Responsive gallery with support for masonry layout and lightbox.

1,381 lines 154 kB
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) :
    typeof define === 'function' && define.amd ? define('ngx-crystal-gallery', ['exports', '@angular/core', '@angular/common'], factory) :
    (factory((global['ngx-crystal-gallery'] = {}),global.ng.core,global.ng.common));
}(this, (function (exports,core,common) { 'use strict';

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var LightboxComponent = (function () {
        function LightboxComponent(elementRef, ref) {
            this.elementRef = elementRef;
            this.ref = ref;
            this.currentImageIndex = 0;
            this.spinnerHeight = 30;
            this.descriptionHeight = 43;
            this.close = new core.EventEmitter();
            this.showLightbox = false;
            this.hideControls = false;
        }
        Object.defineProperty(LightboxComponent.prototype, "images", {
            get: /**
             * @return {?}
             */ function () {
                return this.data.images;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "config", {
            get: /**
             * @return {?}
             */ function () {
                return this.data.config;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "index", {
            get: /**
             * @return {?}
             */ function () {
                return this.currentImageIndex;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "currImagePath", {
            get: /**
             * @return {?}
             */ function () {
                /** @type {?} */
                var image = this.images[this.index];
                if (!image) {
                    return false;
                }
                if (image.path) {
                    image.full = image.path;
                }
                return image;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "prevImagePath", {
            get: /**
             * @return {?}
             */ function () {
                return this.images[this.prevIndex];
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this.images[this.prevIndex] = value;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "isFirst", {
            get: /**
             * @return {?}
             */ function () {
                return this.index === 0;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "isLast", {
            get: /**
             * @return {?}
             */ function () {
                return this.index === (this.images.length - 1);
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "latestImageIndex", {
            get: /**
             * @return {?}
             */ function () {
                return this.images.length - 1;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "description", {
            get: /**
             * @return {?}
             */ function () {
                return this.images[this.index].description;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxComponent.prototype, "counter", {
            get: /**
             * @return {?}
             */ function () {
                return this.currentImageIndex + 1 + '/' + this.images.length;
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @param {?} event
         * @return {?}
         */
        LightboxComponent.prototype.onKeyDown = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                switch (event.key) {
                    case 'ArrowLeft':
                        this.prev();
                        break;
                    case 'ArrowRight':
                        this.next();
                        break;
                    case 'Escape':
                        this.closeLightbox();
                        break;
                }
            };
        /**
         * @param {?} event
         * @return {?}
         */
        LightboxComponent.prototype.onMouseEnter = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                this.hideControls = false;
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.setBackgroundOpacity(this.config.backgroundOpacity);
                this.currentImageIndex = this.config.index;
                //document.body.style.overflow = 'hidden';
                setTimeout(function () {
                    _this.showLightbox = true;
                }, 30);
                this.setMaxDimensions();
                this.setAnimationDuration();
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.closeLightbox = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.showLightbox = false;
                setTimeout(function () {
                    _this.close.emit('close');
                    //document.body.style.overflow = '';
                }, this.config.animationDuration);
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.next = /**
         * @return {?}
         */
            function () {
                var _this = this;
                if (this.isLast) {
                    if (this.config.loop) {
                        this.currentImageIndex = 0;
                    }
                    else {
                        return;
                    }
                }
                else {
                    this.currentImageIndex++;
                }
                this.currImageLoaded = 'loading';
                setTimeout(function () {
                    if (_this.currImageLoaded === 'loading') {
                        _this.currImageLoaded = false;
                    }
                }, 50);
                this.setMaxDimensions();
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.prev = /**
         * @return {?}
         */
            function () {
                var _this = this;
                if (this.isFirst) {
                    if (this.config.loop) {
                        this.currentImageIndex = this.latestImageIndex;
                    }
                    else {
                        return;
                    }
                }
                else {
                    this.currentImageIndex--;
                }
                setTimeout(function () {
                    if (_this.currImageLoaded === 'loading') {
                        _this.currImageLoaded = false;
                    }
                }, 50);
                this.setMaxDimensions();
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.onImageLoaded = /**
         * @return {?}
         */
            function () {
                this.currImageLoaded = true;
                this.ref.detectChanges();
            };
        /**
         * @param {?} opacity
         * @return {?}
         */
        LightboxComponent.prototype.setBackgroundOpacity = /**
         * @param {?} opacity
         * @return {?}
         */
            function (opacity) {
                this.hostStyleBackgroundColor = 'rgba(0, 0, 0, ' + opacity + ')';
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.setMaxDimensions = /**
         * @return {?}
         */
            function () {
                if (this.description) {
                    this.wrapperElem.nativeElement.style.height = 'calc(100% - ' + (this.descriptionHeight * 2) + 'px)';
                }
                else {
                    this.wrapperElem.nativeElement.style.height = '';
                }
                this.currImageElem.nativeElement.style.maxHeight = 'calc(' + this.config.lightboxMaxHeight + ')';
                this.currImageElem.nativeElement.style.maxWidth = this.config.lightboxMaxWidth;
            };
        /**
         * @return {?}
         */
        LightboxComponent.prototype.setAnimationDuration = /**
         * @return {?}
         */
            function () {
                this.hostStyleTransition = 'opacity ' + this.config.animationDuration + 'ms';
            };
        LightboxComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'crystal-lightbox',
                        template: "<div class=\"cg-counter\" *ngIf=\"config.counter && images.length > 1\">{{counter}}</div>\n<div class=\"cg-description\" *ngIf=\"description\">{{description}}</div>\n\n<div \n\tclass=\"cg-close\" \n\t(click)=\"closeLightbox()\">Close</div>\n\n<div \n\tclass=\"cg-spinner\" \n\t *ngIf=\"!currImageLoaded\"></div>\n\n<div class=\"cg-wrapper\" #wrapper>\n\t<img \n\t\tclass=\"cg-curr-image\" \n\t\t#currImageElem \n\t\t[src]=\"currImagePath?.full\" \n\t\t[class.cg-show]=\"currImageLoaded\" \n\t\t(load)=\"onImageLoaded()\" />\n</div>\n\n<div \n\tclass=\"cg-prev\" \n\t[hidden]=\"isFirst && !config.loop\" \n\t(click)=\"prev()\"></div>\n<div \n\tclass=\"cg-next\" \n\t[hidden]=\"isLast && !config.loop\" \n\t(click)=\"next()\"></div>",
                        styles: ["._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:\"\";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:rgba(0,0,0,.85)}:host img{opacity:1;max-width:100%;max-height:100%;box-shadow:0 4px 15px 2px rgba(0,0,0,.35)}:host img.cg-curr-image.cg-show{opacity:1}:host img.cg-curr-image{opacity:0;z-index:10}:host .cg-wrapper.cg-hide{display:none}:host .cg-wrapper{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;left:0;width:100%;height:100%}:host .cg-spinner{position:absolute;top:50%;left:50%;margin-top:-15px;margin-left:-5px}:host .cg-counter{text-align:left;position:absolute;left:22px;top:13px;font-size:14px;text-shadow:0 0 1px rgba(0,0,0,.65);z-index:30}:host .cg-description{text-align:center;max-width:calc(100% - 200px);margin:0 auto;font-size:14px;line-height:43px;position:relative;z-index:50}:host .cg-close{position:absolute;top:0;right:0;padding:13px 22px;font-size:13px;text-transform:uppercase;cursor:pointer;opacity:.5;z-index:30;transition:opacity .1s ease-in-out;text-shadow:0 0 1px rgba(0,0,0,.65)}:host .cg-close:hover{opacity:1}:host .cg-next,:host .cg-prev{width:40%;height:100%;position:absolute;top:0;cursor:pointer;opacity:.5;z-index:20;transition:opacity .1s ease-in-out;-webkit-tap-highlight-color:rgba(255,255,255,0)}:host .cg-next:hover,:host .cg-prev:hover{opacity:1}:host .cg-prev{left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAiCAYAAABbXymAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMzMTZCQzFERDgzMTExRTc5QUYxQTUxRDI5MkM5ODZCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMzMTZCQzFFRDgzMTExRTc5QUYxQTUxRDI5MkM5ODZCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzMxNkJDMUJEODMxMTFFNzlBRjFBNTFEMjkyQzk4NkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMxNkJDMUNEODMxMTFFNzlBRjFBNTFEMjkyQzk4NkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7VrwZKAAAClElEQVR42qzWSY8SQRgGYLoVHPeTXlwCiIwMArJGtiABNep4IGZi4oEfMJooLjePrnFGf5yJS0hYmq2b/aBxiQ6+lRRJdaUZq5vp5E2TLnioVFd9VZLN+iUxIdeMiW2fRVCmvz2DpJBVCk6X6SVBHQRLpVKb7Xb782g0Usrl8jM8W0P20+9YQn3JZPIhwN6MXoPBoI3nG8iKGZhF14A+AqrOmKtWq31F213kkOgQ69B0Ol0BqrFot9vV/H7/c7RfEoVZ1G+EdjqdvtfrfYn2K8gJkaHQodlstjIej/ssihdH0Ddov4acQo7QlycJo5PJhEc1j8fzmqJk2h1D7Lv1lkUv5nK5xzzaarWMUIcwms/nCTrgUbfbTdCrVtAAQafTqQ5VFEVdCi0UCk/Q0yGLNptN1el0vqLoaRHUxqPoKY/2KFo0g0r0ba4Wi8WnQEcs2mg0VAPULrJsZTqpNzDZ6yxar9dVl8tFVtR10SnFohJdgnZYuh9IkjSTZfknPn5DviO/kL/IjkgtIOhhJJ7JZF5gdU24hdDG6qqg/QJywEzlmg/FSTLhE4nE9nA4nHJFRvH5fJto94gOBfvyjtJxXI/H4x+A63re6/UUVDCCnzeDz6fbceQscjsWi703wFsM7hDBJQN8PRqNbmNn0OGapu0JfoviYx4PBAL30e5dCg+Hw0Z4e8/wfr/P451QKPRgaRzIFjDdksefsbjdKn5zER6JRMiwuP+3Ne2KB4PBLVVVR1xd+YK2O2bOFYvwd8CHbK/x/J6Zc8Ui/AZmxdtqtdrAwlFLpRLZrS/PYcnkEUuiY7hCS+g5sovT55+Qj7QS/jYD8zjp/UF6t9GS+oPed8zCLC5zJ0tSo//Q+8wKLHTw/ifAAMQVS4vHZR2VAAAAAElFTkSuQmCC) center left 22px no-repeat}:host .cg-next{right:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAiCAYAAABbXymAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNDE3MDE1RDgzMTExRTc5NjM4QTIzQzI2Rjc2Qjg2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjEyNDE3MDE2RDgzMTExRTc5NjM4QTIzQzI2Rjc2Qjg2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTI0MTcwMTNEODMxMTFFNzk2MzhBMjNDMjZGNzZCODYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTI0MTcwMTREODMxMTFFNzk2MzhBMjNDMjZGNzZCODYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7zv5BKAAACl0lEQVR42rTW224SQRwGcHZb8FT1Sm88BJCiFAE5JpyCBNRE8coYEy94AGqi9XDXS0+JVh/CB/EhiFET5LjAclgWjaa1aazfJDM6u6LuLjrJl2124cd0duY/I9h+NoELabtcTLcFCon0bw+SRE4h28hn2xyNoIvISrlcfqAoSluSpLepVKqCe6cRB/2MYAXei1wfjUbSLm34gX4ymbyN+z6rOBmC/ciNer3+fpdrwGXgd8h/YwVn8Dm/37/e6/UGOnyQTqfXrOBsKI4g571e76Nutzv8De43gwv05S0hx5CLwJ/iBWrwyWQyzGazpnHyITtyCDlBcI/H8wS4ZlhUVbWMO/R4p9P5Bc/lcnfx/Ow8+AW32z0LH+Xz+X+Dt9ttmcen0ynDA1bx4wR3Op2PW62WrOv5uFAo3JsXL1K8r+v5LNxmZrb8wJvNpn5YlGKxeJ/WFruZBcRPxUsul2u90WhocCyqBqk3dLGJiwbgb/T6FflCSqkoiluCIGjqNGzWgQUz9YR8aQ9yBqtyDQtH0q1KNZPJPMTzOHKA4oaHwuPz+SooUm0eHY/H00QisUEWFHKUDYVRdBmVr9Lv9/WoGo/HX+J5iY7/QSMvj003hnb0aCwWe4HnV5GTyGEj002DDgYDDYqdRo1Goxu0p3pU+BvqDQQCqzPQCUWvzINKejQcDltHQ6HQLaBdHh0Oh5ZRO0OBaFD8iIL7z82ibGtyRyKR1T+gl82g/GZ6Dev/HY/KsqwEg0FLKL/93+R7C3QM9Nk8KDtiOWq12jb2s2XS01Kp9Kparb7G/TfIR2QT2TF6UBS42bBEi/UK/SIBPyCfkC0zKA+z6rWPXm30tLlJr6ZQ/ZmYDYnI1eEdejV9Thb+18H7uwADAOG/Wcm4x+knAAAAAElFTkSuQmCC) center right 22px no-repeat}"]
                    },] },
        ];
        /** @nocollapse */
        LightboxComponent.ctorParameters = function () {
            return [
                { type: core.ElementRef },
                { type: core.ChangeDetectorRef }
            ];
        };
        LightboxComponent.propDecorators = {
            data: [{ type: core.Input }],
            showLightbox: [{ type: core.HostBinding, args: ['class.cg-show',] }],
            hideControls: [{ type: core.HostBinding, args: ['class.cg-hide-controls',] }],
            hostStyleTransition: [{ type: core.HostBinding, args: ['style.transition',] }],
            hostStyleBackgroundColor: [{ type: core.HostBinding, args: ['style.backgroundColor',] }],
            currImageElem: [{ type: core.ViewChild, args: ['currImageElem',] }],
            prevImageElem: [{ type: core.ViewChild, args: ['prevImageElem',] }],
            wrapperElem: [{ type: core.ViewChild, args: ['wrapper',] }],
            onKeyDown: [{ type: core.HostListener, args: ['window:keydown', ['$event'],] }],
            onMouseEnter: [{ type: core.HostListener, args: ["mouseenter", ['$event'],] }]
        };
        return LightboxComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var LightboxMobileComponent = (function () {
        function LightboxMobileComponent(elementRef, ref) {
            this.elementRef = elementRef;
            this.ref = ref;
            this.currImage = {
                show: false,
                loaded: false,
                index: 0
            };
            this.prevImage = {
                loaded: false
            };
            this.nextImage = {
                loaded: false
            };
            this.close = new core.EventEmitter();
            this.lightboxShown = false;
        }
        Object.defineProperty(LightboxMobileComponent.prototype, "images", {
            get: /**
             * @return {?}
             */ function () {
                return this.data.images;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "config", {
            get: /**
             * @return {?}
             */ function () {
                return this.data.config;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "index", {
            get: /**
             * @return {?}
             */ function () {
                return this.currImage.index;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "currImagePath", {
            get: /**
             * @return {?}
             */ function () {
                /** @type {?} */
                var image = this.images[this.index];
                if (!image) {
                    return false;
                }
                if (image.path) {
                    image.full = image.path;
                }
                return image;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "prevImagePath", {
            get: /**
             * @return {?}
             */ function () {
                if (this.prevIndex < 0 && this.config.loop) {
                    this.prevIndex = this.latestImageIndex;
                }
                /** @type {?} */
                var image = this.images[this.prevIndex];
                if (image && image.path) {
                    image.full = image.path;
                }
                return image;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "nextImagePath", {
            get: /**
             * @return {?}
             */ function () {
                /** @type {?} */
                var image = this.images[this.nextIndex];
                if (image && image.path) {
                    image.full = image.path;
                }
                return image;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "isFirst", {
            get: /**
             * @return {?}
             */ function () {
                if (this.config.loop) {
                    return false;
                }
                else {
                    return this.index === 0;
                }
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "isLast", {
            get: /**
             * @return {?}
             */ function () {
                if (this.config.loop) {
                    return false;
                }
                else {
                    return this.index === this.latestImageIndex;
                }
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "latestImageIndex", {
            get: /**
             * @return {?}
             */ function () {
                return this.images.length - 1;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(LightboxMobileComponent.prototype, "isLandscape", {
            get: /**
             * @return {?}
             */ function () {
                return window.innerWidth > window.innerHeight;
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @param {?} event
         * @return {?}
         */
        LightboxMobileComponent.prototype.onWindowResize = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                this.landscapeMode = this.isLandscape;
                this.ref.detectChanges();
            };
        /**
         * @return {?}
         */
        LightboxMobileComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.currImage.index = this.config.index;
                this.prevIndex = this.currImage.index - 1;
                this.nextIndex = this.currImage.index + 1;
                this.showLightbox();
            };
        /**
         * @return {?}
         */
        LightboxMobileComponent.prototype.showLightbox = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.currImage.show = true;
                setTimeout(function () {
                    _this.lightboxShown = true;
                }, 30);
            };
        /**
         * @return {?}
         */
        LightboxMobileComponent.prototype.closeLightbox = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.lightboxShown = false;
                setTimeout(function () {
                    _this.close.emit(true);
                }, 200);
            };
        /**
         * @param {?} event
         * @return {?}
         */
        LightboxMobileComponent.prototype.slide = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                var _this = this;
                if (event === 'next') {
                    if (this.isLast) {
                        return;
                    }
                    else {
                        setTimeout(function () {
                            _this.currImage.index++;
                        }, 200);
                    }
                    if (this.index === this.latestImageIndex) {
                        setTimeout(function () {
                            _this.currImage.index = 0;
                        }, 200);
                    }
                    setTimeout(function () {
                        _this.afterSlide('next');
                    }, 300);
                }
                if (event === 'prev') {
                    if (this.isFirst) {
                        return;
                    }
                    else {
                        setTimeout(function () {
                            _this.currImage.index--;
                        }, 200);
                    }
                    if (this.index === 0) {
                        setTimeout(function () {
                            _this.currImage.index = _this.latestImageIndex;
                        }, 200);
                    }
                    setTimeout(function () {
                        _this.afterSlide('prev');
                    }, 300);
                }
            };
        /**
         * @param {?} eventType
         * @return {?}
         */
        LightboxMobileComponent.prototype.afterSlide = /**
         * @param {?} eventType
         * @return {?}
         */
            function (eventType) {
                this.currImage.show = true;
                if (this.index === this.latestImageIndex && this.config.loop) {
                    this.nextIndex = 0;
                }
                else {
                    this.nextIndex = this.index + 1;
                }
                if (this.index === 0 && this.config.loop) {
                    this.prevIndex = this.latestImageIndex;
                }
                else {
                    this.prevIndex = this.index - 1;
                }
                if (eventType === 'prev') {
                    if (!this.prevImage.loaded) {
                        this.currImage.loaded = false;
                        this.prevImage.loaded = false;
                    }
                    if (!this.currImage.loaded) {
                        this.nextImage.loaded = false;
                    }
                }
                if (eventType === 'next') {
                    if (!this.nextImage.loaded) {
                        this.currImage.loaded = false;
                        this.nextImage.loaded = false;
                    }
                    if (!this.currImage.loaded) {
                        this.prevImage.loaded = false;
                    }
                }
                this.defaultWrapperPosition();
                this.ref.detectChanges();
            };
        /**
         * @param {?} elem
         * @return {?}
         */
        LightboxMobileComponent.prototype.onImageLoaded = /**
         * @param {?} elem
         * @return {?}
         */
            function (elem) {
                this[elem].loaded = true;
                this.ref.detectChanges();
            };
        /**
         * @param {?} $event
         * @return {?}
         */
        LightboxMobileComponent.prototype.handlePinchEvents = /**
         * @param {?} $event
         * @return {?}
         */
            function ($event) {
                if ($event === 'prev') {
                    this.slide('prev');
                }
                if ($event === 'next') {
                    this.slide('next');
                }
            };
        /**
         * @return {?}
         */
        LightboxMobileComponent.prototype.defaultWrapperPosition = /**
         * @return {?}
         */
            function () {
                /** @type {?} */
                var elem = this.wrapperEl.nativeElement;
                elem.style.transition = 'all 0ms';
                elem.style.transform = 'matrix(1, 0, 0, 1, 0, 0)';
                elem.style.webkitTransform = 'matrix(1, 0, 0, 1, 0, 0)';
            };
        LightboxMobileComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'crystal-lightbox-mobile',
                        template: "<div class=\"cg-back\" (click)=\"closeLightbox()\"></div>\n\n<div \n\tclass=\"cg-wrapper\" \n\t[class.cg-landscape]=\"landscapeMode\"\n\tpinch [isLast]=\"isLast\" [isFirst]=\"isFirst\" (events)=\"handlePinchEvents($event)\"\n\t#wrapper>\n\t<div class=\"cg-image-wrap cg-prev-image\">\n\t\t<img \n\t\t\t*ngIf=\"prevImagePath\"\n\t\t\t[src]=\"prevImagePath.full\" \n\t\t\t[class.cg-hide]=\"!prevImage.loaded\"\n\t\t\t(load)=\"onImageLoaded('prevImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!prevImage.loaded && prevImagePath\"></div>\n\t</div>\n\n\t<div class=\"cg-image-wrap cg-curr-image\" *ngIf=\"currImage.show\">\n\t\t<img \n\t\t\t[src]=\"currImagePath?.full\" \n\t\t\t[class.cg-hide]=\"!currImage.loaded\" \n\t\t\t(load)=\"onImageLoaded('currImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!currImage.loaded\"></div>\n\t</div>\n\t\n\t<div class=\"cg-image-wrap cg-next-image\">\n\t\t<img \n\t\t\t*ngIf=\"nextImagePath\"\n\t\t\t[src]=\"nextImagePath.full\" \n\t\t\t[class.cg-hide]=\"!nextImage.loaded\" \n\t\t\t(load)=\"onImageLoaded('nextImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!nextImage.loaded && nextImagePath\"></div>\n\t</div>\n</div>",
                        styles: ["._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:\"\";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .2s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:#000}:host .cg-back{background:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22UTF-8%22%3F%3E%3Csvg width%3D%2210px%22 height%3D%2216px%22 viewBox%3D%220 0 10 16%22 version%3D%221.1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E    %3C!-- Generator%3A sketchtool 40.2 (33826) - http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch --%3E    %3Ctitle%3E11A73872-5EBF-46F6-B7C5-142D47A33339%3C%2Ftitle%3E    %3Cdesc%3ECreated with sketchtool.%3C%2Fdesc%3E    %3Cdefs%3E%3C%2Fdefs%3E    %3Cg id%3D%22Interface-1280-x-800%22 stroke%3D%22none%22 stroke-width%3D%221%22 fill%3D%22none%22 fill-rule%3D%22evenodd%22%3E        %3Cg id%3D%22Lot_viewpage_open%22 transform%3D%22translate(-111.000000%2C -296.000000)%22 fill%3D%22%23FFFFFF%22%3E            %3Cg id%3D%22arrows-16px-1_minimal-left%22 transform%3D%22translate(111.000000%2C 296.000000)%22%3E                %3Cpolygon id%3D%22Shape%22 points%3D%228.1 15.7 0.4 8 8.1 0.3 9.6 1.7 3.3 8 9.6 14.3%22%3E%3C%2Fpolygon%3E            %3C%2Fg%3E        %3C%2Fg%3E    %3C%2Fg%3E%3C%2Fsvg%3E\") center/12px no-repeat;width:40px;height:40px;opacity:.9;position:fixed;top:0;left:0;z-index:1000}:host .cg-wrapper.cg-landscape .cg-image-wrap img{height:100%}:host .cg-wrapper{transition:none;width:100%;height:100%;display:block}:host .cg-wrapper .cg-image-wrap.cg-prev-image{-webkit-transform:translate3d(calc(-100% - 8px),0,0);transform:translate3d(calc(-100% - 8px),0,0)}:host .cg-wrapper .cg-image-wrap.cg-next-image{-webkit-transform:translate3d(calc(100% + 8px),0,0);transform:translate3d(calc(100% + 8px),0,0)}:host .cg-wrapper .cg-image-wrap{width:100%;height:100%;text-align:center;position:absolute;display:flex;align-items:center;justify-content:center}:host .cg-wrapper .cg-image-wrap img{max-width:100%;max-height:100%;width:auto;height:auto;position:relative}:host .cg-wrapper .cg-image-wrap img.cg-hide{display:none}"]
                    },] },
        ];
        /** @nocollapse */
        LightboxMobileComponent.ctorParameters = function () {
            return [
                { type: core.ElementRef },
                { type: core.ChangeDetectorRef }
            ];
        };
        LightboxMobileComponent.propDecorators = {
            data: [{ type: core.Input }],
            wrapperEl: [{ type: core.ViewChild, args: ['wrapper',] }],
            lightboxShown: [{ type: core.HostBinding, args: ['class.cg-show',] }],
            onWindowResize: [{ type: core.HostListener, args: ['window:resize', ['$event'],] }]
        };
        return LightboxMobileComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    /** @type {?} */
    var defaultConfig = {
        masonry: true,
        masonryMaxHeight: 200,
        masonryGutter: 4,
        loop: false,
        index: 0,
        backgroundOpacity: 0.85,
        counter: false,
        lightboxMaxHeight: "100%",
        lightboxMaxWidth: "100%",
        animationDuration: 100
    };

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var CrystalLightbox = (function () {
        function CrystalLightbox(componentFactoryResolver, appRef, injector) {
            this.componentFactoryResolver = componentFactoryResolver;
            this.appRef = appRef;
            this.injector = injector;
        }
        Object.defineProperty(CrystalLightbox.prototype, "isMobile", {
            get: /**
             * @return {?}
             */ function () {
                /** @type {?} */
                var check = false;
                (function (a) {
                    if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
                        check = true;
                })(navigator.userAgent || navigator.vendor);
                return check;
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @param {?} component
         * @param {?} data
         * @return {?}
         */
        CrystalLightbox.prototype.appendComponentToBody = /**
         * @param {?} component
         * @param {?} data
         * @return {?}
         */
            function (component, data) {
                var _this = this;
                /** @type {?} */
                var componentRef = this.componentFactoryResolver
                    .resolveComponentFactory(component)
                    .create(this.injector);
                ((componentRef.instance)).data = data;
                this.appRef.attachView(componentRef.hostView);
                /** @type {?} */
                var domElem = (((componentRef.hostView)).rootNodes[0]);
                document.body.appendChild(domElem);
                ((componentRef.instance)).close.subscribe(function () {
                    _this.appRef.detachView(componentRef.hostView);
                    componentRef.destroy();
                });
            };
        /**
         * @param {?} images
         * @param {?=} config
         * @return {?}
         */
        CrystalLightbox.prototype.open = /**
         * @param {?} images
         * @param {?=} config
         * @return {?}
         */
            function (images, config) {
                if (config === void 0) {
                    config = {};
                }
                config = this.applyConfigDefaults(defaultConfig, config);
                /** @type {?} */
                var data = {
                    images: images,
                    config: config
                };
                /** @type {?} */
                var component = this.getLightboxComponent();
                this.appendComponentToBody(component, data);
            };
        /**
         * @return {?}
         */
        CrystalLightbox.prototype.getLightboxComponent = /**
         * @return {?}
         */
            function () {
                return !this.isMobile ? LightboxComponent : LightboxMobileComponent;
            };
        /**
         * @param {?} defaultConfig
         * @param {?} config
         * @return {?}
         */
        CrystalLightbox.prototype.applyConfigDefaults = /**
         * @param {?} defaultConfig
         * @param {?} config
         * @return {?}
         */
            function (defaultConfig$$1, config) {
                if (!config.index) {
                    config.index = 0;
                }
                return Object.assign(defaultConfig$$1, config);
            };
        CrystalLightbox.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        CrystalLightbox.ctorParameters = function () {
            return [
                { type: core.ComponentFactoryResolver },
                { type: core.ApplicationRef },
                { type: core.Injector }
            ];
        };
        return CrystalLightbox;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var GalleryComponent = (function () {
        function GalleryComponent(lightbox, elementRef) {
            this.lightbox = lightbox;
            this.elementRef = elementRef;
            this.config = {};
        }
        Object.defineProperty(GalleryComponent.prototype, "isNgContent", {
            get: /**
             * @return {?}
             */ function () {
                return this.contentWrapper.nativeElement.children.length > 0;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(GalleryComponent.prototype, "masonryState", {
            get: /**
             * @return {?}
             */ function () {
                return this.config.masonry;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(GalleryComponent.prototype, "masonryMaxHeight", {
            get: /**
             * @return {?}
             */ function () {
                return this.config.masonryMaxHeight;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(GalleryComponent.prototype, "masonryGutter", {
            get: /**
             * @return {?}
             */ function () {
                return this.config.masonryGutter;
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @param {?} images
         * @param {?} i
         * @return {?}
         */
        GalleryComponent.prototype.showLightbox = /**
         * @param {?} images
         * @param {?} i
         * @return {?}
         */
            function (images, i) {
                this.config.index = i;
                this.lightbox.open(images, this.config);
            };
        /**
         * @param {?} event
         * @return {?}
         */
        GalleryComponent.prototype.handleMasonryLayoutEvents = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                this.showLightbox(this.images, event.index);
            };
        GalleryComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'crystal-gallery',
                        template: "<div #contentWrapper [hidden]=\"isNgContent\">\n    <ng-content></ng-content>\n</div>\n\n<masonry-layout \n    class=\"cg-wrapper\"\n    *ngIf=\"!isNgContent\" \n\n    [max-height]=\"masonryMaxHeight\" \n    [gutter]=\"masonryGutter\"\n    [masonry]=\"masonryState\"\n    [class-name]=\"'cg-image'\"\n    [images]=\"images\"\n    (events)=\"handleMasonryLayoutEvents($event)\"></masonry-layout>",
                        styles: [":host{display:block;width:100%}:host .cg-wrapper{display:block;width:100%;overflow:hidden}:host .cg-wrapper.cg-show{height:auto;position:relative;display:table}:host .cg-image img{cursor:pointer;width:100%}"],
                    },] },
        ];
        /** @nocollapse */
        GalleryComponent.ctorParameters = function () {
            return [
                { type: CrystalLightbox },
                { type: core.ElementRef }
            ];
        };
        GalleryComponent.propDecorators = {
            images: [{ type: core.Input, args: ['images',] }],
            config: [{ type: core.Input, args: ['config',] }],
            contentWrapper: [{ type: core.ViewChild, args: ['contentWrapper',] }]
        };
        return GalleryComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var MasonryLayoutComponent = (function () {
        function MasonryLayoutComponent(elementRef) {
            this.elementRef = elementRef;
            this.GUTTER = 0;
            this.savedNodeDimensions = [];
            this.gridState = 'not started';
            this.ENABLE_MASONRY = true;
            this.MAX_HEIGHT = 400;
            this.events = new core.EventEmitter();
            this.elem = this.elementRef.nativeElement;
        }
        Object.defineProperty(MasonryLayoutComponent.prototype, "gutter", {
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this.GUTTER = value / 2;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(MasonryLayoutComponent.prototype, "isMobile", {
            get: /**
             * @return {?}
             */ function () {
                /** @type {?} */
                var check = false;
                (function (a) {
                    if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
                        check = true;
                })(navigator.userAgent || navigator.vendor);
                return check;
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @param {?} event
         * @return {?}
         */
        MasonryLayoutComponent.prototype.onWindowResize = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                var _this = this;
                clearTimeout(this.resizeTimer);
                this.resizeTimer = setTimeout(function () {
                    _this.gridState = 'not started';
                    _this.buildGrid();
                }, 250);
            };
        /**
         * @return {?}
         */
        MasonryLayoutComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.buildGrid();
            };
        /**
         * @return {?}
         */
        MasonryLayoutComponent.prototype.ngOnChanges = /**
         * @return {?}
         */
            function () {
                var _this = this;
                clearTimeout(this.changesTimer);
                this.changesTimer = setTimeout(function () {
                    _this.gridState = 'not started';
                    _this.buildGrid();
                }, 250);
            };
        /**
         * @return {?}
         */
        MasonryLayoutComponent.prototype.buildGrid = /**
         * @return {?}
         */
            function () {
                var _this = this;
                /** @type {?} */
                var parentWidth = Math.floor(this.elem.parentNode.offsetWidth);
                /** @type {?} */
                var row = {
                    startIndex: 0,
                    endIndex: 0,
                    length: 0,
                    totalWidth: 0
                };
                if (!this.images || !this.images.length) {
                    return;
                }
                this.elem.style.width = parentWidth + 'px';
                this.elem.style.display = 'table';
                this.images.forEach(function (node, index) {
                    if (row.totalWidth === 0) {
                        row.startIndex = index;
                        row.length = 0;
                    }
                    row.length++;
                    row.totalWidth += _this.getComputedWidth(index);
                    if (row.totalWidth >= parentWidth || _this.isLastChild(index)) {
                        row.endIndex = index;
                        /** @type {?} */
                        var scaling = row.totalWidth / parentWidth;
                        _this.setColDimensions(scaling, row);
                        row.totalWidth = 0;
                    }
                });
            };
        /**
         * @param {?} scaling
         * @param {?} row
         * @return {?}
         */
        MasonryLayoutComponent.prototype.setColDimensions = /**
         * @param {?} scaling
         * @param {?} row
         * @return {?}
         */
            function (scaling, row) {
                var _this = this;
                /** @type {?} */
                var totalRowWidth = 0;
                /** @type {?} */
                var parentWidth = this.elem.parentNode.offsetWidth;
                scaling = (scaling < 1) ? 1 : scaling;
                this.images.forEach(function (node, index) {
                    if (!_this.ENABLE_MASONRY) {
                        node.computedHeight = _this.MAX_HEIGHT + 'px';
                        node.computedWidth = _this.getComputedWidth(index) + 'px';
                        node.margin = _this.getNodeMargin(parentWidth);
                        return;
                    }
                    if (index >= row.startIndex && index <= row.endIndex) {
                        /** @type {?} */
                        var nodeWidth = void 0;
                        // last image
                        if (index === row.endIndex && scaling > 1) {
                            nodeWidth = (100 - totalRowWidth) - ((_this.GUTTER * 2) / parentWidth * 100);
                            node.computedWidth = 'calc(' + nodeWidth + '%)';
                            if (_this.gridState === 'not started') {
                                _this.gridState = 'pre-building';
                                setTimeout(function () {
                                    _this.buildGrid();
                                }, 100);
                            }
                        }
                        else {
                            nodeWidth = ((_this.getComputedWidth(index) / scaling) / parentWidth * 100) - ((row.length * (_this.GUTTER * 2)) * (_this.getComputedWidth(index) / scaling) / parentWidth) / parentWidth * 100;
                            node.computedWidth = 'calc(' + nodeWidth + '%)';
                            totalRowWidth += nodeWidth;
                            totalRowWidth += (_this.GUTTER / parentWidth * 100) * 2;
                        }
                        // last row and last image
                        if (index === row.endIndex && row.length === 1 && _this.isMobile) {
                            nodeWidth = 100 - ((_this.GUTTER * 2) / parentWidth * 100);
                            /** @type {?} */
                            var height = node.height * (parentWidth * (nodeWidth / 100) / node.width);
                            if (height / 2 < _this.MAX_HEIGHT) {
                                node.computedWidth = 'calc(' + nodeWidth + '%)';
                            }
                        }
                        node.margin = _this.getNodeMargin(parentWidth);
                        node.computedHeight = node.height * (parentWidth * (nodeWidth / 100) / node.width) + 'px';
                    }
                });
            };
        /**
         * @param {?} index
         * @return {?}
         */
        MasonryLayoutComponent.prototype.getComputedWidth = /**
         * @param {?} index
         * @return {?}
         */
            function (index) {
                return this.images[index].width / (this.images[index].height / this.MAX_HEIGHT);
            };
        /**
         * @param {?} index
         * @return {?}
         */
        MasonryLayoutComponent.prototype.isLastChild = /**
         * @param {?} index
         * @return {?}
         */
            function (index) {
                return index + 1 === this.images.length;
            };
        /**
         * @param {?} parentWidth
         * @return {?}
         */
        MasonryLayoutComponent.prototype.getNodeMargin = /**
         * @param {?} parentWidth
         * @return {?}
         */
            function (parentWidth) {
                return 'calc(' + this.GUTTER / parentWidth * 100 + '%)';
            };
        /**
         * @param {?} image
         * @param {?} i
         * @return {?}
         */
        MasonryLayoutComponent.prototype.clickOnImage = /**
         * @param {?} image
         * @param {?} i
         * @return {?}
         */
            function (image, i) {
                this.events.emit({
                    type: 'click-on-image',
                    image: image,
                    index: i
                });
            };
        /**
         * @param {?} elem
         * @return {?}
         */
        MasonryLayoutComponent.prototype.onImageLoaded = /**
         * @param {?} elem
         * @return {?}
         */
            function (elem) {
                elem.style.opacity = 1;
            };
        MasonryLayoutComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'masonry-layout',
                        template: "<div \n\t[ngClass]=\"CLASS_NAME\"\n\t*ngFor=\"let image of images; let i = index;\"\n    [style.width]=\"image.computedWidth\"\n    [style.height]=\"image.computedHeight\"\n    [style.float]=\"'left'\"\n    [style.margin]=\"image.margin\"\n    [style.background]=\"'#eeeeee'\"\n    [style.lineHeight]=\"0\">\n\t<img \n        #imageElem\n        [src]=\"image.preview || image.full\" \n        [style.width.%]=\"100\" \n        [style.height]=\"'auto'\"\n        [style.opacity]=\"0\"\n        (click)=\"clickOnImage(image, i)\"\n        (load)=\"onImageLoaded(imageElem)\" />\n</div>",
                    },] },
        ];
        /** @nocollapse */
        MasonryLayoutComponent.ctorParameters = function () {
            return [
                { type: core.ElementRef }
            ];
        };
        MasonryLayoutComponent.propDecorators = {
            images: [{ type: core.Input, args: ['images',] }],
            ENABLE_MASONRY: [{ type: core.Input, args: ['masonry',] }],
            MAX_HEIGHT: [{ type: core.Input, args: ['max-height',] }],
            CLASS_NAME: [{ type: core.Input, args: ['class-name',] }],
            gutter: [{ type: core.Input, args: ['gutter',] }],
            events: [{ type: core.Output }],
            onWindowResize: [{ type: core.HostListener, args: ['window:resize', ['$event'],] }]
        };
        return MasonryLayoutComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var PinchDirective = (function () {
        function PinchDirective(elementRef) {
            this.elementRef = elementRef;
            this.scale = 1;
            this.initialScale = 1;
            this.moveX = 0;
            this.moveY = 0;
            this.initialMoveX = 0;
            this.initialMoveY = 0;
            this.isNextImageLoaded = true;
            this.events = new core.EventEmitter();
            this.elem = this.elementRef.nativeElement;
        }
        /**
         * @param {?} event
         * @return {?}
         */
        PinchDirective.prototype.touchstartHandler = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                this.elem.style.transformOrigin = '0 0';
            };
        /**
         * @param {?} event
         * @return {?}
         */
        PinchDirective.prototype.touchmoveHandler = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                /** @type {?} */
                var touches = event.touches;
                if (touches.length === 1 && this.scale === 1 && !this.eventType || this.eventType == 'swipe') {
                    event.preventDefault();
                    if (!this.isNextImageLoaded) {
                        return;
                    }
                    if (!this.eventType) {
                        this.startX = event.touches[0].pageX;
                        this.startY = event.touches[0].pageY;
                    }
                    this.eventType = 'swipe';
                    this.moveX = this.initialMoveX + (event.touches[0].pageX - this.startX);
                    this.moveY = 0;
                    this.transformElem(0);
                }
            };
        /**
         * @param {?} event
         * @return {?}
         */
        PinchDirective.prototype.touchendHandler = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                /** @type {?} */
                var touches = event.touches;
                /** @type {?} */
                var img = this.elem.getElementsByTagName("img")[0];
                if (!this.isNextImageLoaded) {
                    return;
                }
                if (this.scale < 1) {
                    this.scale = 1;
                }
                if (this.moveY > 0) {
                    this.moveY = 0;
                }
                if (this.moveX > 100) {
                    this.slide('prev');
                }
                else if (this.moveX < -100) {
                    this.slide('next');
                }
                else {
                    this.moveX = 0;
                }
                this.initialScale = this.scale;
                this.initialMoveX = this.moveX;
                this.initialMoveY = this.moveY;
                this.transformElem(200);
                this.eventType = 'touchend';
                if (touches.length == 0) {
                    this.eventType = '';
                }
            };
        /**
         * @param {?} event
         * @return {?}
         */
        PinchDirective.prototype.slide = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                var _this = this;
                this.onSlide(event);
                if (event === 'prev') {
                    this.moveX = window.innerWidth + 8;
                    if (this.isFirst) {
                        this.moveX = 0;
                    }
                }
                if (event === 'next') {
                    this.moveX = -window.innerWidth - 8;
                    if (this.isLast) {
                        this.moveX = 0;
                    }
                }
                this.isNextImageLoaded = false;
                setTimeout(function () {
                    _this.moveX = 0;
                    _this.initialMoveX = 0;
                    _this.isNextImageLoaded = true;
                }, 200);
            };
        /**
         * @param {?} evenType
         * @return {?}
         */
        PinchDirective.prototype.onSlide = /**
         * @param {?} evenType
         * @return {?}
         */
            function (evenType) {
                this.events.emit(evenType);
            };
        /**
         * @param {?=} duration
         * @return {?}
         */
        PinchDirective.prototype.transformElem = /**
         * @param {?=} duration
         * @return {?}
         */
            function (duration) {
                if (duration === void 0) {
                    duration = 50;
                }
                /** @type {?} */
                var matrixVal = 'matrix(' + Number(this.scale) + ',' + 0 + ',' + 0 + ',' + Number(this.scale) + ',' + Number(this.moveX) + ',' + Number(this.moveY) + ')';
                this.elem.style.transition = 'all ' + duration + 'ms';
                this.elem.style.transform = matrixVal;
                this.elem.style.webkitTransform = matrixVal;
            };
        PinchDirective.decorators = [
            { type: core.Directive, args: [{
                        selector: '[pinch]'
                    },] },
        ];
        /** @nocollapse */
        PinchDirective.ctorParameters = function () {
            return [
                { type: core.ElementRef }
            ];
        };
        PinchDirective.propDecorators = {
            isLast: [{ type: core.Input }],
            isFirst: [{ type: core.Input }],
            events: [{ type: core.Output }],
            touchstartHandler: [{ type: core.HostListener, args: ['touchstart', ['$event'],] }],
            touchmoveHandler: [{ type: core.HostListener, args: ['touchmove', ['$event'],] }],
            touchendHandler: [{ type: core.HostListener, args: ['touchend', ['$event'],] }]
        };
        return PinchDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */
    var CrystalGalleryModule = (function () {
        function CrystalGalleryModule() {
        }
        CrystalGalleryModule.decorators = [
            { type: core.NgModule, args: [{
                        declarations: [
                            LightboxComponent,
                            LightboxMobileComponent,
                            GalleryComponent,
                            MasonryLayoutComponent,
                            PinchDirective
                        ],
                        imports: [
                            common.CommonModule
                        ],
                        exports: [
                            GalleryComponent
                        ],
                        providers: [
                            CrystalLightbox
                        ],
                        bootstrap: [],
                        entryComponents: [
                            LightboxComponent,
                            LightboxMobileComponent
                        ]
                    },] },
        ];
        return CrystalGalleryModule;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
     */

    exports.CrystalLightbox = CrystalLightbox;
    exports.GalleryComponent = GalleryComponent;
    exports.CrystalGalleryModule = CrystalGalleryModule;
    exports.LightboxComponent = LightboxComponent;
    exports.LightboxMobileComponent = LightboxMobileComponent;
    exports.MasonryLayoutComponent = MasonryLayoutComponent;
    exports.ɵa = PinchDirective;

    Object.defineProperty(exports, '__esModule', { value: true });

})));

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNyeXN0YWwtZ2FsbGVyeS51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvbGliL2xpZ2h0Ym94LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvbGlnaHRib3gtbW9iaWxlLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvY29uZmlnLnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9kb20uc2VydmljZS50cyIsIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvZ2FsbGVyeS5jb21wb25lbnQudHMiLCJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvbGliL21hc29ucnktbGF5b3V0LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvcGluY2guZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9nYWxsZXJ5Lm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcbiAgICBDb21wb25lbnQsIFxuICAgIElucHV0LCBcbiAgICBFdmVudEVtaXR0ZXIsIFxuICAgIE9uSW5pdCwgXG4gICAgSG9zdEJpbmRpbmcsIFxuICAgIEhvc3RMaXN0ZW5lciwgXG4gICAgVmlld0NoaWxkLCBcbiAgICBFbGVtZW50UmVmLCBcbiAgICBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NyeXN0YWwtbGlnaHRib3gnLFxuICAgIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNnLWNvdW50ZXJcIiAqbmdJZj1cImNvbmZpZy5jb3VudGVyICYmIGltYWdlcy5sZW5ndGggPiAxXCI+e3tjb3VudGVyfX08L2Rpdj5cbjxkaXYgY2xhc3M9XCJjZy1kZXNjcmlwdGlvblwiICpuZ0lmPVwiZGVzY3JpcHRpb25cIj57e2Rlc2NyaXB0aW9ufX08L2Rpdj5cblxuPGRpdiBcblx0Y2xhc3M9XCJjZy1jbG9zZVwiIFxuXHQoY2xpY2spPVwiY2xvc2VMaWdodGJveCgpXCI+Q2xvc2U8L2Rpdj5cblxuPGRpdiBcblx0Y2xhc3M9XCJjZy1zcGlubmVyXCIgXG5cdCAqbmdJZj1cIiFjdXJySW1hZ2VMb2FkZWRcIj48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImNnLXdyYXBwZXJcIiAjd3JhcHBlcj5cblx0PGltZyBcblx0XHRjbGFzcz1cImNnLWN1cnItaW1hZ2VcIiBcblx0XHQjY3VyckltYWdlRWxlbSBcblx0XHRbc3JjXT1cImN1cnJJbWFnZVBhdGg/LmZ1bGxcIiBcblx0XHRbY2xhc3MuY2ctc2hvd109XCJjdXJySW1hZ2VMb2FkZWRcIiBcblx0XHQobG9hZCk9XCJvbkltYWdlTG9hZGVkKClcIiAvPlxuPC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctcHJldlwiIFxuXHRbaGlkZGVuXT1cImlzRmlyc3QgJiYgIWNvbmZpZy5sb29wXCIgXG5cdChjbGljayk9XCJwcmV2KClcIj48L2Rpdj5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctbmV4dFwiIFxuXHRbaGlkZGVuXT1cImlzTGFzdCAmJiAhY29uZmlnLmxvb3BcIiBcblx0KGNsaWNrKT1cIm5leHQoKVwiPjwvZGl2PmAsXG4gICAgc3R5bGVzOiBbYC5fY2ctc3Bpbm5lciwuX2NnLXNwaW5uZXI6YWZ0ZXJ7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MzZweDtoZWlnaHQ6MzZweH0uX2NnLXNwaW5uZXJ7bWFyZ2luOjAgYXV0bztmb250LXNpemU6MTBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWluZGVudDotOTk5OWVtO2JvcmRlci10b3A6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1yaWdodDo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLWJvdHRvbTo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICNmZmY7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWFuaW1hdGlvbjouOXMgbGluZWFyIGluZmluaXRlIGxvYWQ4O2FuaW1hdGlvbjouOXMgbGluZWFyIGluZmluaXRlIGxvYWQ4fUAtd2Via2l0LWtleWZyYW1lcyBsb2FkOHswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBsb2FkOHswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LmNnLXNwaW5uZXIsLmNnLXNwaW5uZXI6YWZ0ZXIsLmNnLXNwaW5uZXI6YmVmb3Jle2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7LXdlYmtpdC1hbmltYXRpb246MS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSBsb2FkNzthbmltYXRpb246MS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSBsb2FkN30uY2ctc3Bpbm5lcntjb2xvcjojZmZmO2ZvbnQtc2l6ZToxMHB4O21hcmdpbjowIGF1dG8gMjBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWluZGVudDotOTk5OWVtOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4xNnM7YW5pbWF0aW9uLWRlbGF5Oi0uMTZzfS5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9LmNnLXNwaW5uZXI6YmVmb3Jle2xlZnQ6LTNlbTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTotLjMyczthbmltYXRpb24tZGVsYXk6LS4zMnN9LmNnLXNwaW5uZXI6YWZ0ZXJ7bGVmdDozZW19QC13ZWJraXQta2V5ZnJhbWVzIGxvYWQ3ezAlLDEwMCUsODAle2JveC1zaGFkb3c6MCAyLjVlbSAwIC0xLjNlbX00MCV7Ym94LXNoYWRvdzowIDIuNWVtIDAgMH19QGtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMTBweCAwIC0xLjNlbX00MCV7Ym94LXNoYWRvdzowIDEwcHggMCAwfX06aG9zdCguY2ctc2hvdyl7b3BhY2l0eToxfTpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctY2xvc2UsOmhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1uZXh0LDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctcHJldntvcGFjaXR5OjB9Omhvc3R7b3BhY2l0eTowO3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2NvbG9yOiNmZmY7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgY3ViaWMtYmV6aWVyKC42NDUsLjA0NSwuMzU1LDEpO3otaW5kZXg6MTAwMDA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44NSl9Omhvc3QgaW1ne29wYWNpdHk6MTttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCU7Ym94LXNoYWRvdzowIDRweCAxNXB4IDJweCByZ2JhKDAsMCwwLC4zNSl9Omhvc3QgaW1nLmNnLWN1cnItaW1hZ2UuY2ctc2hvd3tvcGFjaXR5OjF9Omhvc3QgaW1nLmNnLWN1cnItaW1hZ2V7b3BhY2l0eTowO3otaW5kZXg6MTB9Omhvc3QgLmNnLXdyYXBwZXIuY2ctaGlkZXtkaXNwbGF5Om5vbmV9Omhvc3QgLmNnLXdyYXBwZXJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX06aG9zdCAuY2ctc3Bpbm5lcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbi10b3A6LTE1cHg7bWFyZ2luLWxlZnQ6LTVweH06aG9zdCAuY2ctY291bnRlcnt0ZXh0LWFsaWduOmxlZnQ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoyMnB4O3RvcDoxM3B4O2ZvbnQtc2l6ZToxNHB4O3RleHQtc2hhZG93OjAgMCAxcHggcmdiYSgwLDAsMCwuNjUpO3otaW5kZXg6MzB9Omhvc3QgLmNnLWRlc2NyaXB0aW9ue3RleHQtYWxpZ246Y2VudGVyO21heC13aWR0aDpjYWxjKDEwMCUgLSAyMDBweCk7bWFyZ2luOjAgYXV0bztmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDo0M3B4O3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6NTB9Omhvc3QgLmNnLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7cGFkZGluZzoxM3B4IDIycHg7Zm9udC1zaXplOjEzcHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6LjU7ei1pbmRleDozMDt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UtaW4tb3V0O3RleHQtc2hhZG93OjAgMCAxcHggcmdiYSgwLDAsMCwuNjUpfTpob3N0IC5jZy1jbG9zZTpob3ZlcntvcGFjaXR5OjF9Omhvc3QgLmNnLW5leHQsOmhvc3QgLmNnLXByZXZ7d2lkdGg6NDAlO2hlaWdodDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6LjU7ei1pbmRleDoyMDt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UtaW4tb3V0Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDApfTpob3N0IC5jZy1uZXh0OmhvdmVyLDpob3N0IC5jZy1wcmV2OmhvdmVye29wYWNpdHk6MX06aG9zdCAuY2ctcHJldntsZWZ0OjA7YmFja2dyb3VuZDp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFpQ0FZQUFBQmJYeW1BQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5WnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRjZ0tGZHBibVJ2ZDNNcElpQjRiWEJOVFRwSmJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09qTXpNVFpDUXpGRVJEZ3pNVEV4UlRjNVFVWXhRVFV4UkRJNU1rTTVPRFpDSWlCNGJYQk5UVHBFYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2pNek1UWkNRekZGUkRnek1URXhSVGM1UVVZeFFUVXhSREk1TWtNNU9EWkNJajRnUEhodGNFMU5Pa1JsY21sMlpXUkdjbTl0SUhOMFVtVm1PbWx1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TXpNeE5rSkRNVUpFT0RNeE1URkZOemxCUmpGQk5URkVNamt5UXprNE5rSWlJSE4wVW1WbU9tUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNek14TmtKRE1VTkVPRE14TVRGRk56bEJSakZCTlRGRU1qa3lRems0TmtJaUx6NGdQQzl5WkdZNlJHVnpZM0pwY0hScGIyNCtJRHd2Y21SbU9sSkVSajRnUEM5NE9uaHRjRzFsZEdFK0lEdy9lSEJoWTJ0bGRDQmxibVE5SW5JaVB6N1Zyd1pLQUFBQ2xFbEVRVlI0MnF6V1NZOFNRUmdHWUxvVkhQZVRYbHdDaUl3TUFySkd0aUFCTmVwNElHWmk0b0VmTUpvb0xqZVBybkZHZjV5SlMwaFltcTJiL2FCeGlRNitsUlJKZGFVWnE1dnA1RTJUTG5pb1ZGZDlWWkxOK2lVeElkZU1pVzJmUlZDbXZ6MkRwSkJWQ2s2WDZTVkJIUVJMcFZLYjdYYjc4MmcwVXNybDhqTThXMFAyMCs5WVFuM0paUElod042TVhvUEJvSTNuRzhpS0daaEYxNEErQXFyT21LdFdxMzFGMjEza2tPZ1E2OUIwT2wwQnFyRm90OXZWL0g3L2M3UmZFb1ZaMUcrRWRqcWR2dGZyZlluMks4Z0prYUhRb2Rsc3RqSWVqL3NzaWhkSDBEZG92NGFjUW83UWx5Y0pvNVBKaEVjMWo4ZnptcUprMmgxRDdMdjFsa1V2NW5LNXh6emFhcldNVUljd21zL25DVHJnVWJmYlRkQ3JWdEFBUWFmVHFRNVZGRVZkQ2kwVUNrL1EweUdMTnB0TjFlbDB2cUxvYVJIVXhxUG9LWS8yS0ZvMGcwcjBiYTRXaThXblFFY3MybWcwVkFQVUxySnNaVHFwTnpEWjZ5eGFyOWRWbDh0RlZ0UjEwU25Gb2hKZGduWll1aDlJa2pTVFpma25QbjVEdmlPL2tML0lqa2d0SU9oaEpKN0paRjVnZFUyNGhkREc2cXFnL1FKeXdFemxtZy9GU1RMaEU0bkU5bkE0bkhKRlJ2SDVmSnRvOTRnT0JmdnlqdEp4WEkvSDR4K0E2M3JlNi9VVVZEQ0NuemVEejZmYmNlUXNjanNXaTcwM3dGc003aERCSlFOOFBScU5ibU5uME9HYXB1MEpmb3ZpWXg0UEJBTDMwZTVkQ2crSHcwWjRlOC93ZnIvUDQ1MVFLUFJnYVJ6SUZqRGRrc2Vmc2JqZEtuNXpFUjZKUk1pd3VQKzNOZTJLQjRQQkxWVlZSMXhkK1lLMk8yYk9GWXZ3ZDhDSGJLL3gvSjZaYzhVaS9BWm14ZHRxdGRyQXdsRkxwUkxaclMvUFljbmtFVXVpWTdoQ1MrZzVzb3ZUNTUrUWo3UVMvallEOHpqcC9VRjZ0OUdTK29QZWQ4ekNMQzV6SjB0U28vL1ErOHdLTEhUdy9pZkFBTVFWUzR2SFpSMlZBQUFBQUVsRlRrU3VRbUNDKSBjZW50ZXIgbGVmdCAyMnB4IG5vLXJlcGVhdH06aG9zdCAuY2ctbmV4dHtyaWdodDowO2JhY2tncm91bmQ6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBaUNBWUFBQUJiWHltQUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UY2dLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPakV5TkRFM01ERTFSRGd6TVRFeFJUYzVOak00UVRJelF6STJSamMyUWpnMklpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qRXlOREUzTURFMlJEZ3pNVEV4UlRjNU5qTTRRVEl6UXpJMlJqYzJRamcySWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1USTBNVGN3TVRORU9ETXhNVEZGTnprMk16aEJNak5ETWpaR056WkNPRFlpSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TVRJME1UY3dNVFJFT0RNeE1URkZOemsyTXpoQk1qTkRNalpHTnpaQ09EWWlMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejd6djVCS0FBQUNsMGxFUVZSNDJyVFcyMjRTUVJ3R2NIWmI4RlQxU204OEJKQ2lGQUU1SnB5Q0JOUkU4Y29ZRXk5NEFHcWk5WERYUzArSlZoL0NCL0VoaUZFVDVMakFjbGdXamFhMWFhemZKRE02dTZMdUxqckpsMjEyNGNkMGR1WS9JOWgrTm9FTGFidGNUTGNGQ29uMGJ3K1NSRTRoMjhobjJ4eU5vSXZJU3JsY2ZxQW9TbHVTcExlcFZLcUNlNmNSQi8yTVlBWGVpMXdmalViU0xtMzRnWDR5bWJ5Tit6NnJPQm1DL2NpTmVyMytmcGRyd0dYZ2Q4aC9Zd1ZuOERtLzM3L2U2L1VHT255UVRxZlhyT0JzS0k0ZzU3MWU3Nk51dHp2OERlNDNnd3YwNVMwaHg1Q0x3Si9pQldyd3lXUXl6R2F6cG5IeUlUdHlDRGxCY0kvSDh3UzRabGhVVmJXTU8vUjRwOVA1QmMvbGNuZngvT3c4K0FXMzJ6MExIK1h6K1grRHQ5dHRtY2VuMHluREExYng0d1IzT3AyUFc2MldyT3Y1dUZBbzNKc1hMMUs4cit2NUxOeG1acmI4d0p2TnBuNVlsR0t4ZUovV0ZydVpCY1JQeFVzdWwydTkwV2hvY0N5cUJxazNkTEdKaXdiZ2IvVDZGZmxDU3Frb2lsdUNJR2pxTkd6V2dRVXo5WVI4YVE5eUJxdHlEUXRIMHExS05aUEpQTVR6T0hLQTRvYUh3dVB6K1Nvb1VtMGVIWS9IMDBRaXNVRVdGSEtVRFlWUmRCbVZyOUx2OS9Xb0dvL0hYK0o1aVk3L1FTTXZqMDAzaG5iMGFDd1dlNEhuVjVHVHlHRWowMDJERGdZRERZcWRSbzFHb3h1MHAzcFUrQnZxRFFRQ3F6UFFDVVd2eklOS2VqUWNEbHRIUTZIUUxhQmRIaDBPaDVaUk8wT0JhRkQ4aUlMN3o4MmliR3R5UnlLUjFUK2dsODJnL0daNkRldi9IWS9Lc3F3RWcwRkxLTC85MytSN0MzUU05Tms4S0R0aU9XcTEyamIyczJYUzAxS3A5S3BhcmI3Ry9UZklSMlFUMlRGNlVCUzQyYkJFaS9VSy9TSUJQeUNma0MwektBK3o2cldQWG0zMHRMbEpyNlpRL1ptWURZbkkxZUVkZWpWOVRoYisxOEg3dXdBREFPRy9XY200eCtrbkFBQUFBRWxGVGtTdVFtQ0MpIGNlbnRlciByaWdodCAyMnB4IG5vLXJlcGVhdH1gXVxufSlcbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbXBvbmVudCB7XG4gICAgX2luZGV4OiBhbnk7XG4gICAgcHJldkluZGV4OiBhbnk7XG4gICAgY3VyckltYWdlTG9hZGVkOiBhbnk7IFxuICAgIHByZXZJbWFnZUhpZGU6IGFueTtcbiAgICB3cmFwcGVyUHJvcDogYW55O1xuICAgIF9kYXRhOiBhbnk7XG4gICAgY3VycmVudEltYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gICAgc3Bpbm5lckhlaWdodDogbnVtYmVyID0gMzA7XG4gICAgZGVzY3JpcHRpb25IZWlnaHQ6IG51bWJlciA9IDQzO1xuXG4gICAgQElucHV0KCkgZGF0YTogYW55O1xuXG4gICAgY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNnLXNob3cnKSBzaG93TGlnaHRib3g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNnLWhpZGUtY29udHJvbHMnKSBoaWRlQ29udHJvbHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRyYW5zaXRpb24nKSBob3N0U3R5bGVUcmFuc2l0aW9uOiBzdHJpbmc7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5iYWNrZ3JvdW5kQ29sb3InKSBob3N0U3R5bGVCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ2N1cnJJbWFnZUVsZW0nKSBjdXJySW1hZ2VFbGVtOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3ByZXZJbWFnZUVsZW0nKSBwcmV2SW1hZ2VFbGVtOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3dyYXBwZXInKSB3cmFwcGVyRWxlbTogRWxlbWVudFJlZjtcblxuICAgIGdldCBpbWFnZXMoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5pbWFnZXM7XG4gICAgfVxuXG4gICAgZ2V0IGNvbmZpZygpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvbmZpZztcbiAgICB9XG5cbiAgICBnZXQgaW5kZXgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEltYWdlSW5kZXg7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJJbWFnZVBhdGgoKXtcbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5pbmRleF07XG5cbiAgICAgICAgaWYgKCFpbWFnZSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBpbWFnZS5mdWxsID0gaW1hZ2UucGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG5cbiAgICBnZXQgcHJldkltYWdlUGF0aCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbdGhpcy5wcmV2SW5kZXhdO1xuICAgIH1cblxuICAgIHNldCBwcmV2SW1hZ2VQYXRoKHZhbHVlOiBhbnkpe1xuICAgICAgICB0aGlzLmltYWdlc1t0aGlzLnByZXZJbmRleF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNGaXJzdCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDtcbiAgICB9XG5cbiAgICBnZXQgaXNMYXN0KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAodGhpcy5pbWFnZXMubGVuZ3RoLTEpO1xuICAgIH1cblxuICAgIGdldCBsYXRlc3RJbWFnZUluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGdldCBkZXNjcmlwdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbdGhpcy5pbmRleF0uZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgZ2V0IGNvdW50ZXIoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEltYWdlSW5kZXggKyAxICsnLycrIHRoaXMuaW1hZ2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgb25LZXlEb3duKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgc3dpdGNoKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICB0aGlzLnByZXYoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTGlnaHRib3goKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIFsnJGV2ZW50J10pXG4gICAgb25Nb3VzZUVudGVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5oaWRlQ29udHJvbHMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZil7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKXtcbiAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kT3BhY2l0eSh0aGlzLmNvbmZpZy5iYWNrZ3JvdW5kT3BhY2l0eSk7XG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXggPSB0aGlzLmNvbmZpZy5pbmRleDtcbiAgICAgICAgLy9kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dMaWdodGJveCA9IHRydWU7XG4gICAgICAgIH0sIDMwKTtcblxuICAgICAgICB0aGlzLnNldE1heERpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zZXRBbmltYXRpb25EdXJhdGlvbigpO1xuICAgIH1cblxuICAgIGNsb3NlTGlnaHRib3goKXtcbiAgICAgICAgdGhpcy5zaG93TGlnaHRib3ggPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCgnY2xvc2UnKTtcbiAgICAgICAgICAgLy9kb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgICAgIH0sIHRoaXMuY29uZmlnLmFuaW1hdGlvbkR1cmF0aW9uKTsgXG4gICAgfVxuXG4gICAgbmV4dCgpe1xuICAgICAgICBpZiAodGhpcy5pc0xhc3Qpe1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkZWQgPSAnbG9hZGluZyc7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJySW1hZ2VMb2FkZWQgPT09ICdsb2FkaW5nJyl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgNTApO1xuXG4gICAgICAgIHRoaXMuc2V0TWF4RGltZW5zaW9ucygpO1xuICAgIH1cbiAgICBwcmV2KCl7XG4gICAgICAgIGlmICh0aGlzLmlzRmlyc3Qpe1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXggPSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyckltYWdlTG9hZGVkID09PSAnbG9hZGluZycpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDUwKTtcblxuICAgICAgICB0aGlzLnNldE1heERpbWVuc2lvbnMoKTtcbiAgICB9XG5cbiAgICBvbkltYWdlTG9hZGVkKCl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHNldEJhY2tncm91bmRPcGFjaXR5KG9wYWNpdHk6IGFueSl7XG4gICAgICAgIHRoaXMuaG9zdFN0eWxlQmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMCwgMCwgMCwgJytvcGFjaXR5KycpJztcbiAgICB9XG5cbiAgICBzZXRNYXhEaW1lbnNpb25zKCl7XG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKXtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlckVsZW0ubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnY2FsYygxMDAlIC0gJyArICh0aGlzLmRlc2NyaXB0aW9uSGVpZ2h0ICogMikgKyAncHgpJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlckVsZW0ubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VyckltYWdlRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLm1heEhlaWdodCA9ICdjYWxjKCcgKyB0aGlzLmNvbmZpZy5saWdodGJveE1heEhlaWdodCArICcpJztcbiAgICAgICAgdGhpcy5jdXJySW1hZ2VFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSB0aGlzLmNvbmZpZy5saWdodGJveE1heFdpZHRoO1xuICAgIH1cblxuICAgIHNldEFuaW1hdGlvbkR1cmF0aW9uKCl7XG4gICAgICAgIHRoaXMuaG9zdFN0eWxlVHJhbnNpdGlvbiA9ICdvcGFjaXR5ICcrdGhpcy5jb25maWcuYW5pbWF0aW9uRHVyYXRpb24rJ21zJztcbiAgICB9XG59IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY3J5c3RhbC1saWdodGJveC1tb2JpbGUnLFxuXHR0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjZy1iYWNrXCIgKGNsaWNrKT1cImNsb3NlTGlnaHRib3goKVwiPjwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLXdyYXBwZXJcIiBcblx0W2NsYXNzLmNnLWxhbmRzY2FwZV09XCJsYW5kc2NhcGVNb2RlXCJcblx0cGluY2ggW2lzTGFzdF09XCJpc0xhc3RcIiBbaXNGaXJzdF09XCJpc0ZpcnN0XCIgKGV2ZW50cyk9XCJoYW5kbGVQaW5jaEV2ZW50cygkZXZlbnQpXCJcblx0I3dyYXBwZXI+XG5cdDxkaXYgY2xhc3M9XCJjZy1pbWFnZS13cmFwIGNnLXByZXYtaW1hZ2VcIj5cblx0XHQ8aW1nIFxuXHRcdFx0Km5nSWY9XCJwcmV2SW1hZ2VQYXRoXCJcblx0XHRcdFtzcmNdPVwicHJldkltYWdlUGF0aC5mdWxsXCIgXG5cdFx0XHRbY2xhc3MuY2ctaGlkZV09XCIhcHJldkltYWdlLmxvYWRlZFwiXG5cdFx0XHQobG9hZCk9XCJvbkltYWdlTG9hZGVkKCdwcmV2SW1hZ2UnKVwiXG5cdFx0Lz5cblx0XHQ8ZGl2IGNsYXNzPVwiY2ctc3Bpbm5lclwiICpuZ0lmPVwiIXByZXZJbWFnZS5sb2FkZWQgJiYgcHJldkltYWdlUGF0aFwiPjwvZGl2PlxuXHQ8L2Rpdj5cblxuXHQ8ZGl2IGNsYXNzPVwiY2ctaW1hZ2Utd3JhcCBjZy1jdXJyLWltYWdlXCIgKm5nSWY9XCJjdXJySW1hZ2Uuc2hvd1wiPlxuXHRcdDxpbWcgXG5cdFx0XHRbc3JjXT1cImN1cnJJbWFnZVBhdGg/LmZ1bGxcIiBcblx0XHRcdFtjbGFzcy5jZy1oaWRlXT1cIiFjdXJySW1hZ2UubG9hZGVkXCIgXG5cdFx0XHQobG9hZCk9XCJvbkltYWdlTG9hZGVkKCdjdXJySW1hZ2UnKVwiXG5cdFx0Lz5cblx0XHQ8ZGl2IGNsYXNzPVwiY2ctc3Bpbm5lclwiICpuZ0lmPVwiIWN1cnJJbWFnZS5sb2FkZWRcIj48L2Rpdj5cblx0PC9kaXY+XG5cdFxuXHQ8ZGl2IGNsYXNzPVwiY2ctaW1hZ2Utd3JhcCBjZy1uZXh0LWltYWdlXCI+XG5cdFx0PGltZyBcblx0XHRcdCpuZ0lmPVwibmV4dEltYWdlUGF0aFwiXG5cdFx0XHRbc3JjXT1cIm5leHRJbWFnZVBhdGguZnVsbFwiIFxuXHRcdFx0W2NsYXNzLmNnLWhpZGVdPVwiIW5leHRJbWFnZS5sb2FkZWRcIiBcblx0XHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoJ25leHRJbWFnZScpXCJcblx0XHQvPlxuXHRcdDxkaXYgY2xhc3M9XCJjZy1zcGlubmVyXCIgKm5nSWY9XCIhbmV4dEltYWdlLmxvYWRlZCAmJiBuZXh0SW1hZ2VQYXRoXCI+PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+YCxcbiAgICBzdHlsZXM6IFtgLl9jZy1zcGlubmVyLC5fY2ctc3Bpbm5lcjphZnRlcntib3JkZXItcmFkaXVzOjUwJTt3aWR0aDozNnB4O2hlaWdodDozNnB4fS5fY2ctc3Bpbm5lcnttYXJnaW46MCBhdXRvO2ZvbnQtc2l6ZToxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtaW5kZW50Oi05OTk5ZW07Ym9yZGVyLXRvcDo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItYm90dG9tOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItbGVmdDo0cHggc29saWQgI2ZmZjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uOi45cyBsaW5lYXIgaW5maW5pdGUgbG9hZDg7YW5pbWF0aW9uOi45cyBsaW5lYXIgaW5maW5pdGUgbG9hZDh9QC13ZWJraXQta2V5ZnJhbWVzIGxvYWQ4ezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGxvYWQ4ezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0uY2ctc3Bpbm5lciwuY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDstd2Via2l0LWFuaW1hdGlvbjoxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlIGxvYWQ3O2FuaW1hdGlvbjoxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlIGxvYWQ3fS5jZy1zcGlubmVye2NvbG9yOiNmZmY7Zm9udC1zaXplOjEwcHg7bWFyZ2luOjAgYXV0byAyMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtaW5kZW50Oi05OTk5ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTotLjE2czthbmltYXRpb24tZGVsYXk6LS4xNnN9LmNnLXNwaW5uZXI6YWZ0ZXIsLmNnLXNwaW5uZXI6YmVmb3Jle2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MH0uY2ctc3Bpbm5lcjpiZWZvcmV7bGVmdDotM2VtOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMzJzO2FuaW1hdGlvbi1kZWxheTotLjMyc30uY2ctc3Bpbm5lcjphZnRlcntsZWZ0OjNlbX1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDIuNWVtIDAgLTEuM2VtfTQwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAwfX1Aa2V5ZnJhbWVzIGxvYWQ3ezAlLDEwMCUsODAle2JveC1zaGFkb3c6MCAxMHB4IDAgLTEuM2VtfTQwJXtib3gtc2hhZG93OjAgMTBweCAwIDB9fTpob3N0KC5jZy1zaG93KXtvcGFjaXR5OjF9Omhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1jbG9zZSw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLW5leHQsOmhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1wcmV2e29wYWNpdHk6MH06aG9zdHtvcGFjaXR5OjA7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Y29sb3I6I2ZmZjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycyBjdWJpYy1iZXppZXIoLjY0NSwuMDQ1LC4zNTUsMSk7ei1pbmRleDoxMDAwMDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Omhvc3QgLmNnLWJhY2t7YmFja2dyb3VuZDp1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb24lM0QlMjIxLjAlMjIgZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUzRiUzRSUzQ3N2ZyB3aWR0aCUzRCUyMjEwcHglMjIgaGVpZ2h0JTNEJTIyMTZweCUyMiB2aWV3Qm94JTNEJTIyMCAwIDEwIDE2JTIyIHZlcnNpb24lM0QlMjIxLjElMjIgeG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIgeG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhsaW5rJTIyJTNFICAgICUzQyEtLSBHZW5lcmF0b3IlM0Egc2tldGNodG9vbCA0MC4yICgzMzgyNikgLSBodHRwJTNBJTJGJTJGd3d3LmJvaGVtaWFuY29kaW5nLmNvbSUyRnNrZXRjaCAtLSUzRSAgICAlM0N0aXRsZSUzRTExQTczODcyLTVFQkYtNDZGNi1CN0M1LTE0MkQ0N0EzMzMzOSUzQyUyRnRpdGxlJTNFICAgICUzQ2Rlc2MlM0VDcmVhdGVkIHdpdGggc2tldGNodG9vbC4lM0MlMkZkZXNjJTNFICAgICUzQ2RlZnMlM0UlM0MlMkZkZWZzJTNFICAgICUzQ2cgaWQlM0QlMjJJbnRlcmZhY2UtMTI4MC14LTgwMCUyMiBzdHJva2UlM0QlMjJub25lJTIyIHN0cm9rZS13aWR0aCUzRCUyMjElMjIgZmlsbCUzRCUyMm5vbmUlMjIgZmlsbC1ydWxlJTNEJTIyZXZlbm9kZCUyMiUzRSAgICAgICAgJTNDZyBpZCUzRCUyMkxvdF92aWV3cGFnZV9vcGVuJTIyIHRyYW5zZm9ybSUzRCUyMnRyYW5zbGF0ZSgtMTExLjAwMDAwMCUyQyAtMjk2LjAwMDAwMCklMjIgZmlsbCUzRCUyMiUyM0ZGRkZGRiUyMiUzRSAgICAgICAgICAgICUzQ2cgaWQlM0QlMjJhcnJvd3MtMTZweC0xX21pbmltYWwtbGVmdCUyMiB0cmFuc2Zvcm0lM0QlMjJ0cmFuc2xhdGUoMTExLjAwMDAwMCUyQyAyOTYuMDAwMDAwKSUyMiUzRSAgICAgICAgICAgICAgICAlM0Nwb2x5Z29uIGlkJTNEJTIyU2hhcGUlMjIgcG9pbnRzJTNEJTIyOC4xIDE1LjcgMC40IDggOC4xIDAuMyA5LjYgMS43IDMuMyA4IDkuNiAxNC4zJTIyJTNFJTNDJTJGcG9seWdvbiUzRSAgICAgICAgICAgICUzQyUyRmclM0UgICAgICAgICUzQyUyRmclM0UgICAgJTNDJTJGZyUzRSUzQyUyRnN2ZyUzRVwiKSBjZW50ZXIvMTJweCBuby1yZXBlYXQ7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtvcGFjaXR5Oi45O3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt6LWluZGV4OjEwMDB9Omhvc3QgLmNnLXdyYXBwZXIuY2ctbGFuZHNjYXBlIC5jZy1pbWFnZS13cmFwIGltZ3toZWlnaHQ6MTAwJX06aG9zdCAuY2ctd3JhcHBlcnt0cmFuc2l0aW9uOm5vbmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtkaXNwbGF5OmJsb2NrfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwLmNnLXByZXYtaW1hZ2V7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoY2FsYygtMTAwJSAtIDhweCksMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoY2FsYygtMTAwJSAtIDhweCksMCwwKX06aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcC5jZy1uZXh0LWltYWdley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoMTAwJSArIDhweCksMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoY2FsYygxMDAlICsgOHB4KSwwLDApfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwe3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dGV4dC1hbGlnbjpjZW50ZXI7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwIGltZ3ttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCU7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bztwb3NpdGlvbjpyZWxhdGl2ZX06aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcCBpbWcuY2ctaGlkZXtkaXNwbGF5Om5vbmV9YF1cbn0pXG5leHBvcnQgY2xhc3MgTGlnaHRib3hNb2JpbGVDb21wb25lbnQgeyBcblx0X2luZGV4OiBhbnk7XG4gICAgcHJldkluZGV4OiBhbnk7XG4gICAgbmV4dEluZGV4OiBhbnk7XG5cbiAgICBjdXJySW1hZ2UgPSB7XG4gICAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBpbmRleDogMFxuICAgIH07IFxuXG4gICAgcHJldkltYWdlID0ge1xuICAgICAgICBsb2FkZWQ6IGZhbHNlXG4gICAgfTsgXG5cbiAgICBuZXh0SW1hZ2UgPSB7XG4gICAgICAgIGxvYWRlZDogZmFsc2VcbiAgICB9OyBcblxuICAgIHdyYXBwZXJQcm9wOiBhbnk7XG4gICAgbGFuZHNjYXBlTW9kZTogYW55O1xuXG5cdGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQElucHV0KCkgZGF0YTogYW55O1xuXG4gICAgQFZpZXdDaGlsZCgnd3JhcHBlcicpIHdyYXBwZXJFbDogRWxlbWVudFJlZjtcblxuICAgIGdldCBpbWFnZXMoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5pbWFnZXM7XG4gICAgfVxuXG4gICAgZ2V0IGNvbmZpZygpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvbmZpZztcbiAgICB9XG5cbiAgICBnZXQgaW5kZXgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyckltYWdlLmluZGV4O1xuICAgIH1cblxuICAgIGdldCBjdXJySW1hZ2VQYXRoKCl7XG4gICAgICAgIGxldCBpbWFnZSA9IHRoaXMuaW1hZ2VzW3RoaXMuaW5kZXhdO1xuXG4gICAgICAgIGlmICghaW1hZ2Upe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgaW1hZ2UuZnVsbCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG5cbiAgICBnZXQgcHJldkltYWdlUGF0aCgpe1xuICAgICAgICBpZiAodGhpcy5wcmV2SW5kZXggPCAwICYmIHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLnByZXZJbmRleF07XG5cbiAgICAgICAgaWYgKGltYWdlICYmIGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgaW1hZ2UuZnVsbCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBuZXh0SW1hZ2VQYXRoKCl7XG4gICAgICAgIGxldCBpbWFnZSA9IHRoaXMuaW1hZ2VzW3RoaXMubmV4dEluZGV4XTtcblxuICAgICAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBpbWFnZS5mdWxsID0gaW1hZ2UucGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IGlzRmlyc3QoKXtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgIFx0ICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFzdCgpe1xuICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9ICAgICAgICBcbiAgICB9XG5cbiAgICBnZXQgbGF0ZXN0SW1hZ2VJbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBnZXQgaXNMYW5kc2NhcGUoKXtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoID4gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuY2ctc2hvdycpIGxpZ2h0Ym94U2hvd246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICAgIG9uV2luZG93UmVzaXplKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5sYW5kc2NhcGVNb2RlID0gdGhpcy5pc0xhbmRzY2FwZTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKXtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpe1xuICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleCA9IHRoaXMuY29uZmlnLmluZGV4O1xuICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMuY3VyckltYWdlLmluZGV4LTE7XG4gICAgICAgIHRoaXMubmV4dEluZGV4ID0gdGhpcy5jdXJySW1hZ2UuaW5kZXgrMTtcblxuICAgICAgICB0aGlzLnNob3dMaWdodGJveCgpO1xuICAgIH1cblxuICAgIHNob3dMaWdodGJveCgpe1xuICAgICAgICB0aGlzLmN1cnJJbWFnZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgIHRoaXMubGlnaHRib3hTaG93biA9IHRydWU7XG4gICAgICAgIH0sIDMwKTtcbiAgICB9XG5cblx0Y2xvc2VMaWdodGJveCgpe1xuXHRcdHRoaXMubGlnaHRib3hTaG93biA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5jbG9zZS5lbWl0KHRydWUpO1xuICAgICAgICB9LCAyMDApOyBcblx0fVxuXG4gICAgc2xpZGUoZXZlbnQ6IGFueSl7XG4gICAgICAgIGlmIChldmVudCA9PT0gJ25leHQnKXtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXN0KXtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleCsrO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdGhpcy5sYXRlc3RJbWFnZUluZGV4KXtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyU2xpZGUoJ25leHQnKTtcbiAgICAgICAgICAgIH0sIDMwMCk7IFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50ID09PSAncHJldicpe1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZpcnN0KXtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleC0tO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gMCl7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyU2xpZGUoJ3ByZXYnKTtcbiAgICAgICAgICAgIH0sIDMwMCk7IFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWZ0ZXJTbGlkZShldmVudFR5cGU6IGFueSl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlLnNob3cgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHRoaXMubGF0ZXN0SW1hZ2VJbmRleCAmJiB0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHRoaXMubmV4dEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmV4dEluZGV4ID0gdGhpcy5pbmRleCsxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IDAgJiYgdGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5pbmRleC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ3ByZXYnKXtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZJbWFnZS5sb2FkZWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkltYWdlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJJbWFnZS5sb2FkZWQpe1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dEltYWdlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ25leHQnKXtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLm5leHRJbWFnZS5sb2FkZWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dEltYWdlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJJbWFnZS5sb2FkZWQpe1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkltYWdlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0V3JhcHBlclBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkltYWdlTG9hZGVkKGVsZW06IGFueSl7XG4gICAgICAgIHRoaXNbZWxlbV0ubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGhhbmRsZVBpbmNoRXZlbnRzKCRldmVudCl7XG4gICAgICAgIGlmICgkZXZlbnQgPT09ICdwcmV2Jyl7XG4gICAgICAgICAgICB0aGlzLnNsaWRlKCdwcmV2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRldmVudCA9PT0gJ25leHQnKXtcbiAgICAgICAgICAgIHRoaXMuc2xpZGUoJ25leHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlZmF1bHRXcmFwcGVyUG9zaXRpb24oKXtcbiAgICAgICAgbGV0IGVsZW0gPSB0aGlzLndyYXBwZXJFbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBlbGVtLnN0eWxlLnRyYW5zaXRpb24gPSAnYWxsIDBtcyc7XG4gICAgICAgIGVsZW0uc3R5bGUudHJhbnNmb3JtID0gJ21hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSc7XG4gICAgICAgIGVsZW0uc3R5bGUud2Via2l0VHJhbnNmb3JtID0gJ21hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSc7XG4gICAgfVxufSIsImV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuXHRtYXNvbnJ5OiB0cnVlLFxuXHRtYXNvbnJ5TWF4SGVpZ2h0OiAyMDAsXG5cdG1hc29ucnlHdXR0ZXI6IDQsXG5cdGxvb3A6IGZhbHNlLFxuXHRpbmRleDogMCxcblx0YmFja2dyb3VuZE9wYWNpdHk6IDAuODUsXG5cdGNvdW50ZXI6IGZhbHNlLFxuXHRsaWdodGJveE1heEhlaWdodDogXCIxMDAlXCIsXG5cdGxpZ2h0Ym94TWF4V2lkdGg6IFwiMTAwJVwiLFxuXHRhbmltYXRpb25EdXJhdGlvbjogMTAwXG59IiwiaW1wb3J0IHtcbiAgICBJbmplY3RhYmxlLFxuICAgIEluamVjdG9yLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ29tcG9uZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBMaWdodGJveENvbXBvbmVudCB9IGZyb20gJy4vbGlnaHRib3guY29tcG9uZW50JztcbmltcG9ydCB7IExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IGRlZmF1bHRDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRDb21wb25lbnQge1xuICBkYXRhOiBhbnk7XG4gIGNsb3NlOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDcnlzdGFsTGlnaHRib3gge1xuXG4gICAgZ2V0IGlzTW9iaWxlKCkge1xuICAgICAgICB2YXIgY2hlY2sgPSBmYWxzZTtcbiAgICAgICAgKGZ1bmN0aW9uKGEpe2lmKC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KGEpfHwvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaS50ZXN0KGEuc3Vic3RyKDAsNCkpKSBjaGVjayA9IHRydWU7fSkobmF2aWdhdG9yLnVzZXJBZ2VudHx8bmF2aWdhdG9yLnZlbmRvcik7XG4gICAgICAgIHJldHVybiBjaGVjaztcbiAgICB9O1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG5cdFx0cHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuXHRcdHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG5cdCkgeyB9XG4gXG5cdGFwcGVuZENvbXBvbmVudFRvQm9keShjb21wb25lbnQ6IGFueSwgZGF0YTogYW55KSB7XHRcdFxuXHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG5cdFx0XHQucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KVxuXHRcdFx0LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcblxuXHRcdCg8QWRDb21wb25lbnQ+Y29tcG9uZW50UmVmLmluc3RhbmNlKS5kYXRhID0gZGF0YTtcblx0XHR0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG5cdFx0Y29uc3QgZG9tRWxlbSA9IChjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvbUVsZW0pO1xuXHRcdFxuICAgICAgICAoPEFkQ29tcG9uZW50PmNvbXBvbmVudFJlZi5pbnN0YW5jZSkuY2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcblx0XHRcdHRoaXMuYXBwUmVmLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblx0XHRcdGNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuXHR9XG5cblx0b3BlbihpbWFnZXM6IGFueSwgY29uZmlnOiBhbnkgPSB7fSl7XG5cdFx0Y29uZmlnID0gdGhpcy5hcHBseUNvbmZpZ0RlZmF1bHRzKGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG5cdFx0bGV0IGRhdGEgPSB7XG5cdFx0XHRpbWFnZXMsIFxuXHRcdFx0Y29uZmlnXG5cdFx0fTtcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMuZ2V0TGlnaHRib3hDb21wb25lbnQoKTtcbiAgICAgICAgXG5cdFx0dGhpcy5hcHBlbmRDb21wb25lbnRUb0JvZHkoY29tcG9uZW50LCBkYXRhKTtcblx0fVxuXG5cdGdldExpZ2h0Ym94Q29tcG9uZW50KCl7XG5cdFx0cmV0dXJuICF0aGlzLmlzTW9iaWxlID8gTGlnaHRib3hDb21wb25lbnQgOiBMaWdodGJveE1vYmlsZUNvbXBvbmVudDtcblx0fVxuXG5cdGFwcGx5Q29uZmlnRGVmYXVsdHMoZGVmYXVsdENvbmZpZywgY29uZmlnKXtcblx0XHRpZiAoIWNvbmZpZy5pbmRleCl7IFxuXHRcdFx0Y29uZmlnLmluZGV4ID0gMDtcblx0XHR9XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdENvbmZpZywgY29uZmlnKTtcblx0fVxufSIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgRWxlbWVudFJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcnlzdGFsTGlnaHRib3ggfSBmcm9tJy4vZG9tLnNlcnZpY2UnXG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2NyeXN0YWwtZ2FsbGVyeScsIFxuXHR0ZW1wbGF0ZTogYDxkaXYgI2NvbnRlbnRXcmFwcGVyIFtoaWRkZW5dPVwiaXNOZ0NvbnRlbnRcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cblxuPG1hc29ucnktbGF5b3V0IFxuICAgIGNsYXNzPVwiY2ctd3JhcHBlclwiXG4gICAgKm5nSWY9XCIhaXNOZ0NvbnRlbnRcIiBcblxuICAgIFttYXgtaGVpZ2h0XT1cIm1hc29ucnlNYXhIZWlnaHRcIiBcbiAgICBbZ3V0dGVyXT1cIm1hc29ucnlHdXR0ZXJcIlxuICAgIFttYXNvbnJ5XT1cIm1hc29ucnlTdGF0ZVwiXG4gICAgW2NsYXNzLW5hbWVdPVwiJ2NnLWltYWdlJ1wiXG4gICAgW2ltYWdlc109XCJpbWFnZXNcIlxuICAgIChldmVudHMpPVwiaGFuZGxlTWFzb25yeUxheW91dEV2ZW50cygkZXZlbnQpXCI+PC9tYXNvbnJ5LWxheW91dD5gLFxuICAgIHN0eWxlczogW2A6aG9zdHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9Omhvc3QgLmNnLXdyYXBwZXJ7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbn06aG9zdCAuY2ctd3JhcHBlci5jZy1zaG93e2hlaWdodDphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6dGFibGV9Omhvc3QgLmNnLWltYWdlIGltZ3tjdXJzb3I6cG9pbnRlcjt3aWR0aDoxMDAlfWBdLFxufSlcbmV4cG9ydCBjbGFzcyBHYWxsZXJ5Q29tcG9uZW50IHtcblxuICAgIEBJbnB1dCgnaW1hZ2VzJykgaW1hZ2VzOiBhbnk7XG4gICAgQElucHV0KCdjb25maWcnKSBjb25maWc6IGFueSA9IHt9O1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGVudFdyYXBwZXInKSBjb250ZW50V3JhcHBlcjogRWxlbWVudFJlZjtcblxuICAgIGdldCBpc05nQ29udGVudCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZ2V0IG1hc29ucnlTdGF0ZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWFzb25yeTtcbiAgICB9XG5cbiAgICBnZXQgbWFzb25yeU1heEhlaWdodCgpe1xuICAgIFx0cmV0dXJuIHRoaXMuY29uZmlnLm1hc29ucnlNYXhIZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IG1hc29ucnlHdXR0ZXIoKXtcbiAgICBcdHJldHVybiB0aGlzLmNvbmZpZy5tYXNvbnJ5R3V0dGVyO1xuICAgIH1cblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGxpZ2h0Ym94OiBDcnlzdGFsTGlnaHRib3gsXG5cdFx0cHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmXG5cdCkge31cblxuXHRzaG93TGlnaHRib3goaW1hZ2VzOiBhbnksIGk6IG51bWJlcil7XG4gICAgICAgIHRoaXMuY29uZmlnLmluZGV4ID0gaTtcblx0XHR0aGlzLmxpZ2h0Ym94Lm9wZW4oaW1hZ2VzLCB0aGlzLmNvbmZpZyk7XG5cdH1cblxuICAgIGhhbmRsZU1hc29ucnlMYXlvdXRFdmVudHMoZXZlbnQpe1xuICAgICAgICB0aGlzLnNob3dMaWdodGJveCh0aGlzLmltYWdlcywgZXZlbnQuaW5kZXgpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgICBwYXRoOiBzdHJpbmc7IFxuICAgIHdpZHRoOiBudW1iZXI7IFxuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGNvbXB1dGVkSGVpZ2h0Pzogc3RyaW5nO1xuICAgIGNvbXB1dGVkV2lkdGg/OiBzdHJpbmc7XG4gICAgbWFyZ2luPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZXMgZXh0ZW5kcyBBcnJheTxJbWFnZT57fVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ21hc29ucnktbGF5b3V0JywgXG4gICAgdGVtcGxhdGU6IGA8ZGl2IFxuXHRbbmdDbGFzc109XCJDTEFTU19OQU1FXCJcblx0Km5nRm9yPVwibGV0IGltYWdlIG9mIGltYWdlczsgbGV0IGkgPSBpbmRleDtcIlxuICAgIFtzdHlsZS53aWR0aF09XCJpbWFnZS5jb21wdXRlZFdpZHRoXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImltYWdlLmNvbXB1dGVkSGVpZ2h0XCJcbiAgICBbc3R5bGUuZmxvYXRdPVwiJ2xlZnQnXCJcbiAgICBbc3R5bGUubWFyZ2luXT1cImltYWdlLm1hcmdpblwiXG4gICAgW3N0eWxlLmJhY2tncm91bmRdPVwiJyNlZWVlZWUnXCJcbiAgICBbc3R5bGUubGluZUhlaWdodF09XCIwXCI+XG5cdDxpbWcgXG4gICAgICAgICNpbWFnZUVsZW1cbiAgICAgICAgW3NyY109XCJpbWFnZS5wcmV2aWV3IHx8IGltYWdlLmZ1bGxcIiBcbiAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiMTAwXCIgXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJ2F1dG8nXCJcbiAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwiMFwiXG4gICAgICAgIChjbGljayk9XCJjbGlja09uSW1hZ2UoaW1hZ2UsIGkpXCJcbiAgICAgICAgKGxvYWQpPVwib25JbWFnZUxvYWRlZChpbWFnZUVsZW0pXCIgLz5cbjwvZGl2PmAsXG59KVxuXG5leHBvcnQgY2xhc3MgTWFzb25yeUxheW91dENvbXBvbmVudCB7XG4gICAgR1VUVEVSOiBudW1iZXIgPSAwO1xuICAgIG5vZGVzOiBhbnk7XG4gICAgZWxlbTogYW55O1xuICAgIHNhdmVkTm9kZURpbWVuc2lvbnM6IGFueSA9IFtdO1xuICAgIG9ic2VydmVyOiBhbnk7XG4gICAgZ3JpZFN0YXRlOiBzdHJpbmcgPSAnbm90IHN0YXJ0ZWQnO1xuICAgIHJlc2l6ZVRpbWVyOiBhbnk7XG4gICAgY2hhbmdlc1RpbWVyOiBhbnk7XG5cbiAgICBASW5wdXQoJ2ltYWdlcycpIGltYWdlczogSW1hZ2VzOyBcbiAgICBASW5wdXQoJ21hc29ucnknKSBFTkFCTEVfTUFTT05SWTogYm9vbGVhbiA9IHRydWU7IFxuICAgIEBJbnB1dCgnbWF4LWhlaWdodCcpIE1BWF9IRUlHSFQ6IG51bWJlciA9IDQwMDsgXG4gICAgQElucHV0KCdjbGFzcy1uYW1lJykgQ0xBU1NfTkFNRTogc3RyaW5nIHwgeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XG5cbiAgICBASW5wdXQoJ2d1dHRlcicpXG4gICAgc2V0IGd1dHRlcih2YWx1ZTogbnVtYmVyKXtcbiAgICAgICAgdGhpcy5HVVRURVIgPSB2YWx1ZSAvIDI7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGV2ZW50czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICAgXG4gICAgZ2V0IGlzTW9iaWxlKCk6Ym9vbGVhbiB7XG4gICAgICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgICAgICAoZnVuY3Rpb24oYSl7aWYoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zdWJzdHIoMCw0KSkpIGNoZWNrID0gdHJ1ZTt9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH07XG4gICAgIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZil7XG4gICAgICAgIHRoaXMuZWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICAgIG9uV2luZG93UmVzaXplKGV2ZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9ICdub3Qgc3RhcnRlZCc7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpOyBcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5idWlsZEdyaWQoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpe1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jaGFuZ2VzVGltZXIpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlc1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9ICdub3Qgc3RhcnRlZCc7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpOyBcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICBidWlsZEdyaWQoKXtcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gTWF0aC5mbG9vcih0aGlzLmVsZW0ucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCk7XG4gICAgICAgIGxldCB0b3RhbFJvd1dpZHRoOiBhbnkgPSAwOyBcbiAgICAgICAgbGV0IHJvdzogYW55ID0ge1xuICAgICAgICAgICAgc3RhcnRJbmRleDogMCxcbiAgICAgICAgICAgIGVuZEluZGV4OiAwLFxuICAgICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgICAgdG90YWxXaWR0aDogMFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMgfHwgIXRoaXMuaW1hZ2VzLmxlbmd0aCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW0uc3R5bGUud2lkdGggPSBwYXJlbnRXaWR0aCArJ3B4JztcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAndGFibGUnO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LnRvdGFsV2lkdGggPT09IDApe1xuICAgICAgICAgICAgICAgIHJvdy5zdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgcm93Lmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJvdy5sZW5ndGgrKztcbiAgICAgICAgICAgIHJvdy50b3RhbFdpZHRoICs9IHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChyb3cudG90YWxXaWR0aCA+PSBwYXJlbnRXaWR0aCB8fCB0aGlzLmlzTGFzdENoaWxkKGluZGV4KSl7XG4gICAgICAgICAgICAgICAgcm93LmVuZEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgbGV0IHNjYWxpbmcgPSByb3cudG90YWxXaWR0aC9wYXJlbnRXaWR0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29sRGltZW5zaW9ucyhzY2FsaW5nLCByb3cpO1xuICAgICAgICAgICAgICAgIHJvdy50b3RhbFdpZHRoID0gMDsgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldENvbERpbWVuc2lvbnMoc2NhbGluZzogbnVtYmVyLCByb3c6IGFueSl7XG4gICAgICAgIGxldCB0b3RhbFJvd1dpZHRoOiBhbnkgPSAwO1xuICAgICAgICBsZXQgcGFyZW50V2lkdGggPSB0aGlzLmVsZW0ucGFyZW50Tm9kZS5vZmZzZXRXaWR0aDtcbiAgICAgICAgc2NhbGluZyA9IChzY2FsaW5nIDwgMSkgPyAxIDogc2NhbGluZztcblxuICAgICAgICB0aGlzLmltYWdlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLkVOQUJMRV9NQVNPTlJZKXtcbiAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkSGVpZ2h0ID0gdGhpcy5NQVhfSEVJR0hUICsgJ3B4JztcbiAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSB0aGlzLmdldENvbXB1dGVkV2lkdGgoaW5kZXgpICsgJ3B4JztcbiAgICAgICAgICAgICAgICBub2RlLm1hcmdpbiA9IHRoaXMuZ2V0Tm9kZU1hcmdpbihwYXJlbnRXaWR0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gcm93LnN0YXJ0SW5kZXggJiYgaW5kZXggPD0gcm93LmVuZEluZGV4KXtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZVdpZHRoO1xuXG4gICAgICAgICAgICAgICAgLy8gbGFzdCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcm93LmVuZEluZGV4ICYmIHNjYWxpbmcgPiAxKXsgXG4gICAgICAgICAgICAgICAgICAgIG5vZGVXaWR0aCA9ICgxMDAgLSB0b3RhbFJvd1dpZHRoKSAtICgodGhpcy5HVVRURVIgKiAyKSAvIHBhcmVudFdpZHRoICogMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb21wdXRlZFdpZHRoID0gJ2NhbGMoJytub2RlV2lkdGgrJyUpJztcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkU3RhdGUgPT09ICdub3Qgc3RhcnRlZCcpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGUgPSAncHJlLWJ1aWxkaW5nJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZEdyaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlV2lkdGggPSAoKHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCkgLyBzY2FsaW5nKSAvIHBhcmVudFdpZHRoICogMTAwKSAtICgocm93Lmxlbmd0aCAqICh0aGlzLkdVVFRFUiAqIDIpKSAqICh0aGlzLmdldENvbXB1dGVkV2lkdGgoaW5kZXgpIC8gc2NhbGluZykgLyBwYXJlbnRXaWR0aCkgLyBwYXJlbnRXaWR0aCAqIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb21wdXRlZFdpZHRoID0gJ2NhbGMoJytub2RlV2lkdGgrJyUpJztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUm93V2lkdGggKz0gbm9kZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd1dpZHRoICs9ICh0aGlzLkdVVFRFUiAvIHBhcmVudFdpZHRoICogMTAwKSAqIDI7ICBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBsYXN0IHJvdyBhbmQgbGFzdCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcm93LmVuZEluZGV4ICYmIHJvdy5sZW5ndGggPT09IDEgJiYgdGhpcy5pc01vYmlsZSl7XG4gICAgICAgICAgICAgICAgXHRub2RlV2lkdGggPSAxMDAgLSAoKHRoaXMuR1VUVEVSICogMikgLyBwYXJlbnRXaWR0aCAqIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBub2RlLmhlaWdodCAqICggcGFyZW50V2lkdGggKiAobm9kZVdpZHRoIC8gMTAwKSAvIG5vZGUud2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQvMiA8IHRoaXMuTUFYX0hFSUdIVCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSAnY2FsYygnK25vZGVXaWR0aCsnJSknO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZS5tYXJnaW4gPSB0aGlzLmdldE5vZGVNYXJnaW4ocGFyZW50V2lkdGgpO1xuICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRIZWlnaHQgPSBub2RlLmhlaWdodCAqICggcGFyZW50V2lkdGggKiAobm9kZVdpZHRoIC8gMTAwKSAvIG5vZGUud2lkdGgpICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0Q29tcHV0ZWRXaWR0aChpbmRleDogbnVtYmVyKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW2luZGV4XS53aWR0aCAvICh0aGlzLmltYWdlc1tpbmRleF0uaGVpZ2h0IC8gdGhpcy5NQVhfSEVJR0hUKTtcbiAgICB9XG5cbiAgICBpc0xhc3RDaGlsZChpbmRleDogbnVtYmVyKXtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgMSA9PT0gdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldE5vZGVNYXJnaW4ocGFyZW50V2lkdGg6IG51bWJlcil7XG4gICAgICAgIHJldHVybiAnY2FsYygnK3RoaXMuR1VUVEVSIC8gcGFyZW50V2lkdGggKiAxMDArJyUpJztcbiAgICB9XG5cbiAgICBjbGlja09uSW1hZ2UoaW1hZ2U6IGFueSwgaTogbnVtYmVyKXtcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2stb24taW1hZ2UnLFxuICAgICAgICAgICAgaW1hZ2U6IGltYWdlLFxuICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25JbWFnZUxvYWRlZChlbGVtKXtcbiAgICAgICAgZWxlbS5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICB9XG59IiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1twaW5jaF0nXG59KVxuXG5leHBvcnQgY2xhc3MgUGluY2hEaXJlY3RpdmV7XG5cbiAgICBlbGVtOiBhbnk7XG4gICAgZXZlbnRUeXBlOiBhbnk7XG5cbiAgICBzY2FsZTogYW55ID0gMTtcbiAgICBpbml0aWFsU2NhbGU6IGFueSA9IDE7XG5cbiAgICBzdGFydFg6IGFueTtcbiAgICBzdGFydFk6IGFueTtcblxuICAgIG1vdmVYOiBhbnkgPSAwO1xuICAgIG1vdmVZOiBhbnkgPSAwO1xuICAgIGluaXRpYWxNb3ZlWDogYW55ID0gMDtcbiAgICBpbml0aWFsTW92ZVk6IGFueSA9IDA7XG5cbiAgICBtb3ZlWEM6IGFueTtcbiAgICBtb3ZlWUM6IGFueTtcblxuICAgIGRpc3RhbmNlOiBhbnk7XG4gICAgaW5pdGlhbERpc3RhbmNlOiBhbnk7XG5cbiAgICBpc05leHRJbWFnZUxvYWRlZDogYW55ID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpIGlzTGFzdDogYW55O1xuICAgIEBJbnB1dCgpIGlzRmlyc3Q6IGFueTtcblxuICAgIEBPdXRwdXQoKSBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZil7XG4gICAgICAgIHRoaXMuZWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBbJyRldmVudCddKVxuICAgIHRvdWNoc3RhcnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbS5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAnMCAwJztcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICAgIHRvdWNobW92ZUhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IHRvdWNoZXMgPSBldmVudC50b3VjaGVzO1xuXG4gICAgICAgIGlmICh0b3VjaGVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnNjYWxlID09PSAxICYmICF0aGlzLmV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZSA9PSAnc3dpcGUnKXtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc05leHRJbWFnZUxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV2ZW50VHlwZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRZID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ldmVudFR5cGUgPSAnc3dpcGUnO1xuXG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gdGhpcy5pbml0aWFsTW92ZVggKyAoZXZlbnQudG91Y2hlc1swXS5wYWdlWCAtIHRoaXMuc3RhcnRYKTtcbiAgICAgICAgICAgIHRoaXMubW92ZVkgPSAwO1xuXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUVsZW0oMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gICAgdG91Y2hlbmRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGxldCB0b3VjaGVzID0gZXZlbnQudG91Y2hlcztcbiAgICAgICAgbGV0IGltZyA9IHRoaXMuZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImltZ1wiKVswXTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNOZXh0SW1hZ2VMb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMuc2NhbGUgPCAxKXtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vdmVZID4gMCl7XG4gICAgICAgICAgICB0aGlzLm1vdmVZID0gMDtcbiAgICAgICAgfSBcblxuICAgICAgICBpZiAodGhpcy5tb3ZlWCA+IDEwMCl7XG4gICAgICAgICAgICB0aGlzLnNsaWRlKCdwcmV2Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb3ZlWCA8IC0xMDApe1xuICAgICAgICAgICAgdGhpcy5zbGlkZSgnbmV4dCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxTY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgICAgIHRoaXMuaW5pdGlhbE1vdmVYID0gdGhpcy5tb3ZlWDtcbiAgICAgICAgdGhpcy5pbml0aWFsTW92ZVkgPSB0aGlzLm1vdmVZO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtRWxlbSgyMDApOyBcblxuICAgICAgICB0aGlzLmV2ZW50VHlwZSA9ICd0b3VjaGVuZCc7ICAgICAgICBcbiAgICAgICAgaWYgKHRvdWNoZXMubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgdGhpcy5ldmVudFR5cGUgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNsaWRlKGV2ZW50OiBhbnkpe1xuICAgICAgICB0aGlzLm9uU2xpZGUoZXZlbnQpO1xuXG4gICAgICAgIGlmIChldmVudCA9PT0gJ3ByZXYnKXtcbiAgICAgICAgICAgIHRoaXMubW92ZVggPSB3aW5kb3cuaW5uZXJXaWR0aCArIDg7IFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGaXJzdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50ID09PSAnbmV4dCcpe1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IC13aW5kb3cuaW5uZXJXaWR0aCAtIDg7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhc3Qpe1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZVggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc05leHRJbWFnZUxvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxNb3ZlWCA9IDA7XG4gICAgICAgICAgICB0aGlzLmlzTmV4dEltYWdlTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBvblNsaWRlKGV2ZW5UeXBlOmFueSkge1xuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KGV2ZW5UeXBlKTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1FbGVtKGR1cmF0aW9uOiBhbnkgPSA1MCl7XG4gICAgICAgIGxldCBtYXRyaXhWYWwgPSAnbWF0cml4KCcrIE51bWJlcih0aGlzLnNjYWxlKSArJywnKyAwICsnLCcrIDAgKycsJysgTnVtYmVyKHRoaXMuc2NhbGUpICsnLCcrIE51bWJlcih0aGlzLm1vdmVYKSArJywnKyBOdW1iZXIodGhpcy5tb3ZlWSkgKycpJztcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZWxlbS5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAnKyBkdXJhdGlvbiArJ21zJztcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLnRyYW5zZm9ybSA9IG1hdHJpeFZhbDtcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IG1hdHJpeFZhbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBMaWdodGJveENvbXBvbmVudCB9IGZyb20gJy4vbGlnaHRib3guY29tcG9uZW50JztcbmltcG9ydCB7IExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbGxlcnlDb21wb25lbnQgfSBmcm9tICcuL2dhbGxlcnkuY29tcG9uZW50JztcbmltcG9ydCB7IENyeXN0YWxMaWdodGJveCB9IGZyb20nLi9kb20uc2VydmljZScgXG5pbXBvcnQgeyBNYXNvbnJ5TGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9tYXNvbnJ5LWxheW91dC5jb21wb25lbnQnOyBcbmltcG9ydCB7IFBpbmNoRGlyZWN0aXZlIH0gZnJvbSAnLi9waW5jaC5kaXJlY3RpdmUnOyBcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgTGlnaHRib3hDb21wb25lbnQsXG4gICAgICAgIExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50LFxuICAgICAgICBHYWxsZXJ5Q29tcG9uZW50LFxuICAgICAgICBNYXNvbnJ5TGF5b3V0Q29tcG9uZW50LFxuICAgICAgICBQaW5jaERpcmVjdGl2ZVxuICAgIF0sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGVcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgR2FsbGVyeUNvbXBvbmVudFxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIENyeXN0YWxMaWdodGJveFxuICAgIF0sXG4gICAgYm9vdHN0cmFwOiBbXG4gICAgICAgIFxuICAgIF0sXG4gICAgZW50cnlDb21wb25lbnRzOiBbXG4gICAgICAgIExpZ2h0Ym94Q29tcG9uZW50LFxuICAgICAgICBMaWdodGJveE1vYmlsZUNvbXBvbmVudFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgQ3J5c3RhbEdhbGxlcnlNb2R1bGUgeyB9XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwiQ29tcG9uZW50IiwiRWxlbWVudFJlZiIsIkNoYW5nZURldGVjdG9yUmVmIiwiSW5wdXQiLCJIb3N0QmluZGluZyIsIlZpZXdDaGlsZCIsIkhvc3RMaXN0ZW5lciIsImRlZmF1bHRDb25maWciLCJJbmplY3RhYmxlIiwiQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIiwiQXBwbGljYXRpb25SZWYiLCJJbmplY3RvciIsIk91dHB1dCIsIkRpcmVjdGl2ZSIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7UUE2SUksMkJBQW9CLFVBQXNCLEVBQVUsR0FBc0I7WUFBdEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtZQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO3FDQTNGOUMsQ0FBQztpQ0FDTCxFQUFFO3FDQUNFLEVBQUU7eUJBSXRCLElBQUlBLGlCQUFZLEVBQUU7Z0NBRTRCLEtBQUs7Z0NBQ0ksS0FBSztTQW1GbkU7UUEzRUQsc0JBQUkscUNBQU07OztnQkFBVjtnQkFDSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQzNCOzs7V0FBQTtRQUVELHNCQUFJLHFDQUFNOzs7Z0JBQVY7Z0JBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUMzQjs7O1dBQUE7UUFFRCxzQkFBSSxvQ0FBSzs7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