ngx-beautiful-charts
Version:
A library to create charts in Angular
224 lines • 20.8 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 { ClusteredBarChartService } from './clustered-bar-chart.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
export class ClusteredBarChartComponent {
/**
* @param {?} clusteredBarChartService
* @param {?} globalParametersService
* @param {?} currentElement
*/
constructor(clusteredBarChartService, globalParametersService, currentElement) {
this.clusteredBarChartService = clusteredBarChartService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.showGridLines = false;
this.colorScheme = 'colorful';
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
}
// [{color: string, paths: string[]}];
/**
* @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 {?}
*/
computeBarPaths() {
this.barPaths = [];
/** @type {?} */
let uniqueXAxisValues;
/** @type {?} */
let noOfXAxisValues;
uniqueXAxisValues = new Set();
for (const series of this.data) {
/** @type {?} */
const seriesData = series.data;
for (const sData of seriesData) {
uniqueXAxisValues.add(sData.name);
}
}
noOfXAxisValues = uniqueXAxisValues.size;
/** @type {?} */
const noOfSeries = this.data.length;
/** @type {?} */
const eachWidth = this.clusteredBarChartService.rectWidth / noOfXAxisValues;
/** @type {?} */
const categoryWidth = eachWidth * .5;
/** @type {?} */
const barWidth = categoryWidth / noOfSeries;
/** @type {?} */
let cnt = -1;
/** @type {?} */
let barPath = '';
/** @type {?} */
let cntSeries = -1;
for (const bcS of this.data) {
cntSeries++;
cnt = -1;
/** @type {?} */
let seriesPaths;
seriesPaths = [];
for (const bcD of bcS.data) {
cnt++;
/** @type {?} */
const xPos = cnt * eachWidth + .25 * eachWidth + cntSeries * barWidth + .5 * barWidth + this.xPadding;
/** @type {?} */
const yPos = this.clusteredBarChartService.transformY(this.clusteredBarChartService.maxY - bcD.value) + this.yPadding;
/** @type {?} */
const xStart = xPos - barWidth / 2;
/** @type {?} */
const xEnd = xPos + barWidth / 2;
/** @type {?} */
const yStart = this.clusteredBarChartService.rectHeight + this.yPadding;
barPath = 'M ';
barPath = barPath + ' ' + xStart + ' ' + yStart + ' L ' + xStart
+ ' ' + yPos + ' ' + xEnd + ' ' + yPos + ' ' + xEnd + ' ' + yStart + ' Z';
seriesPaths.push(barPath);
}
this.barPaths.push({ color: bcS.color, paths: seriesPaths });
}
}
/**
* @return {?}
*/
setColors() {
/** @type {?} */
let cnt = 0;
for (const seriesData of this.data) {
if (!seriesData.color) {
if (this.customColorScheme.length > 0) {
seriesData.color = this.customColorScheme[cnt % this.customColorScheme.length];
}
else {
seriesData.color = colorSchemes[this.colorScheme][cnt % 10];
}
cnt++;
}
}
}
/**
* @return {?}
*/
ngOnInit() {
this.componentID = this.globalParametersService.addNewComponent();
console.log('init..');
this.setDimensions();
this.dataCopy = JSON.parse(JSON.stringify(this.data));
this.setColors();
this.clusteredBarChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.computeBarPaths();
}
/**
* @return {?}
*/
ngOnChanges() {
this.setColors();
this.clusteredBarChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.computeBarPaths();
}
}
ClusteredBarChartComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-clustered-bar-chart',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-cbc-chart-base\n [showGridLines]=\"showGridLines\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n\n <g *ngFor=\"let series of barPaths\">\n <g *ngFor=\"let barPath of series.paths\">\n <path class=\"chart-bar\"\n [attr.d]=\"barPath\" [attr.fill]=\"series.color\" />\n </g>\n </g>\n\n</svg>",
providers: [ClusteredBarChartService],
styles: [".chart-bar:hover{stroke-width:1;stroke:#444}"]
}] }
];
/** @nocollapse */
ClusteredBarChartComponent.ctorParameters = () => [
{ type: ClusteredBarChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
];
ClusteredBarChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
xAxisTitle: [{ type: Input }],
yAxisTitle: [{ type: Input }],
showGridLines: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
if (false) {
/** @type {?} */
ClusteredBarChartComponent.prototype.data;
/** @type {?} */
ClusteredBarChartComponent.prototype.width;
/** @type {?} */
ClusteredBarChartComponent.prototype.height;
/** @type {?} */
ClusteredBarChartComponent.prototype.xAxisTitle;
/** @type {?} */
ClusteredBarChartComponent.prototype.yAxisTitle;
/** @type {?} */
ClusteredBarChartComponent.prototype.showGridLines;
/** @type {?} */
ClusteredBarChartComponent.prototype.colorScheme;
/** @type {?} */
ClusteredBarChartComponent.prototype.customColorScheme;
/** @type {?} */
ClusteredBarChartComponent.prototype.componentID;
/** @type {?} */
ClusteredBarChartComponent.prototype.xPadding;
/** @type {?} */
ClusteredBarChartComponent.prototype.yPadding;
/** @type {?} */
ClusteredBarChartComponent.prototype.barPaths;
/** @type {?} */
ClusteredBarChartComponent.prototype.dataCopy;
/** @type {?} */
ClusteredBarChartComponent.prototype.clusteredBarChartService;
/**
* @type {?}
* @private
*/
ClusteredBarChartComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
ClusteredBarChartComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmVkLWJhci1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9jbHVzdGVyZWQtYmFyLWNoYXJ0L2NsdXN0ZXJlZC1iYXItY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQVFqRixNQUFNLE9BQU8sMEJBQTBCOzs7Ozs7SUEyRXJDLFlBQW1CLHdCQUFrRCxFQUNqRCx1QkFBZ0QsRUFDaEQsY0FBMEI7UUFGM0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNqRCw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELG1CQUFjLEdBQWQsY0FBYyxDQUFZO1FBdEVyQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxHQUFHLFVBQVUsQ0FBQztRQUN6QixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFHMUMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQWdFcUIsQ0FBQzs7Ozs7SUEzRG5ELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJ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SUFDcEIsOENBQWM7O0lBQ2QsOENBQTZCOztJQUM3Qiw4Q0FBYzs7SUFDZCw4Q0FBUzs7SUE0REcsOERBQXlEOzs7OztJQUN6RCw2REFBd0Q7Ozs7O0lBQ3hELG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2xvclNjaGVtZXMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29sb3Itc2NoZW1lcyc7XG5pbXBvcnQgeyBDbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UgfSBmcm9tICcuL2NsdXN0ZXJlZC1iYXItY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBHbG9iYWxQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL2dsb2JhbC9nbG9iYWwtcGFyYW1ldGVycy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWNsdXN0ZXJlZC1iYXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2x1c3RlcmVkLWJhci1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsdXN0ZXJlZC1iYXItY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbQ2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDbHVzdGVyZWRCYXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhOiBbe3Nlcmllczogc3RyaW5nLCBjb2xvcjogc3RyaW5nLCBkYXRhOiBbe25hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlciB9XX1dO1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBoZWlnaHQ6IG51bWJlcjtcbiAgQElucHV0KCkgeEF4aXNUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSB5QXhpc1RpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dHcmlkTGluZXMgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sb3JTY2hlbWUgPSAnY29sb3JmdWwnO1xuICBASW5wdXQoKSBjdXN0b21Db2xvclNjaGVtZTogc3RyaW5nW10gPSBbXTtcblxuICBjb21wb25lbnRJRDogbnVtYmVyO1xuICB4UGFkZGluZyA9IDYwO1xuICB5UGFkZGluZyA9IHRoaXMueFBhZGRpbmcgLyAyO1xuICBiYXJQYXRoczogYW55O1xuICBkYXRhQ29weTtcbiAgLy8gW3tjb2xvcjogc3RyaW5nLCBwYXRoczogc3RyaW5nW119XTtcblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC8gMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ICogMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiAhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaG9zdC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGhvc3QucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGRpbXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZGltcy53aWR0aCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBjb21wdXRlQmFyUGF0aHMoKSB7XG4gICAgdGhpcy5iYXJQYXRocyA9IFtdO1xuICAgIGxldCB1bmlxdWVYQXhpc1ZhbHVlcztcbiAgICBsZXQgbm9PZlhBeGlzVmFsdWVzO1xuICAgIHVuaXF1ZVhBeGlzVmFsdWVzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHRoaXMuZGF0YSkge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5kYXRhO1xuICAgICAgZm9yIChjb25zdCBzRGF0YSBvZiBzZXJpZXNEYXRhKSB7XG4gICAgICAgIHVuaXF1ZVhBeGlzVmFsdWVzLmFkZChzRGF0YS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9PZlhBeGlzVmFsdWVzID0gdW5pcXVlWEF4aXNWYWx1ZXMuc2l6ZTtcbiAgICBjb25zdCBub09mU2VyaWVzID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICBjb25zdCBlYWNoV2lkdGggPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5yZWN0V2lkdGggLyBub09mWEF4aXNWYWx1ZXM7XG4gICAgY29uc3QgY2F0ZWdvcnlXaWR0aCA9IGVhY2hXaWR0aCAqIC41O1xuICAgIGNvbnN0IGJhcldpZHRoID0gY2F0ZWdvcnlXaWR0aCAvIG5vT2ZTZXJpZXM7XG4gICAgbGV0IGNudCA9IC0xO1xuICAgIGxldCBiYXJQYXRoID0gJyc7XG4gICAgbGV0IGNudFNlcmllcyA9IC0xO1xuICAgIGZvciAoY29uc3QgYmNTIG9mIHRoaXMuZGF0YSkge1xuICAgICAgY250U2VyaWVzKys7XG4gICAgICBjbnQgPSAtMTtcbiAgICAgIGxldCBzZXJpZXNQYXRocztcbiAgICAgIHNlcmllc1BhdGhzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGJjRCBvZiBiY1MuZGF0YSkge1xuICAgICAgICBjbnQgKys7XG4gICAgICAgIGNvbnN0IHhQb3MgPSBjbnQgKiBlYWNoV2lkdGggKyAuMjUgKiBlYWNoV2lkdGggKyBjbnRTZXJpZXMgKiBiYXJXaWR0aCArIC41ICogYmFyV2lkdGggKyB0aGlzLnhQYWRkaW5nO1xuICAgICAgICBjb25zdCB5UG9zID0gdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UudHJhbnNmb3JtWSh0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5tYXhZIC0gYmNELnZhbHVlKSArIHRoaXMueVBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHhTdGFydCA9IHhQb3MgLSBiYXJXaWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IHhFbmQgPSB4UG9zICsgYmFyV2lkdGggLyAyO1xuICAgICAgICBjb25zdCB5U3RhcnQgPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5yZWN0SGVpZ2h0ICsgdGhpcy55UGFkZGluZztcbiAgICAgICAgYmFyUGF0aCA9ICdNICc7XG4gICAgICAgIGJhclBhdGggPSBiYXJQYXRoICsgJyAnICsgeFN0YXJ0ICsgJyAnICsgeVN0YXJ0ICsgJyBMICcgKyB4U3RhcnRcbiAgICAgICAgKyAnICcgKyB5UG9zICsgJyAnICsgeEVuZCArICcgJyArIHlQb3MgKyAnICcgKyB4RW5kICsgJyAnICsgeVN0YXJ0ICsgJyBaJztcbiAgICAgICAgc2VyaWVzUGF0aHMucHVzaChiYXJQYXRoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmFyUGF0aHMucHVzaCh7Y29sb3I6IGJjUy5jb2xvciwgcGF0aHM6IHNlcmllc1BhdGhzfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZTogQ2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlOiBHbG9iYWxQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZikgeyB9XG5cbiAgc2V0Q29sb3JzKCkge1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGZvciAoY29uc3Qgc2VyaWVzRGF0YSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICghc2VyaWVzRGF0YS5jb2xvcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2VyaWVzRGF0YS5jb2xvciA9IHRoaXMuY3VzdG9tQ29sb3JTY2hlbWVbY250ICUgdGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcmllc0RhdGEuY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAgICAgICB9XG4gICAgICAgIGNudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIGNvbnNvbGUubG9nKCdpbml0Li4nKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmRhdGFDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEpKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmNvbXB1dGVCYXJQYXRocygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5zZXRDb2xvcnMoKTtcbiAgICB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5jb21wdXRlQmFyUGF0aHMoKTtcbiAgfVxuXG59XG4iXX0=