ngx-beautiful-charts
Version:
A library to create charts in Angular
315 lines • 29 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ElementRef } from '@angular/core';
import { colorSchemes } from '../../constants/color-schemes';
import { MultiLineGraphService } from './multi-line-graph.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
export class MultiLineGraphComponent {
/**
* @param {?} multiLineGraphService
* @param {?} globalParametersService
* @param {?} currentElement
*/
constructor(multiLineGraphService, globalParametersService, currentElement) {
this.multiLineGraphService = multiLineGraphService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.colorScheme = 'colorful';
this.minX = null;
this.minY = null;
this.maxX = null;
this.maxY = null;
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
this.transformedData = [];
}
/**
* @return {?}
*/
setDimensions() {
if (this.width && !this.height)
this.height = this.width / 3;
else if (!this.width && this.height)
this.width = this.height * 3;
else if (!this.width && !this.height) {
/** @type {?} */
const host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
const dims = host.parentNode.getBoundingClientRect();
this.width = dims.width;
this.height = dims.width / 3;
}
}
// console.log('---set dimensions---');
// console.log('width: ' + this.width);
// console.log('height: ' + this.height);
// console.log('--------------------');
}
/**
* @return {?}
*/
setMinandMax() {
if (this.minX == null)
this.minX = Math.min(...this.data.map((/**
* @param {?} line
* @return {?}
*/
line => Math.min(...line.data.map((/**
* @param {?} oneData
* @return {?}
*/
oneData => oneData.x))))));
if (this.maxX == null)
this.maxX = Math.max(...this.data.map((/**
* @param {?} line
* @return {?}
*/
line => Math.max(...line.data.map((/**
* @param {?} oneData
* @return {?}
*/
oneData => oneData.x))))));
if (this.minY == null)
this.minY = Math.min(...this.data.map((/**
* @param {?} line
* @return {?}
*/
line => Math.min(...line.data.map((/**
* @param {?} oneData
* @return {?}
*/
oneData => oneData.y))))));
if (this.maxY == null)
this.maxY = Math.max(...this.data.map((/**
* @param {?} line
* @return {?}
*/
line => Math.max(...line.data.map((/**
* @param {?} oneData
* @return {?}
*/
oneData => oneData.y))))));
}
/**
* @return {?}
*/
transformData() {
this.transformedData = [];
for (const singleLine of this.data) {
/** @type {?} */
let lineData;
lineData = [];
for (const point of singleLine.data) {
/** @type {?} */
const x = this.multiLineGraphService.transformX(point.x) + this.xPadding;
/** @type {?} */
const y = this.multiLineGraphService.transformY(this.multiLineGraphService.maxY - point.y) + this.yPadding;
/** @type {?} */
const toolTipX = x;
/** @type {?} */
const toolTipY = y - 30;
/** @type {?} */
const toolTip = point.info && (point.info !== '') ? 'block' : 'none';
lineData.push({
x,
y,
info: point.info,
originalX: point.x,
originalY: point.y,
toolTipTranslate: 'translate(' + toolTipX + 'px, ' + toolTipY + 'px)',
toolTip
});
}
this.transformedData.push({
name: singleLine.name,
color: singleLine.color,
data: lineData
});
}
}
/**
* @return {?}
*/
setLinePath() {
// console.log(this.printAllInput());
this.graphLinePaths = [];
for (const singleLine of this.transformedData) {
/** @type {?} */
let graphLinePath = 'M';
/** @type {?} */
let singleLineData;
singleLineData = singleLine.data;
singleLineData.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a.x < b.x ? -1 : a.x > b.x ? 1 : 0));
for (const point of singleLineData) {
// console.log(point);
/** @type {?} */
const coordX = point.x;
/** @type {?} */
const coordY = point.y;
graphLinePath += ' ' + coordX + ' ' + coordY;
// console.log(graphLinePath);
}
this.graphLinePaths.push({
color: singleLine.color,
path: graphLinePath
});
}
}
/**
* @return {?}
*/
setColors() {
/** @type {?} */
let cnt = 0;
for (const line of this.data) {
if (!line.color) {
if (this.customColorScheme.length > 0) {
line.color = this.customColorScheme[cnt % this.customColorScheme.length];
}
else {
line.color = colorSchemes[this.colorScheme][cnt % 10];
}
}
cnt++;
}
}
/**
* @return {?}
*/
ngOnInit() {
this.componentID = this.globalParametersService.addNewComponent();
console.log('init..');
this.setDimensions();
this.setMinandMax();
this.setColors();
this.dataCopy = JSON.parse(JSON.stringify(this.data));
this.multiLineGraphService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
minX: this.minX,
maxX: this.maxX,
minY: this.minY,
maxY: this.maxY,
dataLength: this.data.length,
xPadding: this.xPadding,
yPadding: this.yPadding
});
this.transformData();
this.setLinePath();
}
/**
* @return {?}
*/
ngOnChanges() {
console.log('changes..');
this.setMinandMax();
this.setColors();
this.dataCopy = JSON.parse(JSON.stringify(this.data));
this.multiLineGraphService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
minX: this.minX,
maxX: this.maxX,
minY: this.minY,
maxY: this.maxY,
dataLength: this.data.length,
xPadding: this.xPadding,
yPadding: this.yPadding
});
this.transformData();
this.setLinePath();
}
}
MultiLineGraphComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-multi-line-graph',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <g ngx-mlg-chart-base [data]=\"data\"\n [gridPrecisionX]=\"gridPrecisionX\" [gridPrecisionY]=\"gridPrecisionY\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n \n\n <!-- <g *ngFor=\"let line of data\">\n <g ngx-line-graph chartBase=\"false\" [data]=\"line.data\" [minX]=\"0\" [maxX]=\"100\" \n [minY]=\"0\" [maxY]=\"50\" \n [gridPrecisionX]=\"10\" \n [gridPrecisionY]=\"10\"\n xAxisTitle=\"Time\"\n yAxisTitle=\"Distance\"\n [data]=\"data\"\n color=\"#ff4444\"\n\n [width]=\"beautifulChartsService.rectWidth\" [height]=\"beautifulChartsService.rectHeight\" [color]=\"line.color\" />\n </g> -->\n\n\n <path *ngFor=\"let singleLine of graphLinePaths\" class=\"line-path\"\n [attr.d]=\"singleLine.path\" fill=\"none\" [attr.stroke]=\"singleLine.color\"\n />\n \n \n <g *ngFor=\"let line of transformedData;\">\n <g id=\"component\" *ngFor=\"let point of line.data\">\n <circle class=\"point\" [attr.cx]=\"point.x\" [attr.cy]=\"point.y\" r=\"4\" [attr.fill]=\"line.color\">\n </circle>\n \n <g class=\"tooltip\" [ngStyle]=\"{'transform': point.toolTipTranslate, 'display': point.toolTip}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"100\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ point.info }}</text>\n </g>\n </g>\n \n </g>\n\n</svg>",
providers: [MultiLineGraphService],
styles: [".line-path{opacity:.6;stroke-width:3;z-index:999999}.line-path:hover{opacity:1}.point{stroke:#fff;stroke-width:2px}.point:hover{stroke-width:.5}#component .tooltip{visibility:hidden}#component:hover .tooltip{visibility:visible;position:absolute}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif}.tooltip rect{fill:#222;stroke:#111}"]
}] }
];
/** @nocollapse */
MultiLineGraphComponent.ctorParameters = () => [
{ type: MultiLineGraphService },
{ type: GlobalParametersService },
{ type: ElementRef }
];
MultiLineGraphComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
colorScheme: [{ type: Input }],
minX: [{ type: Input }],
minY: [{ type: Input }],
maxX: [{ type: Input }],
maxY: [{ type: Input }],
gridPrecisionX: [{ type: Input }],
gridPrecisionY: [{ type: Input }],
xAxisTitle: [{ type: Input }],
yAxisTitle: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
if (false) {
/** @type {?} */
MultiLineGraphComponent.prototype.data;
/** @type {?} */
MultiLineGraphComponent.prototype.width;
/** @type {?} */
MultiLineGraphComponent.prototype.height;
/** @type {?} */
MultiLineGraphComponent.prototype.colorScheme;
/** @type {?} */
MultiLineGraphComponent.prototype.minX;
/** @type {?} */
MultiLineGraphComponent.prototype.minY;
/** @type {?} */
MultiLineGraphComponent.prototype.maxX;
/** @type {?} */
MultiLineGraphComponent.prototype.maxY;
/** @type {?} */
MultiLineGraphComponent.prototype.gridPrecisionX;
/** @type {?} */
MultiLineGraphComponent.prototype.gridPrecisionY;
/** @type {?} */
MultiLineGraphComponent.prototype.xAxisTitle;
/** @type {?} */
MultiLineGraphComponent.prototype.yAxisTitle;
/** @type {?} */
MultiLineGraphComponent.prototype.customColorScheme;
/** @type {?} */
MultiLineGraphComponent.prototype.componentID;
/** @type {?} */
MultiLineGraphComponent.prototype.xPadding;
/** @type {?} */
MultiLineGraphComponent.prototype.yPadding;
/** @type {?} */
MultiLineGraphComponent.prototype.dataCopy;
/** @type {?} */
MultiLineGraphComponent.prototype.graphLinePaths;
/** @type {?} */
MultiLineGraphComponent.prototype.transformedData;
/** @type {?} */
MultiLineGraphComponent.prototype.multiLineGraphService;
/**
* @type {?}
* @private
*/
MultiLineGraphComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
MultiLineGraphComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGluZS1ncmFwaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9tdWx0aS1saW5lLWdyYXBoL211bHRpLWxpbmUtZ3JhcGguY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBU2pGLE1BQU0sT0FBTyx1QkFBdUI7Ozs7OztJQXlHbEMsWUFBbUIscUJBQTRDLEVBQzNDLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzNDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsbUJBQWMsR0FBZCxjQUFjLENBQVk7UUF0R3JDLGdCQUFXLEdBQUcsVUFBVSxDQUFDO1FBQ3pCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFDcEIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFLcEIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFHN0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7SUF1RnJCLENBQUM7Ozs7SUFyRkQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFOztrQkFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtZQUM5QyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFOztzQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsdUNBQXVDO1FBQ3ZDLHVDQUF1QztRQUN2Qyx5Q0FBeUM7UUFDekMsdUNBQXVDO0lBQ3pDLENBQUM7Ozs7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN4SCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7OztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7OztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3hILElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7O1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7O1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDeEgsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUMxSCxDQUFDOzs7O0lBR0QsYUFBYTtRQUNYLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTs7Z0JBQzlCLFFBQVE7WUFFWixRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFOztzQkFDN0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFROztzQkFDbEUsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVE7O3NCQUNwRyxRQUFRLEdBQUcsQ0FBQzs7c0JBQ1osUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFOztzQkFDakIsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU07Z0JBQ3BFLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osQ0FBQztvQkFDRCxDQUFDO29CQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNsQixTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2xCLGdCQUFnQixFQUFFLFlBQVksR0FBRyxRQUFRLEdBQUcsTUFBTSxHQUFHLFFBQVEsR0FBRyxLQUFLO29CQUNyRSxPQUFPO2lCQUNSLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtnQkFDckIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2dCQUN2QixJQUFJLEVBQUUsUUFBUTthQUNmLENBQUMsQ0FBQztTQUVKO0lBQ0gsQ0FBQzs7OztJQUVELFdBQVc7UUFDVCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFOztnQkFDekMsYUFBYSxHQUFHLEdBQUc7O2dCQUNuQixjQUFjO1lBQ2xCLGNBQWMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2pDLGNBQWMsQ0FBQyxJQUFJOzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ2xFLEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFOzs7c0JBRTVCLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQzs7c0JBQ2hCLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFFdEIsYUFBYSxJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztnQkFFN0MsOEJBQThCO2FBQy9CO1lBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztnQkFDdkIsSUFBSSxFQUFFLGFBQWE7YUFDcEIsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs7O0lBUUQsU0FBUzs7WUFDSCxHQUFHLEdBQUcsQ0FBQztRQUNYLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUMxRTtxQkFBTTtvQkFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2lCQUN2RDthQUNGO1lBQ0QsR0FBRyxFQUFFLENBQUM7U0FDUDtJQUNILENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDO1lBQ25DLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUM7WUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7O1lBOUtGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQyxtOUNBQWdEO2dCQUVoRCxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQzs7YUFDbkM7Ozs7WUFUUSxxQkFBcUI7WUFDckIsdUJBQXVCO1lBSGMsVUFBVTs7O21CQWNyRCxLQUFLO29CQUNMLEtBQUs7cUJBQ0wsS0FBSzswQkFDTCxLQUFLO21CQUNMLEtBQUs7bUJBQ0wsS0FBSzttQkFDTCxLQUFLO21CQUNMLEtBQUs7NkJBQ0wsS0FBSzs2QkFDTCxLQUFLO3lCQUNMLEtBQUs7eUJBQ0wsS0FBSztnQ0FDTCxLQUFLOzs7O0lBWk4sdUNBQTJGOztJQUMzRix3Q0FBdUI7O0lBQ3ZCLHlDQUF3Qjs7SUFDeEIsOENBQWtDOztJQUNsQyx1Q0FBNkI7O0lBQzdCLHVDQUE2Qjs7SUFDN0IsdUNBQTZCOztJQUM3Qix1Q0FBNkI7O0lBQzdCLGlEQUFnQzs7SUFDaEMsaURBQWdDOztJQUNoQyw2Q0FBNEI7O0lBQzVCLDZDQUE0Qjs7SUFDNUIsb0RBQTBDOztJQUUxQyw4Q0FBb0I7O0lBQ3BCLDJDQUFjOztJQUNkLDJDQUE2Qjs7SUFDN0IsMkNBQVM7O0lBQ1QsaURBQWU7O0lBQ2Ysa0RBQXFCOztJQW9GVCx3REFBbUQ7Ozs7O0lBQ25ELDBEQUF3RDs7Ozs7SUFDeEQsaURBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcbmltcG9ydCB7IE11bHRpTGluZUdyYXBoU2VydmljZSB9IGZyb20gJy4vbXVsdGktbGluZS1ncmFwaC5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1tdWx0aS1saW5lLWdyYXBoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWxpbmUtZ3JhcGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1saW5lLWdyYXBoLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW011bHRpTGluZUdyYXBoU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlMaW5lR3JhcGhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgZGF0YTogW3tuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcsIGRhdGE6IFt7eDogbnVtYmVyLCB5OiBudW1iZXIsIGluZm86IGFueSB9XX1dO1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBoZWlnaHQ6IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JTY2hlbWUgPSAnY29sb3JmdWwnO1xuICBASW5wdXQoKSBtaW5YOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtaW5ZOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtYXhYOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtYXhZOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBncmlkUHJlY2lzaW9uWDogbnVtYmVyO1xuICBASW5wdXQoKSBncmlkUHJlY2lzaW9uWTogbnVtYmVyO1xuICBASW5wdXQoKSB4QXhpc1RpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHlBeGlzVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgY3VzdG9tQ29sb3JTY2hlbWU6IHN0cmluZ1tdID0gW107XG5cbiAgY29tcG9uZW50SUQ6IG51bWJlcjtcbiAgeFBhZGRpbmcgPSA2MDtcbiAgeVBhZGRpbmcgPSB0aGlzLnhQYWRkaW5nIC8gMjtcbiAgZGF0YUNvcHk7XG4gIGdyYXBoTGluZVBhdGhzO1xuICB0cmFuc2Zvcm1lZERhdGEgPSBbXTtcblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC8gMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ICogMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiAhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaG9zdC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGhvc3QucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGRpbXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZGltcy53aWR0aCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBzZXRNaW5hbmRNYXgoKSB7XG4gICAgaWYgKHRoaXMubWluWCA9PSBudWxsKSB0aGlzLm1pblggPSBNYXRoLm1pbiguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5taW4oLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueCkpKSk7XG4gICAgaWYgKHRoaXMubWF4WCA9PSBudWxsKSB0aGlzLm1heFggPSBNYXRoLm1heCguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5tYXgoLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueCkpKSk7XG4gICAgaWYgKHRoaXMubWluWSA9PSBudWxsKSB0aGlzLm1pblkgPSBNYXRoLm1pbiguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5taW4oLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueSkpKSk7XG4gICAgaWYgKHRoaXMubWF4WSA9PSBudWxsKSB0aGlzLm1heFkgPSBNYXRoLm1heCguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5tYXgoLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueSkpKSk7XG4gIH1cblxuXG4gIHRyYW5zZm9ybURhdGEoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm1lZERhdGEgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNpbmdsZUxpbmUgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBsZXQgbGluZURhdGE7XG5cbiAgICAgIGxpbmVEYXRhID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHNpbmdsZUxpbmUuZGF0YSkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy5tdWx0aUxpbmVHcmFwaFNlcnZpY2UudHJhbnNmb3JtWChwb2ludC54KSArIHRoaXMueFBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLm11bHRpTGluZUdyYXBoU2VydmljZS50cmFuc2Zvcm1ZKHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLm1heFkgLSBwb2ludC55KSArIHRoaXMueVBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHRvb2xUaXBYID0geDtcbiAgICAgICAgY29uc3QgdG9vbFRpcFkgPSB5IC0gMzA7XG4gICAgICAgIGNvbnN0IHRvb2xUaXAgPSBwb2ludC5pbmZvICYmIChwb2ludC5pbmZvICE9PSAnJykgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICBsaW5lRGF0YS5wdXNoKHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgICAgaW5mbzogcG9pbnQuaW5mbyxcbiAgICAgICAgICBvcmlnaW5hbFg6IHBvaW50LngsXG4gICAgICAgICAgb3JpZ2luYWxZOiBwb2ludC55LFxuICAgICAgICAgIHRvb2xUaXBUcmFuc2xhdGU6ICd0cmFuc2xhdGUoJyArIHRvb2xUaXBYICsgJ3B4LCAnICsgdG9vbFRpcFkgKyAncHgpJyxcbiAgICAgICAgICB0b29sVGlwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2Zvcm1lZERhdGEucHVzaCh7XG4gICAgICAgIG5hbWU6IHNpbmdsZUxpbmUubmFtZSxcbiAgICAgICAgY29sb3I6IHNpbmdsZUxpbmUuY29sb3IsXG4gICAgICAgIGRhdGE6IGxpbmVEYXRhXG4gICAgICB9KTtcblxuICAgIH1cbiAgfVxuXG4gIHNldExpbmVQYXRoKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucHJpbnRBbGxJbnB1dCgpKTtcbiAgICB0aGlzLmdyYXBoTGluZVBhdGhzID0gW107XG4gICAgZm9yIChjb25zdCBzaW5nbGVMaW5lIG9mIHRoaXMudHJhbnNmb3JtZWREYXRhKSB7XG4gICAgICBsZXQgZ3JhcGhMaW5lUGF0aCA9ICdNJztcbiAgICAgIGxldCBzaW5nbGVMaW5lRGF0YTtcbiAgICAgIHNpbmdsZUxpbmVEYXRhID0gc2luZ2xlTGluZS5kYXRhO1xuICAgICAgc2luZ2xlTGluZURhdGEuc29ydCgoYSwgYikgPT4gYS54IDwgYi54ID8gLTEgOiBhLnggPiBiLnggPyAxIDogMCk7XG4gICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHNpbmdsZUxpbmVEYXRhKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29vcmRYID0gcG9pbnQueDtcbiAgICAgICAgY29uc3QgY29vcmRZID0gcG9pbnQueTtcblxuICAgICAgICBncmFwaExpbmVQYXRoICs9ICcgJyArIGNvb3JkWCArICcgJyArIGNvb3JkWTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhncmFwaExpbmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ncmFwaExpbmVQYXRocy5wdXNoKHtcbiAgICAgICAgY29sb3I6IHNpbmdsZUxpbmUuY29sb3IsXG4gICAgICAgIHBhdGg6IGdyYXBoTGluZVBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgY29uc3RydWN0b3IocHVibGljIG11bHRpTGluZUdyYXBoU2VydmljZTogTXVsdGlMaW5lR3JhcGhTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlOiBHbG9iYWxQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZikge1xuICB9XG5cbiAgc2V0Q29sb3JzKCkge1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICghbGluZS5jb2xvcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZS5jb2xvciA9IHRoaXMuY3VzdG9tQ29sb3JTY2hlbWVbY250ICUgdGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpbmUuY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbnQrKztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXBvbmVudElEID0gdGhpcy5nbG9iYWxQYXJhbWV0ZXJzU2VydmljZS5hZGROZXdDb21wb25lbnQoKTtcbiAgICBjb25zb2xlLmxvZygnaW5pdC4uJyk7XG4gICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgdGhpcy5zZXRNaW5hbmRNYXgoKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuZGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIG1pblg6IHRoaXMubWluWCxcbiAgICAgIG1heFg6IHRoaXMubWF4WCxcbiAgICAgIG1pblk6IHRoaXMubWluWSxcbiAgICAgIG1heFk6IHRoaXMubWF4WSxcbiAgICAgIGRhdGFMZW5ndGg6IHRoaXMuZGF0YS5sZW5ndGgsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nXG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICB0aGlzLnNldExpbmVQYXRoKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBjb25zb2xlLmxvZygnY2hhbmdlcy4uJyk7XG4gICAgdGhpcy5zZXRNaW5hbmRNYXgoKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuZGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIG1pblg6IHRoaXMubWluWCxcbiAgICAgIG1heFg6IHRoaXMubWF4WCxcbiAgICAgIG1pblk6IHRoaXMubWluWSxcbiAgICAgIG1heFk6IHRoaXMubWF4WSxcbiAgICAgIGRhdGFMZW5ndGg6IHRoaXMuZGF0YS5sZW5ndGgsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nXG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICB0aGlzLnNldExpbmVQYXRoKCk7XG4gIH1cblxufVxuIl19