ngx-beautiful-charts
Version:
A library to create charts in Angular
458 lines • 44 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 { SunburstChartService } from './sunburst-chart.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
var SunburstChartComponent = /** @class */ (function () {
function SunburstChartComponent(sunburstChartService, globalParametersService, currentElement) {
this.sunburstChartService = sunburstChartService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.colorScheme = 'colorful';
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
this.sunDepth = 0;
}
/**
* @param {?} data
* @param {?} i
* @param {?=} color
* @return {?}
*/
SunburstChartComponent.prototype.getRefinedData = /**
* @param {?} data
* @param {?} i
* @param {?=} color
* @return {?}
*/
function (data, i, color) {
var e_1, _a;
if (color === void 0) { color = null; }
try {
for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {
var sbData = data_1_1.value;
sbData.level = i;
if (color && !sbData.color)
sbData.color = color;
if (sbData.level > this.sunDepth)
this.sunDepth = sbData.level;
if (sbData.children) {
if (sbData.children.length > 0) {
sbData.children = this.getRefinedData(sbData.children, i + 1, sbData.color);
sbData.value = sbData.children.map((/**
* @param {?} child
* @return {?}
*/
function (child) { return child.value; })).reduce((/**
* @param {?} sum
* @param {?} curr
* @return {?}
*/
function (sum, curr) { return sum + curr; }));
}
else {
if (!sbData.value)
sbData.value = 0;
}
}
else if (!sbData.value)
sbData.value = 0;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);
}
finally { if (e_1) throw e_1.error; }
}
return data;
};
/**
* @return {?}
*/
SunburstChartComponent.prototype.setDimensions = /**
* @return {?}
*/
function () {
if (this.width)
this.height = this.width - 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 - this.xPadding;
}
}
// console.log('---set dimensions---');
// console.log('width: ' + this.width);
// console.log('height: ' + this.height);
// console.log('--------------------');
};
/**
* @param {?} data
* @param {?} sum
* @param {?} angleRange
* @param {?} rotation
* @return {?}
*/
SunburstChartComponent.prototype.generateSlice = /**
* @param {?} data
* @param {?} sum
* @param {?} angleRange
* @param {?} rotation
* @return {?}
*/
function (data, sum, angleRange, rotation) {
/** @type {?} */
var perc = data.value / sum;
/** @type {?} */
var angle = angleRange * perc;
// const angleMod = (angle > 180 ) ? 360 - angle : angle;
/** @type {?} */
var angleRad = angle * Math.PI / 180;
/** @type {?} */
var largeArc = (angle > 180) ? 1 : 0;
/** @type {?} */
var textRotation = (270 + angle / 2) % 360;
/** @type {?} */
var textX = (data.level - 1) * this.sunSliceWidth + this.sunSliceWidth / 2;
/** @type {?} */
var textRotationString = 'rotate(' + textRotation + 'deg)';
if (rotation > 180) {
/** @type {?} */
var x = textX * 2;
textRotationString = textRotationString + ' scale(-1,-1) translateX(' + -x + 'px)';
}
/** @type {?} */
var path;
/** @type {?} */
var hoverPath;
if (data.level === 1) {
path = 'M 0 0 0 ' + -this.sunSliceWidth + ' A '
+ this.sunSliceWidth + ' ' + this.sunSliceWidth
+ ' 0 ' + largeArc + ' 1 ' + this.sunSliceWidth * Math.sin(angleRad) + ' '
+ -this.sunSliceWidth * Math.cos(angleRad) + ' z';
/** @type {?} */
var hoverRadius = this.sunSliceWidth * 1.1;
hoverPath = 'M 0 0 0 ' + -hoverRadius + ' A '
+ hoverRadius + ' ' + hoverRadius
+ ' 0 ' + largeArc + ' 1 ' + hoverRadius * Math.sin(angleRad) + ' '
+ -hoverRadius * Math.cos(angleRad) + ' z';
}
else if (data.level > 1) {
/** @type {?} */
var sunSliceInnerRadius = this.sunRadius / (this.sunDepth) * (data.level - 1);
/** @type {?} */
var sunSliceOuterRadius = this.sunRadius / (this.sunDepth) * data.level;
path = 'M 0 ' + -sunSliceInnerRadius + ' 0 ' + -sunSliceOuterRadius
+ ' A ' + sunSliceOuterRadius + ' ' + sunSliceOuterRadius
+ ' 0 ' + largeArc + ' 1 ' + sunSliceOuterRadius * Math.sin(angleRad) + ' '
+ -sunSliceOuterRadius * Math.cos(angleRad)
+ ' L ' + sunSliceInnerRadius * Math.sin(angleRad) + ' '
+ -sunSliceInnerRadius * Math.cos(angleRad) + ' A '
+ sunSliceInnerRadius + ' ' + sunSliceInnerRadius
+ ' 0 ' + largeArc + ' 0 0 ' + -sunSliceInnerRadius + ' z';
/** @type {?} */
var hoverSliceOuterRadius = sunSliceOuterRadius + this.sunSliceWidth * 0.1;
hoverPath = 'M 0 ' + -sunSliceInnerRadius + ' 0 ' + -hoverSliceOuterRadius
+ ' A ' + hoverSliceOuterRadius + ' ' + hoverSliceOuterRadius
+ ' 0 ' + largeArc + ' 1 ' + hoverSliceOuterRadius * Math.sin(angleRad) + ' '
+ -hoverSliceOuterRadius * Math.cos(angleRad)
+ ' L ' + sunSliceInnerRadius * Math.sin(angleRad) + ' '
+ -sunSliceInnerRadius * Math.cos(angleRad) + ' A '
+ sunSliceInnerRadius + ' ' + sunSliceInnerRadius
+ ' 0 ' + largeArc + ' 0 0 ' + -sunSliceInnerRadius + ' z';
}
// console.log(hoverPath);
/** @type {?} */
var sunSlice = {
perc: perc,
name: data.name,
color: data.color,
hoverD: hoverPath,
rotation: 'rotate(' + rotation + 'deg)',
textRotation: textRotationString,
textX: textX,
d: path,
angle: angle,
hover: false,
children: null
};
this.levelSunSlices[data.level - 1].push(sunSlice);
return sunSlice;
};
/**
* @param {?} data
* @param {?} angleRange
* @param {?} rotation
* @return {?}
*/
SunburstChartComponent.prototype.generateSunSlicesForAngle = /**
* @param {?} data
* @param {?} angleRange
* @param {?} rotation
* @return {?}
*/
function (data, angleRange, rotation) {
var e_2, _a, e_3, _b;
/** @type {?} */
var sunSlices = [];
/** @type {?} */
var sum = 0;
try {
for (var data_2 = tslib_1.__values(data), data_2_1 = data_2.next(); !data_2_1.done; data_2_1 = data_2.next()) {
var val = data_2_1.value;
sum = sum + val.value;
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (data_2_1 && !data_2_1.done && (_a = data_2.return)) _a.call(data_2);
}
finally { if (e_2) throw e_2.error; }
}
try {
for (var data_3 = tslib_1.__values(data), data_3_1 = data_3.next(); !data_3_1.done; data_3_1 = data_3.next()) {
var val = data_3_1.value;
/** @type {?} */
var sunSlice = this.generateSlice(val, sum, angleRange, rotation);
if (val.children && val.children.length > 0) {
sunSlice.children = this.generateSunSlicesForAngle(val.children, sunSlice.angle, rotation);
}
// console.log(val);
// console.log(sunSlice);
sunSlices.push(sunSlice);
rotation += sunSlice.angle;
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (data_3_1 && !data_3_1.done && (_b = data_3.return)) _b.call(data_3);
}
finally { if (e_3) throw e_3.error; }
}
return sunSlices;
};
/**
* @param {?} data
* @return {?}
*/
SunburstChartComponent.prototype.generateSunSlices = /**
* @param {?} data
* @return {?}
*/
function (data) {
return this.generateSunSlicesForAngle(data, 360, 0);
};
/**
* @return {?}
*/
SunburstChartComponent.prototype.initiateLevelSunSlices = /**
* @return {?}
*/
function () {
this.levelSunSlices = [];
for (var level = 1; level <= this.sunDepth; level++) {
this.levelSunSlices.push([]);
}
};
/**
* @return {?}
*/
SunburstChartComponent.prototype.setColors = /**
* @return {?}
*/
function () {
var e_4, _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_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_4) throw e_4.error; }
}
};
/**
* @return {?}
*/
SunburstChartComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.componentID = this.globalParametersService.addNewComponent();
// console.log('service (oninitsun) color scheme: ' + this.sunburstChartService.colorScheme);
this.setColors();
this.setDimensions();
this.sunburstChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.sunRadius = this.sunburstChartService.sunRadius;
this.dataRefined = this.getRefinedData(this.data, 1);
// console.log('data refined: ');
// console.log(this.dataRefined);
this.initiateLevelSunSlices();
// console.log(this.sunDepth);
// console.log('level sun slices: ');
// console.log(this.levelSunSlices);
// this.hoverPieRadius = this.sunburstChartService.sunRadius / this.sunDepth * 1.05;
this.sunSliceWidth = this.sunRadius / this.sunDepth;
this.sunSlices = this.generateSunSlices(this.dataRefined);
// console.log(this.hoverPieRadius);
this.cX = this.xPadding + this.sunRadius;
this.cY = this.yPadding + this.sunRadius;
/** @type {?} */
var translateX = this.xPadding + this.sunRadius;
/** @type {?} */
var translateY = this.yPadding + this.sunRadius;
this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)';
/** @type {?} */
var hoverTranslateXY = this.sunRadius * 0.08;
this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)';
};
/**
* @return {?}
*/
SunburstChartComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
// console.log('service (onchangessun) color scheme: ' + this.sunburstChartService.colorScheme);
this.setColors();
this.setDimensions();
this.sunburstChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.sunRadius = this.sunburstChartService.sunRadius;
this.dataRefined = this.getRefinedData(this.data, 1);
// console.log('data refined: ');
// console.log(this.dataRefined);
this.initiateLevelSunSlices();
// console.log(this.sunDepth);
// console.log('level sun slices: ');
// console.log(this.levelSunSlices);
// this.hoverPieRadius = this.sunburstChartService.sunRadius / this.sunDepth * 1.05;
this.sunSliceWidth = this.sunRadius / this.sunDepth;
this.sunSlices = this.generateSunSlices(this.dataRefined);
// console.log(this.hoverPieRadius);
this.cX = this.xPadding + this.sunRadius;
this.cY = this.yPadding + this.sunRadius;
/** @type {?} */
var translateX = this.xPadding + this.sunRadius;
/** @type {?} */
var translateY = this.yPadding + this.sunRadius;
this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)';
/** @type {?} */
var hoverTranslateXY = this.sunRadius * 0.08;
this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)';
};
SunburstChartComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-sunburst-chart',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g *ngFor=\"let level of levelSunSlices\">\n <g *ngFor=\"let slice of level\">\n <g [ngStyle]=\"{'transform': gTranslate + ' ' + slice.rotation}\">\n <path class=\"sun-slice\" (mouseover)=\"slice.hover=true\" (mouseout)=\"slice.hover=false\"\n [ngStyle]=\"{'opacity': slice.hover ? 0.7 : 1.0}\"\n [attr.d]=\"slice.hover ? slice.hoverD : slice.d\" [attr.fill]=\"slice.color\" />\n <text class=\"slice-text\" [attr.x]=\"slice.textX\" \n [attr.y]=\"0\" dominant-baseline=\"middle\" text-anchor=\"middle\" [ngStyle]=\"{'transform': slice.textRotation}\"> \n {{ slice.name }} \n </text>\n </g>\n </g>\n </g>\n</svg>\n",
providers: [SunburstChartService],
styles: [".sun-slice{transition:.3s ease-in;stroke:#fff;stroke-width:.5}.slice-text{color:#fff}"]
}] }
];
/** @nocollapse */
SunburstChartComponent.ctorParameters = function () { return [
{ type: SunburstChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
]; };
SunburstChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
return SunburstChartComponent;
}());
export { SunburstChartComponent };
if (false) {
/** @type {?} */
SunburstChartComponent.prototype.data;
/** @type {?} */
SunburstChartComponent.prototype.width;
/** @type {?} */
SunburstChartComponent.prototype.colorScheme;
/** @type {?} */
SunburstChartComponent.prototype.customColorScheme;
/** @type {?} */
SunburstChartComponent.prototype.componentID;
/** @type {?} */
SunburstChartComponent.prototype.height;
/** @type {?} */
SunburstChartComponent.prototype.xPadding;
/** @type {?} */
SunburstChartComponent.prototype.yPadding;
/** @type {?} */
SunburstChartComponent.prototype.dataRefined;
/** @type {?} */
SunburstChartComponent.prototype.sunSlices;
/** @type {?} */
SunburstChartComponent.prototype.sunSliceWidth;
/** @type {?} */
SunburstChartComponent.prototype.levelSunSlices;
/** @type {?} */
SunburstChartComponent.prototype.sunRadius;
/** @type {?} */
SunburstChartComponent.prototype.sunDepth;
/** @type {?} */
SunburstChartComponent.prototype.cX;
/** @type {?} */
SunburstChartComponent.prototype.cY;
/** @type {?} */
SunburstChartComponent.prototype.gTranslate;
/** @type {?} */
SunburstChartComponent.prototype.hoverTranslate;
/** @type {?} */
SunburstChartComponent.prototype.sunburstChartService;
/**
* @type {?}
* @private
*/
SunburstChartComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
SunburstChartComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYnVyc3QtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJlYXV0aWZ1bC1jaGFydHMvIiwic291cmNlcyI6WyJsaWIvc3VuYnVyc3QtY2hhcnQvc3VuYnVyc3QtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFakY7SUE2QkUsZ0NBQW1CLG9CQUEwQyxFQUN6Qyx1QkFBZ0QsRUFDaEQsY0FBMEI7UUFGM0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUN6Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELG1CQUFjLEdBQWQsY0FBYyxDQUFZO1FBckJyQyxnQkFBVyxHQUFHLFVBQVUsQ0FBQztRQUN6QixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFJMUMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQU03QixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBVWIsQ0FBQzs7Ozs7OztJQUVELCtDQUFjOzs7Ozs7SUFBZCxVQUFlLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBWTs7UUFBWixzQkFBQSxFQUFBLFlBQVk7O1lBQ2xDLEtBQXFCLElBQUEsU0FBQSxpQkFBQSxJQUFJLENBQUEsMEJBQUEsNENBQUU7Z0JBQXRCLElBQU0sTUFBTSxpQkFBQTtnQkFDZixNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFN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QUFDLG9CQUFvQixDQUFDOztpQkFDbEM7Ozs7Z0JBUlEsb0JBQW9CO2dCQUNwQix1QkFBdUI7Z0JBSGMsVUFBVTs7O3VCQWFyRCxLQUFLO3dCQUNMLEtBQUs7OEJBQ0wsS0FBSztvQ0FDTCxLQUFLOztJQW9QUiw2QkFBQztDQUFBLEFBL1BELElBK1BDO1NBelBZLHNCQUFzQjs7O0lBRWpDLHNDQUFtQjs7SUFDbkIsdUNBQXVCOztJQUN2Qiw2Q0FBa0M7O0lBQ2xDLG1EQUEwQzs7SUFFMUMsNkNBQVk7O0lBQ1osd0NBQWU7O0lBQ2YsMENBQWM7O0lBQ2QsMENBQTZCOztJQUM3Qiw2Q0FBaUI7O0lBQ2pCLDJDQUFlOztJQUNmLCtDQUFzQjs7SUFDdEIsZ0RBQW9COztJQUNwQiwyQ0FBa0I7O0lBQ2xCLDBDQUFhOztJQUViLG9DQUFXOztJQUNYLG9DQUFXOztJQUNYLDRDQUFtQjs7SUFDbkIsZ0RBQXVCOztJQUVYLHNEQUFpRDs7Ozs7SUFDakQseURBQXdEOzs7OztJQUN4RCxnREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBJbnB1dCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29sb3JTY2hlbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbG9yLXNjaGVtZXMnO1xuaW1wb3J0IHsgU3VuYnVyc3RDaGFydFNlcnZpY2UgfSBmcm9tICcuL3N1bmJ1cnN0LWNoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9nbG9iYWwvZ2xvYmFsLXBhcmFtZXRlcnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zdW5idXJzdC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW5idXJzdC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N1bmJ1cnN0LWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1N1bmJ1cnN0Q2hhcnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBTdW5idXJzdENoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0ICwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9yU2NoZW1lID0gJ2NvbG9yZnVsJztcbiAgQElucHV0KCkgY3VzdG9tQ29sb3JTY2hlbWU6IHN0cmluZ1tdID0gW107XG5cbiAgY29tcG9uZW50SUQ7XG4gIGhlaWdodDogbnVtYmVyO1xuICB4UGFkZGluZyA9IDYwO1xuICB5UGFkZGluZyA9IHRoaXMueFBhZGRpbmcgLyAyO1xuICBkYXRhUmVmaW5lZDogYW55O1xuICBzdW5TbGljZXM6IGFueTtcbiAgc3VuU2xpY2VXaWR0aDogbnVtYmVyO1xuICBsZXZlbFN1blNsaWNlczogYW55O1xuICBzdW5SYWRpdXM6IG51bWJlcjtcbiAgc3VuRGVwdGggPSAwO1xuICAvLyBob3ZlclBpZVJhZGl1czogbnVtYmVyO1xuICBjWDogbnVtYmVyO1xuICBjWTogbnVtYmVyO1xuICBnVHJhbnNsYXRlOiBzdHJpbmc7XG4gIGhvdmVyVHJhbnNsYXRlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHN1bmJ1cnN0Q2hhcnRTZXJ2aWNlOiBTdW5idXJzdENoYXJ0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBnbG9iYWxQYXJhbWV0ZXJzU2VydmljZTogR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgfVxuXG4gIGdldFJlZmluZWREYXRhKGRhdGEsIGksIGNvbG9yID0gbnVsbCkge1xuICAgIGZvciAoY29uc3Qgc2JEYXRhIG9mIGRhdGEpIHtcbiAgICAgIHNiRGF0YS5sZXZlbCA9IGk7XG4gICAgICBpZiAoY29sb3IgJiYgIXNiRGF0YS5jb2xvcikgc2JEYXRhLmNvbG9yID0gY29sb3I7XG4gICAgICBpZiAoc2JEYXRhLmxldmVsID4gdGhpcy5zdW5EZXB0aCkgdGhpcy5zdW5EZXB0aCA9IHNiRGF0YS5sZXZlbDtcbiAgICAgIGlmIChzYkRhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHNiRGF0YS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2JEYXRhLmNoaWxkcmVuID0gdGhpcy5nZXRSZWZpbmVkRGF0YShzYkRhdGEuY2hpbGRyZW4sIGkgKyAxLCBzYkRhdGEuY29sb3IpO1xuICAgICAgICAgIHNiRGF0YS52YWx1ZSA9IHNiRGF0YS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4gY2hpbGQudmFsdWUpLnJlZHVjZSgoc3VtLCBjdXJyKSA9PiBzdW0gKyBjdXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXNiRGF0YS52YWx1ZSkgc2JEYXRhLnZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc2JEYXRhLnZhbHVlKSBzYkRhdGEudmFsdWUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMud2lkdGgpIHRoaXMuaGVpZ2h0ID0gdGhpcy53aWR0aCAtIHRoaXMueFBhZGRpbmc7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBob3N0ID0gdGhpcy5jdXJyZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGhvc3QucGFyZW50Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRpbXMgPSBob3N0LnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMud2lkdGggPSBkaW1zLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggLSB0aGlzLnhQYWRkaW5nO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygnLS0tc2V0IGRpbWVuc2lvbnMtLS0nKTtcbiAgICAvLyBjb25zb2xlLmxvZygnd2lkdGg6ICcgKyB0aGlzLndpZHRoKTtcbiAgICAvLyBjb25zb2xlLmxvZygnaGVpZ2h0OiAnICsgdGhpcy5oZWlnaHQpO1xuICAgIC8vIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICB9XG5cbiAgZ2VuZXJhdGVTbGljZShkYXRhLCBzdW0sIGFuZ2xlUmFuZ2UsIHJvdGF0aW9uKSB7XG4gICAgY29uc3QgcGVyYyA9IGRhdGEudmFsdWUgLyBzdW07XG4gICAgY29uc3QgYW5nbGUgPSBhbmdsZVJhbmdlICogcGVyYztcbiAgICAvLyBjb25zdCBhbmdsZU1vZCA9IChhbmdsZSA+IDE4MCApID8gMzYwIC0gYW5nbGUgOiBhbmdsZTtcbiAgICBjb25zdCBhbmdsZVJhZCA9IGFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICBjb25zdCBsYXJnZUFyYyA9IChhbmdsZSA+IDE4MCkgPyAxIDogMDtcbiAgICBjb25zdCB0ZXh0Um90YXRpb24gPSAoMjcwICsgYW5nbGUgLyAyKSAlIDM2MDtcbiAgICBjb25zdCB0ZXh0WCA9IChkYXRhLmxldmVsIC0gMSkgKiB0aGlzLnN1blNsaWNlV2lkdGggKyB0aGlzLnN1blNsaWNlV2lkdGggLyAyO1xuICAgIGxldCB0ZXh0Um90YXRpb25TdHJpbmcgPSAncm90YXRlKCcgKyB0ZXh0Um90YXRpb24gKyAnZGVnKSc7XG4gICAgaWYgKHJvdGF0aW9uID4gMTgwKSB7XG4gICAgICBjb25zdCB4ID0gdGV4dFggKiAyO1xuICAgICAgdGV4dFJvdGF0aW9uU3RyaW5nID0gdGV4dFJvdGF0aW9uU3RyaW5nICsgJyBzY2FsZSgtMSwtMSkgdHJhbnNsYXRlWCgnICsgLXggKyAncHgpJztcbiAgICB9XG4gICAgbGV0IHBhdGg7XG4gICAgbGV0IGhvdmVyUGF0aDtcbiAgICBpZiAoZGF0YS5sZXZlbCA9PT0gMSkge1xuICAgICAgcGF0aCA9ICdNIDAgMCAwICcgKyAtdGhpcy5zdW5TbGljZVdpZHRoICsgJyBBICdcbiAgICAgICsgdGhpcy5zdW5TbGljZVdpZHRoICsgJyAnICsgdGhpcy5zdW5TbGljZVdpZHRoXG4gICAgICArICcgMCAnICsgbGFyZ2VBcmMgKyAnIDEgJyArIHRoaXMuc3VuU2xpY2VXaWR0aCAqIE1hdGguc2luKGFuZ2xlUmFkKSArICcgJ1xuICAgICAgKyAtdGhpcy5zdW5TbGljZVdpZHRoICogTWF0aC5jb3MoYW5nbGVSYWQpICsgJyB6JztcblxuICAgICAgY29uc3QgaG92ZXJSYWRpdXMgPSB0aGlzLnN1blNsaWNlV2lkdGggKiAxLjE7XG4gICAgICBob3ZlclBhdGggPSAnTSAwIDAgMCAnICsgLWhvdmVyUmFkaXVzICsgJyBBICdcbiAgICAgICsgaG92ZXJSYWRpdXMgKyAnICcgKyBob3ZlclJhZGl1c1xuICAgICAgKyAnIDAgJyArIGxhcmdlQXJjICsgJyAxICcgKyBob3ZlclJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKSArICcgJ1xuICAgICAgKyAtaG92ZXJSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCkgKyAnIHonO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5sZXZlbCA+IDEpIHtcbiAgICAgIGNvbnN0IHN1blNsaWNlSW5uZXJSYWRpdXMgPSB0aGlzLnN1blJhZGl1cyAvICh0aGlzLnN1bkRlcHRoKSAqIChkYXRhLmxldmVsIC0gMSk7XG4gICAgICBjb25zdCBzdW5TbGljZU91dGVyUmFkaXVzID0gdGhpcy5zdW5SYWRpdXMgLyAodGhpcy5zdW5EZXB0aCkgKiBkYXRhLmxldmVsO1xuXG4gICAgICBwYXRoID0gJ00gMCAnICsgLXN1blNsaWNlSW5uZXJSYWRpdXMgKyAnIDAgJyArIC1zdW5TbGljZU91dGVyUmFkaXVzXG4gICAgICArICcgQSAnICsgc3VuU2xpY2VPdXRlclJhZGl1cyArICcgJyArIHN1blNsaWNlT3V0ZXJSYWRpdXNcbiAgICAgICsgJyAwICcgKyBsYXJnZUFyYyArICcgMSAnICsgc3VuU2xpY2VPdXRlclJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKSArICcgJ1xuICAgICAgKyAtc3VuU2xpY2VPdXRlclJhZGl1cyAqIE1hdGguY29zKGFuZ2xlUmFkKVxuICAgICAgKyAnIEwgJyArIHN1blNsaWNlSW5uZXJSYWRpdXMgKiBNYXRoLnNpbihhbmdsZVJhZCkgKyAnICdcbiAgICAgICsgLXN1blNsaWNlSW5uZXJSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCkgKyAnIEEgJ1xuICAgICAgKyBzdW5TbGljZUlubmVyUmFkaXVzICsgJyAnICsgc3VuU2xpY2VJbm5lclJhZGl1c1xuICAgICAgKyAnIDAgJyArIGxhcmdlQXJjICsgJyAwIDAgJyArIC1zdW5TbGljZUlubmVyUmFkaXVzICsgJyB6JztcblxuICAgICAgY29uc3QgaG92ZXJTbGljZU91dGVyUmFkaXVzID0gc3VuU2xpY2VPdXRlclJhZGl1cyArIHRoaXMuc3VuU2xpY2VXaWR0aCAqIDAuMTtcblxuICAgICAgaG92ZXJQYXRoID0gJ00gMCAnICsgLXN1blNsaWNlSW5uZXJSYWRpdXMgKyAnIDAgJyArIC1ob3ZlclNsaWNlT3V0ZXJSYWRpdXNcbiAgICAgICsgJyBBICcgKyBob3ZlclNsaWNlT3V0ZXJSYWRpdXMgKyAnICcgKyBob3ZlclNsaWNlT3V0ZXJSYWRpdXNcbiAgICAgICsgJyAwICcgKyBsYXJnZUFyYyArICcgMSAnICsgaG92ZXJTbGljZU91dGVyUmFkaXVzICogTWF0aC5zaW4oYW5nbGVSYWQpICsgJyAnXG4gICAgICArIC1ob3ZlclNsaWNlT3V0ZXJSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZClcbiAgICAgICsgJyBMICcgKyBzdW5TbGljZUlubmVyUmFkaXVzICogTWF0aC5zaW4oYW5nbGVSYWQpICsgJyAnXG4gICAgICArIC1zdW5TbGljZUlubmVyUmFkaXVzICogTWF0aC5jb3MoYW5nbGVSYWQpICsgJyBBICdcbiAgICAgICsgc3VuU2xpY2VJbm5lclJhZGl1cyArICcgJyArIHN1blNsaWNlSW5uZXJSYWRpdXNcbiAgICAgICsgJyAwICcgKyBsYXJnZUFyYyArICcgMCAwICcgKyAtc3VuU2xpY2VJbm5lclJhZGl1cyArICcgeic7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKGhvdmVyUGF0aCk7XG5cbiAgICBjb25zdCBzdW5TbGljZSA9IHtcbiAgICAgIHBlcmMsXG4gICAgICBuYW1lOiBkYXRhLm5hbWUsXG4gICAgICBjb2xvcjogZGF0YS5jb2xvcixcbiAgICAgIGhvdmVyRDogaG92ZXJQYXRoLFxuICAgICAgcm90YXRpb246ICdyb3RhdGUoJyArIHJvdGF0aW9uICsgJ2RlZyknLFxuICAgICAgdGV4dFJvdGF0aW9uOiB0ZXh0Um90YXRpb25TdHJpbmcsXG4gICAgICB0ZXh0WCxcbiAgICAgIGQ6IHBhdGgsXG4gICAgICBhbmdsZSxcbiAgICAgIGhvdmVyOiBmYWxzZSxcbiAgICAgIGNoaWxkcmVuOiBudWxsXG4gICAgfTtcblxuICAgIHRoaXMubGV2ZWxTdW5TbGljZXNbZGF0YS5sZXZlbCAtIDFdLnB1c2goc3VuU2xpY2UpO1xuXG4gICAgcmV0dXJuIHN1blNsaWNlO1xuICB9XG5cbiAgZ2VuZXJhdGVTdW5TbGljZXNGb3JBbmdsZShkYXRhLCBhbmdsZVJhbmdlLCByb3RhdGlvbikge1xuICAgIGNvbnN0IHN1blNsaWNlcyA9IFtdO1xuXG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgZGF0YSkge1xuICAgICAgc3VtID0gc3VtICsgdmFsLnZhbHVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmFsIG9mIGRhdGEpIHtcblxuICAgICAgY29uc3Qgc3VuU2xpY2UgPSB0aGlzLmdlbmVyYXRlU2xpY2UodmFsLCBzdW0sIGFuZ2xlUmFuZ2UsIHJvdGF0aW9uKTtcbiAgICAgIGlmICh2YWwuY2hpbGRyZW4gJiYgdmFsLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3VuU2xpY2UuY2hpbGRyZW4gPSB0aGlzLmdlbmVyYXRlU3VuU2xpY2VzRm9yQW5nbGUodmFsLmNoaWxkcmVuLCBzdW5TbGljZS5hbmdsZSwgcm90YXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gY29uc29sZS5sb2codmFsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coc3VuU2xpY2UpO1xuICAgICAgc3VuU2xpY2VzLnB1c2goc3VuU2xpY2UpO1xuICAgICAgcm90YXRpb24gKz0gc3VuU2xpY2UuYW5nbGU7XG4gICAgfVxuICAgIHJldHVybiBzdW5TbGljZXM7XG4gIH1cblxuICBnZW5lcmF0ZVN1blNsaWNlcyhkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTdW5TbGljZXNGb3JBbmdsZShkYXRhLCAzNjAsIDApO1xuICB9XG5cbiAgaW5pdGlhdGVMZXZlbFN1blNsaWNlcygpIHtcbiAgICB0aGlzLmxldmVsU3VuU2xpY2VzID0gW107XG4gICAgZm9yIChsZXQgbGV2ZWwgPSAxOyBsZXZlbCA8PSB0aGlzLnN1bkRlcHRoOyBsZXZlbCsrKSB7XG4gICAgICB0aGlzLmxldmVsU3VuU2xpY2VzLnB1c2goW10pO1xuICAgIH1cbiAgfVxuXG4gIHNldENvbG9ycygpIHtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGNvbnN0IHNsaWNlIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKCFzbGljZS5jb2xvcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2xpY2UuY29sb3IgPSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lW2NudCAlIHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzbGljZS5jb2xvciA9IGNvbG9yU2NoZW1lc1t0aGlzLmNvbG9yU2NoZW1lXVtjbnQgJSAxMF07XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb21wb25lbnRJRCA9IHRoaXMuZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UuYWRkTmV3Q29tcG9uZW50KCk7XG4gICAgLy8gY29uc29sZS5sb2coJ3NlcnZpY2UgKG9uaW5pdHN1bikgY29sb3Igc2NoZW1lOiAnICsgdGhpcy5zdW5idXJzdENoYXJ0U2VydmljZS5jb2xvclNjaGVtZSk7XG4gICAgdGhpcy5zZXRDb2xvcnMoKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnN1bmJ1cnN0Q2hhcnRTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLnN1blJhZGl1cyA9IHRoaXMuc3VuYnVyc3RDaGFydFNlcnZpY2Uuc3VuUmFkaXVzO1xuICAgIHRoaXMuZGF0YVJlZmluZWQgPSB0aGlzLmdldFJlZmluZWREYXRhKHRoaXMuZGF0YSwgMSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGEgcmVmaW5lZDogJyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5kYXRhUmVmaW5lZCk7XG4gICAgdGhpcy5pbml0aWF0ZUxldmVsU3VuU2xpY2VzKCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5zdW5EZXB0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2xldmVsIHN1biBzbGljZXM6ICcpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubGV2ZWxTdW5TbGljZXMpO1xuICAgIC8vIHRoaXMuaG92ZXJQaWVSYWRpdXMgPSB0aGlzLnN1bmJ1cnN0Q2hhcnRTZXJ2aWNlLnN1blJhZGl1cyAvIHRoaXMuc3VuRGVwdGggKiAxLjA1O1xuXG4gICAgdGhpcy5zdW5TbGljZVdpZHRoID0gdGhpcy5zdW5SYWRpdXMgLyB0aGlzLnN1bkRlcHRoO1xuICAgIHRoaXMuc3VuU2xpY2VzID0gdGhpcy5nZW5lcmF0ZVN1blNsaWNlcyh0aGlzLmRhdGFSZWZpbmVkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmhvdmVyUGllUmFkaXVzKTtcbiAgICB0aGlzLmNYID0gdGhpcy54UGFkZGluZyArIHRoaXMuc3VuUmFkaXVzO1xuICAgIHRoaXMuY1kgPSB0aGlzLnlQYWRkaW5nICsgdGhpcy5zdW5SYWRpdXM7XG4gICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMueFBhZGRpbmcgKyB0aGlzLnN1blJhZGl1cztcbiAgICBjb25zdCB0cmFuc2xhdGVZID0gdGhpcy55UGFkZGluZyArIHRoaXMuc3VuUmFkaXVzO1xuICAgIHRoaXMuZ1RyYW5zbGF0ZSA9ICd0cmFuc2xhdGUoJyArIHRyYW5zbGF0ZVggKyAncHgsICcgKyB0cmFuc2xhdGVZICsgJ3B4KSc7XG4gICAgY29uc3QgaG92ZXJUcmFuc2xhdGVYWSA9IHRoaXMuc3VuUmFkaXVzICogMC4wODtcbiAgICB0aGlzLmhvdmVyVHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgaG92ZXJUcmFuc2xhdGVYWSArICdweCwgJyArIC1ob3ZlclRyYW5zbGF0ZVhZICsgJ3B4KSc7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnc2VydmljZSAob25jaGFuZ2Vzc3VuKSBjb2xvciBzY2hlbWU6ICcgKyB0aGlzLnN1bmJ1cnN0Q2hhcnRTZXJ2aWNlLmNvbG9yU2NoZW1lKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuc3VuYnVyc3RDaGFydFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgeFBhZGRpbmc6IHRoaXMueFBhZGRpbmcsXG4gICAgICB5UGFkZGluZzogdGhpcy55UGFkZGluZyxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH0pO1xuICAgIHRoaXMuc3VuUmFkaXVzID0gdGhpcy5zdW5idXJzdENoYXJ0U2VydmljZS5zdW5SYWRpdXM7XG4gICAgdGhpcy5kYXRhUmVmaW5lZCA9IHRoaXMuZ2V0UmVmaW5lZERhdGEodGhpcy5kYXRhLCAxKTtcbiAgICAvLyBjb25zb2xlLmxvZygnZGF0YSByZWZpbmVkOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmRhdGFSZWZpbmVkKTtcbiAgICB0aGlzLmluaXRpYXRlTGV2ZWxTdW5TbGljZXMoKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnN1bkRlcHRoKTtcbiAgICAvLyBjb25zb2xlLmxvZygnbGV2ZWwgc3VuIHNsaWNlczogJyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5sZXZlbFN1blNsaWNlcyk7XG4gICAgLy8gdGhpcy5ob3ZlclBpZVJhZGl1cyA9IHRoaXMuc3VuYnVyc3RDaGFydFNlcnZpY2Uuc3VuUmFkaXVzIC8gdGhpcy5zdW5EZXB0aCAqIDEuMDU7XG5cbiAgICB0aGlzLnN1blNsaWNlV2lkdGggPSB0aGlzLnN1blJhZGl1cyAvIHRoaXMuc3VuRGVwdGg7XG4gICAgdGhpcy5zdW5TbGljZXMgPSB0aGlzLmdlbmVyYXRlU3VuU2xpY2VzKHRoaXMuZGF0YVJlZmluZWQpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaG92ZXJQaWVSYWRpdXMpO1xuICAgIHRoaXMuY1ggPSB0aGlzLnhQYWRkaW5nICsgdGhpcy5zdW5SYWRpdXM7XG4gICAgdGhpcy5jWSA9IHRoaXMueVBhZGRpbmcgKyB0aGlzLnN1blJhZGl1cztcbiAgICBjb25zdCB0cmFuc2xhdGVYID0gdGhpcy54UGFkZGluZyArIHRoaXMuc3VuUmFkaXVzO1xuICAgIGNvbnN0IHRyYW5zbGF0ZVkgPSB0aGlzLnlQYWRkaW5nICsgdGhpcy5zdW5SYWRpdXM7XG4gICAgdGhpcy5nVHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgdHJhbnNsYXRlWCArICdweCwgJyArIHRyYW5zbGF0ZVkgKyAncHgpJztcbiAgICBjb25zdCBob3ZlclRyYW5zbGF0ZVhZID0gdGhpcy5zdW5SYWRpdXMgKiAwLjA4O1xuICAgIHRoaXMuaG92ZXJUcmFuc2xhdGUgPSAndHJhbnNsYXRlKCcgKyBob3ZlclRyYW5zbGF0ZVhZICsgJ3B4LCAnICsgLWhvdmVyVHJhbnNsYXRlWFkgKyAncHgpJztcbiAgfVxuXG59XG4iXX0=