@future-grid/fgp-graph
Version:
fgp-graph is a chart lib based on Dygraphs
263 lines (208 loc) • 30.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Synchronizer = void 0;
var _dygraphs = _interopRequireDefault(require("dygraphs"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var Synchronizer = function Synchronizer(graphs) {
var _this = this;
_classCallCheck(this, Synchronizer);
_defineProperty(this, "args", void 0);
_defineProperty(this, "graphs", void 0);
_defineProperty(this, "synchronize", function () {
if (_this.args.length === 0) {
throw 'Invalid invocation of Dygraph.synchronize(). Need >= 1 argument.';
}
var OPTIONS = ['selection', 'zoom', 'range'];
var opts = {
selection: true,
zoom: true,
range: false
};
var dygraphs = [];
var prevCallbacks = [];
var parseOpts = function parseOpts(obj) {
if (!(obj instanceof Object)) {
throw 'Last argument must be either Dygraph or Object.';
} else {
for (var i = 0; i < OPTIONS.length; i++) {
var optName = OPTIONS[i];
if (obj.hasOwnProperty(optName)) opts[optName] = obj[optName];
}
}
};
var arraysAreEqual = function arraysAreEqual(a, b) {
if (!Array.isArray(a) || !Array.isArray(b)) return false;
var i = a.length;
if (i !== b.length) return false;
while (i--) {
if (a[i] !== b[i]) return false;
}
return true;
};
var attachZoomHandlers = function attachZoomHandlers(gs, syncOpts, prevCallbacks) {
var block = false;
for (var i = 0; i < gs.length; i++) {
var g = gs[i];
g.updateOptions({
drawCallback: function drawCallback(me, initial) {
if (block || initial) return;
block = true;
var opts = {
dateWindow: me.xAxisRange()
};
if (syncOpts.range) {
opts.valueRange = me.yAxisRange();
}
for (var j = 0; j < gs.length; j++) {
if (gs[j] == me) {
if (prevCallbacks[j] && prevCallbacks[j].drawCallback) {
prevCallbacks[j].drawCallback.apply(this, arguments);
}
continue;
} // Only redraw if there are new options (in this case only dateWindow changed!)
//&& arraysAreEqual(opts.valueRange, gs[j].getOption('valueRange'))
if (arraysAreEqual(opts.dateWindow, gs[j].getOption('dateWindow'))) {
continue;
}
gs[j].updateOptions(opts);
}
block = false;
}
}, true
/* no need to redraw */
);
}
};
var attachSelectionHandlers = function attachSelectionHandlers(gs, prevCallbacks) {
var block = false;
for (var i = 0; i < gs.length; i++) {
var g = gs[i];
g.updateOptions({
highlightCallback: function highlightCallback(event, x, points, row, seriesName) {
if (block) return;
block = true;
var me = this;
for (var _i = 0; _i < gs.length; _i++) {
if (me == gs[_i]) {
if (prevCallbacks[_i] && prevCallbacks[_i].highlightCallback) {
prevCallbacks[_i].highlightCallback.apply(this, arguments);
}
continue;
}
var idx = gs[_i].getRowForX(x);
if (idx !== null) {
gs[_i].setSelection(idx, seriesName);
}
}
block = false;
},
unhighlightCallback: function unhighlightCallback(e) {
if (block) return;
block = true;
var me = this;
for (var _i2 = 0; _i2 < gs.length; _i2++) {
if (me == gs[_i2]) {
if (prevCallbacks[_i2] && prevCallbacks[_i2].unhighlightCallback) {
prevCallbacks[_i2].unhighlightCallback.apply(this, arguments);
}
continue;
}
gs[_i2].clearSelection();
}
block = false;
}
}, true
/* no need to redraw */
);
}
};
if (_this.args[0] instanceof _dygraphs["default"]) {
// Arguments are Dygraph objects.
var i;
for (i = 0; i < _this.args.length; i++) {
if (_this.args[i] instanceof _dygraphs["default"]) {
dygraphs.push(_this.args[i]);
} else {
break;
}
}
if (i < _this.args.length - 1) {
throw 'Invalid invocation of Dygraph.synchronize(). ' + 'All but the last argument must be Dygraph objects.';
} else if (i == _this.args.length - 1) {
parseOpts(_this.args[_this.args.length - 1]);
}
} else if (_this.args[0].length) {
// Invoked w/ list of dygraphs, options
for (var _i3 = 0; _i3 < _this.args[0].length; _i3++) {
dygraphs.push(_this.args[0][_i3]);
}
if (_this.args.length == 2) {
parseOpts(_this.args[1]);
} else if (_this.args.length > 2) {
throw 'Invalid invocation of Dygraph.synchronize(). ' + 'Expected two arguments: array and optional options argument.';
} // otherwise arguments.length == 1, which is fine.
} else {
throw 'Invalid invocation of Dygraph.synchronize(). ' + 'First parameter must be either Dygraph or list of Dygraphs.';
}
if (dygraphs.length < 2) {
throw 'Invalid invocation of Dygraph.synchronize(). ' + 'Need two or more dygraphs to synchronize.';
}
var readycount = dygraphs.length;
for (var _i4 = 0; _i4 < dygraphs.length; _i4++) {
var g = dygraphs[_i4];
g.ready(function () {
if (--readycount == 0) {
// store original callbacks
var callBackTypes = ['drawCallback', 'highlightCallback', 'unhighlightCallback'];
for (var j = 0; j < dygraphs.length; j++) {
if (!prevCallbacks[j]) {
prevCallbacks[j] = {};
}
for (var k = callBackTypes.length - 1; k >= 0; k--) {
prevCallbacks[j][callBackTypes[k]] = dygraphs[j].getFunctionOption(callBackTypes[k]);
}
} // Listen for draw, highlight, unhighlight callbacks.
if (opts.zoom) {
attachZoomHandlers(dygraphs, opts, prevCallbacks);
}
if (opts.selection) {
attachSelectionHandlers(dygraphs, prevCallbacks);
}
}
});
}
return {
detach: function detach() {
for (var _i5 = 0; _i5 < dygraphs.length; _i5++) {
var _g = dygraphs[_i5];
if (opts.zoom) {
_g.updateOptions({
drawCallback: prevCallbacks[_i5].drawCallback
});
}
if (opts.selection) {
_g.updateOptions({
highlightCallback: prevCallbacks[_i5].highlightCallback,
unhighlightCallback: prevCallbacks[_i5].unhighlightCallback
});
}
} // release references & make subsequent calls throw.
dygraphs = [];
opts = null;
prevCallbacks = [];
},
graphs: [_this.graphs]
};
});
this.graphs = graphs;
this.args = graphs.concat([{
zoom: true,
selection: false
}]);
};
exports.Synchronizer = Synchronizer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRyYXMvc3luY2hyb25pemVyLnRzIl0sIm5hbWVzIjpbIlN5bmNocm9uaXplciIsImdyYXBocyIsImFyZ3MiLCJsZW5ndGgiLCJPUFRJT05TIiwib3B0cyIsInNlbGVjdGlvbiIsInpvb20iLCJyYW5nZSIsImR5Z3JhcGhzIiwicHJldkNhbGxiYWNrcyIsInBhcnNlT3B0cyIsIm9iaiIsIk9iamVjdCIsImkiLCJvcHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJhcnJheXNBcmVFcXVhbCIsImEiLCJiIiwiQXJyYXkiLCJpc0FycmF5IiwiYXR0YWNoWm9vbUhhbmRsZXJzIiwiZ3MiLCJzeW5jT3B0cyIsImJsb2NrIiwiZyIsInVwZGF0ZU9wdGlvbnMiLCJkcmF3Q2FsbGJhY2siLCJtZSIsImluaXRpYWwiLCJkYXRlV2luZG93IiwieEF4aXNSYW5nZSIsInZhbHVlUmFuZ2UiLCJ5QXhpc1JhbmdlIiwiaiIsImFwcGx5IiwiYXJndW1lbnRzIiwiZ2V0T3B0aW9uIiwiYXR0YWNoU2VsZWN0aW9uSGFuZGxlcnMiLCJoaWdobGlnaHRDYWxsYmFjayIsImV2ZW50IiwieCIsInBvaW50cyIsInJvdyIsInNlcmllc05hbWUiLCJpZHgiLCJnZXRSb3dGb3JYIiwic2V0U2VsZWN0aW9uIiwidW5oaWdobGlnaHRDYWxsYmFjayIsImUiLCJjbGVhclNlbGVjdGlvbiIsIkR5Z3JhcGgiLCJwdXNoIiwicmVhZHljb3VudCIsInJlYWR5IiwiY2FsbEJhY2tUeXBlcyIsImsiLCJnZXRGdW5jdGlvbk9wdGlvbiIsImRldGFjaCIsImNvbmNhdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7Ozs7OztJQUVhQSxZLEdBS1Qsc0JBQVlDLE1BQVosRUFBMkI7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQSx1Q0FRYixZQUFNO0FBQ2hCLFFBQUksS0FBSSxDQUFDQyxJQUFMLENBQVVDLE1BQVYsS0FBcUIsQ0FBekIsRUFBNEI7QUFDeEIsWUFBTSxrRUFBTjtB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QWhCO0FBQ0g7O0FBQ0QsY0FBSXZCLElBQUksQ0FBQ0MsU0FBVCxFQUFvQjtBQUNoQm9CLFlBQUFBLEVBQUMsQ0FBQ0MsYUFBRixDQUFnQjtBQUNaYSxjQUFBQSxpQkFBaUIsRUFBRTlCLGFBQWEsQ0FBQ0ksR0FBRCxDQUFiLENBQWlCMEIsaUJBRHhCO0FBRVpTLGNBQUFBLG1CQUFtQixFQUFFdkMsYUFBYSxDQUFDSSxHQUFELENBQWIsQ0FBaUJtQztBQUYxQixhQUFoQjtBQUlIO0FBQ0osU0FaZSxDQWFoQjs7O0FBQ0F4QyxRQUFBQSxRQUFRLEdBQUcsRUFBWDtBQUNBSixRQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNBSyxRQUFBQSxhQUFhLEdBQUcsRUFBaEI7QUFDSCxPQWxCRTtBQW1CSFQsTUFBQUEsTUFBTSxFQUFFLENBQUMsS0FBSSxDQUFDQSxNQUFOO0FBbkJMLEtBQVA7QUFxQkgsR0FsTjBCOztBQUN2QixPQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxPQUFLQyxJQUFMLEdBQVlELE1BQU0sQ0FBQzJELE1BQVAsQ0FBYyxDQUFDO0FBQ3ZCckQsSUFBQUEsSUFBSSxFQUFFLElBRGlCO0FBRXZCRCxJQUFBQSxTQUFTLEVBQUU7QUFGWSxHQUFELENBQWQsQ0FBWjtBQUlILEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRHlncmFwaCBmcm9tICdkeWdyYXBocyc7XG5cbmV4cG9ydCBjbGFzcyBTeW5jaHJvbml6ZXIge1xuXG4gICAgYXJnczogQXJyYXk8YW55PjtcbiAgICBncmFwaHM6IEFycmF5PER5Z3JhcGg+O1xuXG4gICAgY29uc3RydWN0b3IoZ3JhcGhzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLmdyYXBocyA9IGdyYXBocztcbiAgICAgICAgdGhpcy5hcmdzID0gZ3JhcGhzLmNvbmNhdChbe1xuICAgICAgICAgICAgem9vbTogdHJ1ZSxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogZmFsc2VcbiAgICAgICAgfV0pO1xuICAgIH1cblxuICAgIHN5bmNocm9uaXplID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaW52b2NhdGlvbiBvZiBEeWdyYXBoLnN5bmNocm9uaXplKCkuIE5lZWQgPj0gMSBhcmd1bWVudC4nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IE9QVElPTlMgPSBbJ3NlbGVjdGlvbicsICd6b29tJywgJ3JhbmdlJ107XG4gICAgICAgIGxldCBvcHRzOiBhbnkgPSB7XG4gICAgICAgICAgICBzZWxlY3Rpb246IHRydWUsXG4gICAgICAgICAgICB6b29tOiB0cnVlLFxuICAgICAgICAgICAgcmFuZ2U6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBkeWdyYXBoczogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IHByZXZDYWxsYmFja3M6IGFueVtdID0gW107XG5cbiAgICAgICAgbGV0IHBhcnNlT3B0cyA9IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIHRocm93ICdMYXN0IGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIER5Z3JhcGggb3IgT2JqZWN0Lic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgT1BUSU9OUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0TmFtZSA9IE9QVElPTlNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkob3B0TmFtZSkpIG9wdHNbb3B0TmFtZV0gPSBvYmpbb3B0TmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBhcnJheXNBcmVFcXVhbCA9IChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGEpIHx8ICFBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaSA9IGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGkgIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBhdHRhY2hab29tSGFuZGxlcnMgPSAoZ3M6IER5Z3JhcGhbXSwgc3luY09wdHM6IGFueSwgcHJldkNhbGxiYWNrczogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZyA9IGdzW2ldO1xuICAgICAgICAgICAgICAgIGcudXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgIGRyYXdDYWxsYmFjazogZnVuY3Rpb24gKG1lOiBEeWdyYXBoLCBpbml0aWFsOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sgfHwgaW5pdGlhbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wdHM6IHsgZGF0ZVdpbmRvdzogYW55LCB2YWx1ZVJhbmdlPzogYW55IH0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVdpbmRvdzogbWUueEF4aXNSYW5nZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNPcHRzLnJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy52YWx1ZVJhbmdlID0gbWUueUF4aXNSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdzW2pdID09IG1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q2FsbGJhY2tzW2pdICYmIHByZXZDYWxsYmFja3Nbal0uZHJhd0NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzW2pdLmRyYXdDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVkcmF3IGlmIHRoZXJlIGFyZSBuZXcgb3B0aW9ucyAgKGluIHRoaXMgY2FzZSBvbmx5IGRhdGVXaW5kb3cgY2hhbmdlZCEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8mJiBhcnJheXNBcmVFcXVhbChvcHRzLnZhbHVlUmFuZ2UsIGdzW2pdLmdldE9wdGlvbigndmFsdWVSYW5nZScpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheXNBcmVFcXVhbChvcHRzLmRhdGVXaW5kb3csIGdzW2pdLmdldE9wdGlvbignZGF0ZVdpbmRvdycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc1tqXS51cGRhdGVPcHRpb25zKG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRydWUgLyogbm8gbmVlZCB0byByZWRyYXcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF0dGFjaFNlbGVjdGlvbkhhbmRsZXJzID0gKGdzOiBhbnlbXSwgcHJldkNhbGxiYWNrczogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZyA9IGdzW2ldO1xuXG4gICAgICAgICAgICAgICAgZy51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0Q2FsbGJhY2s6IGZ1bmN0aW9uIChldmVudDogRXZlbnQsIHg6IGFueSwgcG9pbnRzOiBhbnlbXSwgcm93OiBhbnksIHNlcmllc05hbWU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWU6IGFueSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lID09IGdzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q2FsbGJhY2tzW2ldICYmIHByZXZDYWxsYmFja3NbaV0uaGlnaGxpZ2h0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDYWxsYmFja3NbaV0uaGlnaGxpZ2h0Q2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGdzW2ldLmdldFJvd0ZvclgoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc1tpXS5zZXRTZWxlY3Rpb24oaWR4LCBzZXJpZXNOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB1bmhpZ2hsaWdodENhbGxiYWNrOiBmdW5jdGlvbiAoZTogRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWUgPT0gZ3NbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDYWxsYmFja3NbaV0gJiYgcHJldkNhbGxiYWNrc1tpXS51bmhpZ2hsaWdodENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzW2ldLnVuaGlnaGxpZ2h0Q2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NbaV0uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0cnVlIC8qIG5vIG5lZWQgdG8gcmVkcmF3ICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3NbMF0gaW5zdGFuY2VvZiBEeWdyYXBoKSB7XG4gICAgICAgICAgICAvLyBBcmd1bWVudHMgYXJlIER5Z3JhcGggb2JqZWN0cy5cbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZ3NbaV0gaW5zdGFuY2VvZiBEeWdyYXBoKSB7XG4gICAgICAgICAgICAgICAgICAgIGR5Z3JhcGhzLnB1c2godGhpcy5hcmdzW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA8IHRoaXMuYXJncy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaW52b2NhdGlvbiBvZiBEeWdyYXBoLnN5bmNocm9uaXplKCkuICcgK1xuICAgICAgICAgICAgICAgICdBbGwgYnV0IHRoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgRHlncmFwaCBvYmplY3RzLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gdGhpcy5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdHModGhpcy5hcmdzW3RoaXMuYXJncy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW52b2tlZCB3LyBsaXN0IG9mIGR5Z3JhcGhzLCBvcHRpb25zXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJnc1swXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGR5Z3JhcGhzLnB1c2godGhpcy5hcmdzWzBdW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3MubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdHModGhpcy5hcmdzWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBpbnZvY2F0aW9uIG9mIER5Z3JhcGguc3luY2hyb25pemUoKS4gJyArXG4gICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHR3byBhcmd1bWVudHM6IGFycmF5IGFuZCBvcHRpb25hbCBvcHRpb25zIGFyZ3VtZW50Lic7XG4gICAgICAgICAgICB9ICAvLyBvdGhlcndpc2UgYXJndW1lbnRzLmxlbmd0aCA9PSAxLCB3aGljaCBpcyBmaW5lLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgaW52b2NhdGlvbiBvZiBEeWdyYXBoLnN5bmNocm9uaXplKCkuICcgK1xuICAgICAgICAgICAgJ0ZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBEeWdyYXBoIG9yIGxpc3Qgb2YgRHlncmFwaHMuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeWdyYXBocy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBpbnZvY2F0aW9uIG9mIER5Z3JhcGguc3luY2hyb25pemUoKS4gJyArXG4gICAgICAgICAgICAnTmVlZCB0d28gb3IgbW9yZSBkeWdyYXBocyB0byBzeW5jaHJvbml6ZS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlYWR5Y291bnQgPSBkeWdyYXBocy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHlncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBnID0gZHlncmFwaHNbaV07XG4gICAgICAgICAgICBnLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoLS1yZWFkeWNvdW50ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgb3JpZ2luYWwgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWxsQmFja1R5cGVzID0gWydkcmF3Q2FsbGJhY2snLCAnaGlnaGxpZ2h0Q2FsbGJhY2snLCAndW5oaWdobGlnaHRDYWxsYmFjayddO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGR5Z3JhcGhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZDYWxsYmFja3Nbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzW2pdID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gY2FsbEJhY2tUeXBlcy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDYWxsYmFja3Nbal1bY2FsbEJhY2tUeXBlc1trXV0gPSBkeWdyYXBoc1tqXS5nZXRGdW5jdGlvbk9wdGlvbihjYWxsQmFja1R5cGVzW2tdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgZHJhdywgaGlnaGxpZ2h0LCB1bmhpZ2hsaWdodCBjYWxsYmFja3MuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLnpvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFpvb21IYW5kbGVycyhkeWdyYXBocywgb3B0cywgcHJldkNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFNlbGVjdGlvbkhhbmRsZXJzKGR5Z3JhcGhzLCBwcmV2Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRldGFjaDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHlncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGcgPSBkeWdyYXBoc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuem9vbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZy51cGRhdGVPcHRpb25zKHsgZHJhd0NhbGxiYWNrOiBwcmV2Q2FsbGJhY2tzW2ldLmRyYXdDYWxsYmFjayB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGcudXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0Q2FsbGJhY2s6IHByZXZDYWxsYmFja3NbaV0uaGlnaGxpZ2h0Q2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5oaWdobGlnaHRDYWxsYmFjazogcHJldkNhbGxiYWNrc1tpXS51bmhpZ2hsaWdodENhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZWxlYXNlIHJlZmVyZW5jZXMgJiBtYWtlIHN1YnNlcXVlbnQgY2FsbHMgdGhyb3cuXG4gICAgICAgICAgICAgICAgZHlncmFwaHMgPSBbXTtcbiAgICAgICAgICAgICAgICBvcHRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBwcmV2Q2FsbGJhY2tzID0gW107XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ3JhcGhzOiBbdGhpcy5ncmFwaHNdXG4gICAgICAgIH07XG4gICAgfTtcbn0iXX0=