@future-grid/fgp-graph
Version:
fgp-graph is a chart lib based on Dygraphs
324 lines (254 loc) • 39 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _configurations = require("../../../metadata/configurations");
var _formatters = require("../../formatters");
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
var _colorService = require("../../../services/colorService");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
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 Filter = function Filter(parentElement, viewConfig, g, lockColorListener) {
var _this = this;
_classCallCheck(this, Filter);
this.parentElement = parentElement;
this.viewConfig = viewConfig;
this.g = g;
this.lockColorListener = lockColorListener;
_defineProperty(this, "chosenCollection", void 0);
_defineProperty(this, "seriesWidget", void 0);
_defineProperty(this, "setVisibility", function (series) {
var _this$g, _this$g2;
// set visibility
var graphLabels = (_this$g = _this.g) === null || _this$g === void 0 ? void 0 : _this$g.getOption('labels');
var visibility = [];
var labels = graphLabels.filter(function (element, index, array) {
if (index != 0) {
visibility.push(true);
return true;
}
return false;
});
var formatters = new _formatters.Formatters(_this.viewConfig.timezone ? _this.viewConfig.timezone : _momentTimezone["default"].tz.guess()); // get current y and y2 axis scaling max and min
var ranges = _this.g.yAxisRanges();
labels.map(function (value, index, array) {
// never hide mark lines
visibility[index] = series.includes(value) || value.indexOf("_markline") != -1;
});
if (_this.seriesWidget && _this.chosenCollection) {
// update visibility
visibility.forEach(function (v, i) {
var _this$seriesWidget;
(_this$seriesWidget = _this.seriesWidget) === null || _this$seriesWidget === void 0 ? void 0 : _this$seriesWidget.updateOption(v, i);
});
} // set visibility
(_this$g2 = _this.g) === null || _this$g2 === void 0 ? void 0 : _this$g2.updateOptions({
visibility: visibility,
axes: {
x: {
axisLabelFormatter: formatters.axisLabel
},
y: {
valueRange: ranges[0],
axisLabelWidth: 80,
labelsKMB: true
},
y2: ranges.length > 1 ? {
valueRange: ranges[1],
axisLabelWidth: 80,
labelsKMB: true
} : undefined
}
});
});
_defineProperty(this, "setColors", function (colors) {
var _this$g3;
// check if length match or not
var graphLabels = (_this$g3 = _this.g) === null || _this$g3 === void 0 ? void 0 : _this$g3.getLabels();
var formatters = new _formatters.Formatters(_this.viewConfig.timezone ? _this.viewConfig.timezone : _momentTimezone["default"].tz.guess());
var sat = 1.0;
var val = 0.5; // get current y and y2 axis scaling max and min
var ranges = _this.g.yAxisRanges();
if (graphLabels && graphLabels.length - 1 === colors.length) {
var _this$g4;
if (_this.lockColorListener) {
_this.lockColorListener(true);
}
(_this$g4 = _this.g) === null || _this$g4 === void 0 ? void 0 : _this$g4.updateOptions({
colors: colors,
axes: {
x: {
axisLabelFormatter: formatters.axisLabel
},
y: {
valueRange: ranges[0],
axisLabelWidth: 80,
labelsKMB: true
},
y2: ranges.length > 1 ? {
valueRange: ranges[1],
axisLabelWidth: 80,
labelsKMB: true
} : undefined
}
});
} else {
if (_this.viewConfig.graphConfig.entities.length > 1) {
var _this$g5;
if (_this.lockColorListener) {
_this.lockColorListener(false);
}
(_this$g5 = _this.g) === null || _this$g5 === void 0 ? void 0 : _this$g5.updateOptions({
colors: undefined,
axes: {
x: {
axisLabelFormatter: formatters.axisLabel
},
y: {
valueRange: ranges[0],
axisLabelWidth: 80,
labelsKMB: true
},
y2: ranges.length > 1 ? {
valueRange: ranges[1],
axisLabelWidth: 80,
labelsKMB: true
} : undefined
}
});
} else {
if (_this.chosenCollection) {
var _this$g6;
if (_this.lockColorListener) {
_this.lockColorListener(false);
}
var defaultColors = [];
var num = _this.chosenCollection.series.length;
_this.chosenCollection.series.forEach(function (series, i) {
var half = Math.ceil(num / 2);
var idx = i % 2 ? half + (i + 1) / 2 : Math.ceil((i + 1) / 2);
var hue = 1.0 * idx / (1 + num);
var colorStr = (0, _colorService.hsvToRGB)(hue, sat, val);
defaultColors.push(series.color ? series.color : colorStr);
});
(_this$g6 = _this.g) === null || _this$g6 === void 0 ? void 0 : _this$g6.updateOptions({
colors: defaultColors,
axes: {
x: {
axisLabelFormatter: formatters.axisLabel
},
y: {
valueRange: ranges[0],
axisLabelWidth: 80,
labelsKMB: true
},
y2: ranges.length > 1 ? {
valueRange: ranges[1],
axisLabelWidth: 80,
labelsKMB: true
} : undefined
}
});
}
}
}
});
_defineProperty(this, "initDom", function () {
// 2 div buttons and dropdown
var filterContainer = document.createElement('div');
filterContainer.setAttribute("class", "fgp-filter-container"); // check buttons
if (_this.viewConfig.graphConfig.filters && _this.viewConfig.graphConfig.filters.buttons) {
// create button area
var buttons = document.createElement("div");
buttons.setAttribute("class", "fgp-filter-buttons"); //
_this.viewConfig.graphConfig.filters.buttons.forEach(function (filter) {
var button = document.createElement("button");
button.className = "fgp-filter-button";
button.textContent = filter.label;
button.addEventListener('click', function (event) {
// call function and get series list back
if (!filter.type || filter.type == _configurations.FilterType.HIGHLIGHT) {
var series = filter.func();
_this.setVisibility(series);
} else if (filter.type == _configurations.FilterType.COLORS) {
//
var labels = [];
if (_this.g) {
var _labels;
labels = (_labels = labels).concat.apply(_labels, _toConsumableArray(_this.g.getLabels()));
labels = labels.slice(1);
}
var colors = filter.func(labels); // update colors
_this.setColors(colors);
}
}); // add button
buttons.appendChild(button);
});
filterContainer.appendChild(buttons);
}
if (_this.viewConfig.graphConfig.filters && _this.viewConfig.graphConfig.filters.dropdown) {
var select = document.createElement("select");
select.setAttribute("class", "fgp-filter-dropdown");
_this.viewConfig.graphConfig.filters.dropdown.forEach(function (_drop) {
// options
var option = document.createElement('option');
option.text = _drop.label;
option.value = _drop.label;
select.add(option);
});
select.addEventListener("change", function (e) {
if (_this.viewConfig.graphConfig.filters && _this.viewConfig.graphConfig.filters.dropdown) {
var _conf = _this.viewConfig.graphConfig.filters.dropdown[select.selectedIndex];
if (!_conf.type || _conf.type == _configurations.FilterType.HIGHLIGHT) {
var series = _conf.func(); // find entity
var finalSeries = [];
series.forEach(function (_series) {
var entity = _this.viewConfig.graphConfig.entities.find(function (_entity) {
return _entity.id === _series;
}); // put name into series
if (entity) {
finalSeries.push(entity.name);
}
}); // compare then update graph
_this.setVisibility(finalSeries);
} else if (_conf.type == _configurations.FilterType.COLORS) {
var labels = []; // find entity
var _finalSeries = [];
if (_this.g) {
var _labels2;
labels = (_labels2 = labels).concat.apply(_labels2, _toConsumableArray(_this.g.getLabels()));
labels = labels.slice(1); // get series name
labels.forEach(function (_series) {
var entity = _this.viewConfig.graphConfig.entities.find(function (_entity) {
return _entity.id === _series;
}); // put name into series
if (entity) {
_finalSeries.push(entity.name);
}
});
}
var colors = _conf.func(_finalSeries);
_this.setColors(colors);
}
}
});
filterContainer.appendChild(select);
}
_this.parentElement.appendChild(filterContainer);
});
_defineProperty(this, "setData", function (collection) {
_this.chosenCollection = collection;
});
_defineProperty(this, "setSeriesWidget", function (seriesWidget) {
_this.seriesWidget = seriesWidget;
});
this.initDom();
};
exports["default"] = Filter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9leHRyYXMvdG9vbGJhci93aWRnZXRzL0ZpbHRlci50cyJdLCJuYW1lcyI6WyJGaWx0ZXIiLCJwYXJlbnRFbGVtZW50Iiwidmlld0NvbmZpZyIsImciLCJsb2NrQ29sb3JMaXN0ZW5lciIsInNlcmllcyIsImdyYXBoTGFiZWxzIiwiZ2V0T3B0aW9uIiwidmlzaWJpbGl0eSIsImxhYmVscyIsImZpbHRlciIsImVsZW1lbnQiLCJpbmRleCIsImFycmF5IiwicHVzaCIsImZvcm1hdHRlcnMiLCJGb3JtYXR0ZXJzIiwidGltZXpvbmUiLCJtb21lbnQiLCJ0eiIsImd1ZXNzIiwicmFuZ2VzIiwieUF4aXNSYW5nZXMiLCJtYXAiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiaW5kZXhPZiIsInNlcmllc1dpZGdldCIsImNob3NlbkNvbGxlY3Rpb24iLCJmb3JFYWNoIiwidiIsImkiLCJ1cGRhdGVPcHRpb24iLCJ1cGRhdGVPcHRpb25zIiwiYXhlcyIsIngiLCJheGlzTGFiZWxGb3JtYXR0ZXIiLCJheGlzTGFiZWwiLCJ5IiwidmFsdWVSYW5nZSIsImF4aXNMYWJlbFdpZHRoIiwibGFiZWxzS01CIiwieTIiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJjb2xvcnMiLCJnZXRMYWJlbHMiLCJzYXQiLCJ2YWwiLCJncmFwaENvbmZpZyIsImVudGl0aWVzIiwiZGVmYXVsdENvbG9ycyIsIm51bSIsImhhbGYiLCJNYXRoIiwiY2VpbCIsImlkeCIsImh1ZSIsImNvbG9yU3RyIiwiY29sb3IiLCJmaWx0ZXJDb250YWluZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJmaWx0ZXJzIiwiYnV0dG9ucyIsImJ1dHRvbiIsImNsYXNzTmFtZSIsInRleHRDb250ZW50IiwibGFiZWwiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJ0eXBlIiwiRmlsdGVyVHlwZSIsIkhJR0hMSUdIVCIsImZ1bmMiLCJzZXRWaXNpYmlsaXR5IiwiQ09MT1JTIiwiY29uY2F0Iiwic2xpY2UiLCJzZXRDb2xvcnMiLCJhcHBlbmRDaGlsZCIsImRyb3Bkb3duIiwic2VsZWN0IiwiX2Ryb3AiLCJvcHRpb24iLCJ0ZXh0IiwiYWRkIiwiZSIsIl9jb25mIiwic2VsZWN0ZWRJbmRleCIsImZpbmFsU2VyaWVzIiwiX3NlcmllcyIsImVudGl0eSIsImZpbmQiLCJfZW50aXR5IiwiaWQiLCJuYW1lIiwiY29sbGVjdGlvbiIsImluaXREb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUdxQkEsTSxHQU1qQixnQkFBbUJDLGFBQW5CLEVBQWtEQyxVQUFsRCxFQUFpRkMsQ0FBakYsRUFBcUdDLGlCQUFyRyxFQUFvSjtBQUFBOztBQUFBOztBQUFBLE9BQWpJSCxhQUFpSSxHQUFqSUEsYUFBaUk7QUFBQSxPQUFsR0MsVUFBa0csR0FBbEdBLFVBQWtHO0FBQUEsT0FBbkVDLENBQW1FLEdBQW5FQSxDQUFtRTtBQUFBLE9BQS9DQyxpQkFBK0MsR0FBL0NBLGlCQUErQzs7QUFBQTs7QUFBQTs7QUFBQSx5Q0FJNUgsVUFBQ0MsTUFBRCxFQUEyQjtBQUFBOztBQUMvQztBQUNBLFFBQUlDLFdBQTBCLGNBQUcsS0FBSSxDQUFDSCxDQUFSLDRDQUFHLFFBQVFJLFNBQVIsQ0FBa0IsUUFBbEIsQ0FBakM7QUFDQSxRQUFJQyxVQUEwQixHQUFHLEVBQWpDO0FBQ0EsUUFBSUMsTUFBTSxHQUFHSCxXQUFXLENBQUNJLE1BQVosQ0FBbUIsVUFBQ0MsT0FBRCxFQUFVQyxLQUFWLEVBQWlCQyxLQUFqQixFQUEyQjtBQUN2RCxVQUFJRCxLQUFLLElBQUksQ0FBYixFQUFnQjtBQUNaSixRQUFBQSxVQUFVLENBQUNNLElBQVgsQ0FBZ0IsSUFBaEI7QUFDQSxlQUFPLElBQVA7QUFDSDs7QUFDRCxhQUFPLEtBQVA7QUFDSCxLQU5ZLENBQWI7QUFRQSxRQUFJQyxVQUFzQixHQUFHLElBQUlDLHNCQUFKLENBQWUsS0FBSSxDQUFDZCxV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aENvbGxlY3Rpb24sIFZpZXdDb25maWcgfSBmcm9tIFwiLi4vLi4vLi4vbWV0YWRhdGEvY29uZmlndXJhdGlvbnNcIjtcbmltcG9ydCB7IEZvcm1hdHRlcnMgfSBmcm9tIFwiLi4vLi4vZm9ybWF0dGVyc1wiO1xuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50LXRpbWV6b25lXCI7XG5pbXBvcnQgeyBoc3ZUb1JHQiB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9jb2xvclNlcnZpY2VcIjtcbmltcG9ydCBTZXJpZXMgZnJvbSBcIi4vU2VyaWVzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbHRlciB7XG5cbiAgICBwcml2YXRlIGNob3NlbkNvbGxlY3Rpb24/OiBHcmFwaENvbGxlY3Rpb247XG5cbiAgICBwcml2YXRlIHNlcmllc1dpZGdldD86IFNlcmllcztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJlbnRFbGVtZW50OiBFbGVtZW50LCBwdWJsaWMgdmlld0NvbmZpZzogVmlld0NvbmZpZywgcHVibGljIGc/OiBEeWdyYXBoLCBwdWJsaWMgbG9ja0NvbG9yTGlzdGVuZXI/OiAoaXNMb2NrOiBib29sZWFuKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuaW5pdERvbSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VmlzaWJpbGl0eSA9IChzZXJpZXM6IEFycmF5PHN0cmluZz4pID0+IHtcbiAgICAgICAgLy8gc2V0IHZpc2liaWxpdHlcbiAgICAgICAgbGV0IGdyYXBoTGFiZWxzOiBBcnJheTxzdHJpbmc+ID0gdGhpcy5nPy5nZXRPcHRpb24oJ2xhYmVscycpO1xuICAgICAgICBsZXQgdmlzaWJpbGl0eTogQXJyYXk8Ym9vbGVhbj4gPSBbXTtcbiAgICAgICAgbGV0IGxhYmVscyA9IGdyYXBoTGFiZWxzLmZpbHRlcigoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gMCkge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHkucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGZvcm1hdHRlcnM6IEZvcm1hdHRlcnMgPSBuZXcgRm9ybWF0dGVycyh0aGlzLnZpZXdDb25maWcudGltZXpvbmUgPyB0aGlzLnZpZXdDb25maWcudGltZXpvbmUgOiBtb21lbnQudHouZ3Vlc3MoKSk7XG4gICAgICAgIC8vIGdldCBjdXJyZW50IHkgYW5kIHkyIGF4aXMgc2NhbGluZyBtYXggYW5kIG1pblxuICAgICAgICBsZXQgcmFuZ2VzOiBBcnJheTxBcnJheTxudW1iZXI+PiA9ICg8YW55PnRoaXMuZykueUF4aXNSYW5nZXMoKTtcblxuXG4gICAgICAgIGxhYmVscy5tYXAoKHZhbHVlLCBpbmRleCwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgIC8vIG5ldmVyIGhpZGUgbWFyayBsaW5lc1xuICAgICAgICAgICAgdmlzaWJpbGl0eVtpbmRleF0gPSBzZXJpZXMuaW5jbHVkZXModmFsdWUpIHx8IHZhbHVlLmluZGV4T2YoXCJfbWFya2xpbmVcIikgIT0gLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnNlcmllc1dpZGdldCAmJiB0aGlzLmNob3NlbkNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB2aXNpYmlsaXR5XG4gICAgICAgICAgICB2aXNpYmlsaXR5LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1dpZGdldD8udXBkYXRlT3B0aW9uKHYsIGkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCB2aXNpYmlsaXR5XG4gICAgICAgIHRoaXMuZz8udXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmlsaXR5LFxuICAgICAgICAgICAgYXhlczoge1xuICAgICAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsRm9ybWF0dGVyOiBmb3JtYXR0ZXJzLmF4aXNMYWJlbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVJhbmdlOiByYW5nZXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIGF4aXNMYWJlbFdpZHRoOiA4MCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzS01COiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB5MjogcmFuZ2VzLmxlbmd0aCA+IDEgPyB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2U6IHJhbmdlc1sxXSxcbiAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsV2lkdGg6IDgwLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbHNLTUI6IHRydWVcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldENvbG9ycyA9IChjb2xvcnM6IEFycmF5PHN0cmluZz4pID0+IHtcbiAgICAgICAgLy8gY2hlY2sgaWYgbGVuZ3RoIG1hdGNoIG9yIG5vdFxuICAgICAgICBsZXQgZ3JhcGhMYWJlbHMgPSB0aGlzLmc/LmdldExhYmVscygpO1xuICAgICAgICBsZXQgZm9ybWF0dGVyczogRm9ybWF0dGVycyA9IG5ldyBGb3JtYXR0ZXJzKHRoaXMudmlld0NvbmZpZy50aW1lem9uZSA/IHRoaXMudmlld0NvbmZpZy50aW1lem9uZSA6IG1vbWVudC50ei5ndWVzcygpKTtcbiAgICAgICAgbGV0IHNhdCA9IDEuMDtcbiAgICAgICAgbGV0IHZhbCA9IDAuNTtcbiAgICAgICAgLy8gZ2V0IGN1cnJlbnQgeSBhbmQgeTIgYXhpcyBzY2FsaW5nIG1heCBhbmQgbWluXG4gICAgICAgIGxldCByYW5nZXM6IEFycmF5PEFycmF5PG51bWJlcj4+ID0gKDxhbnk+dGhpcy5nKS55QXhpc1JhbmdlcygpO1xuICAgICAgICBpZiAoZ3JhcGhMYWJlbHMgJiYgZ3JhcGhMYWJlbHMubGVuZ3RoIC0gMSA9PT0gY29sb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9ja0NvbG9yTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2tDb2xvckxpc3RlbmVyKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nPy51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBjb2xvcnM6IGNvbG9ycyxcbiAgICAgICAgICAgICAgICBheGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNMYWJlbEZvcm1hdHRlcjogZm9ybWF0dGVycy5heGlzTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVSYW5nZTogcmFuZ2VzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsV2lkdGg6IDgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzS01COiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHkyOiByYW5nZXMubGVuZ3RoID4gMSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2U6IHJhbmdlc1sxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNMYWJlbFdpZHRoOiA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc0tNQjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Q29uZmlnLmdyYXBoQ29uZmlnLmVudGl0aWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2NrQ29sb3JMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2tDb2xvckxpc3RlbmVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5nPy51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3JzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGF4ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTGFiZWxGb3JtYXR0ZXI6IGZvcm1hdHRlcnMuYXhpc0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2U6IHJhbmdlc1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTGFiZWxXaWR0aDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzS01COiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeTI6IHJhbmdlcy5sZW5ndGggPiAxID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2U6IHJhbmdlc1sxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTGFiZWxXaWR0aDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzS01COiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hvc2VuQ29sbGVjdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvY2tDb2xvckxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2tDb2xvckxpc3RlbmVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWZhdWx0Q29sb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHRoaXMuY2hvc2VuQ29sbGVjdGlvbi5zZXJpZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNob3NlbkNvbGxlY3Rpb24uc2VyaWVzLmZvckVhY2goKHNlcmllcywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhbGYgPSBNYXRoLmNlaWwobnVtIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaSAlIDIgPyAoaGFsZiArIChpICsgMSkgLyAyKSA6IE1hdGguY2VpbCgoaSArIDEpIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHVlID0gKDEuMCAqIGlkeCAvICgxICsgbnVtKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JTdHIgPSBoc3ZUb1JHQihodWUsIHNhdCwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb2xvcnMucHVzaChzZXJpZXMuY29sb3IgPyBzZXJpZXMuY29sb3IgOiBjb2xvclN0cik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZz8udXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM6IGRlZmF1bHRDb2xvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBheGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTGFiZWxGb3JtYXR0ZXI6IGZvcm1hdHRlcnMuYXhpc0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2U6IHJhbmdlc1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0xhYmVsV2lkdGg6IDgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHNLTUI6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiByYW5nZXMubGVuZ3RoID4gMSA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVSYW5nZTogcmFuZ2VzWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTGFiZWxXaWR0aDogODAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc0tNQjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgcHJpdmF0ZSBpbml0RG9tID0gKCkgPT4ge1xuICAgICAgICAvLyAyIGRpdiBidXR0b25zIGFuZCBkcm9wZG93blxuICAgICAgICBsZXQgZmlsdGVyQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBmaWx0ZXJDb250YWluZXIuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJmZ3AtZmlsdGVyLWNvbnRhaW5lclwiKTtcblxuICAgICAgICAvLyBjaGVjayBidXR0b25zXG4gICAgICAgIGlmICh0aGlzLnZpZXdDb25maWcuZ3JhcGhDb25maWcuZmlsdGVycyAmJiB0aGlzLnZpZXdDb25maWcuZ3JhcGhDb25maWcuZmlsdGVycy5idXR0b25zKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYnV0dG9uIGFyZWFcblxuICAgICAgICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBidXR0b25zLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiZmdwLWZpbHRlci1idXR0b25zXCIpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMudmlld0NvbmZpZy5ncmFwaENvbmZpZy5maWx0ZXJzLmJ1dHRvbnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBidXR0b246IEhUTUxTcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiZmdwLWZpbHRlci1idXR0b25cIjtcbiAgICAgICAgICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSBmaWx0ZXIubGFiZWw7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgZnVuY3Rpb24gYW5kIGdldCBzZXJpZXMgbGlzdCBiYWNrXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsdGVyLnR5cGUgfHwgZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZS5ISUdITElHSFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmllczogQXJyYXk8c3RyaW5nPiA9IDxBcnJheTxzdHJpbmc+PmZpbHRlci5mdW5jKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZpc2liaWxpdHkoc2VyaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlLkNPTE9SUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbGFiZWxzLmNvbmNhdCguLi50aGlzLmcuZ2V0TGFiZWxzKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxhYmVscy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb3JzOiBBcnJheTxzdHJpbmc+ID0gPEFycmF5PHN0cmluZz4+ZmlsdGVyLmZ1bmMobGFiZWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29sb3JzKGNvbG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgYnV0dG9uXG4gICAgICAgICAgICAgICAgYnV0dG9ucy5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgZmlsdGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbnMpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3Q29uZmlnLmdyYXBoQ29uZmlnLmZpbHRlcnMgJiYgdGhpcy52aWV3Q29uZmlnLmdyYXBoQ29uZmlnLmZpbHRlcnMuZHJvcGRvd24pIHtcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbiAgICAgICAgICAgIHNlbGVjdC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImZncC1maWx0ZXItZHJvcGRvd25cIik7XG5cbiAgICAgICAgICAgIHRoaXMudmlld0NvbmZpZy5ncmFwaENvbmZpZy5maWx0ZXJzLmRyb3Bkb3duLmZvckVhY2goX2Ryb3AgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICAgICAgICBvcHRpb24udGV4dCA9IF9kcm9wLmxhYmVsO1xuICAgICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IF9kcm9wLmxhYmVsO1xuICAgICAgICAgICAgICAgIHNlbGVjdC5hZGQob3B0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3Q29uZmlnLmdyYXBoQ29uZmlnLmZpbHRlcnMgJiYgdGhpcy52aWV3Q29uZmlnLmdyYXBoQ29uZmlnLmZpbHRlcnMuZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX2NvbmYgPSB0aGlzLnZpZXdDb25maWcuZ3JhcGhDb25maWcuZmlsdGVycy5kcm9wZG93bltzZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2NvbmYudHlwZSB8fCBfY29uZi50eXBlID09IEZpbHRlclR5cGUuSElHSExJR0hUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpZXM6IEFycmF5PHN0cmluZz4gPSA8QXJyYXk8c3RyaW5nPj5fY29uZi5mdW5jKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGVudGl0eSBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFNlcmllczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWVzLmZvckVhY2goX3NlcmllcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMudmlld0NvbmZpZy5ncmFwaENvbmZpZy5lbnRpdGllcy5maW5kKF9lbnRpdHkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2VudGl0eS5pZCA9PT0gX3Nlcmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1dCBuYW1lIGludG8gc2VyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFNlcmllcy5wdXNoKGVudGl0eS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSB0aGVuIHVwZGF0ZSBncmFwaFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaXNpYmlsaXR5KGZpbmFsU2VyaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfY29uZi50eXBlID09IEZpbHRlclR5cGUuQ09MT1JTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBlbnRpdHkgXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxTZXJpZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsYWJlbHMuY29uY2F0KC4uLnRoaXMuZy5nZXRMYWJlbHMoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbGFiZWxzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBzZXJpZXMgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKF9zZXJpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50aXR5ID0gdGhpcy52aWV3Q29uZmlnLmdyYXBoQ29uZmlnLmVudGl0aWVzLmZpbmQoX2VudGl0eSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2VudGl0eS5pZCA9PT0gX3Nlcmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHV0IG5hbWUgaW50byBzZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTZXJpZXMucHVzaChlbnRpdHkubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb3JzOiBBcnJheTxzdHJpbmc+ID0gPEFycmF5PHN0cmluZz4+X2NvbmYuZnVuYyhmaW5hbFNlcmllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvbG9ycyhjb2xvcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICBmaWx0ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoc2VsZWN0KTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGZpbHRlckNvbnRhaW5lcik7XG4gICAgfTtcblxuXG4gICAgcHVibGljIHNldERhdGEgPSAoY29sbGVjdGlvbjogR3JhcGhDb2xsZWN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMuY2hvc2VuQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG5cbiAgICB9O1xuXG4gICAgcHVibGljIHNldFNlcmllc1dpZGdldCA9IChzZXJpZXNXaWRnZXQ6IFNlcmllcykgPT4ge1xuICAgICAgICB0aGlzLnNlcmllc1dpZGdldCA9IHNlcmllc1dpZGdldDtcbiAgICB9O1xuXG5cbn0iXX0=