ngx-cropperjs-wrapper
Version:
This angular library is a wrapper of Javascript image cropper
363 lines (354 loc) • 39.5 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('cropperjs'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('ngx-cropperjs-wrapper', ['exports', '@angular/core', '@angular/forms', 'cropperjs', '@angular/common'], factory) :
(factory((global['ngx-cropperjs-wrapper'] = {}),global.ng.core,global.ng.forms,null,global.ng.common));
}(this, (function (exports,core,forms,Cropper,common) { 'use strict';
Cropper = Cropper && Cropper.hasOwnProperty('default') ? Cropper['default'] : Cropper;
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CropperComponent = (function () {
function CropperComponent() {
this.crop = new core.EventEmitter();
this.cropMove = new core.EventEmitter();
this.cropStart = new core.EventEmitter();
this.cropEnd = new core.EventEmitter();
this.ready = new core.EventEmitter();
this.zoom = new core.EventEmitter();
this.init = new core.EventEmitter();
this.fail = new core.EventEmitter();
this.fileChange = new core.EventEmitter();
this.options = /** @type {?} */ ({});
this.data = /** @type {?} */ ({});
this.propagateChange = function (value) { return value; };
}
Object.defineProperty(CropperComponent.prototype, "imageFile", {
get: /**
* @return {?}
*/ function () {
return this.originalFile;
},
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
var _this = this;
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
if (['image/gif', 'image/jpeg', 'image/png'].indexOf(value.type) === -1) {
this.fail.emit(new Error('Invalid input file type'));
return;
}
/** @type {?} */
var reader = new FileReader();
reader.onload = function () {
_this.dataUrl = reader.result;
};
this.originalFile = value;
reader.readAsDataURL(this.originalFile);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CropperComponent.prototype, "imageUrl", {
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
this.dataUrl = value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
CropperComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.data = value;
if (this.data && this.cropper) {
this.cropper.setData(this.data);
}
};
/**
* @param {?} fn
* @return {?}
*/
CropperComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* @return {?}
*/
CropperComponent.prototype.registerOnTouched = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
CropperComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroyCropperIfExists();
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onImageLoad = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var img = (event.target);
this.destroyCropperIfExists();
if ((this.options.minCropWidth && img.naturalWidth < this.options.minCropWidth)
|| (this.options.minCropHeight && img.naturalHeight < this.options.minCropHeight)) {
delete this.dataUrl;
this.fail.emit(new Error('Input image is too small'));
return;
}
this.isReady = false;
this.cropper = new Cropper(img, Object.assign({
crop: this.onCrop.bind(this),
cropmove: this.onCropMove.bind(this),
cropstart: this.onCropStart.bind(this),
cropend: this.onCropEnd.bind(this),
ready: this.onReady.bind(this),
zoom: this.onZoom.bind(this),
}, this.options));
this.init.emit(this.cropper);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCrop = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.options.viewMode !== 0) {
this.correctCropArea();
}
if (this.isReady) {
this.update();
}
this.crop.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.options.viewMode === 0) {
this.correctCropArea();
}
this.update();
this.cropMove.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.update();
this.cropStart.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropEnd = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.correctCropArea();
this.updateFile();
this.update();
this.cropEnd.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onReady = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.data) {
this.cropper.setData(this.data);
this.correctCropArea();
}
else {
this.correctCropArea();
this.update();
}
this.isReady = true;
this.ready.emit(event);
this.updateFile();
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onZoom = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.update();
this.zoom.emit(event);
};
/**
* @return {?}
*/
CropperComponent.prototype.updateFile = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var name = 'cropped_file';
if (typeof this.dataUrl === 'string') {
/** @type {?} */
var urlParams = this.dataUrl.split('/');
name = urlParams[urlParams.length - 1];
}
/** @type {?} */
var mimeType = (this.options.outputOptions && this.options.outputOptions.mimeType) || 'image/png';
/** @type {?} */
var qualityArgument = (this.options.outputOptions && this.options.outputOptions.qualityArgument) || 0.9;
this.cropper.getCroppedCanvas().toBlob(function (blob) {
blob.lastModifiedDate = new Date();
blob.name = _this.originalFile ? _this.originalFile.name : name;
_this.fileChange.emit(blob);
}, mimeType, qualityArgument);
};
/**
* @return {?}
*/
CropperComponent.prototype.correctCropArea = /**
* @return {?}
*/
function () {
/** @type {?} */
var data = this.cropper.getData();
if (data.height < this.options.minCropHeight || data.width < this.options.minCropWidth) {
data.width = Math.max(data.width, this.options.minCropWidth || 0);
data.height = Math.max(data.height, this.options.minCropHeight || 0);
this.cropper.setData(data);
}
};
/**
* @return {?}
*/
CropperComponent.prototype.update = /**
* @return {?}
*/
function () {
this.data = this.cropper.getData();
this.propagateChange(this.data);
};
/**
* @return {?}
*/
CropperComponent.prototype.destroyCropperIfExists = /**
* @return {?}
*/
function () {
if (!this.cropper) {
return;
}
this.cropper.destroy();
delete this.cropper;
};
CropperComponent.decorators = [
{ type: core.Component, args: [{
selector: 'lib-cropper',
template: "<div class=\"cropper-component\" *ngIf=\"dataUrl\">\n <img #image alt=\"image\" [src]=\"dataUrl\" (load)=\"onImageLoad($event)\"/>\n</div>\n",
styles: [".cropper-component img{max-width:100%;max-height:100%}::ng-deep{/*!\n * Cropper.js v1.4.0\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2018-06-01T15:18:09.891Z\n */}::ng-deep .cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}::ng-deep .cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}::ng-deep .cropper-canvas,::ng-deep .cropper-crop-box,::ng-deep .cropper-drag-box,::ng-deep .cropper-modal,::ng-deep .cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}::ng-deep .cropper-canvas,::ng-deep .cropper-wrap-box{overflow:hidden}::ng-deep .cropper-drag-box{background-color:#fff;opacity:0}::ng-deep .cropper-modal{background-color:#000;opacity:.5}::ng-deep .cropper-view-box{display:block;height:100%;outline:#eee solid 1px;overflow:hidden;width:100%}::ng-deep .cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}::ng-deep .cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}::ng-deep .cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}::ng-deep .cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}::ng-deep .cropper-center:after,::ng-deep .cropper-center:before{background-color:#eee;content:' ';display:block;position:absolute}::ng-deep .cropper-center:before{height:1px;left:-3px;top:0;width:7px}::ng-deep .cropper-center:after{height:7px;left:0;top:-3px;width:1px}::ng-deep .cropper-face,::ng-deep .cropper-line,::ng-deep .cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}::ng-deep .cropper-face{background-color:#fff;left:0;top:0}::ng-deep .cropper-line{background-color:#39f}::ng-deep .cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}::ng-deep .cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}::ng-deep .cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}::ng-deep .cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}::ng-deep .cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}::ng-deep .cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}::ng-deep .cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}::ng-deep .cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}::ng-deep .cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}::ng-deep .cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}::ng-deep .cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}::ng-deep .cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}::ng-deep .cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){::ng-deep .cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){::ng-deep .cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){::ng-deep .cropper-point.point-se{height:5px;opacity:.75;width:5px}}::ng-deep .cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}::ng-deep .cropper-invisible{opacity:0}::ng-deep .cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}::ng-deep .cropper-hide{display:block;height:0;position:absolute;width:0}::ng-deep .cropper-hidden{display:none!important}::ng-deep .cropper-move{cursor:move}::ng-deep .cropper-crop{cursor:crosshair}::ng-deep .cropper-disabled .cropper-drag-box,::ng-deep .cropper-disabled .cropper-face,::ng-deep .cropper-disabled .cropper-line,::ng-deep .cropper-disabled .cropper-point{cursor:not-allowed}::ng-deep .cropper-line,::ng-deep .cropper-point,::ng-deep .cropper-point.point-se::before{background-color:#eee}"],
providers: [
{
provide: forms.NG_VALUE_ACCESSOR,
useExisting: core.forwardRef(function () { return CropperComponent; }),
multi: true
}
],
},] },
];
CropperComponent.propDecorators = {
crop: [{ type: core.Output }],
cropMove: [{ type: core.Output }],
cropStart: [{ type: core.Output }],
cropEnd: [{ type: core.Output }],
ready: [{ type: core.Output }],
zoom: [{ type: core.Output }],
init: [{ type: core.Output }],
fail: [{ type: core.Output }],
fileChange: [{ type: core.Output }],
options: [{ type: core.Input }],
imageFile: [{ type: core.Input, args: ['imageFile',] }],
imageUrl: [{ type: core.Input, args: ['imageUrl',] }]
};
return CropperComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgxCropperJsModule = (function () {
function NgxCropperJsModule() {
}
NgxCropperJsModule.decorators = [
{ type: core.NgModule, args: [{
imports: [common.CommonModule],
declarations: [CropperComponent],
exports: [CropperComponent]
},] },
];
return NgxCropperJsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.CropperComponent = CropperComponent;
exports.NgxCropperJsModule = NgxCropperJsModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNyb3BwZXJqcy13cmFwcGVyLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWNyb3BwZXJqcy13cmFwcGVyL2xpYi9jcm9wcGVyL2Nyb3BwZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3JvcHBlcmpzLXdyYXBwZXIvbGliL25neC1jcm9wcGVyLWpzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgQ3JvcHBlciBmcm9tICdjcm9wcGVyanMnO1xuaW1wb3J0IHsgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyb3BwZXJPdXRwdXRPcHRpb25zIHtcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgcXVhbGl0eUFyZ3VtZW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcHBlck9wdGlvbnMgZXh0ZW5kcyBDcm9wcGVyLk9wdGlvbnMge1xuICBtaW5Dcm9wV2lkdGg6IG51bWJlcjtcbiAgbWluQ3JvcEhlaWdodDogbnVtYmVyO1xuICBvdXRwdXRPcHRpb25zOiBDcm9wcGVyT3V0cHV0T3B0aW9ucztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNyb3BwZXInLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjcm9wcGVyLWNvbXBvbmVudFwiICpuZ0lmPVwiZGF0YVVybFwiPlxuICA8aW1nICNpbWFnZSBhbHQ9XCJpbWFnZVwiIFtzcmNdPVwiZGF0YVVybFwiIChsb2FkKT1cIm9uSW1hZ2VMb2FkKCRldmVudClcIi8+XG48L2Rpdj5cbmAsXG4gIHN0eWxlczogW2AuY3JvcHBlci1jb21wb25lbnQgaW1ne21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX06Om5nLWRlZXB7LyohXG4gKiBDcm9wcGVyLmpzIHYxLjQuMFxuICogaHR0cHM6Ly9mZW5neXVhbmNoZW4uZ2l0aHViLmlvL2Nyb3BwZXJqc1xuICpcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQgQ2hlbiBGZW5neXVhblxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogRGF0ZTogMjAxOC0wNi0wMVQxNToxODowOS44OTFaXG4gKi99OjpuZy1kZWVwIC5jcm9wcGVyLWNvbnRhaW5lcntkaXJlY3Rpb246bHRyO2ZvbnQtc2l6ZTowO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dG91Y2gtYWN0aW9uOm5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfTo6bmctZGVlcCAuY3JvcHBlci1jb250YWluZXIgaW1ne2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7aW1hZ2Utb3JpZW50YXRpb246MGRlZzttYXgtaGVpZ2h0Om5vbmUhaW1wb3J0YW50O21heC13aWR0aDpub25lIWltcG9ydGFudDttaW4taGVpZ2h0OjAhaW1wb3J0YW50O21pbi13aWR0aDowIWltcG9ydGFudDt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1jYW52YXMsOjpuZy1kZWVwIC5jcm9wcGVyLWNyb3AtYm94LDo6bmctZGVlcCAuY3JvcHBlci1kcmFnLWJveCw6Om5nLWRlZXAgLmNyb3BwZXItbW9kYWwsOjpuZy1kZWVwIC5jcm9wcGVyLXdyYXAtYm94e2JvdHRvbTowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowfTo6bmctZGVlcCAuY3JvcHBlci1jYW52YXMsOjpuZy1kZWVwIC5jcm9wcGVyLXdyYXAtYm94e292ZXJmbG93OmhpZGRlbn06Om5nLWRlZXAgLmNyb3BwZXItZHJhZy1ib3h7YmFja2dyb3VuZC1jb2xvcjojZmZmO29wYWNpdHk6MH06Om5nLWRlZXAgLmNyb3BwZXItbW9kYWx7YmFja2dyb3VuZC1jb2xvcjojMDAwO29wYWNpdHk6LjV9OjpuZy1kZWVwIC5jcm9wcGVyLXZpZXctYm94e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7b3V0bGluZTojZWVlIHNvbGlkIDFweDtvdmVyZmxvdzpoaWRkZW47d2lkdGg6MTAwJX06Om5nLWRlZXAgLmNyb3BwZXItZGFzaGVke2JvcmRlcjowIGRhc2hlZCAjZWVlO2Rpc3BsYXk6YmxvY2s7b3BhY2l0eTouNTtwb3NpdGlvbjphYnNvbHV0ZX06Om5nLWRlZXAgLmNyb3BwZXItZGFzaGVkLmRhc2hlZC1oe2JvcmRlci1ib3R0b20td2lkdGg6MXB4O2JvcmRlci10b3Atd2lkdGg6MXB4O2hlaWdodDozMy4zMzMzMyU7bGVmdDowO3RvcDozMy4zMzMzMyU7d2lkdGg6MTAwJX06Om5nLWRlZXAgLmNyb3BwZXItZGFzaGVkLmRhc2hlZC12e2JvcmRlci1sZWZ0LXdpZHRoOjFweDtib3JkZXItcmlnaHQtd2lkdGg6MXB4O2hlaWdodDoxMDAlO2xlZnQ6MzMuMzMzMzMlO3RvcDowO3dpZHRoOjMzLjMzMzMzJX06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVye2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjA7bGVmdDo1MCU7b3BhY2l0eTouNzU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt3aWR0aDowfTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXI6YWZ0ZXIsOjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZWVlO2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGV9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjpiZWZvcmV7aGVpZ2h0OjFweDtsZWZ0Oi0zcHg7dG9wOjA7d2lkdGg6N3B4fTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXI6YWZ0ZXJ7aGVpZ2h0OjdweDtsZWZ0OjA7dG9wOi0zcHg7d2lkdGg6MXB4fTo6bmctZGVlcCAuY3JvcHBlci1mYWNlLDo6bmctZGVlcCAuY3JvcHBlci1saW5lLDo6bmctZGVlcCAuY3JvcHBlci1wb2ludHtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO29wYWNpdHk6LjE7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJX06Om5nLWRlZXAgLmNyb3BwZXItZmFjZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7bGVmdDowO3RvcDowfTo6bmctZGVlcCAuY3JvcHBlci1saW5le2JhY2tncm91bmQtY29sb3I6IzM5Zn06Om5nLWRlZXAgLmNyb3BwZXItbGluZS5saW5lLWV7Y3Vyc29yOmV3LXJlc2l6ZTtyaWdodDotM3B4O3RvcDowO3dpZHRoOjVweH06Om5nLWRlZXAgLmNyb3BwZXItbGluZS5saW5lLW57Y3Vyc29yOm5zLXJlc2l6ZTtoZWlnaHQ6NXB4O2xlZnQ6MDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItbGluZS5saW5lLXd7Y3Vyc29yOmV3LXJlc2l6ZTtsZWZ0Oi0zcHg7dG9wOjA7d2lkdGg6NXB4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtc3tib3R0b206LTNweDtjdXJzb3I6bnMtcmVzaXplO2hlaWdodDo1cHg7bGVmdDowfTo6bmctZGVlcCAuY3JvcHBlci1wb2ludHtiYWNrZ3JvdW5kLWNvbG9yOiMzOWY7aGVpZ2h0OjVweDtvcGFjaXR5Oi43NTt3aWR0aDo1cHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LWV7Y3Vyc29yOmV3LXJlc2l6ZTttYXJnaW4tdG9wOi0zcHg7cmlnaHQ6LTNweDt0b3A6NTAlfTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1ue2N1cnNvcjpucy1yZXNpemU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtd3tjdXJzb3I6ZXctcmVzaXplO2xlZnQ6LTNweDttYXJnaW4tdG9wOi0zcHg7dG9wOjUwJX06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc3tib3R0b206LTNweDtjdXJzb3I6cy1yZXNpemU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtbmV7Y3Vyc29yOm5lc3ctcmVzaXplO3JpZ2h0Oi0zcHg7dG9wOi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LW53e2N1cnNvcjpud3NlLXJlc2l6ZTtsZWZ0Oi0zcHg7dG9wOi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXN3e2JvdHRvbTotM3B4O2N1cnNvcjpuZXN3LXJlc2l6ZTtsZWZ0Oi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2JvdHRvbTotM3B4O2N1cnNvcjpud3NlLXJlc2l6ZTtoZWlnaHQ6MjBweDtvcGFjaXR5OjE7cmlnaHQ6LTNweDt3aWR0aDoyMHB4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXs6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7aGVpZ2h0OjE1cHg7d2lkdGg6MTVweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpezo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtoZWlnaHQ6MTBweDt3aWR0aDoxMHB4fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpezo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtoZWlnaHQ6NXB4O29wYWNpdHk6Ljc1O3dpZHRoOjVweH19OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNlOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMzOWY7Ym90dG9tOi01MCU7Y29udGVudDonICc7ZGlzcGxheTpibG9jaztoZWlnaHQ6MjAwJTtvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTUwJTt3aWR0aDoyMDAlfTo6bmctZGVlcCAuY3JvcHBlci1pbnZpc2libGV7b3BhY2l0eTowfTo6bmctZGVlcCAuY3JvcHBlci1iZ3tiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFBUU1BQUFBbFBXMGlBQUFBQTNOQ1NWUUlDQWpiNFUvZ0FBQUFCbEJNVkVYTXpNei8vLy9UalJWMkFBQUFDWEJJV1hNQUFBcnJBQUFLNndHQ2l3MWFBQUFBSEhSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCR2FYSmxkMjl5YTNNZ1ExTTI2THl5akFBQUFCRkpSRUZVQ0psaitNL0FnQlZoRi8wUEFINi9EL0hrRHhPR0FBQUFBRWxGVGtTdVFtQ0MpfTo6bmctZGVlcCAuY3JvcHBlci1oaWRle2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MH06Om5nLWRlZXAgLmNyb3BwZXItaGlkZGVue2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9OjpuZy1kZWVwIC5jcm9wcGVyLW1vdmV7Y3Vyc29yOm1vdmV9OjpuZy1kZWVwIC5jcm9wcGVyLWNyb3B7Y3Vyc29yOmNyb3NzaGFpcn06Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItZHJhZy1ib3gsOjpuZy1kZWVwIC5jcm9wcGVyLWRpc2FibGVkIC5jcm9wcGVyLWZhY2UsOjpuZy1kZWVwIC5jcm9wcGVyLWRpc2FibGVkIC5jcm9wcGVyLWxpbmUsOjpuZy1kZWVwIC5jcm9wcGVyLWRpc2FibGVkIC5jcm9wcGVyLXBvaW50e2N1cnNvcjpub3QtYWxsb3dlZH06Om5nLWRlZXAgLmNyb3BwZXItbGluZSw6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQsOjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNlOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZWVlfWBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENyb3BwZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENyb3BwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBAT3V0cHV0KCkgY3JvcCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcm9wTW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcm9wU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY3JvcEVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSB6b29tID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPENyb3BwZXI+KCk7XG4gIEBPdXRwdXQoKSBmYWlsID0gbmV3IEV2ZW50RW1pdHRlcjxFcnJvcj4oKTtcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG5cbiAgQElucHV0KCkgb3B0aW9ucyA9IHt9IGFzIENyb3BwZXJPcHRpb25zO1xuXG4gIGdldCBpbWFnZUZpbGUoKTogRmlsZSB7XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxGaWxlO1xuICB9XG5cbiAgQElucHV0KCdpbWFnZUZpbGUnKSBzZXQgaW1hZ2VGaWxlKHZhbHVlOiBGaWxlKSB7XG4gICAgZGVsZXRlIHRoaXMuZGF0YVVybDtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoWydpbWFnZS9naWYnLCAnaW1hZ2UvanBlZycsICdpbWFnZS9wbmcnXS5pbmRleE9mKHZhbHVlLnR5cGUpID09PSAtMSkge1xuICAgICAgdGhpcy5mYWlsLmVtaXQobmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGZpbGUgdHlwZScpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFVcmwgPSByZWFkZXIucmVzdWx0O1xuICAgIH07XG5cbiAgICB0aGlzLm9yaWdpbmFsRmlsZSA9IHZhbHVlO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHRoaXMub3JpZ2luYWxGaWxlKTtcbiAgfVxuXG4gIEBJbnB1dCgnaW1hZ2VVcmwnKSBzZXQgaW1hZ2VVcmwodmFsdWU6IHN0cmluZykge1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFVcmw7XG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhVXJsID0gdmFsdWU7XG4gIH1cblxuICBkYXRhVXJsOiBzdHJpbmd8U2FmZVVybDtcbiAgcHJpdmF0ZSBjcm9wcGVyOiBDcm9wcGVyO1xuICBwcml2YXRlIGlzUmVhZHk6IGJvb2xlYW47XG4gIHByaXZhdGUgb3JpZ2luYWxGaWxlOiBGaWxlO1xuICBwcml2YXRlIGRhdGEgPSB7fSBhcyBDcm9wcGVyLlNldERhdGFPcHRpb25zO1xuXG4gIHByb3BhZ2F0ZUNoYW5nZSA9ICh2YWx1ZTogQ3JvcHBlci5TZXREYXRhT3B0aW9ucykgPT4gdmFsdWU7XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogQ3JvcHBlci5TZXREYXRhT3B0aW9ucykge1xuICAgIHRoaXMuZGF0YSA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmNyb3BwZXIpIHtcbiAgICAgIHRoaXMuY3JvcHBlci5zZXREYXRhKHRoaXMuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZCgpIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG4gIH1cblxuICBvbkltYWdlTG9hZChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbWcgPSBldmVudC50YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcblxuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuXG4gICAgaWYgKCh0aGlzLm9wdGlvbnMubWluQ3JvcFdpZHRoICYmIGltZy5uYXR1cmFsV2lkdGggPCB0aGlzLm9wdGlvbnMubWluQ3JvcFdpZHRoKVxuICAgICAgfHwgKHRoaXMub3B0aW9ucy5taW5Dcm9wSGVpZ2h0ICYmIGltZy5uYXR1cmFsSGVpZ2h0IDwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQpKSB7XG4gICAgICBkZWxldGUgdGhpcy5kYXRhVXJsO1xuICAgICAgdGhpcy5mYWlsLmVtaXQobmV3IEVycm9yKCdJbnB1dCBpbWFnZSBpcyB0b28gc21hbGwnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5jcm9wcGVyID0gbmV3IENyb3BwZXIoaW1nLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNyb3A6IHRoaXMub25Dcm9wLmJpbmQodGhpcyksXG4gICAgICBjcm9wbW92ZTogdGhpcy5vbkNyb3BNb3ZlLmJpbmQodGhpcyksXG4gICAgICBjcm9wc3RhcnQ6IHRoaXMub25Dcm9wU3RhcnQuYmluZCh0aGlzKSxcbiAgICAgIGNyb3BlbmQ6IHRoaXMub25Dcm9wRW5kLmJpbmQodGhpcyksXG4gICAgICByZWFkeTogdGhpcy5vblJlYWR5LmJpbmQodGhpcyksXG4gICAgICB6b29tOiB0aGlzLm9uWm9vbS5iaW5kKHRoaXMpLFxuICAgIH0sIHRoaXMub3B0aW9ucykpO1xuXG4gICAgdGhpcy5pbml0LmVtaXQodGhpcy5jcm9wcGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmlld01vZGUgIT09IDApIHtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNSZWFkeSkge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyb3AuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uQ3JvcE1vdmUoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52aWV3TW9kZSA9PT0gMCkge1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIHRoaXMuY3JvcE1vdmUuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uQ3JvcFN0YXJ0KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5jcm9wU3RhcnQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uQ3JvcEVuZChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIHRoaXMudXBkYXRlRmlsZSgpO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5jcm9wRW5kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlYWR5KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuY3JvcHBlci5zZXREYXRhKHRoaXMuZGF0YSk7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVhZHkuZW1pdChldmVudCk7XG4gICAgdGhpcy51cGRhdGVGaWxlKCk7XG4gIH1cblxuICBwcml2YXRlIG9uWm9vbShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIHRoaXMuem9vbS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsZSgpIHtcbiAgICBsZXQgbmFtZSA9ICdjcm9wcGVkX2ZpbGUnO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmRhdGFVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSB0aGlzLmRhdGFVcmwuc3BsaXQoJy8nKTtcbiAgICAgIG5hbWUgPSB1cmxQYXJhbXNbdXJsUGFyYW1zLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuXG4gICAgY29uc3QgbWltZVR5cGUgPSAodGhpcy5vcHRpb25zLm91dHB1dE9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm91dHB1dE9wdGlvbnMubWltZVR5cGUpIHx8ICdpbWFnZS9wbmcnO1xuICAgIGNvbnN0IHF1YWxpdHlBcmd1bWVudCA9ICh0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucy5xdWFsaXR5QXJndW1lbnQpIHx8IDAuOTtcblxuICAgIHRoaXMuY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKCkudG9CbG9iKChibG9iOiBhbnkpID0+IHtcbiAgICAgIGJsb2IubGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBibG9iLm5hbWUgPSB0aGlzLm9yaWdpbmFsRmlsZSA/IHRoaXMub3JpZ2luYWxGaWxlLm5hbWUgOiBuYW1lO1xuICAgICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoYmxvYik7XG4gICAgfSwgbWltZVR5cGUsIHF1YWxpdHlBcmd1bWVudCk7XG4gIH1cblxuICBwcml2YXRlIGNvcnJlY3RDcm9wQXJlYSgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jcm9wcGVyLmdldERhdGEoKTtcblxuICAgIGlmIChkYXRhLmhlaWdodCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wSGVpZ2h0IHx8IGRhdGEud2lkdGggPCB0aGlzLm9wdGlvbnMubWluQ3JvcFdpZHRoKSB7XG4gICAgICBkYXRhLndpZHRoID0gTWF0aC5tYXgoZGF0YS53aWR0aCwgdGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aCB8fCAwKTtcbiAgICAgIGRhdGEuaGVpZ2h0ID0gTWF0aC5tYXgoZGF0YS5oZWlnaHQsIHRoaXMub3B0aW9ucy5taW5Dcm9wSGVpZ2h0IHx8IDApO1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEoZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKSB7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5jcm9wcGVyLmdldERhdGEoKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLmRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Q3JvcHBlcklmRXhpc3RzKCkge1xuICAgIGlmICghdGhpcy5jcm9wcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jcm9wcGVyLmRlc3Ryb3koKTtcbiAgICBkZWxldGUgdGhpcy5jcm9wcGVyO1xuICB9XG5cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jcm9wcGVyL2Nyb3BwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDcm9wcGVyQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0Nyb3BwZXJDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5neENyb3BwZXJKc01vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJDb21wb25lbnQiLCJOR19WQUxVRV9BQ0NFU1NPUiIsImZvcndhcmRSZWYiLCJPdXRwdXQiLCJJbnB1dCIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7d0JBeUNtQixJQUFJQSxpQkFBWSxFQUFlOzRCQUMzQixJQUFJQSxpQkFBWSxFQUFlOzZCQUM5QixJQUFJQSxpQkFBWSxFQUFlOzJCQUNqQyxJQUFJQSxpQkFBWSxFQUFlO3lCQUNqQyxJQUFJQSxpQkFBWSxFQUFlO3dCQUNoQyxJQUFJQSxpQkFBWSxFQUFlO3dCQUMvQixJQUFJQSxpQkFBWSxFQUFXO3dCQUMzQixJQUFJQSxpQkFBWSxFQUFTOzhCQUNuQixJQUFJQSxpQkFBWSxFQUFROzZDQUU1QixFQUFvQjswQ0EyQ3hCLEVBQTRCO21DQUV6QixVQUFDLEtBQTZCLElBQUssT0FBQSxLQUFLLEdBQUE7O1FBM0MxRCxzQkFBSSx1Q0FBUzs7O2dCQUFiO2dCQUNFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQzthQUMxQjs7OztnQkFFRCxVQUFrQyxLQUFXO2dCQUE3QyxpQkFvQkM7Z0JBbkJDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDcEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBRTlCLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ1YsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7b0JBQ3JELE9BQU87aUJBQ1I7O2dCQUVELElBQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7b0JBQ2QsS0FBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUM5QixDQUFDO2dCQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN6Qzs7O1dBdEJBO1FBd0JELHNCQUF1QixzQ0FBUTs7OztnQkFBL0IsVUFBZ0MsS0FBYTtnQkFDM0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFFOUIsSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDVixPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQ3RCOzs7V0FBQTs7Ozs7UUFVRCxxQ0FBVTs7OztZQUFWLFVBQVcsS0FBNkI7Z0JBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO2dCQUVsQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNqQzthQUNGOzs7OztRQUVELDJDQUFnQjs7OztZQUFoQixVQUFpQixFQUFFO2dCQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQzthQUMzQjs7OztRQUVELDRDQUFpQjs7O1lBQWpCLGVBQXNCOzs7O1FBRXRCLHNDQUFXOzs7WUFBWDtnQkFDRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUMvQjs7Ozs7UUFFRCxzQ0FBVzs7OztZQUFYLFVBQVksS0FBWTs7Z0JBQ3RCLElBQU0sR0FBRyxJQUFHLEtBQUssQ0FBQyxNQUEwQixFQUFDO2dCQUU3QyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFFOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZO3dCQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUU7b0JBQ25GLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO29CQUM1QyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNsQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUM3QixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUVsQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDOUI7Ozs7O1FBRU8saUNBQU07Ozs7c0JBQUMsS0FBa0I7Z0JBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO29CQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQ3hCO2dCQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDaEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUNmO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7UUFHaEIscUNBQVU7Ozs7c0JBQUMsS0FBa0I7Z0JBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO29CQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQ3hCO2dCQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O1FBR3BCLHNDQUFXOzs7O3NCQUFDLEtBQWtCO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7OztRQUdyQixvQ0FBUzs7OztzQkFBQyxLQUFrQjtnQkFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O1FBR25CLGtDQUFPOzs7O3NCQUFDLEtBQWtCO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUNmO2dCQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOzs7Ozs7UUFHWixpQ0FBTTs7OztzQkFBQyxLQUFrQjtnQkFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztRQUdoQixxQ0FBVTs7Ozs7O2dCQUNoQixJQUFJLElBQUksR0FBRyxjQUFjLENBQUM7Z0JBRTFCLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTs7b0JBQ3BDLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMxQyxJQUFJLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3hDOztnQkFHRCxJQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUM7O2dCQUNwRyxJQUFNLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGVBQWUsS0FBSyxHQUFHLENBQUM7Z0JBRTFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFTO29CQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDOUQsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDOzs7OztRQUd4QiwwQ0FBZTs7Ozs7Z0JBQ3JCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRXBDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO29CQUN0RixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1Qjs7Ozs7UUFHSyxpQ0FBTTs7OztnQkFDWixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7OztRQUcxQixpREFBc0I7Ozs7Z0JBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNqQixPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQzs7O29CQXpOdkJDLGNBQVMsU0FBQzt3QkFDVCxRQUFRLEVBQUUsYUFBYTt3QkFDdkIsUUFBUSxFQUFFLCtJQUdYO3dCQUNDLE1BQU0sRUFBRSxDQUFDLHN5SUFRMmhJLENBQUM7d0JBQ3JpSSxTQUFTLEVBQUU7NEJBQ1Q7Z0NBQ0UsT0FBTyxFQUFFQyx1QkFBaUI7Z0NBQzFCLFdBQVcsRUFBRUMsZUFBVSxDQUFDLGNBQU0sT0FBQSxnQkFBZ0IsR0FBQSxDQUFDO2dDQUMvQyxLQUFLLEVBQUUsSUFBSTs2QkFDWjt5QkFDRjtxQkFDRjs7OzJCQUdFQyxXQUFNOytCQUNOQSxXQUFNO2dDQUNOQSxXQUFNOzhCQUNOQSxXQUFNOzRCQUNOQSxXQUFNOzJCQUNOQSxXQUFNOzJCQUNOQSxXQUFNOzJCQUNOQSxXQUFNO2lDQUNOQSxXQUFNOzhCQUVOQyxVQUFLO2dDQU1MQSxVQUFLLFNBQUMsV0FBVzsrQkFzQmpCQSxVQUFLLFNBQUMsVUFBVTs7K0JBL0VuQjs7Ozs7OztBQ0FBOzs7O29CQUlDQyxhQUFRLFNBQUM7d0JBQ1IsT0FBTyxFQUFFLENBQUNDLG1CQUFZLENBQUM7d0JBQ3ZCLFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDO3dCQUNoQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztxQkFDNUI7O2lDQVJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0=