ngx-crystal-gallery
Version:
Responsive gallery with support for masonry layout and lightbox.
364 lines (363 loc) • 43.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, EventEmitter, HostBinding, HostListener, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';
var LightboxComponent = /** @class */ (function () {
function LightboxComponent(elementRef, ref) {
this.elementRef = elementRef;
this.ref = ref;
this.currentImageIndex = 0;
this.spinnerHeight = 30;
this.descriptionHeight = 43;
this.close = new 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: 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: ElementRef },
{ type: ChangeDetectorRef }
]; };
LightboxComponent.propDecorators = {
data: [{ type: Input }],
showLightbox: [{ type: HostBinding, args: ['class.cg-show',] }],
hideControls: [{ type: HostBinding, args: ['class.cg-hide-controls',] }],
hostStyleTransition: [{ type: HostBinding, args: ['style.transition',] }],
hostStyleBackgroundColor: [{ type: HostBinding, args: ['style.backgroundColor',] }],
currImageElem: [{ type: ViewChild, args: ['currImageElem',] }],
prevImageElem: [{ type: ViewChild, args: ['prevImageElem',] }],
wrapperElem: [{ type: ViewChild, args: ['wrapper',] }],
onKeyDown: [{ type: HostListener, args: ['window:keydown', ['$event'],] }],
onMouseEnter: [{ type: HostListener, args: ["mouseenter", ['$event'],] }]
};
return LightboxComponent;
}());
export { LightboxComponent };
if (false) {
/** @type {?} */
LightboxComponent.prototype._index;
/** @type {?} */
LightboxComponent.prototype.prevIndex;
/** @type {?} */
LightboxComponent.prototype.currImageLoaded;
/** @type {?} */
LightboxComponent.prototype.prevImageHide;
/** @type {?} */
LightboxComponent.prototype.wrapperProp;
/** @type {?} */
LightboxComponent.prototype._data;
/** @type {?} */
LightboxComponent.prototype.currentImageIndex;
/** @type {?} */
LightboxComponent.prototype.spinnerHeight;
/** @type {?} */
LightboxComponent.prototype.descriptionHeight;
/** @type {?} */
LightboxComponent.prototype.data;
/** @type {?} */
LightboxComponent.prototype.close;
/** @type {?} */
LightboxComponent.prototype.showLightbox;
/** @type {?} */
LightboxComponent.prototype.hideControls;
/** @type {?} */
LightboxComponent.prototype.hostStyleTransition;
/** @type {?} */
LightboxComponent.prototype.hostStyleBackgroundColor;
/** @type {?} */
LightboxComponent.prototype.currImageElem;
/** @type {?} */
LightboxComponent.prototype.prevImageElem;
/** @type {?} */
LightboxComponent.prototype.wrapperElem;
/** @type {?} */
LightboxComponent.prototype.elementRef;
/** @type {?} */
LightboxComponent.prototype.ref;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS8iLCJzb3VyY2VzIjpbImxpYi9saWdodGJveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFlBQVksRUFFWixXQUFXLEVBQ1gsWUFBWSxFQUNaLFNBQVMsRUFDVCxVQUFVLEVBQ1YsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0lBb0l6QywyQkFBb0IsVUFBc0IsRUFBVSxHQUFzQjtRQUF0RCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7aUNBM0Y5QyxDQUFDOzZCQUNMLEVBQUU7aUNBQ0UsRUFBRTtxQkFJdEIsSUFBSSxZQUFZLEVBQUU7NEJBRTRCLEtBQUs7NEJBQ0ksS0FBSztLQW1GbkU7SUEzRUQsc0JBQUkscUNBQU07Ozs7UUFBVjtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMzQjs7O09BQUE7SUFFRCxzQkFBSSxxQ0FBTTs7OztRQUFWO1lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzNCOzs7T0FBQTtJQUVELHNCQUFJLG9DQUFLOzs7O1FBQVQ7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1NBQ2pDOzs7T0FBQTtJQUVELHNCQUFJLDRDQUFhOzs7O1FBQWpCOztZQUNJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXBDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQztnQkFDUixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2hCO1lBRUQsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUM7Z0JB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S0FBSzsrQkFJTCxXQUFXLFNBQUMsZUFBZTsrQkFDM0IsV0FBVyxTQUFDLHdCQUF3QjtzQ0FDcEMsV0FBVyxTQUFDLGtCQUFrQjsyQ0FDOUIsV0FBVyxTQUFDLHVCQUF1QjtnQ0FFbkMsU0FBUyxTQUFDLGVBQWU7Z0NBQ3pCLFNBQVMsU0FBQyxlQUFlOzhCQUN6QixTQUFTLFNBQUMsU0FBUzs0QkF3RG5CLFlBQVksU0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzsrQkFlekMsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzs7NEJBeEkxQzs7U0EyQ2EsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXG4gICAgQ29tcG9uZW50LCBcbiAgICBJbnB1dCwgXG4gICAgRXZlbnRFbWl0dGVyLCBcbiAgICBPbkluaXQsIFxuICAgIEhvc3RCaW5kaW5nLCBcbiAgICBIb3N0TGlzdGVuZXIsIFxuICAgIFZpZXdDaGlsZCwgXG4gICAgRWxlbWVudFJlZiwgXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjcnlzdGFsLWxpZ2h0Ym94JyxcbiAgICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjZy1jb3VudGVyXCIgKm5nSWY9XCJjb25maWcuY291bnRlciAmJiBpbWFnZXMubGVuZ3RoID4gMVwiPnt7Y291bnRlcn19PC9kaXY+XG48ZGl2IGNsYXNzPVwiY2ctZGVzY3JpcHRpb25cIiAqbmdJZj1cImRlc2NyaXB0aW9uXCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctY2xvc2VcIiBcblx0KGNsaWNrKT1cImNsb3NlTGlnaHRib3goKVwiPkNsb3NlPC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctc3Bpbm5lclwiIFxuXHQgKm5nSWY9XCIhY3VyckltYWdlTG9hZGVkXCI+PC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJjZy13cmFwcGVyXCIgI3dyYXBwZXI+XG5cdDxpbWcgXG5cdFx0Y2xhc3M9XCJjZy1jdXJyLWltYWdlXCIgXG5cdFx0I2N1cnJJbWFnZUVsZW0gXG5cdFx0W3NyY109XCJjdXJySW1hZ2VQYXRoPy5mdWxsXCIgXG5cdFx0W2NsYXNzLmNnLXNob3ddPVwiY3VyckltYWdlTG9hZGVkXCIgXG5cdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgpXCIgLz5cbjwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLXByZXZcIiBcblx0W2hpZGRlbl09XCJpc0ZpcnN0ICYmICFjb25maWcubG9vcFwiIFxuXHQoY2xpY2spPVwicHJldigpXCI+PC9kaXY+XG48ZGl2IFxuXHRjbGFzcz1cImNnLW5leHRcIiBcblx0W2hpZGRlbl09XCJpc0xhc3QgJiYgIWNvbmZpZy5sb29wXCIgXG5cdChjbGljayk9XCJuZXh0KClcIj48L2Rpdj5gLFxuICAgIHN0eWxlczogW2AuX2NnLXNwaW5uZXIsLl9jZy1zcGlubmVyOmFmdGVye2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjM2cHg7aGVpZ2h0OjM2cHh9Ll9jZy1zcGlubmVye21hcmdpbjowIGF1dG87Zm9udC1zaXplOjEwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTtib3JkZXItdG9wOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItcmlnaHQ6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1ib3R0b206NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjZmZmOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkODthbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkOH1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS5jZy1zcGlubmVyLC5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxMHB4O2hlaWdodDoxMHB4Oy13ZWJraXQtYW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDc7YW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDd9LmNnLXNwaW5uZXJ7Y29sb3I6I2ZmZjtmb250LXNpemU6MTBweDttYXJnaW46MCBhdXRvIDIwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMTZzO2FuaW1hdGlvbi1kZWxheTotLjE2c30uY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZy1zcGlubmVyOmJlZm9yZXtsZWZ0Oi0zZW07LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4zMnM7YW5pbWF0aW9uLWRlbGF5Oi0uMzJzfS5jZy1zcGlubmVyOmFmdGVye2xlZnQ6M2VtfUAtd2Via2l0LWtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAyLjVlbSAwIDB9fUBrZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDEwcHggMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAxMHB4IDAgMH19Omhvc3QoLmNnLXNob3cpe29wYWNpdHk6MX06aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLWNsb3NlLDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctbmV4dCw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLXByZXZ7b3BhY2l0eTowfTpob3N0e29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGN1YmljLWJlemllciguNjQ1LC4wNDUsLjM1NSwxKTt6LWluZGV4OjEwMDAwO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODUpfTpob3N0IGltZ3tvcGFjaXR5OjE7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlO2JveC1zaGFkb3c6MCA0cHggMTVweCAycHggcmdiYSgwLDAsMCwuMzUpfTpob3N0IGltZy5jZy1jdXJyLWltYWdlLmNnLXNob3d7b3BhY2l0eToxfTpob3N0IGltZy5jZy1jdXJyLWltYWdle29wYWNpdHk6MDt6LWluZGV4OjEwfTpob3N0IC5jZy13cmFwcGVyLmNnLWhpZGV7ZGlzcGxheTpub25lfTpob3N0IC5jZy13cmFwcGVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9Omhvc3QgLmNnLXNwaW5uZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW4tdG9wOi0xNXB4O21hcmdpbi1sZWZ0Oi01cHh9Omhvc3QgLmNnLWNvdW50ZXJ7dGV4dC1hbGlnbjpsZWZ0O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MjJweDt0b3A6MTNweDtmb250LXNpemU6MTRweDt0ZXh0LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjY1KTt6LWluZGV4OjMwfTpob3N0IC5jZy1kZXNjcmlwdGlvbnt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMjAwcHgpO21hcmdpbjowIGF1dG87Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6NDNweDtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjUwfTpob3N0IC5jZy1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO3BhZGRpbmc6MTNweCAyMnB4O2ZvbnQtc2l6ZToxM3B4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi41O3otaW5kZXg6MzA7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLWluLW91dDt0ZXh0LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjY1KX06aG9zdCAuY2ctY2xvc2U6aG92ZXJ7b3BhY2l0eToxfTpob3N0IC5jZy1uZXh0LDpob3N0IC5jZy1wcmV2e3dpZHRoOjQwJTtoZWlnaHQ6MTAwJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi41O3otaW5kZXg6MjA7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLWluLW91dDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwKX06aG9zdCAuY2ctbmV4dDpob3Zlciw6aG9zdCAuY2ctcHJldjpob3ZlcntvcGFjaXR5OjF9Omhvc3QgLmNnLXByZXZ7bGVmdDowO2JhY2tncm91bmQ6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBaUNBWUFBQUJiWHltQUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UY2dLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPak16TVRaQ1F6RkVSRGd6TVRFeFJUYzVRVVl4UVRVeFJESTVNa001T0RaQ0lpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qTXpNVFpDUXpGRlJEZ3pNVEV4UlRjNVFVWXhRVFV4UkRJNU1rTTVPRFpDSWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk16TXhOa0pETVVKRU9ETXhNVEZGTnpsQlJqRkJOVEZFTWpreVF6azROa0lpSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TXpNeE5rSkRNVU5FT0RNeE1URkZOemxCUmpGQk5URkVNamt5UXprNE5rSWlMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejdWcndaS0FBQUNsRWxFUVZSNDJxeldTWThTUVJnR1lMb1ZIUGVUWGx3Q2lJd01BckpHdGlBQk5lcDRJR1ppNG9FZk1Kb29MamVQcm5GR2Y1eUpTMGhZbXEyYi9hQnhpUTYrbFJSSmRhVVpxNXZwNUUyVExuaW9WRmQ5VlpMTitpVXhJZGVNaVcyZlJWQ212ejJEcEpCVkNrNlg2U1ZCSFFSTHBWS2I3WGI3ODJnMFVzcmw4ak04VzBQMjArOVlRbjNKWlBJaHdONk1Yb1BCb0kzbkc4aUtHWmhGMTRBK0Fxck9tS3RXcTMxRjIxM2trT2dRNjlCME9sMEJxckZvdDl2Vi9INy9jN1JmRW9WWjFHK0VkanFkdnRmcmZZbjJLOGdKa2FIUW9kbHN0akllai9zc2loZEgwRGRvdjRhY1FvN1FseWNKbzVQSmhFYzFqOGZ6bXFKazJoMUQ3THYxbGtVdjVuSzV4enphYXJXTVVJY3dtcy9uQ1RyZ1ViZmJUZENyVnRBQVFhZlRxUTVWRkVWZENpMFVDay9RMHlHTE5wdE4xZWwwdnFMb2FSSFV4cVBvS1kvMktGbzBnMHIwYmE0V2k4V25RRWNzMm1nMFZBUFVMckpzWlRxcE56RFo2eXhhcjlkVmw4dEZWdFIxMFNuRm9oSmRnblpZdWg5SWtqU1RaZmtuUG41RHZpTy9rTC9JamtndElPaGhKSjdKWkY1Z2RVMjRoZERHNnFxZy9RSnl3RXpsbWcvRlNUTGhFNG5FOW5BNG5ISkZSdkg1Zkp0bzk0Z09CZnZ5anRKeFhJL0g0eCtBNjNyZTYvVVVWRENDbnplRHo2ZmJjZVFzY2pzV2k3MDN3RnNNN2hEQkpRTjhQUnFOYm1ObjBPR2FwdTBKZm92aVl4NFBCQUwzMGU1ZENnK0h3MFo0ZTgvd2ZyL1A0NTFRS1BSZ2FSeklGakRka3NlZnNiamRLbjV6RVI2SlJNaXd1UCszTmUyS0I0UEJMVlZWUjF4ZCtZSzJPMmJPRll2d2Q4Q0hiSy94L0o2WmM4VWkvQVpteGR0cXRkckF3bEZMcFJMWnJTL1BZY25rRVV1aVk3aENTK2c1c292VDU1K1FqN1FTL2pZRDh6anAvVUY2dDlHUytvUGVkOHpDTEM1ekowdFNvLy9RKzh3S0xIVHcvaWZBQU1RVlM0dkhaUjJWQUFBQUFFbEZUa1N1UW1DQykgY2VudGVyIGxlZnQgMjJweCBuby1yZXBlYXR9Omhvc3QgLmNnLW5leHR7cmlnaHQ6MDtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQWlDQVlBQUFCYlh5bUFBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGNnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pFeU5ERTNNREUxUkRnek1URXhSVGM1TmpNNFFUSXpRekkyUmpjMlFqZzJJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPakV5TkRFM01ERTJSRGd6TVRFeFJUYzVOak00UVRJelF6STJSamMyUWpnMklqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNVEkwTVRjd01UTkVPRE14TVRGRk56azJNemhCTWpORE1qWkdOelpDT0RZaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk1USTBNVGN3TVRSRU9ETXhNVEZGTnprMk16aEJNak5ETWpaR056WkNPRFlpTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo3enY1QktBQUFDbDBsRVFWUjQyclRXMjI0U1FSd0djSFpiOEZUMVNtODhCSkNpRkFFNUpweUNCTlJFOGNvWUV5OTRBR3FpOVhEWFMwK0pWaC9DQi9FaGlGRVQ1TGpBY2xnV2phYTFhYXpmSkRNNnU2THVManJKbDIxMjRjZDBkdVkvSTloK05vRUxhYnRjVExjRkNvbjBidytTUkU0aDI4aG4yeHlOb0l2SVNybGNmcUFvU2x1U3BMZXBWS3FDZTZjUkIvMk1ZQVhlaTF3ZmpVYlNMbTM0Z1g0eW1ieU4rejZyT0JtQy9jaU5lcjMrZnBkcndHWGdkOGgvWXdWbjhEbS8zNy9lNi9VR09ueVFUcWZYck9Cc0tJNGc1NzFlNzZOdXR6djhEZTQzZ3d2MDVTMGh4NUNMd0ovaUJXcnd5V1F5ekdhenBuSHlJVHR5Q0RsQmNJL0g4d1M0WmxoVVZiV01PL1I0cDlQNUJjL2xjbmZ4L093OCtBVzMyejBMSCtYeitYK0R0OXR0bWNlbjB5bkRBMWJ4NHdSM09wMlBXNjJXck92NXVGQW8zSnNYTDFLOHIrdjVMTnhtWnJiOHdKdk5wbjVZbEdLeGVKL1dGcnVaQmNSUHhVc3VsMnU5MFdob2NDeXFCcWszZExHSml3YmdiL1Q2RmZsQ1Nxa29pbHVDSUdqcU5HeldnUVV6OVlSOGFROXlCcXR5RFF0SDBxMUtOWlBKUE1Uek9IS0E0b2FId3VQeitTb29VbTBlSFkvSDAwUWlzVUVXRkhLVURZVlJkQm1WcjlMdjkvV29Hby9IWCtKNWlZNy9RU012ajAwM2huYjBhQ3dXZTRIblY1R1R5R0VqMDAyRERnWUREWXFkUm8xR294dTBwM3BVK0J2cURRUUNxelBRQ1VXdnpJTktlalFjRGx0SFE2SFFMYUJkSGgwT2g1WlJPME9CYUZEOGlJTDd6ODJpYkd0eVJ5S1IxVCtnbDgyZy9HWjZEZXYvSFkvS3Nxd0VnMEZMS0wvOTMrUjdDM1FNOU5rOEtEdGlPV3ExMmpiMnMyWFMwMUtwOUtwYXJiN0cvVGZJUjJRVDJURjZVQlM0MmJCRWkvVUsvU0lCUHlDZmtDMHpLQSt6NnJXUFhtMzB0TGxKcjZaUS9abVlEWW5JMWVFZGVqVjlUaGIrMThIN3V3QURBT0cvV2NtNHgra25BQUFBQUVsRlRrU3VRbUNDKSBjZW50ZXIgcmlnaHQgMjJweCBuby1yZXBlYXR9YF1cbn0pXG5leHBvcnQgY2xhc3MgTGlnaHRib3hDb21wb25lbnQge1xuICAgIF9pbmRleDogYW55O1xuICAgIHByZXZJbmRleDogYW55O1xuICAgIGN1cnJJbWFnZUxvYWRlZDogYW55OyBcbiAgICBwcmV2SW1hZ2VIaWRlOiBhbnk7XG4gICAgd3JhcHBlclByb3A6IGFueTtcbiAgICBfZGF0YTogYW55O1xuICAgIGN1cnJlbnRJbWFnZUluZGV4OiBudW1iZXIgPSAwO1xuICAgIHNwaW5uZXJIZWlnaHQ6IG51bWJlciA9IDMwO1xuICAgIGRlc2NyaXB0aW9uSGVpZ2h0OiBudW1iZXIgPSA0MztcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcblxuICAgIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZy1zaG93Jykgc2hvd0xpZ2h0Ym94OiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZy1oaWRlLWNvbnRyb2xzJykgaGlkZUNvbnRyb2xzOiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50cmFuc2l0aW9uJykgaG9zdFN0eWxlVHJhbnNpdGlvbjogc3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuYmFja2dyb3VuZENvbG9yJykgaG9zdFN0eWxlQmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKCdjdXJySW1hZ2VFbGVtJykgY3VyckltYWdlRWxlbTogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdwcmV2SW1hZ2VFbGVtJykgcHJldkltYWdlRWxlbTogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd3cmFwcGVyJykgd3JhcHBlckVsZW06IEVsZW1lbnRSZWY7XG5cbiAgICBnZXQgaW1hZ2VzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaW1hZ2VzO1xuICAgIH1cblxuICAgIGdldCBjb25maWcoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb25maWc7XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbWFnZUluZGV4O1xuICAgIH1cblxuICAgIGdldCBjdXJySW1hZ2VQYXRoKCl7XG4gICAgICAgIGxldCBpbWFnZSA9IHRoaXMuaW1hZ2VzW3RoaXMuaW5kZXhdO1xuXG4gICAgICAgIGlmICghaW1hZ2Upe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgaW1hZ2UuZnVsbCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZJbWFnZVBhdGgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3RoaXMucHJldkluZGV4XTtcbiAgICB9XG5cbiAgICBzZXQgcHJldkltYWdlUGF0aCh2YWx1ZTogYW55KXtcbiAgICAgICAgdGhpcy5pbWFnZXNbdGhpcy5wcmV2SW5kZXhdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IGlzRmlyc3QoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFzdCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gKHRoaXMuaW1hZ2VzLmxlbmd0aC0xKTtcbiAgICB9XG5cbiAgICBnZXQgbGF0ZXN0SW1hZ2VJbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBnZXQgZGVzY3JpcHRpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW3RoaXMuaW5kZXhdLmRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIGdldCBjb3VudGVyKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ICsgMSArJy8nKyB0aGlzLmltYWdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgICAgIHN3aXRjaChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxpZ2h0Ym94KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBbJyRldmVudCddKVxuICAgIG9uTW91c2VFbnRlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaGlkZUNvbnRyb2xzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpe1xuICAgIH1cblxuICAgIG5nT25Jbml0KCl7XG4gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZE9wYWNpdHkodGhpcy5jb25maWcuYmFja2dyb3VuZE9wYWNpdHkpO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gdGhpcy5jb25maWcuaW5kZXg7XG4gICAgICAgIC8vZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93TGlnaHRib3ggPSB0cnVlO1xuICAgICAgICB9LCAzMCk7XG5cbiAgICAgICAgdGhpcy5zZXRNYXhEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuc2V0QW5pbWF0aW9uRHVyYXRpb24oKTtcbiAgICB9XG5cbiAgICBjbG9zZUxpZ2h0Ym94KCl7XG4gICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94ID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQoJ2Nsb3NlJyk7XG4gICAgICAgICAgIC8vZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgICAgICB9LCB0aGlzLmNvbmZpZy5hbmltYXRpb25EdXJhdGlvbik7IFxuICAgIH1cblxuICAgIG5leHQoKXtcbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0KXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGVkID0gJ2xvYWRpbmcnO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyckltYWdlTG9hZGVkID09PSAnbG9hZGluZycpe1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDUwKTtcblxuICAgICAgICB0aGlzLnNldE1heERpbWVuc2lvbnMoKTtcbiAgICB9XG4gICAgcHJldigpe1xuICAgICAgICBpZiAodGhpcy5pc0ZpcnN0KXtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZUluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJJbWFnZUxvYWRlZCA9PT0gJ2xvYWRpbmcnKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG5cbiAgICAgICAgdGhpcy5zZXRNYXhEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUxvYWRlZCgpe1xuICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBzZXRCYWNrZ3JvdW5kT3BhY2l0eShvcGFjaXR5OiBhbnkpe1xuICAgICAgICB0aGlzLmhvc3RTdHlsZUJhY2tncm91bmRDb2xvciA9ICdyZ2JhKDAsIDAsIDAsICcrb3BhY2l0eSsnKSc7XG4gICAgfVxuXG4gICAgc2V0TWF4RGltZW5zaW9ucygpe1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbil7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXJFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoMTAwJSAtICcgKyAodGhpcy5kZXNjcmlwdGlvbkhlaWdodCAqIDIpICsgJ3B4KSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXJFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJJbWFnZUVsZW0ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhIZWlnaHQgPSAnY2FsYygnICsgdGhpcy5jb25maWcubGlnaHRib3hNYXhIZWlnaHQgKyAnKSc7XG4gICAgICAgIHRoaXMuY3VyckltYWdlRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gdGhpcy5jb25maWcubGlnaHRib3hNYXhXaWR0aDtcbiAgICB9XG5cbiAgICBzZXRBbmltYXRpb25EdXJhdGlvbigpe1xuICAgICAgICB0aGlzLmhvc3RTdHlsZVRyYW5zaXRpb24gPSAnb3BhY2l0eSAnK3RoaXMuY29uZmlnLmFuaW1hdGlvbkR1cmF0aW9uKydtcyc7XG4gICAgfVxufSJdfQ==