drawdown-svg-render
Version:
Svg renderer for drawdown diagrams
369 lines (321 loc) • 41.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
exports.tailGenerator = tailGenerator;
exports.simpleRightHead = simpleRightHead;
exports.simpleLeftHead = simpleLeftHead;
exports.leftHead = leftHead;
exports.rightHead = rightHead;
function tailGenerator(style, opts) {
switch (style) {
case '-':
case 'STRAIGHT':
return straightTail;
case '~':
case 'CURVED':
return curvedTail;
case 'MESSAGE':
return function (d) {
return messageTail(d, opts);
};
case 'LINE':
return lineTail;
default:
throw 'Unknown link style "' + style + '"';
}
}
var _180OVER_PI = 180 / Math.PI;
function lineTail(d) {
var sl = d.source.layout;
var tl = d.target.layout;
d.pathMeta = {
start: { x: sl.pos.x, y: sl.pos.y },
end: { x: tl.pos.x, y: tl.pos.y },
dir: 'E'
};
var start = d.pathMeta.start;
var end = d.pathMeta.end;
var angle = Math.atan2(end.y - start.y, end.x - start.x) * _180OVER_PI;
var length = Math.sqrt((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y));
d.pathMeta.length = length;
d.pathMeta.transform = 'translate(' + start.x + ' ' + start.y + ') rotate(' + angle + ')';
d.textMeta = {
pos: { x: start.x + length / 2, y: start.y },
baseLine: 'text-after-edge',
textAnchor: 'start'
};
return 'M' + 0 + ' ' + 0 + 'L' + length + ' ' + 0;
}
function messageTail(d, opts) {
var yOffset = opts.yStart + opts.ySeparation * d.index;
var sl = d.source.layout;
var tl = d.target.layout;
if (d.source == d.target) {
d.pathMeta = {
start: { x: sl.pos.x, y: yOffset - opts.ySeparation },
end: { x: sl.pos.x, y: yOffset },
dir: 'W'
};
var start = d.pathMeta.start;
d.textMeta = {
pos: { x: start.x + opts.ySeparation * 0.8, y: start.y + opts.ySeparation / 2 },
baseLine: 'text-after-edge',
textAnchor: 'start'
};
return 'M' + start.x + ' ' + start.y + '\n C ' + (start.x + opts.ySeparation) + ' ' + start.y + '\n ' + (start.x + opts.ySeparation) + ' ' + (start.y + opts.ySeparation) + '\n ' + start.x + ' ' + (start.y + opts.ySeparation);
} else {
d.pathMeta = {
start: { x: sl.pos.x, y: yOffset },
end: { x: tl.pos.x, y: yOffset },
dir: tl.pos.x > sl.pos.x ? 'E' : 'W'
};
d.textMeta = {
pos: { x: d.pathMeta.start.x + (d.pathMeta.end.x - d.pathMeta.start.x) / 2, y: yOffset - 5 },
baseLine: 'text-after-edge',
textAnchor: 'middle'
};
return 'M' + d.source.layout.pos.x + ' ' + yOffset + ' H ' + d.target.layout.pos.x;
}
}
function straightTail(d) {
var _tail = tail(d, true),
_tail2 = _slicedToArray(_tail, 2),
pathMeta = _tail2[0],
script = _tail2[1];
d.pathMeta = pathMeta;
return script;
}
function curvedTail(d) {
var _tail3 = tail(d, false),
_tail4 = _slicedToArray(_tail3, 2),
pathMeta = _tail4[0],
script = _tail4[1];
d.pathMeta = pathMeta;
return script;
}
function tail(d, isStraight) {
var sl = d.source.layout;
var tl = d.target.layout;
var dir = d.source.id == d.target.id ? 'SELF' : getApparentDir(sl, tl);
var start = { x: 0, y: 0 };
var end = { x: 0, y: 0 };
var middle = 0;
var script = '';
switch (true) {
case ['NNE', 'SSE', 'SSW', 'NNW'].indexOf(dir) >= 0:
start.x = sl.pos.x + sl.bbw / 2;
start.y = sl.pos.y;
end.x = tl.pos.x;
end.y = tl.pos.y + tl.bbh / 2;
if (['NNW', 'SSW'].indexOf(dir) >= 0) {
start.x = sl.pos.x - sl.bbw / 2;
}
if (['SSE', 'SSW'].indexOf(dir) >= 0) {
end.y = tl.pos.y - tl.bbh / 2;
}
if (isStraight) {
script = 'M' + start.x + ' ' + start.y + ' H' + end.x + ' V' + end.y;
} else {
script = 'M' + start.x + ' ' + start.y + ' Q' + end.x + ' ' + start.y + ' ' + end.x + ' ' + end.y;
}
break;
case ['ENE', 'ESE', 'WNW', 'WSW'].indexOf(dir) >= 0:
start.x = sl.pos.x;
start.y = sl.pos.y - sl.bbh / 2;
end.x = tl.pos.x - tl.bbw / 2;
end.y = tl.pos.y;
if (['ESE', 'WSW'].indexOf(dir) >= 0) {
start.y = sl.pos.y + sl.bbh / 2;
}
if (['WNW', 'WSW'].indexOf(dir) >= 0) {
end.x = tl.pos.x + tl.bbw / 2;
}
if (isStraight) {
script = 'M' + start.x + ' ' + start.y + 'V' + end.y + 'H' + end.x;
} else {
script = 'M' + start.x + ' ' + start.y + 'Q' + start.x + ' ' + end.y + ' ' + end.x + ' ' + end.y;
}
break;
case ['E', 'W'].indexOf(dir) >= 0:
start.x = sl.pos.x + sl.bbw / 2;
start.y = sl.pos.y;
end.x = tl.pos.x - tl.bbw / 2;
end.y = tl.pos.y;
if (dir == 'W') {
start.x = sl.pos.x - sl.bbw / 2;
end.x = tl.pos.x + tl.bbw / 2;
}
middle = start.x + (end.x - start.x) / 2;
if (isStraight) {
script = 'M' + start.x + ' ' + start.y + 'H' + middle + 'V' + end.y + 'H' + end.x;
} else {
script = 'M' + start.x + ' ' + start.y + 'C' + middle + ' ' + start.y + ' ' + middle + ' ' + end.y + ' ' + end.x + ' ' + end.y;
}
break;
case ['N', 'S'].indexOf(dir) >= 0:
start.x = sl.pos.x;
start.y = sl.pos.y - sl.bbh / 2;
end.x = tl.pos.x;
end.y = tl.pos.y + tl.bbh / 2;
if (dir == 'S') {
start.y = sl.pos.y + sl.bbh / 2;
end.y = tl.pos.y - tl.bbh / 2;
}
middle = start.y + (end.y - start.y) / 2;
if (isStraight) {
script = 'M' + start.x + ' ' + start.y + 'V' + middle + 'H' + end.x + 'V' + end.y;
} else {
script = 'M' + start.x + ' ' + start.y + 'C' + start.x + ' ' + middle + ' ' + end.x + ' ' + middle + ' ' + end.x + ' ' + end.y;
}
break;
case 'SELF' == dir:
start.x = sl.pos.x;
start.y = sl.pos.y - sl.bbh / 2;
end.x = sl.pos.x + sl.bbw / 2;
end.y = sl.pos.y;
var r = Math.sqrt(sl.bbw * sl.bbw + sl.bbh * sl.bbh) / 4;
if (isStraight) {
script = 'M' + start.x + ' ' + start.y + 'V' + (start.y - r) + 'H' + (end.x + r) + 'V' + end.y + 'H' + end.x;
} else {
script = 'M' + start.x + ' ' + start.y + 'C ' + (start.x + r) + ' ' + (start.y - 3 * r) + ' ' + (end.x + 3 * r) + ' ' + end.y + ' ' + end.x + ' ' + end.y;
}
break;
}
return [{
start: start,
end: end,
dir: dir
}, script];
return script;
}
function simpleRightHead(d) {
return simpleHead(d, true);
}
function simpleLeftHead(d) {
return simpleHead(d, true);
}
function simpleHead(d, isRight) {
if (!d.pathMeta) {
return;
}
var w = 14;
var h = 8;
var bbw = d.source.layout.bbw;
var length = d.pathMeta.length;
if (isRight) {
return 'M' + (length - bbw / 2) + ' 0l' + -w + ' ' + -h / 2 + 'v' + h + 'Z';
} else {
return 'M' + bbw / 2 + ' 0l' + w + ' ' + -h / 2 + 'v' + h + 'Z';
}
}
function leftHead(d) {
return head(d, false);
}
function rightHead(d) {
return head(d, true);
}
function head(d, isRight) {
if (!d.pathMeta) {
return;
}
var end = void 0;
if (isRight) {
end = d.pathMeta.end;
} else {
end = d.pathMeta.start;
}
var dir = d.pathMeta.dir;
var w = 14;
var h = 8;
var directions = void 0;
if (isRight) {
directions = {
easts: ['ENE', 'E', 'ESE'],
wests: ['WNW', 'W', 'WSW', "SELF"],
norts: ['NNW', 'N', 'NNE'],
souths: ['SSW', 'S', 'SSE']
};
} else {
directions = {
easts: ['NNW', 'W', 'SSW'],
wests: ['NNE', 'E', 'SSE'],
norts: ['WSW', 'S', 'ESE'],
souths: ['WNW', 'N', 'ENE', "SELF"]
};
}
switch (true) {
case directions.easts.indexOf(dir) >= 0:
return 'M' + end.x + ' ' + end.y + 'L' + (end.x - w) + ' ' + (end.y - h / 2) + 'V' + (end.y + h / 2) + 'Z';
case directions.wests.indexOf(dir) >= 0:
return 'M' + end.x + ' ' + end.y + 'L' + (end.x + w) + ' ' + (end.y - h / 2) + 'V' + (end.y + h / 2) + 'Z';
case directions.norts.indexOf(dir) >= 0:
return 'M' + end.x + ' ' + end.y + 'L' + (end.x - h / 2) + ' ' + (end.y + w) + 'H' + (end.x + h / 2) + 'Z';
case directions.souths.indexOf(dir) >= 0:
return 'M' + end.x + ' ' + end.y + 'L' + (end.x - h / 2) + ' ' + (end.y - w) + 'H' + (end.x + h / 2) + 'Z';
}
}
function getApparentDir(sl, tl) {
var vDir = 'SAME';
var hDir = 'SAME';
var dir = '?';
if (tl.pos.y + tl.bbh / 2 < sl.pos.y - sl.bbh / 2) {
vDir = 'TOP';
} else if (tl.pos.y - tl.bbh / 2 > sl.pos.y + sl.bbh / 2) {
vDir = 'BOTTOM';
}
if (tl.pos.x + tl.bbw / 2 < sl.pos.x - sl.bbw / 2) {
hDir = 'LEFT';
} else if (sl.pos.x + sl.bbw / 2 < tl.pos.x - tl.bbw / 2) {
hDir = 'RIGHT';
}
switch (true) {
case hDir == 'SAME' && vDir == 'TOP':
dir = 'N';
break;
case hDir == 'SAME' && vDir == 'BOTTOM':
dir = 'S';
break;
case hDir == 'RIGHT' && vDir == 'SAME':
dir = 'E';
break;
case hDir == 'LEFT' && vDir == 'SAME':
dir = 'W';
break;
case hDir == 'RIGHT' && vDir == 'TOP':
dir = 'NE';
if (tl.pos.x - tl.bbw / 2 - sl.pos.x - sl.bbw / 2 > sl.pos.y - sl.bbh / 2 - tl.pos.y - tl.bbh / 2) {
dir = 'ENE';
} else {
dir = 'NNE';
}
break;
case hDir == 'RIGHT' && vDir == 'BOTTOM':
dir = 'SE';
if (tl.pos.x - tl.bbw / 2 - sl.pos.x - sl.bbw / 2 > tl.pos.y - tl.bbh / 2 - sl.pos.y - sl.bbh / 2) {
dir = 'ESE';
} else {
dir = 'SSE';
}
break;
case hDir == 'LEFT' && vDir == 'TOP':
dir = 'NW';
if (sl.pos.x - sl.bbw / 2 - tl.pos.x - tl.bbw / 2 > sl.pos.y - sl.bbh / 2 - tl.pos.y - tl.bbh / 2) {
dir = 'WNW';
} else {
dir = 'NNW';
}
break;
case hDir == 'LEFT' && vDir == 'BOTTOM':
dir = 'SW';
if (sl.pos.x - sl.bbw / 2 - tl.pos.x - tl.bbw / 2 > tl.pos.y - tl.bbh / 2 - sl.pos.y - sl.bbh / 2) {
dir = 'WSW';
} else {
dir = 'SSW';
}
break;
}
return dir;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzL2xpbmsuanMiXSwibmFtZXMiOlsidGFpbEdlbmVyYXRvciIsInNpbXBsZVJpZ2h0SGVhZCIsInNpbXBsZUxlZnRIZWFkIiwibGVmdEhlYWQiLCJyaWdodEhlYWQiLCJzdHlsZSIsIm9wdHMiLCJzdHJhaWdodFRhaWwiLCJjdXJ2ZWRUYWlsIiwiZCIsIm1lc3NhZ2VUYWlsIiwibGluZVRhaWwiLCJfMTgwT1ZFUl9QSSIsIk1hdGgiLCJQSSIsInNsIiwic291cmNlIiwibGF5b3V0IiwidGwiLCJ0YXJnZXQiLCJwYXRoTWV0YSIsInN0YXJ0IiwieCIsInBvcyIsInkiLCJlbmQiLCJkaXIiLCJhbmdsZSIsImF0YW4yIiwibGVuZ3RoIiwic3FydCIsInRyYW5zZm9ybSIsInRleHRNZXRhIiwiYmFzZUxpbmUiLCJ0ZXh0QW5jaG9yIiwieU9mZnNldCIsInlTdGFydCIsInlTZXBhcmF0aW9uIiwiaW5kZXgiLCJ0YWlsIiwic2NyaXB0IiwiaXNTdHJhaWdodCIsImlkIiwiZ2V0QXBwYXJlbnREaXIiLCJtaWRkbGUiLCJpbmRleE9mIiwiYmJ3IiwiYmJoIiwiciIsInNpbXBsZUhlYWQiLCJpc1JpZ2h0IiwidyIsImgiLCJoZWFkIiwiZGlyZWN0aW9ucyIsImVhc3RzIiwid2VzdHMiLCJub3J0cyIsInNvdXRocyIsInZEaXIiLCJoRGlyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztRQUVnQkEsYSxHQUFBQSxhO1FBa05DQyxlLEdBQUFBLGU7UUFHQUMsYyxHQUFBQSxjO1FBcUJEQyxRLEdBQUFBLFE7UUFHQUMsUyxHQUFBQSxTO0FBN09ULFNBQVNKLGFBQVQsQ0FBdUJLLEtBQXZCLEVBQThCQyxJQUE5QixFQUFvQztBQUN6QyxVQUFTRCxLQUFUOztBQUVFLFNBQUssR0FBTDtBQUNBLFNBQUssVUFBTDtBQUFpQixhQUFPRSxZQUFQOztBQUVqQixTQUFLLEdBQUw7QUFDQSxTQUFLLFFBQUw7QUFBZSxhQUFPQyxVQUFQOztBQUVmLFNBQUssU0FB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QUdLLEdBQUgsQ0FBT0QsQ0FBN0IsR0FBaUNKLEdBQUc0QixHQUFILEdBQU8sQ0FBeEMsR0FBNEM1QixHQUFHSyxHQUFILENBQU9DLENBQVAsR0FBV04sR0FBRzZCLEdBQUgsR0FBTyxDQUFsQixHQUFzQmhDLEdBQUdRLEdBQUgsQ0FBT0MsQ0FBN0IsR0FBaUNULEdBQUdnQyxHQUFILEdBQU8sQ0FBeEYsRUFBMkY7QUFDekZyQixjQUFNLEtBQU47QUFDRCxPQUZELE1BRU87QUFDTEEsY0FBTSxLQUFOO0FBQ0Q7QUFDRDtBQTVDSjtBQThDQSxTQUFPQSxHQUFQO0FBRUQiLCJmaWxlIjoibGluay5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5leHBvcnQgZnVuY3Rpb24gdGFpbEdlbmVyYXRvcihzdHlsZSwgb3B0cykge1xuICBzd2l0Y2ggKCBzdHlsZSApIHtcblxuICAgIGNhc2UgJy0nOlxuICAgIGNhc2UgJ1NUUkFJR0hUJzogcmV0dXJuIHN0cmFpZ2h0VGFpbDtcblxuICAgIGNhc2UgJ34nOlxuICAgIGNhc2UgJ0NVUlZFRCc6IHJldHVybiBjdXJ2ZWRUYWlsO1xuXG4gICAgY2FzZSAnTUVTU0FHRSc6IHJldHVybiAoZCkgPT4gbWVzc2FnZVRhaWwoZCwgb3B0cyk7XG5cbiAgICBjYXNlICdMSU5FJzogcmV0dXJuIGxpbmVUYWlsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGBVbmtub3duIGxpbmsgc3R5bGUgXCIke3N0eWxlfVwiYDtcbiAgfVxufVxuXG5jb25zdCBfMTgwT1ZFUl9QSSA9IDE4MCAvIE1hdGguUEk7XG5cbmZ1bmN0aW9uIGxpbmVUYWlsKGQpIHtcbiAgY29uc3Qgc2wgPSBkLnNvdXJjZS5sYXlvdXQ7XG4gIGNvbnN0IHRsID0gZC50YXJnZXQubGF5b3V0XG5cbiAgZC5wYXRoTWV0YSA9IHtcbiAgICBzdGFydDoge3g6IHNsLnBvcy54LCB5OiBzbC5wb3MueX0sXG4gICAgZW5kOiB7eDogdGwucG9zLngsIHk6IHRsLnBvcy55fSxcbiAgICBkaXI6ICdFJyxcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gZC5wYXRoTWV0YS5zdGFydDtcbiAgY29uc3QgZW5kID0gZC5wYXRoTWV0YS5lbmQ7XG4gIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihlbmQueSAtIHN0YXJ0LnksIGVuZC54IC0gc3RhcnQueCkqXzE4ME9WRVJfUEk7XG4gIGNvbnN0IGxlbmd0aCA9IE1hdGguc3FydCgoZW5kLnggLSBzdGFydC54KSooZW5kLnggLSBzdGFydC54KSArIChlbmQueSAtIHN0YXJ0LnkpKihlbmQueSAtIHN0YXJ0LnkpKTtcblxuICBkLnBhdGhNZXRhLmxlbmd0aCA9IGxlbmd0aDtcblxuICBkLnBhdGhNZXRhLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtzdGFydC54fSAke3N0YXJ0Lnl9KSByb3RhdGUoJHthbmdsZX0pYDtcblxuICBkLnRleHRNZXRhID0ge1xuICAgIHBvczoge3g6IHN0YXJ0LnggKyBsZW5ndGgvMiAsIHk6IHN0YXJ0Lnl9LFxuICAgIGJhc2VMaW5lOiAndGV4dC1hZnRlci1lZGdlJyxcbiAgICB0ZXh0QW5jaG9yOiAnc3RhcnQnXG5cbiAgfVxuICByZXR1cm4gYE0kezB9ICR7MH1MJHtsZW5ndGh9ICR7MH1gO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlVGFpbChkLCBvcHRzKSB7XG4gIGxldCB5T2Zmc2V0ID0gb3B0cy55U3RhcnQrIG9wdHMueVNlcGFyYXRpb24gKiBkLmluZGV4XG4gIGxldCBzbCA9IGQuc291cmNlLmxheW91dDtcbiAgbGV0IHRsID0gZC50YXJnZXQubGF5b3V0XG5cblxuICBpZiAoZC5zb3VyY2UgPT0gZC50YXJnZXQpIHtcblxuICAgIGQucGF0aE1ldGEgPSB7XG4gICAgICBzdGFydDoge3g6IHNsLnBvcy54LCB5OiB5T2Zmc2V0IC0gb3B0cy55U2VwYXJhdGlvbn0sXG4gICAgICBlbmQ6IHt4OiBzbC5wb3MueCwgeTogeU9mZnNldH0sXG4gICAgICBkaXI6ICdXJ1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBkLnBhdGhNZXRhLnN0YXJ0O1xuXG4gICAgZC50ZXh0TWV0YSA9IHtcbiAgICAgIHBvczoge3g6IHN0YXJ0LnggKyBvcHRzLnlTZXBhcmF0aW9uKjAuOCwgeTogc3RhcnQueSArIG9wdHMueVNlcGFyYXRpb24vMn0sXG4gICAgICBiYXNlTGluZTogJ3RleHQtYWZ0ZXItZWRnZScsXG4gICAgICB0ZXh0QW5jaG9yOiAnc3RhcnQnXG5cbiAgICB9XG4gICAgcmV0dXJuIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9XG4gICAgICAgICAgQyAke3N0YXJ0LnggKyBvcHRzLnlTZXBhcmF0aW9ufSAke3N0YXJ0Lnl9XG4gICAgICAgICAgICAke3N0YXJ0LnggKyBvcHRzLnlTZXBhcmF0aW9ufSAke3N0YXJ0LnkgKyBvcHRzLnlTZXBhcmF0aW9ufVxuICAgICAgICAgICAgJHtzdGFydC54fSAke3N0YXJ0LnkgKyBvcHRzLnlTZXBhcmF0aW9ufWBcblxuICB9IGVsc2Uge1xuXG4gICAgZC5wYXRoTWV0YSA9IHtcbiAgICAgIHN0YXJ0OiB7eDogc2wucG9zLngsIHk6IHlPZmZzZXR9LFxuICAgICAgZW5kOiB7eDogdGwucG9zLngsIHk6IHlPZmZzZXR9LFxuICAgICAgZGlyOiB0bC5wb3MueCA+IHNsLnBvcy54ID8gJ0UnOiAnVydcbiAgICB9XG5cbiAgICBkLnRleHRNZXRhID0ge1xuICAgICAgcG9zOiB7eDogZC5wYXRoTWV0YS5zdGFydC54ICsgKGQucGF0aE1ldGEuZW5kLnggLSBkLnBhdGhNZXRhLnN0YXJ0LngpIC8gMiwgeTogeU9mZnNldCAtIDUgfSxcbiAgICAgIGJhc2VMaW5lOiAndGV4dC1hZnRlci1lZGdlJyxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnXG4gICAgfVxuICAgIHJldHVybiBgTSR7ZC5zb3VyY2UubGF5b3V0LnBvcy54fSAke3lPZmZzZXR9IEggJHtkLnRhcmdldC5sYXlvdXQucG9zLnh9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJhaWdodFRhaWwoZCkge1xuICBjb25zdCBbcGF0aE1ldGEsIHNjcmlwdF0gPSAgdGFpbChkLCB0cnVlKTtcbiAgZC5wYXRoTWV0YSA9IHBhdGhNZXRhO1xuICByZXR1cm4gc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjdXJ2ZWRUYWlsKGQpIHtcbiAgY29uc3QgW3BhdGhNZXRhLCBzY3JpcHRdID0gIHRhaWwoZCwgZmFsc2UpO1xuICBkLnBhdGhNZXRhID0gcGF0aE1ldGE7XG4gIHJldHVybiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIHRhaWwoZCwgaXNTdHJhaWdodCkge1xuXG4gIGxldCBzbCA9IGQuc291cmNlLmxheW91dDtcbiAgbGV0IHRsID0gZC50YXJnZXQubGF5b3V0O1xuXG5cbiAgbGV0IGRpciA9IGQuc291cmNlLmlkID09IGQudGFyZ2V0LmlkID8gJ1NFTEYnIDogZ2V0QXBwYXJlbnREaXIoc2wsIHRsKTtcblxuICBsZXQgc3RhcnQgPSAge3g6IDAsIHk6MH07XG4gIGxldCBlbmQgPSAge3g6IDAsIHk6MH07XG4gIGxldCBtaWRkbGUgPSAwO1xuICBsZXQgc2NyaXB0ID0gJyc7XG5cbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBbJ05ORScsICdTU0UnLCAnU1NXJywgJ05OVyddLmluZGV4T2YoZGlyKSA+PSAwOlxuICAgICAgc3RhcnQueCA9IHNsLnBvcy54ICsgc2wuYmJ3LzI7XG4gICAgICBzdGFydC55ID0gc2wucG9zLnk7XG4gICAgICBlbmQueCA9IHRsLnBvcy54O1xuICAgICAgZW5kLnkgPSB0bC5wb3MueSArIHRsLmJiaC8yO1xuICAgICAgaWYgKFsnTk5XJywgJ1NTVyddLmluZGV4T2YoZGlyKSA+PSAwKSB7XG4gICAgICAgIHN0YXJ0LnggPSBzbC5wb3MueCAtIHNsLmJidy8yO1xuICAgICAgfVxuICAgICAgaWYgKFsnU1NFJywgJ1NTVyddLmluZGV4T2YoZGlyKSA+PSAwKSB7XG4gICAgICAgIGVuZC55ID0gdGwucG9zLnkgLSB0bC5iYmgvMjtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmFpZ2h0KSB7XG4gICAgICAgIHNjcmlwdCA9ICBgTSR7c3RhcnQueH0gJHtzdGFydC55fSBIJHtlbmQueH0gViR7ZW5kLnl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjcmlwdCA9ICBgTSR7c3RhcnQueH0gJHtzdGFydC55fSBRJHtlbmQueH0gJHtzdGFydC55fSAke2VuZC54fSAke2VuZC55fWA7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIChbJ0VORScsICdFU0UnLCAnV05XJywgJ1dTVyddLmluZGV4T2YoZGlyKSA+PSAwKTpcbiAgICAgIHN0YXJ0LnggPSBzbC5wb3MueDtcbiAgICAgIHN0YXJ0LnkgPSBzbC5wb3MueSAtIHNsLmJiaC8yO1xuICAgICAgZW5kLnggPSB0bC5wb3MueCAtIHRsLmJidy8yO1xuICAgICAgZW5kLnkgPSB0bC5wb3MueTtcbiAgICAgIGlmIChbJ0VTRScsICdXU1cnXS5pbmRleE9mKGRpcikgPj0gMCkge1xuICAgICAgICBzdGFydC55ID0gc2wucG9zLnkgKyBzbC5iYmgvMjtcbiAgICAgIH1cbiAgICAgIGlmIChbJ1dOVycsICdXU1cnXS5pbmRleE9mKGRpcikgPj0gMCkge1xuICAgICAgICBlbmQueCA9IHRsLnBvcy54ICsgdGwuYmJ3LzI7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJhaWdodCkge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1WJHtlbmQueX1IJHtlbmQueH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NyaXB0ID0gIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9USR7c3RhcnQueH0gJHtlbmQueX0gJHtlbmQueH0gJHtlbmQueX1gO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFsnRScsICdXJ10uaW5kZXhPZihkaXIpID49IDA6XG4gICAgICBzdGFydC54ID0gc2wucG9zLnggKyBzbC5iYncvMjtcbiAgICAgIHN0YXJ0LnkgPSBzbC5wb3MueTtcbiAgICAgIGVuZC54ID0gdGwucG9zLnggLSB0bC5iYncvMjtcbiAgICAgIGVuZC55ID0gdGwucG9zLnk7XG4gICAgICBpZiAoZGlyID09ICdXJykge1xuICAgICAgICBzdGFydC54ID0gc2wucG9zLnggLSBzbC5iYncvMjtcbiAgICAgICAgZW5kLnggPSB0bC5wb3MueCArIHRsLmJidy8yO1xuICAgICAgfVxuICAgICAgbWlkZGxlID0gc3RhcnQueCArIChlbmQueCAtIHN0YXJ0LngpLzI7XG4gICAgICBpZiAoaXNTdHJhaWdodCkge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1IJHttaWRkbGV9ViR7ZW5kLnl9SCR7ZW5kLnh9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjcmlwdCA9ICBgTSR7c3RhcnQueH0gJHtzdGFydC55fUMke21pZGRsZX0gJHtzdGFydC55fSAke21pZGRsZX0gJHtlbmQueX0gJHtlbmQueH0gJHtlbmQueX1gO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBbJ04nLCAnUyddLmluZGV4T2YoZGlyKSA+PSAwOlxuICAgICAgc3RhcnQueCA9IHNsLnBvcy54O1xuICAgICAgc3RhcnQueSA9IHNsLnBvcy55IC0gc2wuYmJoLzI7XG4gICAgICBlbmQueCA9IHRsLnBvcy54O1xuICAgICAgZW5kLnkgPSB0bC5wb3MueSArIHRsLmJiaC8yO1xuICAgICAgaWYgKGRpciA9PSAnUycpIHtcbiAgICAgICAgc3RhcnQueSA9IHNsLnBvcy55ICsgc2wuYmJoLzI7XG4gICAgICAgIGVuZC55ID0gdGwucG9zLnkgLSB0bC5iYmgvMjtcbiAgICAgIH1cbiAgICAgIG1pZGRsZSA9IHN0YXJ0LnkgKyAoZW5kLnkgLSBzdGFydC55KS8yO1xuICAgICAgaWYgKGlzU3RyYWlnaHQpIHtcbiAgICAgICAgc2NyaXB0ID0gIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9ViR7bWlkZGxlfUgke2VuZC54fVYke2VuZC55fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1DJHtzdGFydC54fSAke21pZGRsZX0gJHtlbmQueH0gJHttaWRkbGV9ICR7ZW5kLnh9ICR7ZW5kLnl9YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NFTEYnID09IGRpcjpcbiAgICAgIHN0YXJ0LnggPSBzbC5wb3MueDtcbiAgICAgIHN0YXJ0LnkgPSBzbC5wb3MueSAtIHNsLmJiaC8yO1xuICAgICAgZW5kLnggPSBzbC5wb3MueCArIHNsLmJidy8yO1xuICAgICAgZW5kLnkgPSBzbC5wb3MueTtcbiAgICAgIGxldCByID0gTWF0aC5zcXJ0KHNsLmJidypzbC5iYncgKyBzbC5iYmgqc2wuYmJoKS80O1xuICAgICAgaWYgKGlzU3RyYWlnaHQpIHtcbiAgICAgICAgc2NyaXB0ID0gIGBNJHtzdGFydC54fSAke3N0YXJ0Lnl9ViR7c3RhcnQueSAtIHJ9SCR7ZW5kLnggKyByfVYke2VuZC55fUgke2VuZC54fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3JpcHQgPSAgYE0ke3N0YXJ0Lnh9ICR7c3RhcnQueX1DICR7c3RhcnQueCtyfSAke3N0YXJ0LnktMypyfSAke2VuZC54ICsgMypyfSAke2VuZC55fSAke2VuZC54fSAke2VuZC55fWA7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZCxcbiAgICAgIGRpcjogZGlyXG4gICAgfSxcbiAgICBzY3JpcHRcbiAgXVxuICByZXR1cm4gc2NyaXB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gIHNpbXBsZVJpZ2h0SGVhZChkKSB7XG4gIHJldHVybiBzaW1wbGVIZWFkKGQsIHRydWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uICBzaW1wbGVMZWZ0SGVhZChkKSB7XG4gIHJldHVybiBzaW1wbGVIZWFkKGQsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVIZWFkKGQsIGlzUmlnaHQpIHtcblxuICBpZiAoIWQucGF0aE1ldGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdyA9IDE0O1xuICBjb25zdCBoID0gODtcbiAgY29uc3QgYmJ3ID0gZC5zb3VyY2UubGF5b3V0LmJidztcbiAgY29uc3QgbGVuZ3RoID0gZC5wYXRoTWV0YS5sZW5ndGg7XG4gIGlmIChpc1JpZ2h0KSB7XG4gICAgcmV0dXJuIGBNJHtsZW5ndGgtYmJ3LzJ9IDBsJHstd30gJHstaC8yfXYke2h9WmA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBNJHtiYncvMn0gMGwke3d9ICR7LWgvMn12JHtofVpgO1xuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGxlZnRIZWFkKGQpIHtcbiAgcmV0dXJuIGhlYWQoZCwgZmFsc2UpXG59XG5leHBvcnQgZnVuY3Rpb24gcmlnaHRIZWFkKGQpIHtcbiAgcmV0dXJuIGhlYWQoZCwgdHJ1ZSlcbn1cbmZ1bmN0aW9uIGhlYWQoZCwgaXNSaWdodCkge1xuICBpZiAoIWQucGF0aE1ldGEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGVuZDtcbiAgaWYgKGlzUmlnaHQpIHtcbiAgICBlbmQgPSBkLnBhdGhNZXRhLmVuZDtcbiAgfSBlbHNlIHtcbiAgICBlbmQgPSBkLnBhdGhNZXRhLnN0YXJ0O1xuICB9XG5cbiAgY29uc3QgZGlyID0gZC5wYXRoTWV0YS5kaXI7XG4gIGNvbnN0IHcgPSAxNDtcbiAgY29uc3QgaCA9IDg7XG5cbiAgbGV0IGRpcmVjdGlvbnM7XG4gIGlmIChpc1JpZ2h0KSB7XG4gICAgZGlyZWN0aW9ucyA9IHtcbiAgICAgIGVhc3RzOiBbJ0VORScsICdFJywgJ0VTRSddLFxuICAgICAgd2VzdHM6IFsnV05XJywgJ1cnLCAnV1NXJywgXCJTRUxGXCJdLFxuICAgICAgbm9ydHM6IFsnTk5XJywgJ04nLCAnTk5FJ10sXG4gICAgICBzb3V0aHM6IFsnU1NXJywgJ1MnLCAnU1NFJ11cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9ucyA9IHtcbiAgICAgIGVhc3RzOiBbJ05OVycsICdXJywgJ1NTVyddLFxuICAgICAgd2VzdHM6IFsnTk5FJywgJ0UnLCAnU1NFJ10sXG4gICAgICBub3J0czogWydXU1cnLCAnUycsICdFU0UnXSxcbiAgICAgIHNvdXRoczogWydXTlcnLCAnTicsICdFTkUnLCBcIlNFTEZcIl1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIGRpcmVjdGlvbnMuZWFzdHMuaW5kZXhPZihkaXIpID49IDA6XG4gICAgICByZXR1cm4gYE0ke2VuZC54fSAke2VuZC55fUwke2VuZC54IC0gd30gJHtlbmQueSAtIGgvMn1WJHtlbmQueSArIGgvMn1aYDtcbiAgICBjYXNlIGRpcmVjdGlvbnMud2VzdHMuaW5kZXhPZihkaXIpID49IDA6XG4gICAgICByZXR1cm4gYE0ke2VuZC54fSAke2VuZC55fUwke2VuZC54ICsgd30gJHtlbmQueSAtIGgvMn1WJHtlbmQueSArIGgvMn1aYDtcbiAgICBjYXNlIGRpcmVjdGlvbnMubm9ydHMuaW5kZXhPZihkaXIpID49IDA6XG4gICAgICByZXR1cm4gYE0ke2VuZC54fSAke2VuZC55fUwke2VuZC54IC0gaC8yfSAke2VuZC55ICsgd31IJHtlbmQueCArIGgvMn1aYDtcbiAgICBjYXNlIGRpcmVjdGlvbnMuc291dGhzLmluZGV4T2YoZGlyKSA+PSAwOlxuICAgICAgcmV0dXJuIGBNJHtlbmQueH0gJHtlbmQueX1MJHtlbmQueCAtIGgvMn0gJHtlbmQueSAtIHd9SCR7ZW5kLnggKyBoLzJ9WmA7XG5cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBcHBhcmVudERpcihzbCwgdGwpIHtcblxuXG4gIGxldCB2RGlyID0gJ1NBTUUnO1xuICBsZXQgaERpciA9ICdTQU1FJztcbiAgbGV0IGRpciA9ICc/JztcblxuICBpZiAodGwucG9zLnkgKyB0bC5iYmgvMiA8IHNsLnBvcy55IC0gc2wuYmJoLzIgKSB7XG4gICAgdkRpciA9ICdUT1AnO1xuICB9IGVsc2UgaWYgKHRsLnBvcy55IC0gdGwuYmJoLzIgPiBzbC5wb3MueSArIHNsLmJiaC8yKSB7XG4gICAgdkRpciA9ICdCT1RUT00nO1xuICB9XG5cbiAgaWYgKHRsLnBvcy54ICsgdGwuYmJ3IC8yICA8IHNsLnBvcy54IC0gc2wuYmJ3LzIpIHtcbiAgICBoRGlyID0gJ0xFRlQnXG4gIH0gZWxzZSBpZiAoc2wucG9zLnggKyBzbC5iYncvMiA8IHRsLnBvcy54IC0gdGwuYmJ3LzIpIHtcbiAgICBoRGlyID0gJ1JJR0hUJ1xuICB9XG5cbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBoRGlyID09ICdTQU1FJyAmJiB2RGlyID09ICdUT1AnOlxuICAgICAgZGlyID0gJ04nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBoRGlyID09ICdTQU1FJyAmJiB2RGlyID09ICdCT1RUT00nOlxuICAgICAgZGlyID0gJ1MnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBoRGlyID09ICdSSUdIVCcgJiYgdkRpciA9PSAnU0FNRSc6XG4gICAgICBkaXIgPSAnRSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGhEaXIgPT0gJ0xFRlQnICYmIHZEaXIgPT0gJ1NBTUUnOlxuICAgICAgZGlyID0gJ1cnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBoRGlyID09ICdSSUdIVCcgJiYgdkRpciA9PSAnVE9QJzpcbiAgICAgIGRpciA9ICdORSc7XG4gICAgICBpZiAodGwucG9zLnggLSB0bC5iYncvMiAtIHNsLnBvcy54IC0gc2wuYmJ3LzIgPiBzbC5wb3MueSAtIHNsLmJiaC8yIC0gdGwucG9zLnkgLSB0bC5iYmgvMikge1xuICAgICAgICBkaXIgPSAnRU5FJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gJ05ORSdcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgaERpciA9PSAnUklHSFQnICYmIHZEaXIgPT0gJ0JPVFRPTSc6XG4gICAgICBkaXIgPSAnU0UnO1xuICAgICAgaWYgKHRsLnBvcy54IC0gdGwuYmJ3LzItIHNsLnBvcy54IC0gc2wuYmJ3LzIgPiB0bC5wb3MueSAtIHRsLmJiaCAvMiAtIHNsLnBvcy55IC0gc2wuYmJoLzIpIHtcbiAgICAgICAgZGlyID0gJ0VTRSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpciA9ICdTU0UnXG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIGhEaXIgPT0gJ0xFRlQnICYmIHZEaXIgPT0gJ1RPUCc6XG4gICAgICBkaXIgPSAnTlcnO1xuICAgICAgaWYgKHNsLnBvcy54IC0gc2wuYmJ3LzIgLSB0bC5wb3MueCAtIHRsLmJidy8yID4gc2wucG9zLnkgLSBzbC5iYmgvMi0gdGwucG9zLnkgLSB0bC5iYmgvMikge1xuICAgICAgICBkaXIgPSAnV05XJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gJ05OVydcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgaERpciA9PSAnTEVGVCcgJiYgdkRpciA9PSAnQk9UVE9NJzpcbiAgICAgIGRpciA9ICdTVyc7XG4gICAgICBpZiAoc2wucG9zLnggLSBzbC5iYncvMiAtIHRsLnBvcy54IC0gdGwuYmJ3LzIgPiB0bC5wb3MueSAtIHRsLmJiaC8yIC0gc2wucG9zLnkgLSBzbC5iYmgvMikge1xuICAgICAgICBkaXIgPSAnV1NXJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gJ1NTVydcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBkaXI7XG5cbn1cbiJdfQ==