UNPKG

ng-d3-graphs

Version:

<img src="./assets/ng-d3.png" alt="drawing" width="250" height="250"/>

200 lines 28.5 kB
import * as tslib_1 from "tslib"; import { Component, ElementRef, HostListener, Input, OnInit, ViewEncapsulation } from '@angular/core'; import * as d3 from 'd3'; import { Subject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { axisConfig } from '../shared/config/axis.config'; import { D3Service } from '../shared/services/d3.service'; var BandComponent = /** @class */ (function () { function BandComponent(container, d3Service) { this.container = container; this.d3Service = d3Service; this.data = []; this.labels = []; this.options = {}; this.labelsAndData = []; this.viewBox = {}; this._options = { width: 879, height: 804, margin: { top: 50, right: 50, bottom: 50, left: 50 }, yAxisLabel: '', gridTicks: 0, timeParser: axisConfig.xAxisTimeParser, timeFormat: axisConfig.xAxisTimeFormat, xAxisTicks: axisConfig.xAxisTicks, }; this.parseTime = d3.timeParse(this.options.timeParser); this.formatTime = d3.timeFormat(this.options.timeFormat); this.onResize$ = new Subject(); } BandComponent.prototype.onResize = function () { this.onResize$.next(); }; BandComponent.prototype.ngOnInit = function () { this.options = tslib_1.__assign({}, this._options, this.options); this.viewBox = { minX: -this.options.margin.left, minY: -10, width: this.options.width + this.options.margin.left + this.options.margin.right, height: this.options.height + this.options.margin.top, }; this.parseTime = d3.timeParse(this.options.timeParser); this.formatTime = d3.timeFormat(this.options.timeFormat); this.labels = this.formatLabels(); this.labelsAndData = this.combineLabelsDataToOne(); this.onResizeEvent(); this.render(); }; BandComponent.prototype.formatLabels = function () { var _this = this; return this.labels.map(function (d) { return _this.parseTime(d); }); }; BandComponent.prototype.combineLabelsDataToOne = function () { var N = this.labels.length; var result = []; for (var index = 0; index < N; index++) { result.push({ x: this.labels[index], low: this.data[index].low, high: this.data[index].high, }); } return result; }; BandComponent.prototype.render = function () { var currentWidth = parseInt(d3.select(this.container.nativeElement).select('div').style('width'), 10); var currentHeight = parseInt(d3.select(this.container.nativeElement).select('div').style('height'), 10); var width = this.options.width - this.options.margin.left - this.options.margin.right; var height = this.options.height - this.options.margin.top - this.options.margin.bottom; this.viewBox = { minX: -this.options.margin.left, minY: -10, width: this.options.width, height: this.options.height - this.options.margin.top, }; var svg = d3.select(this.container.nativeElement) .select('div') .append('svg') .attr('width', currentWidth) .attr('height', currentHeight) .attr('viewBox', this.viewBox.minX + " " + this.viewBox.minY + " " + this.viewBox.width + " " + this.viewBox.height) .classed('svg-content', true) .append('g'); var x = d3.scaleTime() .domain(d3.extent(this.labels, function (d) { return new Date(d); })) .range([0, width]); var y = d3.scaleLinear() .domain([ d3.min(this.data, function (d) { return d.low; }), d3.max(this.data, function (d) { return d.high; }) ]) .nice(this.options.gridTicks) .range([height, 0]); // add the X gridlines svg.append('g') .attr('class', 'grid') .call(this.make_x_gridlines(x).tickSize(height) // .tickFormat('') ); // add the Y gridlines svg.append('g') .attr('class', 'grid') .call(this.make_y_gridlines(y).tickSize(-width) // .tickFormat('') ); var xAxis = this.d3Service.getXaxisTime(svg, height, x, this.options.timeFormat, this.options.xAxisTicks); var yAxis = function (g) { return g.attr('transform', "translate(" + 0 + ",0)").call(d3.axisLeft(y)); }; var curve = d3.curveStep; var area = d3.area() .curve(curve) .x(function (d) { return x(d.x); }) .y0(function (d) { return y(d.low); }) .y1(function (d) { return y(d.high); }); var _yAxis = svg.append('g').call(yAxis); // this.d3Service.addLabelAxisX(svg, width, height, this.options); // text label for the x axis this.addLabelAxisX(svg, width, height); // text label for the y axis this.addLabelAxisY(svg, height); svg.append('path') .datum(this.labelsAndData) .attr('fill', 'steelblue') .attr('d', area); this.removeAxisTicks(xAxis); this.removeAxisTicks(_yAxis); this.changeAxisColor(xAxis, axisConfig); this.changeAxisColor(_yAxis, axisConfig); }; BandComponent.prototype.changeAxisColor = function (axis, config) { this.d3Service.changeAxisColor(axis, config); }; BandComponent.prototype.removeAxisTicks = function (axis) { this.d3Service.removeAxisTicks(axis); }; BandComponent.prototype.addLabelAxisY = function (svg, height) { svg.append('text') .attr('transform', 'rotate(0)') .attr('y', 0 - this.options.margin.top / 2) .attr('x', 0) .attr('dy', '1em') .style('text-anchor', 'start') .text(this.options.yAxisLabel); }; BandComponent.prototype.addLabelAxisX = function (svg, width, height) { svg.append('text') .attr('transform', 'translate(' + width / 2 + ' ,' + (height + this.options.margin.top - 15) + ')') .style('text-anchor', 'middle') .text(this.options.xAxisLabel); }; // gridlines in x axis function BandComponent.prototype.make_x_gridlines = function (x) { return d3.axisBottom(x).ticks(this.options.gridTicks); }; // gridlines in y axis function BandComponent.prototype.make_y_gridlines = function (y) { return d3.axisLeft(y).ticks(this.options.gridTicks); }; BandComponent.prototype.onResizeEvent = function () { var _this = this; this.onResize$.pipe(debounceTime(200)).subscribe(function () { var svgExist = d3.select(_this.container.nativeElement).select('svg'); if (svgExist) { svgExist.remove(); } _this.render(); }); }; BandComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: D3Service } ]; }; tslib_1.__decorate([ Input() ], BandComponent.prototype, "data", void 0); tslib_1.__decorate([ Input() ], BandComponent.prototype, "labels", void 0); tslib_1.__decorate([ Input() ], BandComponent.prototype, "options", void 0); tslib_1.__decorate([ HostListener('window:resize') ], BandComponent.prototype, "onResize", null); BandComponent = tslib_1.__decorate([ Component({ selector: 'ng-band', template: "<div class=\"svg-container\"></div>\n", encapsulation: ViewEncapsulation.None, styles: [".svg-container{display:inline-block;position:relative;width:100%;height:100%;padding-bottom:100%;vertical-align:top;overflow:hidden}.svg-content{display:inline-block;position:absolute;top:0;left:0}.grid line{stroke:#d3d3d3;stroke-opacity:.4;shape-rendering:crispEdges}.grid path{stroke-width:0}.grid text{display:none}.area{fill:#4682b4}"] }) ], BandComponent); return BandComponent; }()); export { BandComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kMy1ncmFwaHMvIiwic291cmNlcyI6WyJiYW5kL2JhbmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFHeEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBa0J4RDtJQTJCRSx1QkFBb0IsU0FBcUIsRUFBVSxTQUFvQjtRQUFuRCxjQUFTLEdBQVQsU0FBUyxDQUFZO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQTFCOUQsU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUNqQixXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLFlBQU8sR0FBaUIsRUFBaUIsQ0FBQztRQUNuRCxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFZLEVBQWEsQ0FBQztRQUVqQyxhQUFRLEdBQWdCO1lBQ3RCLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDO1lBQ2xELFVBQVUsRUFBRSxFQUFFO1lBQ2QsU0FBUyxFQUFFLENBQUM7WUFDWixVQUFVLEVBQUUsVUFBVSxDQUFDLGVBQWU7WUFDdEMsVUFBVSxFQUFF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Qy9DLElBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ25CO1lBQ0QsS0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBNUw4QixVQUFVO2dCQUFxQixTQUFTOztJQTFCOUQ7UUFBUixLQUFLLEVBQUU7K0NBQWtCO0lBQ2pCO1FBQVIsS0FBSyxFQUFFO2lEQUFvQjtJQUNuQjtRQUFSLEtBQUssRUFBRTtrREFBMkM7SUFvQm5EO1FBREMsWUFBWSxDQUFDLGVBQWUsQ0FBQztpREFHN0I7SUF6QlUsYUFBYTtRQU56QixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsU0FBUztZQUNuQixpREFBb0M7WUFFcEMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O1NBQ3RDLENBQUM7T0FDVyxhQUFhLENBd056QjtJQUFELG9CQUFDO0NBQUEsQUF4TkQsSUF3TkM7U0F4TlksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7U2NhbGVUaW1lfSBmcm9tICdkMyc7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtheGlzQ29uZmlnfSBmcm9tICcuLi9zaGFyZWQvY29uZmlnL2F4aXMuY29uZmlnJztcbmltcG9ydCB7R3JhcGhPcHRpb25zfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL2dyYXBoLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7Vmlld0JveH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy92aWV3Ym94LmludGVyZmFjZSc7XG5pbXBvcnQge0QzU2VydmljZX0gZnJvbSAnLi4vc2hhcmVkL3NlcnZpY2VzL2QzLnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgTGFiZWxzQW5kRGF0YSB7XG4gIHg6IGFueTtcbiAgbG93OiBhbnk7XG4gIGhpZ2g6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYW5kT3B0aW9ucyBleHRlbmRzIEdyYXBoT3B0aW9ucyB7XG4gIGdyaWRUaWNrcz86IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctYmFuZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYW5kLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFuZC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBCYW5kQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgbGFiZWxzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBvcHRpb25zPzogQmFuZE9wdGlvbnMgPSB7fSBhcyBCYW5kT3B0aW9ucztcbiAgbGFiZWxzQW5kRGF0YTogTGFiZWxzQW5kRGF0YVtdID0gW107XG4gIHZpZXdCb3g6IFZpZXdCb3ggPSB7fSBhcyBWaWV3Qm94O1xuXG4gIF9vcHRpb25zOiBCYW5kT3B0aW9ucyA9IHtcbiAgICB3aWR0aDogODc5LFxuICAgIGhlaWdodDogODA0LFxuICAgIG1hcmdpbjoge3RvcDogNTAsIHJpZ2h0OiA1MCwgYm90dG9tOiA1MCwgbGVmdDogNTB9LFxuICAgIHlBeGlzTGFiZWw6ICcnLFxuICAgIGdyaWRUaWNrczogMCxcbiAgICB0aW1lUGFyc2VyOiBheGlzQ29uZmlnLnhBeGlzVGltZVBhcnNlcixcbiAgICB0aW1lRm9ybWF0OiBheGlzQ29uZmlnLnhBeGlzVGltZUZvcm1hdCxcbiAgICB4QXhpc1RpY2tzOiBheGlzQ29uZmlnLnhBeGlzVGlja3MsXG4gIH07XG5cbiAgcGFyc2VUaW1lID0gZDMudGltZVBhcnNlKHRoaXMub3B0aW9ucy50aW1lUGFyc2VyKTtcbiAgZm9ybWF0VGltZSA9IGQzLnRpbWVGb3JtYXQodGhpcy5vcHRpb25zLnRpbWVGb3JtYXQpO1xuXG4gIG9uUmVzaXplJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVzaXplJC5uZXh0KCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRhaW5lcjogRWxlbWVudFJlZiwgcHJpdmF0ZSBkM1NlcnZpY2U6IEQzU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5fb3B0aW9ucywgLi4udGhpcy5vcHRpb25zfTtcbiAgICB0aGlzLnZpZXdCb3ggPSB7XG4gICAgICBtaW5YOiAtdGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0LFxuICAgICAgbWluWTogLTEwLFxuICAgICAgd2lkdGg6IHRoaXMub3B0aW9ucy53aWR0aCArIHRoaXMub3B0aW9ucy5tYXJnaW4ubGVmdCArXG4gICAgICAgICAgdGhpcy5vcHRpb25zLm1hcmdpbi5yaWdodCxcbiAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmhlaWdodCArIHRoaXMub3B0aW9ucy5tYXJnaW4udG9wLFxuICAgIH07XG5cbiAgICB0aGlzLnBhcnNlVGltZSA9IGQzLnRpbWVQYXJzZSh0aGlzLm9wdGlvbnMudGltZVBhcnNlcik7XG4gICAgdGhpcy5mb3JtYXRUaW1lID0gZDMudGltZUZvcm1hdCh0aGlzLm9wdGlvbnMudGltZUZvcm1hdCk7XG5cbiAgICB0aGlzLmxhYmVscyA9IHRoaXMuZm9ybWF0TGFiZWxzKCk7XG4gICAgdGhpcy5sYWJlbHNBbmREYXRhID0gdGhpcy5jb21iaW5lTGFiZWxzRGF0YVRvT25lKCk7XG5cbiAgICB0aGlzLm9uUmVzaXplRXZlbnQoKTtcblxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdExhYmVscygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWxzLm1hcChkID0+IHRoaXMucGFyc2VUaW1lKGQpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZUxhYmVsc0RhdGFUb09uZSgpOiBMYWJlbHNBbmREYXRhW10ge1xuICAgIGNvbnN0IE4gPSB0aGlzLmxhYmVscy5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0OiBMYWJlbHNBbmREYXRhW10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTjsgaW5kZXgrKykge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB4OiB0aGlzLmxhYmVsc1tpbmRleF0sXG4gICAgICAgIGxvdzogdGhpcy5kYXRhW2luZGV4XS5sb3csXG4gICAgICAgIGhpZ2g6IHRoaXMuZGF0YVtpbmRleF0uaGlnaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY3VycmVudFdpZHRoID0gcGFyc2VJbnQoXG4gICAgICAgIGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ2RpdicpLnN0eWxlKCd3aWR0aCcpLFxuICAgICAgICAxMCk7XG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IHBhcnNlSW50KFxuICAgICAgICBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdkaXYnKS5zdHlsZSgnaGVpZ2h0JyksXG4gICAgICAgIDEwKTtcblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoIC0gdGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0IC1cbiAgICAgICAgdGhpcy5vcHRpb25zLm1hcmdpbi5yaWdodDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0IC0gdGhpcy5vcHRpb25zLm1hcmdpbi50b3AgLVxuICAgICAgICB0aGlzLm9wdGlvbnMubWFyZ2luLmJvdHRvbTtcbiAgICB0aGlzLnZpZXdCb3ggPSB7XG4gICAgICBtaW5YOiAtdGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0LFxuICAgICAgbWluWTogLTEwLFxuICAgICAgd2lkdGg6IHRoaXMub3B0aW9ucy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmhlaWdodCAtIHRoaXMub3B0aW9ucy5tYXJnaW4udG9wLFxuICAgIH07XG5cbiAgICBjb25zdCBzdmcgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgY3VycmVudFdpZHRoKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgY3VycmVudEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAndmlld0JveCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLnZpZXdCb3gubWluWH0gJHt0aGlzLnZpZXdCb3gubWluWX0gJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdCb3gud2lkdGh9ICR7dGhpcy52aWV3Qm94LmhlaWdodH1gKVxuICAgICAgICAgICAgICAgICAgICAuY2xhc3NlZCgnc3ZnLWNvbnRlbnQnLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJyk7XG5cbiAgICBjb25zdCB4OiBTY2FsZVRpbWU8YW55LCBhbnk+ID1cbiAgICAgICAgZDMuc2NhbGVUaW1lKClcbiAgICAgICAgICAgIC5kb21haW4oZDMuZXh0ZW50KHRoaXMubGFiZWxzLCAoZCkgPT4gbmV3IERhdGUoZCkpKVxuICAgICAgICAgICAgLnJhbmdlKFswLCB3aWR0aF0pO1xuXG4gICAgY29uc3QgeSA9XG4gICAgICAgIGQzLnNjYWxlTGluZWFyKClcbiAgICAgICAgICAgIC5kb21haW4oW1xuICAgICAgICAgICAgICBkMy5taW4odGhpcy5kYXRhLCAoZCkgPT4gZC5sb3cpLCBkMy5tYXgodGhpcy5kYXRhLCAoZCkgPT4gZC5oaWdoKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC5uaWNlKHRoaXMub3B0aW9ucy5ncmlkVGlja3MpXG4gICAgICAgICAgICAucmFuZ2UoW2hlaWdodCwgMF0pO1xuXG4gICAgLy8gYWRkIHRoZSBYIGdyaWRsaW5lc1xuICAgIHN2Zy5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXG4gICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgdGhpcy5tYWtlX3hfZ3JpZGxpbmVzKHgpLnRpY2tTaXplKGhlaWdodClcbiAgICAgICAgICAgIC8vIC50aWNrRm9ybWF0KCcnKVxuICAgICAgICApO1xuXG4gICAgLy8gYWRkIHRoZSBZIGdyaWRsaW5lc1xuICAgIHN2Zy5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXG4gICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgdGhpcy5tYWtlX3lfZ3JpZGxpbmVzKHkpLnRpY2tTaXplKC13aWR0aClcbiAgICAgICAgICAgIC8vIC50aWNrRm9ybWF0KCcnKVxuICAgICAgICApO1xuXG4gICAgY29uc3QgeEF4aXMgPSB0aGlzLmQzU2VydmljZS5nZXRYYXhpc1RpbWUoXG4gICAgICAgIHN2ZywgaGVpZ2h0LCB4LCB0aGlzLm9wdGlvbnMudGltZUZvcm1hdCwgdGhpcy5vcHRpb25zLnhBeGlzVGlja3MpO1xuXG4gICAgY29uc3QgeUF4aXMgPSAoZykgPT5cbiAgICAgICAgZy5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7MH0sMClgKS5jYWxsKGQzLmF4aXNMZWZ0KHkpKTtcblxuICAgIGNvbnN0IGN1cnZlOiBhbnkgPSBkMy5jdXJ2ZVN0ZXA7XG4gICAgY29uc3QgYXJlYSA9IGQzLmFyZWE8TGFiZWxzQW5kRGF0YT4oKVxuICAgICAgICAgICAgICAgICAgICAgLmN1cnZlKGN1cnZlKVxuICAgICAgICAgICAgICAgICAgICAgLngoKGQpID0+IHgoZC54KSlcbiAgICAgICAgICAgICAgICAgICAgIC55MCgoZCkgPT4geShkLmxvdykpXG4gICAgICAgICAgICAgICAgICAgICAueTEoKGQpID0+IHkoZC5oaWdoKSk7XG5cbiAgICBjb25zdCBfeUF4aXMgPSBzdmcuYXBwZW5kKCdnJykuY2FsbCh5QXhpcyk7XG5cbiAgICAvLyB0aGlzLmQzU2VydmljZS5hZGRMYWJlbEF4aXNYKHN2Zywgd2lkdGgsIGhlaWdodCwgdGhpcy5vcHRpb25zKTtcblxuICAgIC8vIHRleHQgbGFiZWwgZm9yIHRoZSB4IGF4aXNcbiAgICB0aGlzLmFkZExhYmVsQXhpc1goc3ZnLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvLyB0ZXh0IGxhYmVsIGZvciB0aGUgeSBheGlzXG4gICAgdGhpcy5hZGRMYWJlbEF4aXNZKHN2ZywgaGVpZ2h0KTtcblxuICAgIHN2Zy5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuZGF0dW0odGhpcy5sYWJlbHNBbmREYXRhKVxuICAgICAgICAuYXR0cignZmlsbCcsICdzdGVlbGJsdWUnKVxuICAgICAgICAuYXR0cignZCcsIGFyZWEpO1xuXG4gICAgdGhpcy5yZW1vdmVBeGlzVGlja3MoeEF4aXMpO1xuICAgIHRoaXMucmVtb3ZlQXhpc1RpY2tzKF95QXhpcyk7XG5cbiAgICB0aGlzLmNoYW5nZUF4aXNDb2xvcih4QXhpcywgYXhpc0NvbmZpZyk7XG4gICAgdGhpcy5jaGFuZ2VBeGlzQ29sb3IoX3lBeGlzLCBheGlzQ29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlQXhpc0NvbG9yKFxuICAgICAgYXhpczogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LCBjb25maWc6IGFueSkge1xuICAgIHRoaXMuZDNTZXJ2aWNlLmNoYW5nZUF4aXNDb2xvcihheGlzLCBjb25maWcpO1xuICB9XG5cblxuICBwcml2YXRlIHJlbW92ZUF4aXNUaWNrcyhcbiAgICAgIGF4aXM6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPikge1xuICAgIHRoaXMuZDNTZXJ2aWNlLnJlbW92ZUF4aXNUaWNrcyhheGlzKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBhZGRMYWJlbEF4aXNZKFxuICAgICAgc3ZnOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgICBoZWlnaHQ6IG51bWJlcikge1xuICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgwKScpXG4gICAgICAgIC5hdHRyKCd5JywgMCAtIHRoaXMub3B0aW9ucy5tYXJnaW4udG9wIC8gMilcbiAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAuYXR0cignZHknLCAnMWVtJylcbiAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdzdGFydCcpXG4gICAgICAgIC50ZXh0KHRoaXMub3B0aW9ucy55QXhpc0xhYmVsKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTGFiZWxBeGlzWChcbiAgICAgIHN2ZzogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LCB3aWR0aDogbnVtYmVyLFxuICAgICAgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBzdmcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICd0cmFuc2xhdGUoJyArIHdpZHRoIC8gMiArICcgLCcgK1xuICAgICAgICAgICAgICAgIChoZWlnaHQgKyB0aGlzLm9wdGlvbnMubWFyZ2luLnRvcCAtIDE1KSArICcpJylcbiAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAudGV4dCh0aGlzLm9wdGlvbnMueEF4aXNMYWJlbCk7XG4gIH1cblxuICAvLyBncmlkbGluZXMgaW4geCBheGlzIGZ1bmN0aW9uXG4gIHByaXZhdGUgbWFrZV94X2dyaWRsaW5lcyh4KSB7XG4gICAgcmV0dXJuIGQzLmF4aXNCb3R0b20oeCkudGlja3ModGhpcy5vcHRpb25zLmdyaWRUaWNrcyk7XG4gIH1cblxuICAvLyBncmlkbGluZXMgaW4geSBheGlzIGZ1bmN0aW9uXG4gIHByaXZhdGUgbWFrZV95X2dyaWRsaW5lcyh5KSB7XG4gICAgcmV0dXJuIGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHRoaXMub3B0aW9ucy5ncmlkVGlja3MpO1xuICB9XG5cbiAgb25SZXNpemVFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVzaXplJC5waXBlKGRlYm91bmNlVGltZSgyMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3Qgc3ZnRXhpc3QgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdzdmcnKTtcbiAgICAgIGlmIChzdmdFeGlzdCkge1xuICAgICAgICBzdmdFeGlzdC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==