ng-d3-graphs
Version:
<img src="./assets/ng-d3.png" alt="drawing" width="250" height="250"/>
173 lines • 21.6 kB
JavaScript
import * as tslib_1 from "tslib";
import { ChangeDetectionStrategy, Component, ElementRef, HostListener, Input, OnInit, ViewEncapsulation, } from '@angular/core';
import * as d3 from 'd3';
import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
var PieComponent = /** @class */ (function () {
function PieComponent(container) {
this.container = container;
this.labels = [];
this.data = [];
this.backgroundColors = d3.schemeSet2;
this.radius = 100;
this.options = {};
this.color = this.interpolateColor(); // range [0,1] -> builtin range of colors.
this.defaultSliceColor = 'steerblue';
this.labelsAndData = [];
this.viewBox = {};
this._options = {
width: 300,
height: 300,
margin: { top: 50, right: 50, bottom: 50, left: 50 },
};
this.onResize$ = new Subject();
}
PieComponent.prototype.onResize = function () {
this.onResize$.next();
};
PieComponent.prototype.ngOnInit = function () {
this.options = tslib_1.__assign({}, this._options, this.options);
this.viewBox = {
minX: -this.options.margin.left,
minY: 0,
width: Number(this.options.width) + Number(this.options.margin.left) + Number(this.options.margin.right),
height: this.options.height,
};
this.onBgdColorUndefined();
this.onResizeEvent();
this.render();
};
PieComponent.prototype.onBgdColorUndefined = function () {
var e_1, _a;
if (this.backgroundColors.length === 0) {
try {
// TODO: check linter
// for (let index = 0; index < this.data.length; index++) {
// this.backgroundColors.push(this.defaultSliceColor);
// }
for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) {
var iterator = _c.value;
this.backgroundColors.push(this.defaultSliceColor);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
};
PieComponent.prototype.render = function () {
var _this = this;
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 radius = Math.min(this.options.width, this.options.height) / 2 - 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')
.attr('transform', 'translate(' + this.options.width / 2 + ',' + this.options.height / 2 + ')');
var color = d3.scaleOrdinal().domain(this.data).range(this.backgroundColors);
var pie = d3.pie().value(function (d) { return d.value; });
var pieData = pie(d3.entries(this.data));
var arcGenerator = d3.arc().innerRadius(0).outerRadius(radius);
svg
.selectAll('slices')
.data(pieData)
.enter()
.append('path')
.attr('d', arcGenerator)
.attr('fill', function (d) { return _this.backgroundColors[d.index]; })
.attr('stroke', 'black')
.style('stroke-width', '2px')
.style('opacity', 0.7);
svg
.selectAll('slices')
.data(pieData)
.enter()
.append('text')
.text(function (d) { return _this.labels[d.index]; })
.attr('transform', function (d) {
return ('translate(' +
arcGenerator.centroid({
startAngle: d.startAngle,
endAngle: d.endAngle,
}) +
')');
})
.style('text-anchor', 'middle')
.style('font-size', 17);
this.addLabelAxisX(svg, this.options.width, this.options.height);
};
PieComponent.prototype.addLabelAxisX = function (svg, width, height) {
svg
.append('text')
.attr('transform', "translate(" + 0 + ", " + this.options.margin.top * 2.5 + ")")
.style('text-anchor', 'middle')
.text(this.options.xAxisLabel);
};
/**
* range [0, 1]
*/
PieComponent.prototype.interpolateColor = function () {
return d3.interpolateCool;
};
PieComponent.prototype.combineLabelsDataToOne = function () {
var result = [];
var N = this.data.length;
for (var index = 0; index < N; index++) {
result.push({ x: this.labels[index], y: this.data[index] });
}
return result;
};
PieComponent.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();
});
};
PieComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
tslib_1.__decorate([
Input()
], PieComponent.prototype, "labels", void 0);
tslib_1.__decorate([
Input()
], PieComponent.prototype, "data", void 0);
tslib_1.__decorate([
Input()
], PieComponent.prototype, "backgroundColors", void 0);
tslib_1.__decorate([
Input()
], PieComponent.prototype, "radius", void 0);
tslib_1.__decorate([
Input()
], PieComponent.prototype, "options", void 0);
tslib_1.__decorate([
HostListener('window:resize')
], PieComponent.prototype, "onResize", null);
PieComponent = tslib_1.__decorate([
Component({
selector: 'ng-pie',
template: "<div class=\"svg-container\"></div>\n",
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
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}svg{background-color:transparent!important}.slice text{font-size:16pt;font-family:Arial}"]
})
], PieComponent);
return PieComponent;
}());
export { PieComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWQzLWdyYXBocy8iLCJzb3VyY2VzIjpbInBpZS9waWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBOEI5QztJQXVCRSxzQkFBb0IsU0FBcUI7UUFBckIsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQXRCaEMsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDdEMsV0FBTSxHQUFXLEdBQUcsQ0FBQztRQUNyQixZQUFPLEdBQWlCLEVBQWtCLENBQUM7UUFDcEQsVUFBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsMENBQTBDO1FBQzNFLHNCQUFpQixHQUFHLFdBQVcsQ0FBQztRQUNoQyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFZLEVBQWEsQ0FBQztRQUV6QixhQUFRLEdBQWlCO1lBQy9CLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1NBQ3JELENBQUM7UUFFRixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU1Z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QVE7WUFDbEIsaURBQW1DO1lBRW5DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztTQUNoRCxDQUFDO09BQ1csWUFBWSxDQThJeEI7SUFBRCxtQkFBQztDQUFBLEFBOUlELElBOElDO1NBOUlZLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgR3JhcGhPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9ncmFwaC1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWaWV3Qm94IH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy92aWV3Ym94LmludGVyZmFjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGllIHtcbiAgbGFiZWxzOiBzdHJpbmdbXTtcbiAgZGF0YTogYW55W107XG4gIGJhY2tncm91bmRDb2xvcnM/OiBzdHJpbmdbXTtcbiAgb3B0aW9uczogR3JhcGhPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsIHtcbiAgdGV4dDogc3RyaW5nO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIExhYmVsc0FuZERhdGEge1xuICB4OiBhbnk7XG4gIHk6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctcGllJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BpZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BpZS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUGllQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBiYWNrZ3JvdW5kQ29sb3JzOiBhbnkgPSBkMy5zY2hlbWVTZXQyO1xuICBASW5wdXQoKSByYWRpdXM6IG51bWJlciA9IDEwMDtcbiAgQElucHV0KCkgb3B0aW9uczogR3JhcGhPcHRpb25zID0ge30gYXMgR3JhcGhPcHRpb25zO1xuICBjb2xvciA9IHRoaXMuaW50ZXJwb2xhdGVDb2xvcigpOyAvLyByYW5nZSBbMCwxXSAtPiBidWlsdGluIHJhbmdlIG9mIGNvbG9ycy5cbiAgZGVmYXVsdFNsaWNlQ29sb3IgPSAnc3RlZXJibHVlJztcbiAgbGFiZWxzQW5kRGF0YTogTGFiZWxzQW5kRGF0YVtdID0gW107XG4gIHZpZXdCb3g6IFZpZXdCb3ggPSB7fSBhcyBWaWV3Qm94O1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IEdyYXBoT3B0aW9ucyA9IHtcbiAgICB3aWR0aDogMzAwLFxuICAgIGhlaWdodDogMzAwLFxuICAgIG1hcmdpbjogeyB0b3A6IDUwLCByaWdodDogNTAsIGJvdHRvbTogNTAsIGxlZnQ6IDUwIH0sXG4gIH07XG5cbiAgb25SZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uUmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMub25SZXNpemUkLm5leHQoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29udGFpbmVyOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4udGhpcy5fb3B0aW9ucywgLi4udGhpcy5vcHRpb25zIH07XG4gICAgdGhpcy52aWV3Qm94ID0ge1xuICAgICAgbWluWDogLXRoaXMub3B0aW9ucy5tYXJnaW4ubGVmdCxcbiAgICAgIG1pblk6IDAsXG4gICAgICB3aWR0aDogTnVtYmVyKHRoaXMub3B0aW9ucy53aWR0aCkgKyBOdW1iZXIodGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0KSArIE51bWJlcih0aGlzLm9wdGlvbnMubWFyZ2luLnJpZ2h0KSxcbiAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICB9O1xuICAgIHRoaXMub25CZ2RDb2xvclVuZGVmaW5lZCgpO1xuXG4gICAgdGhpcy5vblJlc2l6ZUV2ZW50KCk7XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkJnZENvbG9yVW5kZWZpbmVkKCkge1xuICAgIGlmICh0aGlzLmJhY2tncm91bmRDb2xvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUT0RPOiBjaGVjayBsaW50ZXJcbiAgICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAvLyAgIHRoaXMuYmFja2dyb3VuZENvbG9ycy5wdXNoKHRoaXMuZGVmYXVsdFNsaWNlQ29sb3IpO1xuICAgICAgLy8gfVxuICAgICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiB0aGlzLmRhdGEpIHtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3JzLnB1c2godGhpcy5kZWZhdWx0U2xpY2VDb2xvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IHBhcnNlSW50KGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ2RpdicpLnN0eWxlKCd3aWR0aCcpLCAxMCk7XG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IHBhcnNlSW50KGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ2RpdicpLnN0eWxlKCdoZWlnaHQnKSwgMTApO1xuXG4gICAgY29uc3QgcmFkaXVzID0gTWF0aC5taW4odGhpcy5vcHRpb25zLndpZHRoLCB0aGlzLm9wdGlvbnMuaGVpZ2h0KSAvIDIgLSB0aGlzLm9wdGlvbnMubWFyZ2luLnRvcDtcbiAgICBjb25zdCBzdmcgPSBkM1xuICAgICAgLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KVxuICAgICAgLnNlbGVjdCgnZGl2JylcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAuYXR0cignd2lkdGgnLCBjdXJyZW50V2lkdGgpXG4gICAgICAuYXR0cignaGVpZ2h0JywgY3VycmVudEhlaWdodClcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYCR7dGhpcy52aWV3Qm94Lm1pblh9ICR7dGhpcy52aWV3Qm94Lm1pbll9ICR7dGhpcy52aWV3Qm94LndpZHRofSAke3RoaXMudmlld0JveC5oZWlnaHR9YClcbiAgICAgIC5jbGFzc2VkKCdzdmctY29udGVudCcsIHRydWUpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyB0aGlzLm9wdGlvbnMud2lkdGggLyAyICsgJywnICsgdGhpcy5vcHRpb25zLmhlaWdodCAvIDIgKyAnKScpO1xuXG4gICAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKS5kb21haW4odGhpcy5kYXRhKS5yYW5nZSh0aGlzLmJhY2tncm91bmRDb2xvcnMpO1xuXG4gICAgY29uc3QgcGllID0gZDMucGllPGFueT4oKS52YWx1ZSgoZCkgPT4gZC52YWx1ZSk7XG5cbiAgICBjb25zdCBwaWVEYXRhID0gcGllKGQzLmVudHJpZXModGhpcy5kYXRhKSk7XG5cbiAgICBjb25zdCBhcmNHZW5lcmF0b3IgPSBkMy5hcmM8YW55PigpLmlubmVyUmFkaXVzKDApLm91dGVyUmFkaXVzKHJhZGl1cyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3NsaWNlcycpXG4gICAgICAuZGF0YShwaWVEYXRhKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2QnLCBhcmNHZW5lcmF0b3IpXG4gICAgICAuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmJhY2tncm91bmRDb2xvcnNbZC5pbmRleF0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzJweCcpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjcpO1xuXG4gICAgc3ZnXG4gICAgICAuc2VsZWN0QWxsKCdzbGljZXMnKVxuICAgICAgLmRhdGEocGllRGF0YSlcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC50ZXh0KChkKSA9PiB0aGlzLmxhYmVsc1tkLmluZGV4XSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICd0cmFuc2xhdGUoJyArXG4gICAgICAgICAgYXJjR2VuZXJhdG9yLmNlbnRyb2lkKHtcbiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IGQuc3RhcnRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlOiBkLmVuZEFuZ2xlLFxuICAgICAgICAgIH0pICtcbiAgICAgICAgICAnKSdcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIDE3KTtcblxuICAgIHRoaXMuYWRkTGFiZWxBeGlzWChzdmcsIHRoaXMub3B0aW9ucy53aWR0aCwgdGhpcy5vcHRpb25zLmhlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGFkZExhYmVsQXhpc1goc3ZnOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgc3ZnXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7MH0sICR7dGhpcy5vcHRpb25zLm1hcmdpbi50b3AgKiAyLjV9KWApXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAudGV4dCh0aGlzLm9wdGlvbnMueEF4aXNMYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogcmFuZ2UgWzAsIDFdXG4gICAqL1xuICBpbnRlcnBvbGF0ZUNvbG9yKCk6IGFueSB7XG4gICAgcmV0dXJuIGQzLmludGVycG9sYXRlQ29vbDtcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZUxhYmVsc0RhdGFUb09uZSgpOiBMYWJlbHNBbmREYXRhW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IE4gPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBOOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHg6IHRoaXMubGFiZWxzW2luZGV4XSwgeTogdGhpcy5kYXRhW2luZGV4XSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uUmVzaXplRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5vblJlc2l6ZSQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHN2Z0V4aXN0ID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdCgnc3ZnJyk7XG4gICAgICBpZiAoc3ZnRXhpc3QpIHtcbiAgICAgICAgc3ZnRXhpc3QucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=