angular-sunburst-radar-chart
Version:
A Sunburst Radar chart with SVG,No Dependencies
119 lines • 18.8 kB
JavaScript
//Not Used now ,Might Use later
import { polarToCartesian } from './trignometry';
// function anglesBasedOnPercentage(items) {
//
// const total = items.reduce((prevValue, curValue) => prevValue +
//curValue, 0);
// if (Math.round(total) != 100) {
// console.error('Cannnot draw as the sum of values should be 100');
// throw new Error('Cannnot draw as the sum of values should be 100');
// }
// let prevDegree = 0;
// const results = [];
// for (let i = 0; i < items.length; i++) {
//
// const item = items[i];
// const currentDegree = item * 3.6;
//
// const degreeToBeDrawn = currentDegree + prevDegree;
// results.push(degreeToBeDrawn);
// prevDegree = prevDegree + currentDegree;
// }
//
//
// return results;
// }
//
function getInitialPosition(startLocation, totalDegrees, num) {
var perLocation = totalDegrees / num;
var middleLocation = perLocation / 2;
var startMiddle = startLocation + middleLocation;
return { startLocation: startLocation, perLocation: perLocation, middleLocation: middleLocation, startMiddle: startMiddle };
}
function getDegreeForIndexBasedOnSplitAngle(index, data) {
var perLocation = data.perLocation, middleLocation = data.middleLocation, startMiddle = data.startMiddle, startLocation = data.startLocation;
var position = index; // + 1;
var startDegree = startLocation + (position * perLocation);
var middleDegree = startMiddle + (position * perLocation);
var endDegree = startLocation + (position * perLocation) + perLocation;
return { startDegree: startDegree, middleDegree: middleDegree, endDegree: endDegree };
}
export function getAllAnglesBasedOnChild(items) {
var num = items.length;
var results = [];
var totalChildren = items.filter(function (item) { return item.children; }).map(function (item) { return item.children.length; }).reduce((function (a, b) { return a + b; }), 0);
var childAngleDifference = 360 / totalChildren;
var currentStartLocation = 0;
for (var i = 0; i < items.length; i++) {
var item = items[i];
var childCount = item.children ? item.children.length : 0;
var totalDegrees = childCount * childAngleDifference;
var endDegree = currentStartLocation + (childCount * childAngleDifference);
var middleDegree = (endDegree - currentStartLocation) / 2;
var currentItem = {};
currentItem['item'] = item;
currentItem['startDegree'] = currentStartLocation;
currentItem['middleDegree'] = middleDegree;
currentItem['endDegree'] = endDegree;
if (childCount > 0) {
currentItem['children'] = iterateChildrenAndSetAngles({ children: item.children, currentItem: currentItem, angleDifference: totalDegrees });
}
currentStartLocation = currentStartLocation + (childCount * childAngleDifference);
results.push(currentItem);
}
return results;
}
export function getAllAnglesBasedOnParent(items) {
var num = items.length;
var results = [];
var angleDifference = 360 / num;
var data = getInitialPosition(0, 360, num);
for (var i = 0; i < items.length; i++) {
var _a = getDegreeForIndexBasedOnSplitAngle(i, data), startDegree = _a.startDegree, middleDegree = _a.middleDegree, endDegree = _a.endDegree;
var item = items[i];
var currentItem = {};
currentItem['item'] = item;
currentItem['startDegree'] = startDegree;
currentItem['middleDegree'] = middleDegree;
currentItem['endDegree'] = endDegree;
var hasChildren = items.filter(function (item) { return !!item.children; }).length > 0;
if (hasChildren) {
currentItem['children'] = iterateChildrenAndSetAngles({ children: item.children, currentItem: currentItem, angleDifference: angleDifference });
}
results.push(currentItem);
}
return results;
}
function iterateChildrenAndSetAngles(_a) {
var children = _a.children, currentItem = _a.currentItem, angleDifference = _a.angleDifference;
var count = children.length;
var childItems = [];
var data = getInitialPosition(currentItem['startDegree'], angleDifference, count);
for (var j = 0; j < count; j++) {
var childItem = {};
childItem['item'] = children[j];
var _b = getDegreeForIndexBasedOnSplitAngle(j, data), startDegree = _b.startDegree, middleDegree = _b.middleDegree, endDegree = _b.endDegree;
childItem['startDegree'] = startDegree;
childItem['middleDegree'] = middleDegree;
childItem['endDegree'] = endDegree;
childItems.push(childItem);
}
return childItems;
}
export function positionsOnAngles(centerX, centerY, radius, angels) {
var results = [];
for (var i = 0; i < angels.length; i++) {
var degreeToBeDrawn = angels[i];
results.push(polarToCartesian(centerX, centerY, radius, degreeToBeDrawn));
}
return results;
}
export function getPointsOnCircleAtAngels(centerX, centerY, radius, angels) {
var results = [];
for (var i = 0; i < angels.length; i++) {
var degreeToBeDrawn = angels[i];
results.push(polarToCartesian(centerX, centerY, radius, degreeToBeDrawn));
}
return results;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5nZWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1zdW5idXJzdC1yYWRhci1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9hbmdlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUvQyw0Q0FBNEM7QUFDNUMsRUFBRTtBQUNGLG9FQUFvRTtBQUNwRSxlQUFlO0FBQ2Ysb0NBQW9DO0FBQ3BDLHdFQUF3RTtBQUN4RSwwRUFBMEU7QUFDMUUsTUFBTTtBQUNOLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsNkNBQTZDO0FBQzdDLEVBQUU7QUFDRiw2QkFBNkI7QUFDN0Isd0NBQXdDO0FBQ3hDLEVBQUU7QUFDRiwwREFBMEQ7QUFDMUQscUNBQXFDO0FBQ3JDLCtDQUErQztBQUMvQyxNQUFNO0FBQ04sRUFBRTtBQUNGLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsSUFBSTtBQUNKLEVBQUU7QUFFRixTQUFTLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRztJQUcxRCxJQUFNLFdBQVcsR0FBRyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lBQ3ZDLElBQU0sY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDdkMsSUFBTSxXQUFXLEdBQUcsYUFBYSxHQUFHLGNBQWMsQ0FBQztJQUVuRCxPQUFPLEVBQUMsYUFBYSxlQUFBLEVBQUUsV0FBVyxhQUFBLEVBQUUsY0FBYyxnQkFBQSxFQUFFLFdBQVcsYUFBQSxFQUFDLENBQUM7QUFHbkUsQ0FBQztBQUVELFNBQVMsa0NBQWtDLENBQUMsS0FBSyxFQUFFLElBQUk7SUFHOUMsSUFBQSw4QkFBVyxFQUFFLG9DQUFjLEVBQUUsOEJBQVcsRUFBRSxrQ0FBYSxDQUFTO0lBQ3ZFLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFBLE9BQU87SUFHNUIsSUFBTSxXQUFXLEdBQUcsYUFBYSxH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QUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUV0QyxJQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0tBRTNFO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vTm90IFVzZWQgbm93ICxNaWdodCBVc2UgbGF0ZXJcclxuaW1wb3J0IHtwb2xhclRvQ2FydGVzaWFufSBmcm9tICcuL3RyaWdub21ldHJ5JztcclxuXHJcbi8vIGZ1bmN0aW9uIGFuZ2xlc0Jhc2VkT25QZXJjZW50YWdlKGl0ZW1zKSB7XHJcbi8vXHJcbi8vICAgY29uc3QgdG90YWwgPSBpdGVtcy5yZWR1Y2UoKHByZXZWYWx1ZSwgY3VyVmFsdWUpID0+IHByZXZWYWx1ZSArXHJcbi8vY3VyVmFsdWUsIDApO1xyXG4vLyAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSAhPSAxMDApIHtcclxuLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5ub3QgZHJhdyBhcyB0aGUgc3VtIG9mIHZhbHVlcyBzaG91bGQgYmUgMTAwJyk7XHJcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5ub3QgZHJhdyBhcyB0aGUgc3VtIG9mIHZhbHVlcyBzaG91bGQgYmUgMTAwJyk7XHJcbi8vICAgfVxyXG4vLyAgIGxldCBwcmV2RGVncmVlID0gMDtcclxuLy8gICBjb25zdCByZXN1bHRzID0gW107XHJcbi8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4vL1xyXG4vLyAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xyXG4vLyAgICAgY29uc3QgY3VycmVudERlZ3JlZSA9IGl0ZW0gKiAzLjY7XHJcbi8vXHJcbi8vICAgICBjb25zdCBkZWdyZWVUb0JlRHJhd24gPSBjdXJyZW50RGVncmVlICsgcHJldkRlZ3JlZTtcclxuLy8gICAgIHJlc3VsdHMucHVzaChkZWdyZWVUb0JlRHJhd24pO1xyXG4vLyAgICAgcHJldkRlZ3JlZSA9IHByZXZEZWdyZWUgKyBjdXJyZW50RGVncmVlO1xyXG4vLyAgIH1cclxuLy9cclxuLy9cclxuLy8gICByZXR1cm4gcmVzdWx0cztcclxuLy8gfVxyXG4vL1xyXG5cclxuZnVuY3Rpb24gZ2V0SW5pdGlhbFBvc2l0aW9uKHN0YXJ0TG9jYXRpb24sIHRvdGFsRGVncmVlcywgbnVtKSB7XHJcblxyXG5cclxuICBjb25zdCBwZXJMb2NhdGlvbiA9IHRvdGFsRGVncmVlcyAvIG51bTtcclxuICBjb25zdCBtaWRkbGVMb2NhdGlvbiA9IHBlckxvY2F0aW9uIC8gMjtcclxuICBjb25zdCBzdGFydE1pZGRsZSA9IHN0YXJ0TG9jYXRpb24gKyBtaWRkbGVMb2NhdGlvbjtcclxuXHJcbiAgcmV0dXJuIHtzdGFydExvY2F0aW9uLCBwZXJMb2NhdGlvbiwgbWlkZGxlTG9jYXRpb24sIHN0YXJ0TWlkZGxlfTtcclxuXHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREZWdyZWVGb3JJbmRleEJhc2VkT25TcGxpdEFuZ2xlKGluZGV4LCBkYXRhKSB7XHJcblxyXG5cclxuICBjb25zdCB7cGVyTG9jYXRpb24sIG1pZGRsZUxvY2F0aW9uLCBzdGFydE1pZGRsZSwgc3RhcnRMb2NhdGlvbn0gPSBkYXRhO1xyXG4gIGxldCBwb3NpdGlvbiA9IGluZGV4Oy8vICsgMTtcclxuXHJcblxyXG4gIGNvbnN0IHN0YXJ0RGVncmVlID0gc3RhcnRMb2NhdGlvbiArIChwb3NpdGlvbiAqIHBlckxvY2F0aW9uKTtcclxuICBjb25zdCBtaWRkbGVEZWdyZWUgPSBzdGFydE1pZGRsZSArIChwb3NpdGlvbiAqIHBlckxvY2F0aW9uKTtcclxuICBjb25zdCBlbmREZWdyZWUgPSBzdGFydExvY2F0aW9uICsgKHBvc2l0aW9uICogcGVyTG9jYXRpb24pICsgcGVyTG9jYXRpb247XHJcblxyXG5cclxuICByZXR1cm4ge3N0YXJ0RGVncmVlLCBtaWRkbGVEZWdyZWUsIGVuZERlZ3JlZX07XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQW5nbGVzQmFzZWRPbkNoaWxkKGl0ZW1zKSB7XHJcblxyXG4gIGNvbnN0IG51bSA9IGl0ZW1zLmxlbmd0aDtcclxuICBjb25zdCByZXN1bHRzID0gW107XHJcblxyXG5cclxuICBjb25zdCB0b3RhbENoaWxkcmVuID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbikubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlbi5sZW5ndGgpLnJlZHVjZSgoKGEsIGIpID0+IGEgKyBiKSwwKTtcclxuXHJcbiAgY29uc3QgY2hpbGRBbmdsZURpZmZlcmVuY2UgPSAzNjAgLyB0b3RhbENoaWxkcmVuO1xyXG5cclxuICBsZXQgY3VycmVudFN0YXJ0TG9jYXRpb24gPSAwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XHJcbiAgICBjb25zdCBjaGlsZENvdW50ID0gaXRlbS5jaGlsZHJlbiA/IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoIDogMDtcclxuICAgIGNvbnN0IHRvdGFsRGVncmVlcyA9IGNoaWxkQ291bnQgKiBjaGlsZEFuZ2xlRGlmZmVyZW5jZTtcclxuXHJcblxyXG4gICAgY29uc3QgZW5kRGVncmVlID0gY3VycmVudFN0YXJ0TG9jYXRpb24gKyAoY2hpbGRDb3VudCAqIGNoaWxkQW5nbGVEaWZmZXJlbmNlKTtcclxuXHJcbiAgICBjb25zdCBtaWRkbGVEZWdyZWUgPSAoZW5kRGVncmVlIC0gY3VycmVudFN0YXJ0TG9jYXRpb24pIC8gMjtcclxuXHJcblxyXG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB7fTtcclxuICAgIGN1cnJlbnRJdGVtWydpdGVtJ10gPSBpdGVtO1xyXG4gICAgY3VycmVudEl0ZW1bJ3N0YXJ0RGVncmVlJ10gPSBjdXJyZW50U3RhcnRMb2NhdGlvbjtcclxuICAgIGN1cnJlbnRJdGVtWydtaWRkbGVEZWdyZWUnXSA9IG1pZGRsZURlZ3JlZTtcclxuICAgIGN1cnJlbnRJdGVtWydlbmREZWdyZWUnXSA9IGVuZERlZ3JlZTtcclxuXHJcbiAgICBpZiAoY2hpbGRDb3VudCA+IDApIHtcclxuXHJcblxyXG4gICAgICBjdXJyZW50SXRlbVsnY2hpbGRyZW4nXSA9IGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2U6IHRvdGFsRGVncmVlc30pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U3RhcnRMb2NhdGlvbiA9IGN1cnJlbnRTdGFydExvY2F0aW9uICsgKGNoaWxkQ291bnQgKiBjaGlsZEFuZ2xlRGlmZmVyZW5jZSk7XHJcbiAgICByZXN1bHRzLnB1c2goY3VycmVudEl0ZW0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsQW5nbGVzQmFzZWRPblBhcmVudChpdGVtcykge1xyXG5cclxuICBjb25zdCBudW0gPSBpdGVtcy5sZW5ndGg7XHJcbiAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICBsZXQgYW5nbGVEaWZmZXJlbmNlID0gMzYwIC8gbnVtO1xyXG5cclxuICBjb25zdCBkYXRhID0gZ2V0SW5pdGlhbFBvc2l0aW9uKDAsIDM2MCwgbnVtKTtcclxuXHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICBjb25zdFxyXG4gICAgICB7c3RhcnREZWdyZWUsIG1pZGRsZURlZ3JlZSwgZW5kRGVncmVlfSA9IGdldERlZ3JlZUZvckluZGV4QmFzZWRPblNwbGl0QW5nbGUoaSwgZGF0YSk7XHJcblxyXG5cclxuICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0ge307XHJcbiAgICBjdXJyZW50SXRlbVsnaXRlbSddID0gaXRlbTtcclxuICAgIGN1cnJlbnRJdGVtWydzdGFydERlZ3JlZSddID0gc3RhcnREZWdyZWU7XHJcbiAgICBjdXJyZW50SXRlbVsnbWlkZGxlRGVncmVlJ10gPSBtaWRkbGVEZWdyZWU7XHJcbiAgICBjdXJyZW50SXRlbVsnZW5kRGVncmVlJ10gPSBlbmREZWdyZWU7XHJcblxyXG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0uY2hpbGRyZW4pLmxlbmd0aCA+IDA7XHJcbiAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcclxuXHJcblxyXG4gICAgICBjdXJyZW50SXRlbVsnY2hpbGRyZW4nXSA9IGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW46IGl0ZW0uY2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2V9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRJdGVtKTtcclxuICB9XHJcblxyXG5cclxuICByZXR1cm4gcmVzdWx0cztcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGl0ZXJhdGVDaGlsZHJlbkFuZFNldEFuZ2xlcyh7Y2hpbGRyZW4sIGN1cnJlbnRJdGVtLCBhbmdsZURpZmZlcmVuY2V9KSB7XHJcblxyXG5cclxuICBjb25zdCBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgY29uc3QgY2hpbGRJdGVtcyA9IFtdO1xyXG4gIGNvbnN0IGRhdGEgPSBnZXRJbml0aWFsUG9zaXRpb24oY3VycmVudEl0ZW1bJ3N0YXJ0RGVncmVlJ10sIGFuZ2xlRGlmZmVyZW5jZSwgY291bnQpO1xyXG5cclxuXHJcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7XHJcbiAgICBjb25zdCBjaGlsZEl0ZW0gPSB7fTtcclxuXHJcblxyXG4gICAgY2hpbGRJdGVtWydpdGVtJ10gPSBjaGlsZHJlbltqXTtcclxuXHJcblxyXG4gICAgY29uc3RcclxuICAgICAge3N0YXJ0RGVncmVlLCBtaWRkbGVEZWdyZWUsIGVuZERlZ3JlZX0gPSBnZXREZWdyZWVGb3JJbmRleEJhc2VkT25TcGxpdEFuZ2xlKGosIGRhdGEpO1xyXG5cclxuXHJcbiAgICBjaGlsZEl0ZW1bJ3N0YXJ0RGVncmVlJ10gPSBzdGFydERlZ3JlZTtcclxuICAgIGNoaWxkSXRlbVsnbWlkZGxlRGVncmVlJ10gPSBtaWRkbGVEZWdyZWU7XHJcbiAgICBjaGlsZEl0ZW1bJ2VuZERlZ3JlZSddID0gZW5kRGVncmVlO1xyXG5cclxuICAgIGNoaWxkSXRlbXMucHVzaChjaGlsZEl0ZW0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHJldHVybiBjaGlsZEl0ZW1zO1xyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25zT25BbmdsZXMoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdlbHMpIHtcclxuXHJcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYW5nZWxzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgY29uc3QgZGVncmVlVG9CZURyYXduID0gYW5nZWxzW2ldO1xyXG4gICAgcmVzdWx0cy5wdXNoKHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBkZWdyZWVUb0JlRHJhd24pKTtcclxuXHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uXHJcbmdldFBvaW50c09uQ2lyY2xlQXRBbmdlbHMoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdlbHMpIHtcclxuXHJcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYW5nZWxzLmxlbmd0aDsgaSsrKSB7XHJcblxyXG4gICAgY29uc3QgZGVncmVlVG9CZURyYXduID0gYW5nZWxzW2ldO1xyXG4gICAgcmVzdWx0cy5wdXNoKHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBkZWdyZWVUb0JlRHJhd24pKTtcclxuXHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHRzO1xyXG59XHJcbiJdfQ==