webglimpse
Version:
Webglimpse is a data visualization library for the web.
123 lines • 21.4 kB
JavaScript
import { hasval, isNumber } from '../util/util';
function childWidth(child) {
const usePrefWidth = (!hasval(child.layoutOptions) || child.layoutOptions.width === undefined || child.layoutOptions.width === 'pref');
return (usePrefWidth ? child.prefSize.w : child.layoutOptions.width);
}
export function newColumnLayout(leftToRight = true) {
return {
updatePrefSize: function (parentPrefSize, children) {
const childrenToPlace = [];
for (let c = 0; c < children.length; c++) {
const child = children[c];
if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) {
childrenToPlace.push(child);
}
}
let hMax = 0;
let wSum = 0;
for (let c = 0; c < childrenToPlace.length; c++) {
const child = childrenToPlace[c];
const honorChildHeight = !(child.layoutOptions && child.layoutOptions.ignoreHeight);
if (honorChildHeight) {
const h = child.prefSize.h;
if (hasval(hMax) && hasval(h)) {
hMax = Math.max(hMax, h);
}
else {
hMax = null;
}
}
const w = childWidth(child);
if (hasval(wSum) && hasval(w)) {
wSum += w;
}
else {
wSum = null;
}
}
parentPrefSize.w = wSum;
parentPrefSize.h = hMax;
},
updateChildViewports: function (children, parentViewport) {
const childrenToPlace = [];
const childrenToHide = [];
for (let c = 0; c < children.length; c++) {
const child = children[c];
if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) {
childrenToPlace.push(child);
}
else {
childrenToHide.push(child);
}
}
// Use the original index to make the sort stable
const indexProp = 'webglimpse_columnLayout_index';
for (let c = 0; c < childrenToPlace.length; c++) {
const child = childrenToPlace[c];
child[indexProp] = c;
}
childrenToPlace.sort(function (a, b) {
const orderDiff = a.layoutArg - b.layoutArg;
return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp]));
});
let numFlexible = 0;
let totalFlexWidth = parentViewport.w;
for (let c = 0; c < childrenToPlace.length; c++) {
const w = childWidth(childrenToPlace[c]);
if (hasval(w)) {
totalFlexWidth -= w;
}
else {
numFlexible++;
}
}
const flexWidth = totalFlexWidth / numFlexible;
if (leftToRight) {
const jStart = parentViewport.jStart;
const jEnd = parentViewport.jEnd;
let iStart = parentViewport.iStart;
let iRemainder = 0;
for (let c = 0; c < childrenToPlace.length; c++) {
const child = childrenToPlace[c];
let iEnd;
const w = childWidth(child);
if (hasval(w)) {
iEnd = iStart + w;
}
else {
const iEnd0 = iStart + flexWidth + iRemainder;
iEnd = Math.round(iEnd0);
iRemainder = iEnd0 - iEnd;
}
child.viewport.setEdges(iStart, iEnd, jStart, jEnd);
iStart = iEnd;
}
}
else {
const jStart = parentViewport.jStart;
const jEnd = parentViewport.jEnd;
let iEnd = parentViewport.iEnd;
let iRemainder = 0;
for (let c = 0; c < childrenToPlace.length; c++) {
const child = childrenToPlace[c];
let iStart;
const w = childWidth(child);
if (hasval(w)) {
iStart = iEnd - w;
}
else {
const iStart0 = iEnd - flexWidth - iRemainder;
iStart = Math.round(iStart0);
iRemainder = iStart - iStart0;
}
child.viewport.setEdges(iStart, iEnd, jStart, jEnd);
iEnd = iStart;
}
}
for (let c = 0; c < childrenToHide.length; c++) {
childrenToHide[c].viewport.setEdges(0, 0, 0, 0);
}
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uX2xheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93ZWJnbGltcHNlL2xheW91dC9jb2x1bW5fbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStCQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdoRCxTQUFTLFVBQVUsQ0FBQyxLQUFrQjtJQUNsQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDdkksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUdELE1BQU0sVUFBVSxlQUFlLENBQUMsY0FBdUIsSUFBSTtJQUV2RCxPQUFlO1FBR1gsY0FBYyxFQUFFLFVBQVUsY0FBb0IsRUFBRSxRQUF1QjtZQUNuRSxNQUFNLGVBQWUsR0FBa0IsRUFBRSxDQUFDO1lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNqRixlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMvQjth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Q0FBQyxFQUFFLEVBQUU7Z0JBQzVDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ25EO1FBQ0wsQ0FBQztLQUdKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBNZXRyb24sIEluYy5cclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICpcclxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcclxuICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxyXG4gKlxyXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcclxuICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXHJcbiAqXHJcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcclxuICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxyXG4gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cclxuICpcclxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcclxuICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcclxuICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcclxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcclxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxyXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxyXG4gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcclxuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xyXG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cclxuICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcclxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcclxuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqL1xyXG5pbXBvcnQgeyBMYXlvdXRFbnRyeSwgTGF5b3V0IH0gZnJvbSAnLi4vY29yZSc7XHJcbmltcG9ydCB7IFNpemUsIEJvdW5kc1VubW9kaWZpYWJsZSB9IGZyb20gJy4uL2JvdW5kcyc7XHJcbmltcG9ydCB7IGhhc3ZhbCwgaXNOdW1iZXIgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5cclxuXHJcbmZ1bmN0aW9uIGNoaWxkV2lkdGgoY2hpbGQ6IExheW91dEVudHJ5KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHVzZVByZWZXaWR0aCA9ICghaGFzdmFsKGNoaWxkLmxheW91dE9wdGlvbnMpIHx8IGNoaWxkLmxheW91dE9wdGlvbnMud2lkdGggPT09IHVuZGVmaW5lZCB8fCBjaGlsZC5sYXlvdXRPcHRpb25zLndpZHRoID09PSAncHJlZicpO1xyXG4gICAgcmV0dXJuICh1c2VQcmVmV2lkdGggPyBjaGlsZC5wcmVmU2l6ZS53IDogY2hpbGQubGF5b3V0T3B0aW9ucy53aWR0aCk7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3Q29sdW1uTGF5b3V0KGxlZnRUb1JpZ2h0OiBib29sZWFuID0gdHJ1ZSk6IExheW91dCB7XHJcblxyXG4gICAgcmV0dXJuIDxMYXlvdXQ+e1xyXG5cclxuXHJcbiAgICAgICAgdXBkYXRlUHJlZlNpemU6IGZ1bmN0aW9uIChwYXJlbnRQcmVmU2l6ZTogU2l6ZSwgY2hpbGRyZW46IExheW91dEVudHJ5W10pIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Ub1BsYWNlID0gPExheW91dEVudHJ5W10+W107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bY107XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIoY2hpbGQubGF5b3V0QXJnKSAmJiAhKGNoaWxkLmxheW91dE9wdGlvbnMgJiYgY2hpbGQubGF5b3V0T3B0aW9ucy5oaWRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuVG9QbGFjZS5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhNYXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgd1N1bSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub1BsYWNlLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuVG9QbGFjZVtjXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBob25vckNoaWxkSGVpZ2h0ID0gIShjaGlsZC5sYXlvdXRPcHRpb25zICYmIGNoaWxkLmxheW91dE9wdGlvbnMuaWdub3JlSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGlmIChob25vckNoaWxkSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IGNoaWxkLnByZWZTaXplLmg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc3ZhbChoTWF4KSAmJiBoYXN2YWwoaCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaE1heCA9IE1hdGgubWF4KGhNYXgsIGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaE1heCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSBjaGlsZFdpZHRoKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChoYXN2YWwod1N1bSkgJiYgaGFzdmFsKHcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd1N1bSArPSB3O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd1N1bSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50UHJlZlNpemUudyA9IHdTdW07XHJcbiAgICAgICAgICAgIHBhcmVudFByZWZTaXplLmggPSBoTWF4O1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgICB1cGRhdGVDaGlsZFZpZXdwb3J0czogZnVuY3Rpb24gKGNoaWxkcmVuOiBMYXlvdXRFbnRyeVtdLCBwYXJlbnRWaWV3cG9ydDogQm91bmRzVW5tb2RpZmlhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuVG9QbGFjZSA9IDxMYXlvdXRFbnRyeVtdPltdO1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlblRvSGlkZSA9IDxMYXlvdXRFbnRyeVtdPltdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoaWxkcmVuLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGNoaWxkLmxheW91dEFyZykgJiYgIShjaGlsZC5sYXlvdXRPcHRpb25zICYmIGNoaWxkLmxheW91dE9wdGlvbnMuaGlkZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblRvUGxhY2UucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblRvSGlkZS5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBpbmRleCB0byBtYWtlIHRoZSBzb3J0IHN0YWJsZVxyXG4gICAgICAgICAgICBjb25zdCBpbmRleFByb3AgPSAnd2ViZ2xpbXBzZV9jb2x1bW5MYXlvdXRfaW5kZXgnO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoaWxkcmVuVG9QbGFjZS5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblRvUGxhY2VbY107XHJcbiAgICAgICAgICAgICAgICBjaGlsZFtpbmRleFByb3BdID0gYztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hpbGRyZW5Ub1BsYWNlLnNvcnQoZnVuY3Rpb24gKGE6IExheW91dEVudHJ5LCBiOiBMYXlvdXRFbnRyeSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJEaWZmID0gYS5sYXlvdXRBcmcgLSBiLmxheW91dEFyZztcclxuICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXJEaWZmICE9PSAwID8gb3JkZXJEaWZmIDogKGFbaW5kZXhQcm9wXSAtIGJbaW5kZXhQcm9wXSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBudW1GbGV4aWJsZSA9IDA7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbEZsZXhXaWR0aCA9IHBhcmVudFZpZXdwb3J0Lnc7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub1BsYWNlLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3ID0gY2hpbGRXaWR0aChjaGlsZHJlblRvUGxhY2VbY10pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhc3ZhbCh3KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsRmxleFdpZHRoIC09IHc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBudW1GbGV4aWJsZSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGZsZXhXaWR0aCA9IHRvdGFsRmxleFdpZHRoIC8gbnVtRmxleGlibGU7XHJcblxyXG4gICAgICAgICAgICBpZiAobGVmdFRvUmlnaHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpTdGFydCA9IHBhcmVudFZpZXdwb3J0LmpTdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpFbmQgPSBwYXJlbnRWaWV3cG9ydC5qRW5kO1xyXG4gICAgICAgICAgICAgICAgbGV0IGlTdGFydCA9IHBhcmVudFZpZXdwb3J0LmlTdGFydDtcclxuICAgICAgICAgICAgICAgIGxldCBpUmVtYWluZGVyID0gMDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub1BsYWNlLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblRvUGxhY2VbY107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpRW5kOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdyA9IGNoaWxkV2lkdGgoY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXN2YWwodykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaUVuZCA9IGlTdGFydCArIHc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpRW5kMCA9IGlTdGFydCArIGZsZXhXaWR0aCArIGlSZW1haW5kZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlFbmQgPSBNYXRoLnJvdW5kKGlFbmQwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaVJlbWFpbmRlciA9IGlFbmQwIC0gaUVuZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnZpZXdwb3J0LnNldEVkZ2VzKGlTdGFydCwgaUVuZCwgalN0YXJ0LCBqRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICBpU3RhcnQgPSBpRW5kO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgalN0YXJ0ID0gcGFyZW50Vmlld3BvcnQualN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgakVuZCA9IHBhcmVudFZpZXdwb3J0LmpFbmQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgaUVuZCA9IHBhcmVudFZpZXdwb3J0LmlFbmQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgaVJlbWFpbmRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoaWxkcmVuVG9QbGFjZS5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5Ub1BsYWNlW2NdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgaVN0YXJ0OiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdyA9IGNoaWxkV2lkdGgoY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXN2YWwodykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCAtIHc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpU3RhcnQwID0gaUVuZCAtIGZsZXhXaWR0aCAtIGlSZW1haW5kZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IE1hdGgucm91bmQoaVN0YXJ0MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlSZW1haW5kZXIgPSBpU3RhcnQgLSBpU3RhcnQwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQudmlld3BvcnQuc2V0RWRnZXMoaVN0YXJ0LCBpRW5kLCBqU3RhcnQsIGpFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlFbmQgPSBpU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub0hpZGUubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuVG9IaWRlW2NdLnZpZXdwb3J0LnNldEVkZ2VzKDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9O1xyXG59XHJcbiJdfQ==