lib-sketch-tool
Version:
## Installing with npm $ npm install --save lib-sketch-tool
453 lines • 61.3 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
import { AvailableGeometricShape } from './../constants/available-geometric-shapes';
import { CanvasManagerService } from './../services/canvas-manager.service';
import { TranslateService } from '@ngx-translate/core';
import { ActionSheetController } from '@ionic/angular';
//import { GestureController } from ‘@ionic/core/dist/collection/utils/gesture/gesture-controller’;
var Black = '#000000';
var Transparent = 'transparent';
var MobileSketchToolComponent = /** @class */ (function () {
function MobileSketchToolComponent(actionSheetCtrl, canvasManagerService, translate) {
this.actionSheetCtrl = actionSheetCtrl;
this.canvasManagerService = canvasManagerService;
this.translate = translate;
this.canvas = new EventEmitter();
this.strokeColor = Black;
this.fillColor = Transparent;
this.isCropping = false;
this.isPanning = false;
this.isLoaded = false;
this.isUndoAvailable = false;
this.isSelectingColor = false;
}
MobileSketchToolComponent.prototype.ngOnInit = function () {
if (this.imageData) {
this.canvasManagerService.emptyCanvas();
if (this.loadedJson == null || this.loadedJson.length < 10) {
this.canvasManagerService.setBackgroundFromURL(this.imageData);
}
else {
this.previousJson = JSON.parse(this.loadedJson);
this.currentJson = this.previousJson;
this.canvasManagerService
.loadfromJson(JSON.parse(this.loadedJson));
}
this.isLoaded = true;
this.previousImageData = this.imageData;
}
this.emitCanvas();
};
MobileSketchToolComponent.prototype.ngOnChanges = function () {
if (this.isLoaded) {
if (this.loadedJson === null || this.loadedJson.length < 10 || this.imageData !== this.previousImageData) {
this.canvasManagerService.emptyCanvas();
this.canvasManagerService.setBackgroundFromURL(this.imageData);
this.previousImageData = this.imageData;
this.currentJson = null;
}
else if (this.loadedJson !== JSON.stringify(this.currentJson)) {
this.previousJson = JSON.parse(this.loadedJson);
this.currentJson = this.previousJson;
this.canvasManagerService
.loadfromJson(JSON.parse(this.loadedJson));
}
}
this.emitCanvas();
};
MobileSketchToolComponent.prototype.ngAfterViewInit = function () {
/*this.gesture = new Gesture(this.element.nativeElement);
this.gesture.listen();
this.gesture.on('pinch', $event => this.pinch($event));*/
};
MobileSketchToolComponent.prototype.ngOnDestroy = function () {
//this.gesture.destroy();
};
Object.defineProperty(MobileSketchToolComponent.prototype, "hasPictograms", {
get: function () {
return !(!this.pictograms);
},
enumerable: true,
configurable: true
});
MobileSketchToolComponent.prototype.addText = function () {
this.disableAllStates();
this.canvasManagerService.addText(this.strokeColor, 'text ');
this.emitCanvas();
};
MobileSketchToolComponent.prototype.addShape = function (shape) {
this.disableAllStates();
this.canvasManagerService.addGeometricShape(this.strokeColor, this.fillColor, AvailableGeometricShape[shape]);
this.emitCanvas();
};
MobileSketchToolComponent.prototype.addImage = function (source) {
this.disableAllStates();
this.canvasManagerService.addImage(this.pictogramsPath + source);
this.emitCanvas();
};
MobileSketchToolComponent.prototype.changeStrokeColor = function () {
this.canvasManagerService.changeSelectedObjectsStrokeColor(this.strokeColor);
this.canvasManagerService.setFreeDrawingBrushColor(this.strokeColor);
this.emitCanvas();
};
MobileSketchToolComponent.prototype.bringFoward = function () {
this.disableAllStates();
this.canvasManagerService.bringSelectedObjectsToFront();
this.emitCanvas();
};
MobileSketchToolComponent.prototype.sendToBack = function () {
this.disableAllStates();
this.canvasManagerService.sendSelectedObjectsToBack();
this.emitCanvas();
};
MobileSketchToolComponent.prototype.crop = function () {
if (this.isCropping) {
this.disableCroppping();
}
else {
this.disableAllStates();
this.isCropping = true;
this.canvasManagerService.resetZoom();
this.canvasManagerService.disableSelection();
this.canvasManagerService.addSelectionRectangle();
this.isUndoAvailable = true;
this.previousJson = this.canvasManagerService.jsonFromCanvas();
this.emitCanvas();
}
};
MobileSketchToolComponent.prototype.disableCroppping = function () {
this.isCropping = false;
this.canvasManagerService.enableSlection();
this.isUndoAvailable = false;
};
MobileSketchToolComponent.prototype.deleteSelection = function () {
this.disableAllStates();
this.canvasManagerService.deleteSelectedObjects();
this.emitCanvas();
};
MobileSketchToolComponent.prototype.mouseUp = function () {
if (this.isCropping) {
this.isCropping = false;
this.canvasManagerService.cropImage();
this.isUndoAvailable = true;
this.emitCanvas();
}
};
MobileSketchToolComponent.prototype.mouseMove = function (event) {
if (this.isCropping) {
this.canvasManagerService.ajustCropRectangle(event);
}
else if (this.isPanning) {
this.canvasManagerService.panCanvas(event);
}
};
MobileSketchToolComponent.prototype.mouseDown = function (event) {
if (this.isCropping) {
this.canvasManagerService.startSelectingCropRectangle(event);
}
else if (this.isPanning) {
this.canvasManagerService.setLastPanPosition(event);
}
};
MobileSketchToolComponent.prototype.pinch = function (event) {
event.preventDefault();
this.disableDrawing();
this.canvasManagerService.zoom(event);
};
MobileSketchToolComponent.prototype.group = function () {
this.disableAllStates();
this.canvasManagerService.groupSelectedObjects();
this.emitCanvas();
};
MobileSketchToolComponent.prototype.undo = function () {
this.canvasManagerService.loadfromJson(this.previousJson);
this.isUndoAvailable = false;
this.emitCanvas();
};
MobileSketchToolComponent.prototype.onColorClicked = function () {
this.isSelectingColor = true;
this.stopPanning();
};
MobileSketchToolComponent.prototype.onMoveClicked = function () {
this.isPanning = !this.isPanning;
this.disableDrawing();
if (this.isPanning) {
this.canvasManagerService.disableSelection();
}
else {
this.canvasManagerService.enableSlection();
}
};
MobileSketchToolComponent.prototype.disablePanning = function () {
this.isPanning = false;
this.canvasManagerService.enableSlection();
};
MobileSketchToolComponent.prototype.disableAllStates = function () {
this.disableDrawing();
this.disablePanning();
};
MobileSketchToolComponent.prototype.stopPanning = function () {
if (this.isPanning) {
this.isPanning = false;
this.canvasManagerService.enableSlection();
}
};
MobileSketchToolComponent.prototype.setColor = function (color) {
this.strokeColor = color;
this.changeStrokeColor();
this.isSelectingColor = false;
this.emitCanvas();
};
MobileSketchToolComponent.prototype.draw = function () {
this.isDrawing = !this.isDrawing;
this.canvasManagerService.toggleFreeDrawing();
this.canvasManagerService.setFreeDrawingBrushColor(this.strokeColor);
if (this.isDrawing) {
this.isPanning = false;
}
};
MobileSketchToolComponent.prototype.disableDrawing = function () {
if (this.isDrawing) {
this.isDrawing = false;
this.canvasManagerService.toggleFreeDrawing();
}
};
MobileSketchToolComponent.prototype.translateShapeButtonsText = function () {
var translationArray = [];
translationArray.push(this.translate.instant('rectangle'));
translationArray.push(this.translate.instant('triangle'));
translationArray.push(this.translate.instant('circle'));
translationArray.push(this.translate.instant('line'));
translationArray.push(this.translate.instant('cross'));
translationArray.push(this.translate.instant('text'));
return translationArray;
};
MobileSketchToolComponent.prototype.presentShapeActionSheet = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var titleText, buttonsText, i, actionSheet;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
this.disableDrawing();
titleText = this.translate.instant('addGeometricShape');
buttonsText = this.translateShapeButtonsText();
i = 0;
return [4 /*yield*/, this.actionSheetCtrl.create({
header: titleText,
buttons: [
{
text: '\uf0c8 ' + buttonsText[i++],
handler: function () {
_this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Rectangle);
}
},
{
text: '\uf0d8 ' + buttonsText[i++],
handler: function () {
_this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Triangle);
}
},
{
text: '\uf111 ' + buttonsText[i++],
handler: function () {
_this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Circle);
}
},
{
text: '\uf068 ' + buttonsText[i++],
handler: function () {
_this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Line);
}
},
{
text: '\uf067 ' + buttonsText[i++],
handler: function () {
_this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Cross);
}
},
{
text: '\uf031 ' + buttonsText[i++],
handler: function () {
_this.canvasManagerService.addText(_this.strokeColor, '');
}
}
]
})];
case 1:
actionSheet = _a.sent();
return [4 /*yield*/, actionSheet.present()];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
MobileSketchToolComponent.prototype.translateEditButtonsText = function () {
var translationArray = [];
translationArray.push(this.translate.instant('crop'));
translationArray.push(this.translate.instant('group'));
translationArray.push(this.translate.instant('bringToFront'));
translationArray.push(this.translate.instant('sendToBack'));
translationArray.push(this.translate.instant('delete'));
return translationArray;
};
MobileSketchToolComponent.prototype.presentEditActionSheet = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var titleText, buttonsText, i, actionSheet;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
this.disableDrawing();
titleText = this.translate.instant('edition');
buttonsText = this.translateEditButtonsText();
i = 0;
return [4 /*yield*/, this.actionSheetCtrl.create({
header: titleText,
buttons: [
{
text: '\uf125 ' + buttonsText[i++],
handler: function () {
_this.crop();
}
},
{
text: '\uf247 ' + buttonsText[i++],
handler: function () {
_this.group();
}
},
{
text: '\uf0de ' + buttonsText[i++],
handler: function () {
_this.bringFoward();
}
},
{
text: '\uf0dd ' + buttonsText[i++],
handler: function () {
_this.sendToBack();
}
},
{
text: '\uf1f8 ' + buttonsText[i++],
handler: function () {
_this.deleteSelection();
}
}
]
})];
case 1:
actionSheet = _a.sent();
return [4 /*yield*/, actionSheet.present()];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
MobileSketchToolComponent.prototype.presentPictogramsActionSheet = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var buttons, actionSheetStyles, images, _loop_1, this_1, i, titleText, actionSheet;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
this.disableDrawing();
buttons = [];
actionSheetStyles = [];
images = this.pictograms;
_loop_1 = function (i) {
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML =
'.customCSSClass' +
i +
'{background: url(' +
"'" +
this_1.pictogramsPath +
images[i] +
"'" +
') no-repeat !important;padding-left:50px !important;height:80px; background-position: left center !important;}';
document.getElementsByTagName('head')[0].appendChild(style);
actionSheetStyles.push(style);
buttons.push({
role: 'destructive',
text: images[i],
cssClass: 'customCSSClass' + i,
handler: function () {
_this.addImage(images[i]);
}
});
};
this_1 = this;
for (i = 0; i < images.length; i++) {
_loop_1(i);
}
titleText = this.translate.instant('addPictogram');
return [4 /*yield*/, this.actionSheetCtrl.create({
header: titleText,
buttons: buttons
})];
case 1:
actionSheet = _a.sent();
actionSheet.onDidDismiss().then(function () {
for (var i = 0; i < actionSheetStyles.length; i++) {
if (actionSheetStyles[i].parentNode != null) {
actionSheetStyles[i].parentNode.removeChild(actionSheetStyles[i]);
}
}
});
return [4 /*yield*/, actionSheet.present()];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
MobileSketchToolComponent.prototype.emitCanvas = function () {
this.canvas.emit(this.canvasManagerService.canvas);
};
tslib_1.__decorate([
ViewChild('pinchElement'),
tslib_1.__metadata("design:type", Object)
], MobileSketchToolComponent.prototype, "element", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], MobileSketchToolComponent.prototype, "imageData", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], MobileSketchToolComponent.prototype, "loadedJson", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], MobileSketchToolComponent.prototype, "pictogramsPath", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Array)
], MobileSketchToolComponent.prototype, "pictograms", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], MobileSketchToolComponent.prototype, "canvas", void 0);
MobileSketchToolComponent = tslib_1.__decorate([
Component({
selector: 'lib-mobile-sketch-tool',
template: "<ion-content>\n <div class=\"div-canvas-container\" (touchstart)=\"mouseDown($event)\" (touchmove)=\"mouseMove($event)\" (touchend)=\"mouseUp()\"\n #pinchElement>\n <canvas id=\"canvas\"></canvas>\n\n <div class=\"color-picker\" *ngIf=\"isSelectingColor\">\n <ion-grid fixed>\n <ion-row>\n <ion-col style=\"background:#660000\" (tap)=\"setColor('#660000')\">\n </ion-col>\n <ion-col style=\"background:#663300\" (tap)=\"setColor('#663300')\">\n </ion-col>\n <ion-col style=\"background:#666600\" (tap)=\"setColor('#666600')\">\n </ion-col>\n <ion-col style=\"background:#006600\" (tap)=\"setColor('#006600')\">\n </ion-col>\n <ion-col style=\"background:#000066\" (tap)=\"setColor('#000066')\">\n </ion-col>\n <ion-col style=\"background:#660066\" (tap)=\"setColor('#660066')\">\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col style=\"background:#CC0000\" (tap)=\"setColor('#CC0000')\">\n </ion-col>\n <ion-col style=\"background:#CC6600\" (tap)=\"setColor('#CC6600')\">\n </ion-col>\n <ion-col style=\"background:#CCCC00\" (tap)=\"setColor('#CCCC00')\">\n </ion-col>\n <ion-col style=\"background:#00CC00\" (tap)=\"setColor('#00CC00')\">\n </ion-col>\n <ion-col style=\"background:#0000CC\" (tap)=\"setColor('#0000CC')\">\n </ion-col>\n <ion-col style=\"background:#CC00CC\" (tap)=\"setColor('#CC00CC')\">\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col style=\"background:#FF0000\" (tap)=\"setColor('#FF0000')\">\n </ion-col>\n <ion-col style=\"background:#FF8000\" (tap)=\"setColor('#FF8000')\">\n </ion-col>\n <ion-col style=\"background:#FFFF00\" (tap)=\"setColor('#FFFF00')\">\n </ion-col>\n <ion-col style=\"background:#00FF00\" (tap)=\"setColor('#00FF00')\">\n </ion-col>\n <ion-col style=\"background:#0000FF\" (tap)=\"setColor('#0000FF')\">\n </ion-col>\n <ion-col style=\"background:#FF00FF\" (tap)=\"setColor('#FF00FF')\">\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col style=\"background:#FF6666\" (tap)=\"setColor('#FF6666')\">\n </ion-col>\n <ion-col style=\"background:#FFB266\" (tap)=\"setColor('#FFB266')\">\n </ion-col>\n <ion-col style=\"background:#FFFF66\" (tap)=\"setColor('#FFFF66')\">\n </ion-col>\n <ion-col style=\"background:#66FF66\" (tap)=\"setColor('#66FF66')\">\n </ion-col>\n <ion-col style=\"background:#6666FF\" (tap)=\"setColor('#6666FF')\">\n </ion-col>\n <ion-col style=\"background:#FF66FF\" (tap)=\"setColor('#FF66FF')\">\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col style=\"background:#FF9999\" (tap)=\"setColor('#FF9999')\">\n </ion-col>\n <ion-col style=\"background:#FFCC99\" (tap)=\"setColor('#FFCC99')\">\n </ion-col>\n <ion-col style=\"background:#FFFF99\" (tap)=\"setColor('#FFFF99')\">\n </ion-col>\n <ion-col style=\"background:#99FF99\" (tap)=\"setColor('#99FF99')\">\n </ion-col>\n <ion-col style=\"background:#9999FF\" (tap)=\"setColor('#9999FF')\">\n </ion-col>\n <ion-col style=\"background:#FF99FF\" (tap)=\"setColor('#FF99FF')\">\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col style=\"background:#FFFFFF\" (tap)=\"setColor('#FFFFFF')\">\n </ion-col>\n <ion-col style=\"background:#C0C0C0\" (tap)=\"setColor('#C0C0C0')\">\n </ion-col>\n <ion-col style=\"background:#808080\" (tap)=\"setColor('#808080')\">\n </ion-col>\n <ion-col style=\"background:#606060\" (tap)=\"setColor('#606060')\">\n </ion-col>\n <ion-col style=\"background:#303030\" (tap)=\"setColor('#606060')\">\n </ion-col>\n <ion-col style=\"background:#000000\" (tap)=\"setColor('#000000')\">\n </ion-col>\n </ion-row>\n </ion-grid>\n </div>\n </div>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <div class=\"div-edit-toolbar\">\n <ion-button class=\"button-edit-toolbar\" size=\"large\" fill=\"clear\" (click)=\"presentShapeActionSheet()\">\n <i class=\"fas fa-shapes\" id=\"icon\"></i>\n </ion-button>\n\n <ion-button class=\"button-edit-toolbar\" size=\"large\" fill=\"clear\" (click)=\"presentPictogramsActionSheet()\" *ngIf=\"hasPictograms\">\n <i class=\"fas fa-images\" id=\"icon\"></i>\n </ion-button>\n\n <ion-button class=\"button-edit-toolbar\" size=\"large\" fill=\"clear\" (click)=\"presentEditActionSheet()\">\n <i class=\"fas fa-edit\" id=\"icon\"></i>\n </ion-button>\n\n <ion-button class=\"button-edit-toolbar\" size=\"large\" [fill]=\"!isDrawing ? 'clear' : 'solid'\" (click)=\"draw()\">\n <i class=\"fas fa-pencil-alt\" id=\"icon\"></i>\n </ion-button>\n\n <ion-button class=\"button-edit-toolbar\" size=\"large\" fill=\"clear\" (click)=\"onColorClicked()\">\n <i class=\"fas fa-palette\" id=\"icon\"></i>\n </ion-button>\n\n <ion-button class=\"button-edit-toolbar\" size=\"large\" [fill]=\"!isPanning ? 'clear' : 'solid'\" (click)=\"onMoveClicked()\">\n <i class=\"fas fa-arrows-alt\" id=\"icon\"></i>\n </ion-button>\n\n <ion-button class=\"button-edit-toolbar\" size=\"large\" fill=\"clear\" (click)=\"undo()\" *ngIf=\"isUndoAvailable\">\n <i class=\"fas fa-undo\" id=\"icon\"></i>\n </ion-button>\n\n </div>\n </ion-toolbar>\n</ion-footer>\n",
providers: [CanvasManagerService],
styles: [".div-canvas-container{height:100%;width:100%;-o-object-fit:contain;object-fit:contain;text-align:center;margin:0 auto;padding:0 auto}.scroll-content{padding:0!important;overflow-y:hidden}.div-edit-toolbar{text-align:center}.button-edit-toolbar{padding:4%!important;margin:0!important}.action-sheet-button{font-family:FontAwesome,Arial}.color-picker{position:absolute;width:100%;height:auto;bottom:0;left:0}#icon{color:#b32017}.col{padding:10px}"]
}),
tslib_1.__metadata("design:paramtypes", [ActionSheetController,
CanvasManagerService,
TranslateService])
], MobileSketchToolComponent);
return MobileSketchToolComponent;
}());
export { MobileSketchToolComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9iaWxlLXNrZXRjaC10b29sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2xpYi1za2V0Y2gtdG9vbC8iLCJzb3VyY2VzIjpbImFwcC9saWItc2tldGNoLXRvb2wvbW9iaWxlLWNvbXBvbmVudC9tb2JpbGUtc2tldGNoLXRvb2wuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQW9DLFlBQVksRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0gsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsbUdBQW1HO0FBRW5HLElBQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQztBQUN4QixJQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFRbEM7SUF3QkUsbUNBQ1MsZUFBc0MsRUFDckMsb0JBQTBDLEVBQzFDLFNBQTJCO1FBRjVCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUNyQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBVnBCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQVkxRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENB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SUFDMUI7UUFBUixLQUFLLEVBQUU7O3FFQUErQjtJQUM5QjtRQUFSLEtBQUssRUFBRTs7aUVBQTZCO0lBRTNCO1FBQVQsTUFBTSxFQUFFOzs2REFBbUQ7SUFqQmpELHlCQUF5QjtRQU5yQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsd0JBQXdCO1lBQ2xDLCtxTEFBa0Q7WUFFbEQsU0FBUyxFQUFFLENBQUMsb0JBQW9CLENBQUM7O1NBQ2xDLENBQUM7aURBMEIwQixxQkFBcUI7WUFDZixvQkFBb0I7WUFDL0IsZ0JBQWdCO09BM0IxQix5QkFBeUIsQ0EwYnJDO0lBQUQsZ0NBQUM7Q0FBQSxBQTFiRCxJQTBiQztTQTFiWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdmFpbGFibGVHZW9tZXRyaWNTaGFwZSB9IGZyb20gJy4vLi4vY29uc3RhbnRzL2F2YWlsYWJsZS1nZW9tZXRyaWMtc2hhcGVzJztcbmltcG9ydCB7IENhbnZhc01hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9jYW52YXMtbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IGZhYnJpYyB9IGZyb20gJ2ZhYnJpYyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb25TaGVldENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG4vL2ltcG9ydCB7IEdlc3R1cmVDb250cm9sbGVyIH0gZnJvbSDigJhAaW9uaWMvY29yZS9kaXN0L2NvbGxlY3Rpb24vdXRpbHMvZ2VzdHVyZS9nZXN0dXJlLWNvbnRyb2xsZXLigJk7XG5cbmNvbnN0IEJsYWNrID0gJyMwMDAwMDAnO1xuY29uc3QgVHJhbnNwYXJlbnQgPSAndHJhbnNwYXJlbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbW9iaWxlLXNrZXRjaC10b29sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vYmlsZS1za2V0Y2gtdG9vbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vYmlsZS1za2V0Y2gtdG9vbC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtDYW52YXNNYW5hZ2VyU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTW9iaWxlU2tldGNoVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvLyBwcml2YXRlIGdlc3R1cmU6IEdlc3R1cmVDb250cm9sbGVyO1xuICBAVmlld0NoaWxkKCdwaW5jaEVsZW1lbnQnKSBlbGVtZW50O1xuXG4gIHB1YmxpYyBmaWxsQ29sb3I6IHN0cmluZztcbiAgcHVibGljIHN0cm9rZUNvbG9yOiBzdHJpbmc7XG4gIHB1YmxpYyBpc0Nyb3BwaW5nOiBib29sZWFuO1xuICBwdWJsaWMgaXNVbmRvQXZhaWxhYmxlOiBib29sZWFuO1xuICBwdWJsaWMgaXNTZWxlY3RpbmdDb2xvcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRHJhd2luZzogYm9vbGVhbjtcbiAgcHVibGljIGlzUGFubmluZzogYm9vbGVhbjtcblxuICBASW5wdXQoKSBwdWJsaWMgaW1hZ2VEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkZWRKc29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBwaWN0b2dyYW1zUGF0aDogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgcGljdG9ncmFtczogW3N0cmluZ107XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBjYW52YXMgPSBuZXcgRXZlbnRFbWl0dGVyPGZhYnJpYy5DYW52YXM+KCk7XG5cbiAgcHJpdmF0ZSBpc0xvYWRlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwcmV2aW91c0ltYWdlRGF0YTogc3RyaW5nO1xuICBwcml2YXRlIGN1cnJlbnRKc29uOiBKU09OO1xuICBwcml2YXRlIHByZXZpb3VzSnNvbjogSlNPTjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aW9uU2hlZXRDdHJsOiBBY3Rpb25TaGVldENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBjYW52YXNNYW5hZ2VyU2VydmljZTogQ2FudmFzTWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdHJva2VDb2xvciA9IEJsYWNrO1xuICAgIHRoaXMuZmlsbENvbG9yID0gVHJhbnNwYXJlbnQ7XG4gICAgdGhpcy5pc0Nyb3BwaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc1Bhbm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc1VuZG9BdmFpbGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzU2VsZWN0aW5nQ29sb3IgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmltYWdlRGF0YSkge1xuICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5lbXB0eUNhbnZhcygpO1xuICAgICAgaWYgKHRoaXMubG9hZGVkSnNvbiA9PSBudWxsIHx8IHRoaXMubG9hZGVkSnNvbi5sZW5ndGggPCAxMCkge1xuICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnNldEJhY2tncm91bmRGcm9tVVJMKHRoaXMuaW1hZ2VEYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNKc29uID0gSlNPTi5wYXJzZSh0aGlzLmxvYWRlZEpzb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnRKc29uID0gdGhpcy5wcmV2aW91c0pzb247XG4gICAgICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2VcbiAgICAgICAgICAubG9hZGZyb21Kc29uKEpTT04ucGFyc2UodGhpcy5sb2FkZWRKc29uKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucHJldmlvdXNJbWFnZURhdGEgPSB0aGlzLmltYWdlRGF0YTtcbiAgICB9XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRlZCkge1xuICAgICAgaWYgKHRoaXMubG9hZGVkSnNvbiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRlZEpzb24ubGVuZ3RoIDwgMTAgfHwgdGhpcy5pbWFnZURhdGEgIT09IHRoaXMucHJldmlvdXNJbWFnZURhdGEpIHtcbiAgICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5lbXB0eUNhbnZhcygpO1xuICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnNldEJhY2tncm91bmRGcm9tVVJMKHRoaXMuaW1hZ2VEYXRhKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0ltYWdlRGF0YSA9IHRoaXMuaW1hZ2VEYXRhO1xuICAgICAgICB0aGlzLmN1cnJlbnRKc29uID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2FkZWRKc29uICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRKc29uKSkge1xuICAgICAgICAgIHRoaXMucHJldmlvdXNKc29uID0gSlNPTi5wYXJzZSh0aGlzLmxvYWRlZEpzb24pO1xuICAgICAgICAgIHRoaXMuY3VycmVudEpzb24gPSB0aGlzLnByZXZpb3VzSnNvbjtcbiAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlXG4gICAgICAgICAgICAubG9hZGZyb21Kc29uKEpTT04ucGFyc2UodGhpcy5sb2FkZWRKc29uKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8qdGhpcy5nZXN0dXJlID0gbmV3IEdlc3R1cmUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuZ2VzdHVyZS5saXN0ZW4oKTtcbiAgICB0aGlzLmdlc3R1cmUub24oJ3BpbmNoJywgJGV2ZW50ID0+IHRoaXMucGluY2goJGV2ZW50KSk7Ki9cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vdGhpcy5nZXN0dXJlLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdldCBoYXNQaWN0b2dyYW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKCF0aGlzLnBpY3RvZ3JhbXMpO1xuICB9XG5cbiAgcHVibGljIGFkZFRleHQoKSB7XG4gICAgdGhpcy5kaXNhYmxlQWxsU3RhdGVzKCk7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5hZGRUZXh0KHRoaXMuc3Ryb2tlQ29sb3IsICd0ZXh0ICcpO1xuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgcHVibGljIGFkZFNoYXBlKHNoYXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRpc2FibGVBbGxTdGF0ZXMoKTtcbiAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFkZEdlb21ldHJpY1NoYXBlKFxuICAgICAgdGhpcy5zdHJva2VDb2xvcixcbiAgICAgIHRoaXMuZmlsbENvbG9yLFxuICAgICAgQXZhaWxhYmxlR2VvbWV0cmljU2hhcGVbc2hhcGVdXG4gICAgKTtcbiAgICB0aGlzLmVtaXRDYW52YXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRJbWFnZShzb3VyY2U6IHN0cmluZykge1xuICAgIHRoaXMuZGlzYWJsZUFsbFN0YXRlcygpO1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuYWRkSW1hZ2UodGhpcy5waWN0b2dyYW1zUGF0aCArIHNvdXJjZSk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU3Ryb2tlQ29sb3IoKSB7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5jaGFuZ2VTZWxlY3RlZE9iamVjdHNTdHJva2VDb2xvcihcbiAgICAgIHRoaXMuc3Ryb2tlQ29sb3JcbiAgICApO1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2Uuc2V0RnJlZURyYXdpbmdCcnVzaENvbG9yKHRoaXMuc3Ryb2tlQ29sb3IpO1xuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgcHVibGljIGJyaW5nRm93YXJkKCkge1xuICAgIHRoaXMuZGlzYWJsZUFsbFN0YXRlcygpO1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuYnJpbmdTZWxlY3RlZE9iamVjdHNUb0Zyb250KCk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgc2VuZFRvQmFjaygpIHtcbiAgICB0aGlzLmRpc2FibGVBbGxTdGF0ZXMoKTtcbiAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnNlbmRTZWxlY3RlZE9iamVjdHNUb0JhY2soKTtcbiAgICB0aGlzLmVtaXRDYW52YXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBjcm9wKCkge1xuICAgIGlmICh0aGlzLmlzQ3JvcHBpbmcpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUNyb3BwcGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVBbGxTdGF0ZXMoKTtcbiAgICAgIHRoaXMuaXNDcm9wcGluZyA9IHRydWU7XG4gICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnJlc2V0Wm9vbSgpO1xuICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5kaXNhYmxlU2VsZWN0aW9