ngx-beautiful-charts
Version:
A library to create charts in Angular
351 lines • 34 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, ElementRef } from '@angular/core';
import { colorSchemes } from '../../constants/color-schemes';
import { PieChartService } from './pie-chart.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
var PieChartComponent = /** @class */ (function () {
function PieChartComponent(pieChartService, globalParametersService, currentElement) {
this.pieChartService = pieChartService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.colorScheme = 'colorful';
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
this.pieSlicesInit = 0;
}
/**
* @param {?} pieCompletion
* @return {?}
*/
PieChartComponent.prototype.generatePieSlices = /**
* @param {?} pieCompletion
* @return {?}
*/
function (pieCompletion) {
var e_1, _a, e_2, _b;
if (this.pieSlicesInit === 0)
this.pieSlices = [];
/** @type {?} */
var sum = 0;
try {
for (var _c = tslib_1.__values(this.data), _d = _c.next(); !_d.done; _d = _c.next()) {
var val = _d.value;
sum = sum + val.value;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
}
finally { if (e_1) throw e_1.error; }
}
/** @type {?} */
var rotation = 0;
/** @type {?} */
var rotationRad = 0;
/** @type {?} */
var cnt = 0;
try {
for (var _e = tslib_1.__values(this.data), _f = _e.next(); !_f.done; _f = _e.next()) {
var val = _f.value;
// console.log(val);
/** @type {?} */
var perc = val.value / sum * pieCompletion;
/** @type {?} */
var angle = 360 * perc;
// const angleMod = (angle > 180 ) ? 360 - angle : angle;
/** @type {?} */
var angleRad = angle * Math.PI / 180;
/** @type {?} */
var largeArc = (angle > 180) ? 1 : 0;
/** @type {?} */
var path = 'M 0 0 0 ' + -this.pieRadius + ' A '
+ this.pieRadius + ' ' + this.pieRadius
+ ' 0 ' + largeArc + ' 1' + this.pieRadius * Math.sin(angleRad) + ' '
+ -this.pieRadius * Math.cos(angleRad) + ' z';
/** @type {?} */
var hoverPath = 'M 0 0 0 ' + -this.hoverPieRadius + ' A '
+ this.hoverPieRadius + ' ' + this.hoverPieRadius
+ ' 0 ' + largeArc + ' 1' + this.hoverPieRadius * Math.sin(angleRad) + ' '
+ -this.hoverPieRadius * Math.cos(angleRad) + ' z';
/** @type {?} */
var pieInteriorX = this.pieRadius * 2 / 3 * Math.sin(rotationRad + angleRad / 2);
/** @type {?} */
var pieInteriorY = -this.pieRadius * 2 / 3 * Math.cos(rotationRad + angleRad / 2);
/** @type {?} */
var toolTipText = (Math.round(perc * 10000) / 100).toString() + '%';
/** @type {?} */
var pieSlice = {
perc: perc,
name: val.name,
color: val.color,
hoverD: hoverPath,
rotation: 'rotate(' + rotation + 'deg)',
d: path,
hover: false,
toolTipTranslate: 'translate(' + pieInteriorX + 'px, ' + pieInteriorY + 'px)',
toolTipText: toolTipText
};
// console.log(hoverPath);
// console.log(pieSlice);
if (this.pieSlicesInit === 0)
this.pieSlices.push(pieSlice);
else
this.pieSlices[cnt] = pieSlice;
// this.pieSlices.push(pieSlice);
rotation += angle;
rotationRad = rotation * Math.PI / 180;
cnt++;
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
}
finally { if (e_2) throw e_2.error; }
}
};
/**
* @return {?}
*/
PieChartComponent.prototype.setDimensions = /**
* @return {?}
*/
function () {
if (this.width)
this.height = this.width * .6 - this.xPadding;
else {
/** @type {?} */
var host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
var dims = host.parentNode.getBoundingClientRect();
this.width = dims.width;
this.height = this.width * .6 - this.xPadding;
}
}
// console.log('---set dimensions---');
// console.log('width: ' + this.width);
// console.log('height: ' + this.height);
// console.log('--------------------');
};
/**
* @return {?}
*/
PieChartComponent.prototype.setColors = /**
* @return {?}
*/
function () {
var e_3, _a;
/** @type {?} */
var cnt = 0;
try {
for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) {
var slice = _c.value;
if (!slice.color) {
if (this.customColorScheme.length > 0) {
slice.color = this.customColorScheme[cnt % this.customColorScheme.length];
}
else {
slice.color = colorSchemes[this.colorScheme][cnt % 10];
}
}
cnt++;
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_3) throw e_3.error; }
}
};
/**
* @return {?}
*/
PieChartComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.data = JSON.parse(JSON.stringify(this.data));
this.componentID = this.globalParametersService.addNewComponent();
// console.log('x: ' + this.x);
this.setDimensions();
this.data.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a.value > b.value ? -1 : a.value < b.value ? 1 : 0; }));
this.setColors();
this.pieSlicesInit = 0;
this.pieChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.pieRadius = this.pieChartService.pieRadius;
this.hoverPieRadius = this.pieChartService.pieRadius * 1.05;
/** @type {?} */
var pieCompletion = 0;
/** @type {?} */
var intervalID = setInterval((/**
* @return {?}
*/
function () {
_this.generatePieSlices(pieCompletion);
_this.pieSlicesInit = 1;
pieCompletion = pieCompletion + 0.01;
pieCompletion = Math.round(pieCompletion * 100) / 100;
if (pieCompletion > 1)
clearInterval(intervalID);
}), 5);
// console.log(this.hoverPieRadius);
this.cX = this.xPadding + this.pieRadius;
this.cY = this.yPadding + this.pieRadius;
/** @type {?} */
var translateX = this.xPadding + this.pieRadius;
/** @type {?} */
var translateY = this.yPadding + this.pieRadius;
this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)';
/** @type {?} */
var hoverTranslateXY = this.pieRadius * 0.08;
this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)';
};
/**
* @return {?}
*/
PieChartComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
var _this = this;
this.data = JSON.parse(JSON.stringify(this.data));
// console.log('x: ' + this.x);
this.setDimensions();
this.data.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a.value > b.value ? -1 : a.value < b.value ? 1 : 0; }));
this.setColors();
this.pieSlicesInit = 0;
this.pieChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.pieRadius = this.pieChartService.pieRadius;
this.hoverPieRadius = this.pieChartService.pieRadius * 1.05;
/** @type {?} */
var pieCompletion = 0;
/** @type {?} */
var intervalID = setInterval((/**
* @return {?}
*/
function () {
_this.generatePieSlices(pieCompletion);
_this.pieSlicesInit = 1;
pieCompletion = pieCompletion + 0.01;
pieCompletion = Math.round(pieCompletion * 100) / 100;
if (pieCompletion > 1)
clearInterval(intervalID);
}), 5);
// console.log(this.hoverPieRadius);
this.cX = this.xPadding + this.pieRadius;
this.cY = this.yPadding + this.pieRadius;
/** @type {?} */
var translateX = this.xPadding + this.pieRadius;
/** @type {?} */
var translateY = this.yPadding + this.pieRadius;
this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)';
/** @type {?} */
var hoverTranslateXY = this.pieRadius * 0.08;
this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)';
};
PieChartComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-pie-chart',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-pie-chart-base />\n <g *ngFor=\"let pieSlice of pieSlices\">\n <g id=\"component\" [ngStyle]=\"{'transform': gTranslate}\">\n <g class=\"pie-g\" [ngStyle]=\"{'transform': pieSlice.rotation, 'position': 'relative'}\">\n <path class=\"pie-slice\" (mouseover)=\"pieSlice.hover=true\" (mouseout)=\"pieSlice.hover=false\"\n [ngStyle]=\"{'opacity': pieSlice.hover ? 0.7 : 1.0}\"\n [attr.d]=\"pieSlice.hover ? pieSlice.hoverD : pieSlice.d\" [attr.fill]=\"pieSlice.color\" />\n </g>\n <g class=\"tooltip\" [ngStyle]=\"{'transform': pieSlice.toolTipTranslate}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"70\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ pieSlice.toolTipText }}</text>\n </g>\n </g>\n </g>\n \n</svg>\n\n<!-- 'transform': pieSlice.hover ? hoverTranslate + ' ' + pieSlice.rotation : pieSlice.rotation, -->",
providers: [PieChartService],
styles: [".pie-slice{transition:.3s ease-in}#component .tooltip{visibility:hidden;position:relative!important}#component:hover .tooltip{visibility:visible;position:absolute;z-index:9999999!important}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap;z-index:9999999!important}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif;z-index:9999999!important}.tooltip rect{fill:#222;stroke:#111;z-index:9999998!important}"]
}] }
];
/** @nocollapse */
PieChartComponent.ctorParameters = function () { return [
{ type: PieChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
]; };
PieChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
return PieChartComponent;
}());
export { PieChartComponent };
if (false) {
/** @type {?} */
PieChartComponent.prototype.data;
/** @type {?} */
PieChartComponent.prototype.width;
/** @type {?} */
PieChartComponent.prototype.colorScheme;
/** @type {?} */
PieChartComponent.prototype.customColorScheme;
/** @type {?} */
PieChartComponent.prototype.componentID;
/** @type {?} */
PieChartComponent.prototype.xPadding;
/** @type {?} */
PieChartComponent.prototype.yPadding;
/** @type {?} */
PieChartComponent.prototype.height;
/** @type {?} */
PieChartComponent.prototype.pieSlices;
/** @type {?} */
PieChartComponent.prototype.pieRadius;
/** @type {?} */
PieChartComponent.prototype.hoverPieRadius;
/** @type {?} */
PieChartComponent.prototype.cX;
/** @type {?} */
PieChartComponent.prototype.cY;
/** @type {?} */
PieChartComponent.prototype.gTranslate;
/** @type {?} */
PieChartComponent.prototype.hoverTranslate;
/** @type {?} */
PieChartComponent.prototype.pieSlicesInit;
/** @type {?} */
PieChartComponent.prototype.pieChartService;
/**
* @type {?}
* @private
*/
PieChartComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
PieChartComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL3BpZS1jaGFydC9waWUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFakY7SUE4QkUsMkJBQW1CLGVBQWdDLEVBQy9CLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQWxCckMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFTN0Isa0JBQWEsR0FBRyxDQUFDLENBQUM7SUFLbEIsQ0FBQzs7Ozs7SUFFRCw2Q0FBaUI7Ozs7SUFBakIsVUFBa0IsYUFBYTs7UUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUM7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzs7WUFFOUMsR0FBRyxHQUFHLENBQUM7O1lBQ1gsS0FBa0IsSUFBQSxLQUFBLGlCQUFBLElBQUksQ0FBQyxJQUFJLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQXhCLElBQU0sR0FBRyxXQUFBO2dCQUNaLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FB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TFIsd0JBQUM7Q0FBQSxBQW5NRCxJQW1NQztTQTdMWSxpQkFBaUI7OztJQU01QixpQ0FBK0Q7O0lBQy9ELGtDQUF1Qjs7SUFDdkIsd0NBQWtDOztJQUNsQyw4Q0FBMEM7O0lBRTFDLHdDQUFZOztJQUNaLHFDQUFjOztJQUNkLHFDQUE2Qjs7SUFDN0IsbUNBQWU7O0lBQ2Ysc0NBQWU7O0lBQ2Ysc0NBQWtCOztJQUNsQiwyQ0FBdUI7O0lBQ3ZCLCtCQUFXOztJQUNYLCtCQUFXOztJQUNYLHVDQUFtQjs7SUFDbkIsMkNBQXVCOztJQUN2QiwwQ0FBa0I7O0lBRU4sNENBQXVDOzs7OztJQUN2QyxvREFBd0Q7Ozs7O0lBQ3hELDJDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2xvclNjaGVtZXMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29sb3Itc2NoZW1lcyc7XG5pbXBvcnQgeyBQaWVDaGFydFNlcnZpY2UgfSBmcm9tICcuL3BpZS1jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtcGllLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BpZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BpZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtQaWVDaGFydFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFBpZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIC8vIDxuZ3gtYmVhdXRpZnVsLWNoYXJ0cyBbd2lkdGhdPVwiODAwXCJcbiAgLy8gW2RhdGFdPVwicGllQ2hhcnREYXRhXCJcbiAgLy8gY2hhcnRUeXBlPVwicGllLWNoYXJ0XCI+PC9uZ3gtYmVhdXRpZnVsLWNoYXJ0cz5cblxuICBASW5wdXQoKSBkYXRhOiBbe25hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZywgdmFsdWU6IG51bWJlciB9XTtcbiAgQElucHV0KCkgd2lkdGg6IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JTY2hlbWUgPSAnY29sb3JmdWwnO1xuICBASW5wdXQoKSBjdXN0b21Db2xvclNjaGVtZTogc3RyaW5nW10gPSBbXTtcblxuICBjb21wb25lbnRJRDtcbiAgeFBhZGRpbmcgPSA2MDtcbiAgeVBhZGRpbmcgPSB0aGlzLnhQYWRkaW5nIC8gMjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHBpZVNsaWNlczogYW55O1xuICBwaWVSYWRpdXM6IG51bWJlcjtcbiAgaG92ZXJQaWVSYWRpdXM6IG51bWJlcjtcbiAgY1g6IG51bWJlcjtcbiAgY1k6IG51bWJlcjtcbiAgZ1RyYW5zbGF0ZTogc3RyaW5nO1xuICBob3ZlclRyYW5zbGF0ZTogc3RyaW5nO1xuICBwaWVTbGljZXNJbml0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGllQ2hhcnRTZXJ2aWNlOiBQaWVDaGFydFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2U6IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGN1cnJlbnRFbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gIH1cblxuICBnZW5lcmF0ZVBpZVNsaWNlcyhwaWVDb21wbGV0aW9uKSB7XG4gICAgaWYgKHRoaXMucGllU2xpY2VzSW5pdCA9PT0gMCkgdGhpcy5waWVTbGljZXMgPSBbXTtcblxuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZGF0YSkge1xuICAgICAgc3VtID0gc3VtICsgdmFsLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgcm90YXRpb24gPSAwO1xuICAgIGxldCByb3RhdGlvblJhZCA9IDA7XG5cbiAgICBsZXQgY250ID0gMDtcblxuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZGF0YSkge1xuICAgICAgLy8gY29uc29sZS5sb2codmFsKTtcbiAgICAgIGNvbnN0IHBlcmMgPSB2YWwudmFsdWUgLyBzdW0gKiBwaWVDb21wbGV0aW9uO1xuICAgICAgY29uc3QgYW5nbGUgPSAzNjAgKiBwZXJjO1xuICAgICAgLy8gY29uc3QgYW5nbGVNb2QgPSAoYW5nbGUgPiAxODAgKSA/IDM2MCAtIGFuZ2xlIDogYW5nbGU7XG4gICAgICBjb25zdCBhbmdsZVJhZCA9IGFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICAgIGNvbnN0IGxhcmdlQXJjID0gKGFuZ2xlID4gMTgwKSA/IDEgOiAwO1xuXG4gICAgICBjb25zdCBwYXRoID0gJ00gMCAwIDAgJyArIC10aGlzLnBpZVJhZGl1cyArICcgQSAnXG4gICAgICArIHRoaXMucGllUmFkaXVzICsgJyAnICsgdGhpcy5waWVSYWRpdXNcbiAgICAgICsgJyAwICcgKyBsYXJnZUFyYyArICcgMScgKyB0aGlzLnBpZVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKSArICcgJ1xuICAgICAgKyAtdGhpcy5waWVSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCkgKyAnIHonO1xuXG4gICAgICBjb25zdCBob3ZlclBhdGggPSAnTSAwIDAgMCAnICsgLXRoaXMuaG92ZXJQaWVSYWRpdXMgKyAnIEEgJ1xuICAgICAgKyB0aGlzLmhvdmVyUGllUmFkaXVzICsgJyAnICsgdGhpcy5ob3ZlclBpZVJhZGl1c1xuICAgICAgKyAnIDAgJyArIGxhcmdlQXJjICsgJyAxJyArIHRoaXMuaG92ZXJQaWVSYWRpdXMgKiBNYXRoLnNpbihhbmdsZVJhZCkgKyAnICdcbiAgICAgICsgLXRoaXMuaG92ZXJQaWVSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCkgKyAnIHonO1xuXG4gICAgICBjb25zdCBwaWVJbnRlcmlvclggPSB0aGlzLnBpZVJhZGl1cyAqIDIgLyAzICogTWF0aC5zaW4ocm90YXRpb25SYWQgKyBhbmdsZVJhZCAvIDIpO1xuICAgICAgY29uc3QgcGllSW50ZXJpb3JZID0gLXRoaXMucGllUmFkaXVzICogMiAvIDMgKiBNYXRoLmNvcyhyb3RhdGlvblJhZCArIGFuZ2xlUmFkIC8gMik7XG4gICAgICBjb25zdCB0b29sVGlwVGV4dCA9IChNYXRoLnJvdW5kKHBlcmMgKiAxMDAwMCkgLyAxMDApLnRvU3RyaW5nKCkgKyAnJSc7XG5cbiAgICAgIGNvbnN0IHBpZVNsaWNlID0ge1xuICAgICAgICBwZXJjLFxuICAgICAgICBuYW1lOiB2YWwubmFtZSxcbiAgICAgICAgY29sb3I6IHZhbC5jb2xvcixcbiAgICAgICAgaG92ZXJEOiBob3ZlclBhdGgsXG4gICAgICAgIHJvdGF0aW9uOiAncm90YXRlKCcgKyByb3RhdGlvbiArICdkZWcpJyxcbiAgICAgICAgZDogcGF0aCxcbiAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICB0b29sVGlwVHJhbnNsYXRlOiAndHJhbnNsYXRlKCcgKyBwaWVJbnRlcmlvclggKyAncHgsICcgKyBwaWVJbnRlcmlvclkgKyAncHgpJyxcbiAgICAgICAgdG9vbFRpcFRleHRcbiAgICAgIH07XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKGhvdmVyUGF0aCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhwaWVTbGljZSk7XG4gICAgICBpZiAoIHRoaXMucGllU2xpY2VzSW5pdCA9PT0gMCApIHRoaXMucGllU2xpY2VzLnB1c2gocGllU2xpY2UpO1xuICAgICAgZWxzZSB0aGlzLnBpZVNsaWNlc1tjbnRdID0gcGllU2xpY2U7XG4gICAgICAvLyB0aGlzLnBpZVNsaWNlcy5wdXNoKHBpZVNsaWNlKTtcbiAgICAgIHJvdGF0aW9uICs9IGFuZ2xlO1xuICAgICAgcm90YXRpb25SYWQgPSByb3RhdGlvbiAqIE1hdGguUEkgLyAxODA7XG5cbiAgICAgIGNudCArKztcbiAgICB9XG4gIH1cblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggKiAuNiAtIHRoaXMueFBhZGRpbmc7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBob3N0ID0gdGhpcy5jdXJyZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGhvc3QucGFyZW50Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRpbXMgPSBob3N0LnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMud2lkdGggPSBkaW1zLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggKiAuNiAtIHRoaXMueFBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBzZXRDb2xvcnMoKSB7XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChjb25zdCBzbGljZSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICghc2xpY2UuY29sb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNsaWNlLmNvbG9yID0gdGhpcy5jdXN0b21Db2xvclNjaGVtZVtjbnQgJSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2xpY2UuY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbnQrKztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd4OiAnICsgdGhpcy54KTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmRhdGEuc29ydCgoYSwgYikgPT4gYS52YWx1ZSA+IGIudmFsdWUgPyAtMSA6IGEudmFsdWUgPCBiLnZhbHVlID8gMSA6IDApO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5waWVTbGljZXNJbml0ID0gMDtcbiAgICB0aGlzLnBpZUNoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5waWVSYWRpdXMgPSB0aGlzLnBpZUNoYXJ0U2VydmljZS5waWVSYWRpdXM7XG4gICAgdGhpcy5ob3ZlclBpZVJhZGl1cyA9IHRoaXMucGllQ2hhcnRTZXJ2aWNlLnBpZVJhZGl1cyAqIDEuMDU7XG4gICAgbGV0IHBpZUNvbXBsZXRpb24gPSAwO1xuXG4gICAgY29uc3QgaW50ZXJ2YWxJRCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVQaWVTbGljZXMocGllQ29tcGxldGlvbik7XG4gICAgICB0aGlzLnBpZVNsaWNlc0luaXQgPSAxO1xuICAgICAgcGllQ29tcGxldGlvbiA9IHBpZUNvbXBsZXRpb24gKyAwLjAxO1xuICAgICAgcGllQ29tcGxldGlvbiA9IE1hdGgucm91bmQocGllQ29tcGxldGlvbiAqIDEwMCkgLyAxMDA7XG4gICAgICBpZiAocGllQ29tcGxldGlvbiA+IDEpIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJRCk7XG4gICAgfSwgNSk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ob3ZlclBpZVJhZGl1cyk7XG4gICAgdGhpcy5jWCA9IHRoaXMueFBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICB0aGlzLmNZID0gdGhpcy55UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIGNvbnN0IHRyYW5zbGF0ZVggPSB0aGlzLnhQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgY29uc3QgdHJhbnNsYXRlWSA9IHRoaXMueVBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICB0aGlzLmdUcmFuc2xhdGUgPSAndHJhbnNsYXRlKCcgKyB0cmFuc2xhdGVYICsgJ3B4LCAnICsgdHJhbnNsYXRlWSArICdweCknO1xuICAgIGNvbnN0IGhvdmVyVHJhbnNsYXRlWFkgPSB0aGlzLnBpZVJhZGl1cyAqIDAuMDg7XG4gICAgdGhpcy5ob3ZlclRyYW5zbGF0ZSA9ICd0cmFuc2xhdGUoJyArIGhvdmVyVHJhbnNsYXRlWFkgKyAncHgsICcgKyAtaG92ZXJUcmFuc2xhdGVYWSArICdweCknO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEpKTtcbiAgICAvLyBjb25zb2xlLmxvZygneDogJyArIHRoaXMueCk7XG4gICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgdGhpcy5kYXRhLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgPiBiLnZhbHVlID8gLTEgOiBhLnZhbHVlIDwgYi52YWx1ZSA/IDEgOiAwKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMucGllU2xpY2VzSW5pdCA9IDA7XG4gICAgdGhpcy5waWVDaGFydFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgeFBhZGRpbmc6IHRoaXMueFBhZGRpbmcsXG4gICAgICB5UGFkZGluZzogdGhpcy55UGFkZGluZyxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH0pO1xuICAgIHRoaXMucGllUmFkaXVzID0gdGhpcy5waWVDaGFydFNlcnZpY2UucGllUmFkaXVzO1xuICAgIHRoaXMuaG92ZXJQaWVSYWRpdXMgPSB0aGlzLnBpZUNoYXJ0U2VydmljZS5waWVSYWRpdXMgKiAxLjA1O1xuICAgIGxldCBwaWVDb21wbGV0aW9uID0gMDtcbiAgICBjb25zdCBpbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5nZW5lcmF0ZVBpZVNsaWNlcyhwaWVDb21wbGV0aW9uKTtcbiAgICAgIHRoaXMucGllU2xpY2VzSW5pdCA9IDE7XG4gICAgICBwaWVDb21wbGV0aW9uID0gcGllQ29tcGxldGlvbiArIDAuMDE7XG4gICAgICBwaWVDb21wbGV0aW9uID0gTWF0aC5yb3VuZChwaWVDb21wbGV0aW9uICogMTAwKSAvIDEwMDtcbiAgICAgIGlmIChwaWVDb21wbGV0aW9uID4gMSkgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElEKTtcbiAgICB9LCA1KTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmhvdmVyUGllUmFkaXVzKTtcbiAgICB0aGlzLmNYID0gdGhpcy54UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIHRoaXMuY1kgPSB0aGlzLnlQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMueFBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICBjb25zdCB0cmFuc2xhdGVZID0gdGhpcy55UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIHRoaXMuZ1RyYW5zbGF0ZSA9ICd0cmFuc2xhdGUoJyArIHRyYW5zbGF0ZVggKyAncHgsICcgKyB0cmFuc2xhdGVZICsgJ3B4KSc7XG4gICAgY29uc3QgaG92ZXJUcmFuc2xhdGVYWSA9IHRoaXMucGllUmFkaXVzICogMC4wODtcbiAgICB0aGlzLmhvdmVyVHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgaG92ZXJUcmFuc2xhdGVYWSArICdweCwgJyArIC1ob3ZlclRyYW5zbGF0ZVhZICsgJ3B4KSc7XG4gIH1cblxufVxuIl19