dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
360 lines • 31.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Output, ViewChild } from '@angular/core';
import { distance, getInsertPointBetweenCircleAndLine, pointInCicle } from './geometric';
/**
* @record
*/
export function MoveEvent() { }
if (false) {
/** @type {?} */
MoveEvent.prototype.startDragPoint;
}
var PortraitMaskComponent = /** @class */ (function () {
function PortraitMaskComponent(elRef) {
this.elRef = elRef;
this.hostClass = true;
this.cx = 100;
this.cy = 100;
this.r = 50;
this.handleX = 150;
this.handleY = 100;
this.handleR = 6;
this.cursor = 'grab';
this.startDrag = new EventEmitter();
this.dragging = new EventEmitter();
this.maskChange = new EventEmitter();
this.mouseDown = this.mouseDown.bind(this);
this.mouseUp = this.mouseUp.bind(this);
this.move = this.move.bind(this);
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
PortraitMaskComponent.prototype.toScreenPoint = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
/** @type {?} */
var pt = this.svg.nativeElement.createSVGPoint();
pt.x = x;
pt.y = y;
return pt.matrixTransform(this.svg.nativeElement.getScreenCTM());
};
// 将一个距离转换成屏幕尺寸
// 将一个距离转换成屏幕尺寸
/**
* @param {?} val
* @return {?}
*/
PortraitMaskComponent.prototype.toScreenDistance =
// 将一个距离转换成屏幕尺寸
/**
* @param {?} val
* @return {?}
*/
function (val) {
/** @type {?} */
var p1 = this.toScreenPoint(0, 0);
/** @type {?} */
var p2 = this.toScreenPoint(val, 0);
return p2.x - p1.x;
};
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
PortraitMaskComponent.prototype.toSVGPoint = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
/** @type {?} */
var pt = this.svg.nativeElement.createSVGPoint();
pt.x = x;
pt.y = y;
return pt.matrixTransform(this.svg.nativeElement.getScreenCTM().inverse());
};
// 获取handle的受限的圆心坐标 svg
// 获取handle的受限的圆心坐标 svg
/**
* @param {?} mousePoint
* @return {?}
*/
PortraitMaskComponent.prototype.getLimitHandleCenterPostion =
// 获取handle的受限的圆心坐标 svg
/**
* @param {?} mousePoint
* @return {?}
*/
function (mousePoint) {
// 根据mouse point拿到对应的圆心位置
/** @type {?} */
var point = { x: mousePoint.x - this.handleDistanceOffset.x, y: mousePoint.y - this.handleDistanceOffset.y };
// Create an SVGPoint for future math
/** @type {?} */
var r = distance(point.x, point.y, this.cx, this.cy);
if (r <= this.maxR) {
return point;
}
r = this.maxR;
/** @type {?} */
var arr = getInsertPointBetweenCircleAndLine(this.cx, this.cy, point.x, point.y, this.cx, this.cy, r);
/** @type {?} */
var d1 = distance(point.x, point.y, arr[0].x, arr[0].y);
/** @type {?} */
var d2 = distance(point.x, point.y, arr[1].x, arr[1].y);
if (d1 < d2) {
return arr[0];
}
else {
return arr[1];
}
};
// tslint:disable-next-line: quotemark
// tslint:disable-next-line: quotemark
/**
* @param {?} event
* @return {?}
*/
PortraitMaskComponent.prototype.mouseDown =
// tslint:disable-next-line: quotemark
/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.button !== 0) {
return;
}
/** @type {?} */
var p = this.toSVGPoint(event.x, event.y);
this.handleDistanceOffset = { x: p.x - this.handleX, y: p.y - this.handleY };
this.maskDistanceOffset = { x: p.x - this.cx, y: p.y - this.cy };
this.startDragPoint = { x: event.x, y: event.y };
if (pointInCicle(p.x, p.y, this.handleX, this.handleY, this.handleR)) {
this.dragType = 'handle';
}
else if (pointInCicle(p.x, p.y, this.cx, this.cy, this.r)) {
this.dragType = 'mask';
}
else {
this.dragType = 'outside';
this.startDrag.emit(event);
}
window.addEventListener('mousemove', this.move, false);
window.addEventListener('mouseup', this.mouseUp, false);
event.stopPropagation();
};
/**
* @return {?}
*/
PortraitMaskComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.calcSize();
};
/**
* @return {?}
*/
PortraitMaskComponent.prototype.emitMaskRect = /**
* @return {?}
*/
function () {
/** @type {?} */
var p1 = this.toScreenPoint(this.cx - this.r, this.cy - this.r);
/** @type {?} */
var p2 = this.toScreenPoint(this.cx + this.r, this.cy + this.r);
this.maskChange.emit({
left: p1.x,
top: p1.y,
right: p2.x,
bottom: p2.y,
width: p2.x - p1.x,
height: p2.y - p1.y
});
};
/**
* @return {?}
*/
PortraitMaskComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.emitMaskRect();
};
/**
* @param {?} event
* @return {?}
*/
PortraitMaskComponent.prototype.move = /**
* @param {?} event
* @return {?}
*/
function (event) {
switch (this.dragType) {
case 'handle': {
/** @type {?} */
var p = this.getLimitHandleCenterPostion(this.toSVGPoint(event.x, event.y));
this.handleX = p.x;
this.handleY = p.y;
this.r = distance(this.handleX, this.handleY, this.cx, this.cy);
this.emitMaskRect();
break;
}
case 'mask':
{
/** @type {?} */
var p = this.toSVGPoint(event.x, event.y);
p.x = Math.max(0, Math.min(this.svgWidth, p.x));
p.y = Math.max(0, Math.min(this.svgHeight, p.y));
this.cx = p.x - this.maskDistanceOffset.x;
this.cy = p.y - this.maskDistanceOffset.y;
this.handleX = p.x - this.handleDistanceOffset.x;
this.handleY = p.y - this.handleDistanceOffset.y;
this.emitMaskRect();
}
break;
case 'outside':
this.dragging.emit({ x: event.x, y: event.y });
break;
default:
break;
}
event.stopPropagation();
event.preventDefault();
};
/**
* @param {?} event
* @return {?}
*/
PortraitMaskComponent.prototype.mouseUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
window.removeEventListener('mousemove', this.move, false);
window.removeEventListener('mouseup', this.mouseUp, false);
};
// 重置到中心点,半径为最大
// 重置到中心点,半径为最大
/**
* @return {?}
*/
PortraitMaskComponent.prototype.reset =
// 重置到中心点,半径为最大
/**
* @return {?}
*/
function () {
this.calcSize();
this.emitMaskRect();
};
/**
* @private
* @return {?}
*/
PortraitMaskComponent.prototype.calcSize = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var rect = this.elRef.nativeElement.getBoundingClientRect();
/** @type {?} */
var p = this.toSVGPoint(rect.left + rect.width / 2, rect.top + rect.height / 2);
/** @type {?} */
var p1 = this.toSVGPoint(rect.left, rect.top);
/** @type {?} */
var p2 = this.toSVGPoint(rect.right, rect.bottom);
this.cx = p.x;
this.cy = p.y;
this.maxR = this.r = (p2.x - p1.x) / 2;
this.svgWidth = p2.x - p1.x;
this.svgHeight = p2.y - p1.y;
this.handleX = this.cx + this.r;
this.handleY = this.cy;
};
PortraitMaskComponent.decorators = [
{ type: Component, args: [{
selector: 'common-portrait-mask',
template: "<svg version=\"1.1\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\r\n\txmlns:xlink=\"http://www.w3.org/1999/xlink\" #svg>\r\n\t<style>\r\n\t\t.handle {\r\n\t\t\tcursor: grab;\r\n\t\t}\r\n\t</style>\r\n\t<defs>\r\n\t\t<mask id=\"Mask\">\r\n\t\t\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\r\n\t\t\t<circle [attr.cx]=\"cx\" [attr.cy]=\"cy\" [attr.r]=\"r\" />\r\n\t\t</mask>\r\n\t</defs>\r\n\r\n\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" opacity=\"0.4\"\r\n\t\tmask=\"url(#Mask)\" />\r\n\t<circle [attr.cx]=\"cx\" [attr.cy]=\"cy\" [attr.r]=\"r\" stroke-width=\"2\" #maskCicle\r\n\t\tclass=\"border-cicle\"/>\r\n\t<circle [attr.cx]=\"handleX\" [attr.cy]=\"handleY\" [attr.r]=\"handleR\" class=\"handle\"/>\r\n</svg>",
styles: [":host{width:100%;height:100%;display:block;position:relative}.handle{cursor:hand}"]
}] }
];
/** @nocollapse */
PortraitMaskComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
PortraitMaskComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.portrait-mask',] }],
startDrag: [{ type: Output }],
dragging: [{ type: Output }],
maskChange: [{ type: Output }],
svg: [{ type: ViewChild, args: ['svg', { static: true },] }],
handle: [{ type: ViewChild, args: ['handle', { static: true },] }],
maskCicle: [{ type: ViewChild, args: ['maskCicle', { static: true },] }],
mouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
return PortraitMaskComponent;
}());
export { PortraitMaskComponent };
if (false) {
/** @type {?} */
PortraitMaskComponent.prototype.hostClass;
/** @type {?} */
PortraitMaskComponent.prototype.cx;
/** @type {?} */
PortraitMaskComponent.prototype.cy;
/** @type {?} */
PortraitMaskComponent.prototype.r;
/** @type {?} */
PortraitMaskComponent.prototype.maxR;
/** @type {?} */
PortraitMaskComponent.prototype.svgWidth;
/** @type {?} */
PortraitMaskComponent.prototype.svgHeight;
/** @type {?} */
PortraitMaskComponent.prototype.handleX;
/** @type {?} */
PortraitMaskComponent.prototype.handleY;
/** @type {?} */
PortraitMaskComponent.prototype.handleR;
/** @type {?} */
PortraitMaskComponent.prototype.cursor;
/** @type {?} */
PortraitMaskComponent.prototype.maskDistanceOffset;
/** @type {?} */
PortraitMaskComponent.prototype.handleDistanceOffset;
/** @type {?} */
PortraitMaskComponent.prototype.startDragPoint;
/** @type {?} */
PortraitMaskComponent.prototype.dragType;
/** @type {?} */
PortraitMaskComponent.prototype.startDrag;
/** @type {?} */
PortraitMaskComponent.prototype.dragging;
/** @type {?} */
PortraitMaskComponent.prototype.maskChange;
/** @type {?} */
PortraitMaskComponent.prototype.svg;
/** @type {?} */
PortraitMaskComponent.prototype.handle;
/** @type {?} */
PortraitMaskComponent.prototype.maskCicle;
/**
* @type {?}
* @private
*/
PortraitMaskComponent.prototype.elRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHJhaXQtbWFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlcmluZm8vcG9ydHJhaXQtZWRpdC9wb3J0cmFpdC1tYXNrL3BvcnRyYWl0LW1hc2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBRU4sU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0NBQWtDLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBR3pGLCtCQUVDOzs7SUFEQSxtQ0FBc0I7O0FBRXZCO0lBMkJDLCtCQUFvQixLQUE4QjtRQUE5QixVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQXJCZCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JELE9BQUUsR0FBRyxHQUFHLENBQUM7UUFDVCxPQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ1QsTUFBQyxHQUFHLEVBQUUsQ0FBQztRQUlQLFlBQU8sR0FBRyxHQUFHLENBQUM7UUFDZCxZQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2QsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFLTixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUMzQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNyQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUtyRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxD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QUNOLE1BQU07c0JBQ04sU0FBUyxTQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7eUJBQ2pDLFNBQVMsU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzRCQUNwQyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkE4Q3ZDLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBZ0d0Qyw0QkFBQztDQUFBLEFBeEtELElBd0tDO1NBbktZLHFCQUFxQjs7O0lBQ2pDLDBDQUFxRDs7SUFDckQsbUNBQVM7O0lBQ1QsbUNBQVM7O0lBQ1Qsa0NBQU87O0lBQ1AscUNBQWE7O0lBQ2IseUNBQWlCOztJQUNqQiwwQ0FBa0I7O0lBQ2xCLHdDQUFjOztJQUNkLHdDQUFjOztJQUNkLHdDQUFZOztJQUNaLHVDQUFnQjs7SUFDaEIsbURBQTBCOztJQUMxQixxREFBNEI7O0lBQzVCLCtDQUFzQjs7SUFDdEIseUNBQW1COztJQUNuQiwwQ0FBcUQ7O0lBQ3JELHlDQUErQzs7SUFDL0MsMkNBQXNEOztJQUN0RCxvQ0FBb0Q7O0lBQ3BELHVDQUEwRDs7SUFDMUQsMENBQWdFOzs7OztJQUNwRCxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2ludCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AvdHlwaW5ncy9kcmFnLXJlZic7XG5pbXBvcnQge1xuXHRBZnRlclZpZXdJbml0LFxuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdEhvc3RMaXN0ZW5lcixcblx0T25Jbml0LFxuXHRPdXRwdXQsXG5cdFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRpc3RhbmNlLCBnZXRJbnNlcnRQb2ludEJldHdlZW5DaXJjbGVBbmRMaW5lLCBwb2ludEluQ2ljbGUgfSBmcm9tICcuL2dlb21ldHJpYyc7XG5cbnR5cGUgRGFyZ1R5cGUgPSAnaGFuZGxlJyB8ICdtYXNrJyB8ICdvdXRzaWRlJztcbmV4cG9ydCBpbnRlcmZhY2UgTW92ZUV2ZW50IHtcblx0c3RhcnREcmFnUG9pbnQ6IFBvaW50O1xufVxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY29tbW9uLXBvcnRyYWl0LW1hc2snLFxuXHR0ZW1wbGF0ZVVybDogJy4vcG9ydHJhaXQtbWFzay5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL3BvcnRyYWl0LW1hc2suY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQb3J0cmFpdE1hc2tDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXHRASG9zdEJpbmRpbmcoJ2NsYXNzLnBvcnRyYWl0LW1hc2snKSBob3N0Q2xhc3MgPSB0cnVlO1xuXHRjeCA9IDEwMDtcblx0Y3kgPSAxMDA7XG5cdHIgPSA1MDtcblx0bWF4UjogbnVtYmVyO1xuXHRzdmdXaWR0aDogbnVtYmVyOyAvLyBzdmcg5Z2Q5qCH55qE5oC75a695bqmXG5cdHN2Z0hlaWdodDogbnVtYmVyO1xuXHRoYW5kbGVYID0gMTUwO1xuXHRoYW5kbGVZID0gMTAwO1xuXHRoYW5kbGVSID0gNjtcblx0Y3Vyc29yID0gJ2dyYWInO1xuXHRtYXNrRGlzdGFuY2VPZmZzZXQ6IFBvaW50OyAvLyDpvKDmoIfngrnlh7vkvY3nva7kuI7lnIblv4PnmoTlgY/np7tcblx0aGFuZGxlRGlzdGFuY2VPZmZzZXQ6IFBvaW50O1xuXHRzdGFydERyYWdQb2ludDogUG9pbnQ7IC8vIOW8gOWni+aLluWKqOeahOeCue+8jOWxj+W5leWdkOagh1xuXHRkcmFnVHlwZTogRGFyZ1R5cGU7XG5cdEBPdXRwdXQoKSBzdGFydERyYWcgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cdEBPdXRwdXQoKSBkcmFnZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8UG9pbnQ+KCk7XG5cdEBPdXRwdXQoKSBtYXNrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDbGllbnRSZWN0PigpO1xuXHRAVmlld0NoaWxkKCdzdmcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzdmc6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ2hhbmRsZScsIHsgc3RhdGljOiB0cnVlIH0pIGhhbmRsZTogRWxlbWVudFJlZjtcblx0QFZpZXdDaGlsZCgnbWFza0NpY2xlJywgeyBzdGF0aWM6IHRydWUgfSkgbWFza0NpY2xlOiBFbGVtZW50UmVmO1xuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuXHRcdHRoaXMubW91c2VEb3duID0gdGhpcy5tb3VzZURvd24uYmluZCh0aGlzKTtcblx0XHR0aGlzLm1vdXNlVXAgPSB0aGlzLm1vdXNlVXAuYmluZCh0aGlzKTtcblx0XHR0aGlzLm1vdmUgPSB0aGlzLm1vdmUuYmluZCh0aGlzKTtcblx0fVxuXHR0b1NjcmVlblBvaW50KHgsIHkpOiBQb2ludCB7XG5cdFx0Y29uc3QgcHQgPSB0aGlzLnN2Zy5uYXRpdmVFbGVtZW50LmNyZWF0ZVNWR1BvaW50KCk7XG5cdFx0cHQueCA9IHg7XG5cdFx0cHQueSA9IHk7XG5cdFx0cmV0dXJuIHB0Lm1hdHJpeFRyYW5zZm9ybSh0aGlzLnN2Zy5uYXRpdmVFbGVtZW50LmdldFNjcmVlbkNUTSgpKTtcblx0fVxuXHQvLyDlsIbkuIDkuKrot53nprvovazmjaLmiJDlsY/luZXlsLrlr7hcblx0dG9TY3JlZW5EaXN0YW5jZSh2YWw6IG51bWJlcik6IG51bWJlciB7XG5cdFx0Y29uc3QgcDEgPSB0aGlzLnRvU2NyZWVuUG9pbnQoMCwgMCk7XG5cdFx0Y29uc3QgcDIgPSB0aGlzLnRvU2NyZWVuUG9pbnQodmFsLCAwKTtcblx0XHRyZXR1cm4gcDIueCAtIHAxLng7XG5cdH1cblx0dG9TVkdQb2ludCh4LCB5KTogUG9pbnQge1xuXHRcdGNvbnN0IHB0ID0gdGhpcy5zdmcubmF0aXZlRWxlbWVudC5jcmVhdGVTVkdQb2ludCgpO1xuXHRcdHB0LnggPSB4O1xuXHRcdHB0LnkgPSB5O1xuXHRcdHJldHVybiBwdC5tYXRyaXhUcmFuc2Zvcm0odGhpcy5zdmcubmF0aXZlRWxlbWVudC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuXHR9XG5cdC8vIOiOt+WPlmhhbmRsZeeahOWPl+mZkOeahOWchuW/g+WdkOaghyBzdmdcblx0Z2V0TGltaXRIYW5kbGVDZW50ZXJQb3N0aW9uKG1vdXNlUG9pbnQ6IFBvaW50KTogUG9pbnQge1xuXHRcdC8vIOagueaNrm1vdXNlIHBvaW505ou/5Yiw5a+55bqU55qE5ZyG5b+D5L2N572uXG5cdFx0Y29uc3QgcG9pbnQgPSB7IHg6IG1vdXNlUG9pbnQueCAtIHRoaXMuaGFuZGxlRGlzdGFuY2VPZmZzZXQueCwgeTogbW91c2VQb2ludC55IC0gdGhpcy5oYW5kbGVEaXN0YW5jZU9mZnNldC55IH07XG5cdFx0Ly8gQ3JlYXRlIGFuIFNWR1BvaW50IGZvciBmdXR1cmUgbWF0aFxuXHRcdGxldCByID0gZGlzdGFuY2UocG9pbnQueCwgcG9pbnQueSwgdGhpcy5jeCwgdGhpcy5jeSk7XG5cdFx0aWYgKHIgPD0gdGhpcy5tYXhSKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQ7XG5cdFx0fVxuXHRcdHIgPSB0aGlzLm1heFI7XG5cdFx0Y29uc3QgYXJyID0gZ2V0SW5zZXJ0UG9pbnRCZXR3ZWVuQ2lyY2xlQW5kTGluZSh0aGlzLmN4LCB0aGlzLmN5LCBwb2ludC54LCBwb2ludC55LCB0aGlzLmN4LCB0aGlzLmN5LCByKTtcblxuXHRcdGNvbnN0IGQxID0gZGlzdGFuY2UocG9pbnQueCwgcG9pbnQueSwgYXJyWzBdLngsIGFyclswXS55KTtcblx0XHRjb25zdCBkMiA9IGRpc3RhbmNlKHBvaW50LngsIHBvaW50LnksIGFyclsxXS54LCBhcnJbMV0ueSk7XG5cdFx0aWYgKGQxIDwgZDIpIHtcblx0XHRcdHJldHVybiBhcnJbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBhcnJbMV07XG5cdFx0fVxuXHR9XG5cblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBxdW90ZW1hcmtcblx0QEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcblx0bW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwID0gdGhpcy50b1NWR1BvaW50KGV2ZW50LngsIGV2ZW50LnkpO1xuXHRcdHRoaXMuaGFuZGxlRGlzdGFuY2VPZmZzZXQgPSB7IHg6IHAueCAtIHRoaXMuaGFuZGxlWCwgeTogcC55IC0gdGhpcy5oYW5kbGVZIH07XG5cdFx0dGhpcy5tYXNrRGlzdGFuY2VPZmZzZXQgPSB7IHg6IHAueCAtIHRoaXMuY3gsIHk6IHAueSAtIHRoaXMuY3kgfTtcblx0XHR0aGlzLnN0YXJ0RHJhZ1BvaW50ID0geyB4OiBldmVudC54LCB5OiBldmVudC55IH07XG5cblx0XHRpZiAocG9pbnRJbkNpY2xlKHAueCwgcC55LCB0aGlzLmhhbmRsZVgsIHRoaXMuaGFuZGxlWSwgdGhpcy5oYW5kbGVSKSkge1xuXHRcdFx0dGhpcy5kcmFnVHlwZSA9ICdoYW5kbGUnO1xuXHRcdH0gZWxzZSBpZiAocG9pbnRJbkNpY2xlKHAueCwgcC55LCB0aGlzLmN4LCB0aGlzLmN5LCB0aGlzLnIpKSB7XG5cdFx0XHR0aGlzLmRyYWdUeXBlID0gJ21hc2snO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRyYWdUeXBlID0gJ291dHNpZGUnO1xuXHRcdFx0dGhpcy5zdGFydERyYWcuZW1pdChldmVudCk7XG5cdFx0fVxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdmUsIGZhbHNlKTtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuY2FsY1NpemUoKTtcblx0fVxuXHRlbWl0TWFza1JlY3QoKSB7XG5cdFx0Y29uc3QgcDEgPSB0aGlzLnRvU2NyZWVuUG9pbnQodGhpcy5jeCAtIHRoaXMuciwgdGhpcy5jeSAtIHRoaXMucik7XG5cdFx0Y29uc3QgcDIgPSB0aGlzLnRvU2NyZWVuUG9pbnQodGhpcy5jeCArIHRoaXMuciwgdGhpcy5jeSArIHRoaXMucik7XG5cdFx0dGhpcy5tYXNrQ2hhbmdlLmVtaXQoe1xuXHRcdFx0bGVmdDogcDEueCxcblx0XHRcdHRvcDogcDEueSxcblx0XHRcdHJpZ2h0OiBwMi54LFxuXHRcdFx0Ym90dG9tOiBwMi55LFxuXHRcdFx0d2lkdGg6IHAyLnggLSBwMS54LFxuXHRcdFx0aGVpZ2h0OiBwMi55IC0gcDEueVxuXHRcdH0pO1xuXHR9XG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHR0aGlzLmVtaXRNYXNrUmVjdCgpO1xuXHR9XG5cdG1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblx0XHRzd2l0Y2ggKHRoaXMuZHJhZ1R5cGUpIHtcblx0XHRcdGNhc2UgJ2hhbmRsZSc6IHtcblx0XHRcdFx0Y29uc3QgcCA9IHRoaXMuZ2V0TGltaXRIYW5kbGVDZW50ZXJQb3N0aW9uKHRoaXMudG9TVkdQb2ludChldmVudC54LCBldmVudC55KSk7XG5cdFx0XHRcdHRoaXMuaGFuZGxlWCA9IHAueDtcblx0XHRcdFx0dGhpcy5oYW5kbGVZID0gcC55O1xuXHRcdFx0XHR0aGlzLnIgPSBkaXN0YW5jZSh0aGlzLmhhbmRsZVgsIHRoaXMuaGFuZGxlWSwgdGhpcy5jeCwgdGhpcy5jeSk7XG5cdFx0XHRcdHRoaXMuZW1pdE1hc2tSZWN0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnbWFzayc6XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBwID0gdGhpcy50b1NWR1BvaW50KGV2ZW50LngsIGV2ZW50LnkpO1xuXHRcdFx0XHRcdHAueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuc3ZnV2lkdGgsIHAueCkpO1xuXHRcdFx0XHRcdHAueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuc3ZnSGVpZ2h0LCBwLnkpKTtcblx0XHRcdFx0XHR0aGlzLmN4ID0gcC54IC0gdGhpcy5tYXNrRGlzdGFuY2VPZmZzZXQueDtcblx0XHRcdFx0XHR0aGlzLmN5ID0gcC55IC0gdGhpcy5tYXNrRGlzdGFuY2VPZmZzZXQueTtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVggPSBwLnggLSB0aGlzLmhhbmRsZURpc3RhbmNlT2Zmc2V0Lng7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVZID0gcC55IC0gdGhpcy5oYW5kbGVEaXN0YW5jZU9mZnNldC55O1xuXHRcdFx0XHRcdHRoaXMuZW1pdE1hc2tSZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdvdXRzaWRlJzpcblx0XHRcdFx0dGhpcy5kcmFnZ2luZy5lbWl0KHsgeDogZXZlbnQueCwgeTogZXZlbnQueSB9KTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9XG5cdG1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3ZlLCBmYWxzZSk7XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm1vdXNlVXAsIGZhbHNlKTtcblx0fVxuXHQvLyDph43nva7liLDkuK3lv4PngrnvvIzljYrlvoTkuLrmnIDlpKdcblx0cmVzZXQoKSB7XG5cdFx0dGhpcy5jYWxjU2l6ZSgpO1xuXG5cdFx0dGhpcy5lbWl0TWFza1JlY3QoKTtcblx0fVxuXG5cdHByaXZhdGUgY2FsY1NpemUoKSB7XG5cdFx0Y29uc3QgcmVjdCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBwID0gdGhpcy50b1NWR1BvaW50KHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyLCByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMik7XG5cdFx0Y29uc3QgcDEgPSB0aGlzLnRvU1ZHUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCk7XG5cdFx0Y29uc3QgcDIgPSB0aGlzLnRvU1ZHUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pO1xuXHRcdHRoaXMuY3ggPSBwLng7XG5cdFx0dGhpcy5jeSA9IHAueTtcblx0XHR0aGlzLm1heFIgPSB0aGlzLnIgPSAocDIueCAtIHAxLngpIC8gMjtcblx0XHR0aGlzLnN2Z1dpZHRoID0gcDIueCAtIHAxLng7XG5cdFx0dGhpcy5zdmdIZWlnaHQgPSBwMi55IC0gcDEueTtcblx0XHR0aGlzLmhhbmRsZVggPSB0aGlzLmN4ICsgdGhpcy5yO1xuXHRcdHRoaXMuaGFuZGxlWSA9IHRoaXMuY3k7XG5cdH1cbn1cbiJdfQ==