@future-grid/fgp-graph
Version:
fgp-graph is a chart lib based on Dygraphs
309 lines (237 loc) • 34.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _resizeObserver = require("@juggle/resize-observer");
var _GraphRenderer = require("./widgets/GraphRenderer");
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 FgpGraph = // private isReady: boolean = false;
/**
*Creates an instance of FgpGraph.
* @param {HTMLElement} dom
* graph container
* @param {Array<ViewConfig>} viewConfigs
* graph configuration
* @memberof FgpGraph
*/
function FgpGraph(dom, viewConfigs, eventHandlers, syncViews) {
var _this = this;
_classCallCheck(this, FgpGraph);
_defineProperty(this, "graphContainer", void 0);
_defineProperty(this, "body", void 0);
_defineProperty(this, "graph", void 0);
_defineProperty(this, "rangeBarGraph", void 0);
_defineProperty(this, "viewConfigs", void 0);
_defineProperty(this, "parentDom", void 0);
_defineProperty(this, "syncLegend", false);
_defineProperty(this, "intervalLabelsArea", void 0);
_defineProperty(this, "children", []);
_defineProperty(this, "currentDateWindow", []);
_defineProperty(this, "id", void 0);
_defineProperty(this, "operator", void 0);
_defineProperty(this, "eventListeners", void 0);
_defineProperty(this, "graphDateWindow", void 0);
_defineProperty(this, "syncViews", false);
_defineProperty(this, "dateWindowHandler", function (dateWindow, currentView) {
if (_this.syncViews) {
// store data
_this.graphDateWindow = dateWindow;
}
_this.currentDateWindow = dateWindow;
_this.children.forEach(function (graph) {
// call updateDatewinow
if (graph.id != _this.id) {
graph.updateDatewinowInside(dateWindow);
}
});
});
_defineProperty(this, "changeView", function (view) {
// change view
// find view
_this.viewConfigs.forEach(function (config) {
config.show = false;
if (config.name === view) {
// update show attribute
config.show = true;
if (_this.syncViews && _this.graphDateWindow) {
config.initRange = {
start: _this.graphDateWindow[0],
end: _this.graphDateWindow[1]
};
}
_this.operator.init(config, function (graph) {
_this.graph = graph;
_this.children.forEach(function (graph) {
// call updateDatewinow
if (graph.id != _this.id) {
// update data
graph.operator.refresh();
}
});
}, function () {
_this.children.forEach(function (graph) {
// call updateDatewinow
if (graph.id != _this.id) {
// update data
graph.operator.refresh();
}
});
}); // check if we need to tell others the view changed.
if (_this.eventListeners && _this.eventListeners.onViewChange) {
//f call
_this.eventListeners.onViewChange(_this, config);
}
}
});
});
_defineProperty(this, "initGraph", function (ready, needSync) {
_this.operator = new _GraphRenderer.GraphOperator(_this.graph, _this.rangeBarGraph, _this.graphContainer, _this.body, _this.dateWindowHandler, _this, _this.eventListeners, _this.id, needSync); // which "view" should be shown first? device or scatter?
if (_this.viewConfigs) {
var showView; // check if showView is undefined
if (!showView && _this.viewConfigs.length > 0) {
showView = _this.viewConfigs[0];
} else if (!showView && _this.viewConfigs.length === 0) {
console.error("view config not found!");
return false;
}
if (showView) {
_this.operator.init(showView, function (graph) {
_this.graph = graph;
if (ready) {
ready(_this);
} // this.isReady = true;
}, function () {
_this.children.forEach(function (graph) {
// call updateDatewinow
if (graph.id != _this.id) {
// update data
graph.operator.refresh();
}
});
});
}
}
});
_defineProperty(this, "updateDatewinow", function (datewindow) {
//
console.log("new datewindow: ".concat(datewindow)); // update graph
if (_this.graph) {
var range = _this.graph.xAxisRange(); // if datewindow same then ignore that
if (range[0] != datewindow[0] || range[1] != datewindow[1]) {
// reload data for current graph
_this.operator.update(undefined, undefined, true, datewindow); // get all children graphs then run update
debugger;
_this.children.forEach(function (child) {
child.updateDatewinowInside(datewindow, true);
});
}
}
});
_defineProperty(this, "updateDatewinowInside", function (datewindow, forceReload) {
// update graph
if (_this.graph) {
// update current date-window
_this.graph.updateOptions({
dateWindow: datewindow
});
if (forceReload) {
_this.operator.update(undefined, undefined, true, datewindow);
}
}
});
_defineProperty(this, "setChildren", function (graphs) {
_this.children = _this.children.concat(graphs);
});
_defineProperty(this, "highlightSeries", function (series, duration, type) {
//
_this.operator.highlightSeries(series, duration, type);
});
_defineProperty(this, "reloadData", function () {
_this.operator.update(undefined, undefined, true);
});
_defineProperty(this, "updateConfig", function (config) {
//
return "not enabled in this version";
});
_defineProperty(this, "clear", function () {
console.warn("under developing!");
});
this.parentDom = dom;
this.graphDateWindow = [0, 0];
if (eventHandlers) {
this.eventListeners = eventHandlers;
}
console.log("need to sync views? ".concat(syncViews));
if (syncViews) {
this.syncViews = true;
}
this.id = (Math.random() * 10000 | 0) + 1 + ''; // if id exist then change id to id
if (this.parentDom.getAttribute('id')) {
this.id = this.parentDom.id;
} //
if (this.parentDom.getAttribute("fgp-graph-id")) {
this.id = this.parentDom.getAttribute("fgp-graph-id");
}
var intervalsLabelsAttrs = [{
key: 'class',
value: "fgp-interval-labels"
}];
this.intervalLabelsArea = _GraphRenderer.DomElementOperator.createElement('div', intervalsLabelsAttrs);
var buttonsAttrs = [{
key: 'class',
value: "fgp-buttons"
}];
var buttonsArea = _GraphRenderer.DomElementOperator.createElement('div', buttonsAttrs);
var filterAttrs = [{
key: 'class',
value: "fgp-filter-buttons"
}];
var filterArea = _GraphRenderer.DomElementOperator.createElement('div', filterAttrs);
var toolbarAreaAttrs = [{
key: 'class',
value: "fgp-toolbar-area"
}];
var toolbarArea = _GraphRenderer.DomElementOperator.createElement('div', toolbarAreaAttrs); // create doms
var containerAttrs = [{
key: 'class',
value: 'fgp-graph-container noselect'
}];
this.graphContainer = _GraphRenderer.DomElementOperator.createElement('div', containerAttrs);
var bodyAttrs = [{
key: 'class',
value: 'fgp-graph-body'
}];
this.body = _GraphRenderer.DomElementOperator.createElement('div', bodyAttrs);
this.graphContainer.appendChild(this.body);
this.parentDom.appendChild(this.graphContainer);
this.viewConfigs = viewConfigs; // listening for div resizing.......
var divResizeRo = new _resizeObserver.ResizeObserver(function (roes, observer) {
roes.forEach(function (domObserverEntry) {
if (_this.graph && domObserverEntry.target.className == 'fgp-graph-body') {
console.log("resizing dom: ", domObserverEntry.target.className, 'if someone see a infinite loop here, please report it to author!');
if (isNaN(domObserverEntry.contentRect.width) || isNaN(domObserverEntry.contentRect.height)) {} else {
// resize graph manually, because dygraph resizing base on window object.
console.log("new size is: ".concat(domObserverEntry.contentRect.width, " ").concat(domObserverEntry.contentRect.height));
var evt = window.document.createEvent('UIEvents');
evt.initEvent('resize', false, false);
window.dispatchEvent(evt);
}
} else {
console.log("resizing not support for: ", domObserverEntry.target.className);
}
});
});
divResizeRo.observe(this.body);
}
/**
*update datewindow for children graphs
* @param datewindow
* @param currentView
* @private
* @memberof FgpGraph
*/
;
exports["default"] = FgpGraph;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJGZ3BHcmFwaCIsImRvbSIsInZpZXdDb25maWdzIiwiZXZlbnRIYW5kbGVycyIsInN5bmNWaWV3cyIsImRhdGVXaW5kb3ciLCJjdXJyZW50VmlldyIsImdyYXBoRGF0ZVdpbmRvdyIsImN1cnJlbnREYXRlV2luZG93IiwiY2hpbGRyZW4iLCJmb3JFYWNoIiwiZ3JhcGgiLCJpZCIsInVwZGF0ZURhdGV3aW5vd0luc2lkZSIsInZpZXciLCJjb25maWciLCJzaG93IiwibmFtZSIsImluaXRSYW5nZSIsInN0YXJ0IiwiZW5kIiwib3BlcmF0b3IiLCJpbml0IiwicmVmcmVzaCIsImV2ZW50TGlzdGVuZXJzIiwib25WaWV3Q2hhbmdlIiwicmVhZHkiLCJuZWVkU3luYyIsIkdyYXBoT3BlcmF0b3IiLCJyYW5nZUJhckdyYXBoIiwiZ3JhcGhDb250YWluZXIiLCJib2R5IiwiZGF0ZVdpbmRvd0hhbmRsZXIiLCJzaG93VmlldyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsImRhdGV3aW5kb3ciLCJsb2ciLCJyYW5nZSIsInhBeGlzUmFuZ2UiLCJ1cGRhdGUiLCJ1bmRlZmluZWQiLCJjaGlsZCIsImZvcmNlUmVsb2FkIiwidXBkYXRlT3B0aW9ucyIsImdyYXBocyIsImNvbmNhdCIsInNlcmllcyIsImR1cmF0aW9uIiwidHlwZSIsImhpZ2hsaWdodFNlcmllcyIsIndhcm4iLCJwYXJlbnREb20iLCJNYXRoIiwicmFuZG9tIiwiZ2V0QXR0cmlidXRlIiwiaW50ZXJ2YWxzTGFiZWxzQXR0cnMiLCJrZXkiLCJ2YWx1ZSIsImludGVydmFsTGFiZWxzQXJlYSIsIkRvbUVsZW1lbnRPcGVyYXRvciIsImNyZWF0ZUVsZW1lbnQiLCJidXR0b25zQXR0cnMiLCJidXR0b25zQXJlYSIsImZpbHRlckF0dHJzIiwiZmlsdGVyQXJlYSIsInRvb2xiYXJBcmVhQXR0cnMiLCJ0b29sYmFyQXJlYSIsImNvbnRhaW5lckF0dHJzIiwiYm9keUF0dHJzIiwiYXBwZW5kQ2hpbGQiLCJkaXZSZXNpemVSbyIsIlJlc2l6ZU9ic2VydmVyIiwicm9lcyIsIm9ic2VydmVyIiwiZG9tT2JzZXJ2ZXJFbnRyeSIsInRhcmdldCIsImNsYXNzTmFtZSIsImlzTmFOIiwiY29udGVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsImV2dCIsIndpbmRvdyIsImRvY3VtZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50Iiwib2JzZXJ2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUlBOztBQUdBOzs7Ozs7SUFFcUJBLFEsR0FnQ2pCOztBQUdBOzs7Ozs7OztBQVFBLGtCQUFZQyxHQUFaLEVBQThCQyxXQUE5QixFQUE4REMsYUFBOUQsRUFBNkZDLFNBQTdGLEVBQWtIO0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUEsc0NBN0JyRixLQTZCcUY7O0FBQUE7O0FBQUEsb0NBekIvRSxFQXlCK0U7O0FBQUEsNkNBdkI3RSxFQXVCNkU7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUEscUNBYjVFLEtBYTRFOztBQUFBLDZDQTRFdEYsVUFBQ0MsVUFBRCxFQUErQkMsV0FBL0IsRUFBNEQ7QUFFcEYsUUFBSSxLQUFJLENBQUNGLFNBQVQsRUFBb0I7QUFDaEI7QUFDQSxNQUFBLEtBQUksQ0FBQ0csZUFBTCxHQUF1QkYsVUFBdkI7QUFDSDs7QUFFRCxJQUFBLEtBQUksQ0FBQ0csaUJBQUwsR0FBeUJILFVBQXpCOztBQUNBLElBQUEsS0FBSSxDQUFDSSxRQUFMLENBQWNDLE9BQWQsQ0FBc0IsVUFBQUMsS0FBSyxFQUFJO0FBQzNCO0FBQ0EsVUFBSUEsS0FBSyxDQUFDQyxFQUFOLElBQVksS0FBSSxDQUFDQSxFQUFyQixFQUF5QjtBQUNyQkQsUUFBQUEsS0FBSyxDQUFDRSxxQkFBTixDQUE0QlIsVUFBNUI7QUFDSDtBQUNKLEtBTEQ7QUFPSCxHQTNGaUg7O0FBQUEsc0NBaUc5RixVQUFDUyxJQUFELEVB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O1xuXG5pbXBvcnQge0RvbUF0dHJzLCBWaWV3Q29uZmlnLCBWaWV3T3B0aW9uc30gZnJvbSBcIi4vbWV0YWRhdGEvY29uZmlndXJhdGlvbnNcIjtcblxuaW1wb3J0IHtSZXNpemVPYnNlcnZlciwgUmVzaXplT2JzZXJ2ZXJFbnRyeX0gZnJvbSAnQGp1Z2dsZS9yZXNpemUtb2JzZXJ2ZXInO1xuXG5pbXBvcnQge0V2ZW50SGFuZGxlcnN9IGZyb20gJy4vbWV0YWRhdGEvZ3JhcGhvcHRpb25zJztcbmltcG9ydCB7RG9tRWxlbWVudE9wZXJhdG9yLCBHcmFwaE9wZXJhdG9yfSBmcm9tIFwiLi93aWRnZXRzL0dyYXBoUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmdwR3JhcGgge1xuXG4gICAgZ3JhcGhDb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgYm9keTogSFRNTEVsZW1lbnQ7XG5cbiAgICBwdWJsaWMgZ3JhcGghOiBEeWdyYXBoO1xuXG4gICAgcHJpdmF0ZSByYW5nZUJhckdyYXBoITogRHlncmFwaDtcblxuICAgIHZpZXdDb25maWdzOiBBcnJheTxWaWV3Q29uZmlnPjtcblxuICAgIHByaXZhdGUgcGFyZW50RG9tOiBIVE1MRWxlbWVudDtcblxuICAgIHB1YmxpYyBzeW5jTGVnZW5kOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBpbnRlcnZhbExhYmVsc0FyZWE6IEhUTUxFbGVtZW50O1xuXG4gICAgcHVibGljIGNoaWxkcmVuOiBBcnJheTxGZ3BHcmFwaD4gPSBbXTtcblxuICAgIHB1YmxpYyBjdXJyZW50RGF0ZVdpbmRvdzogbnVtYmVyW10gPSBbXTtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgb3BlcmF0b3IhOiBHcmFwaE9wZXJhdG9yO1xuXG4gICAgZXZlbnRMaXN0ZW5lcnM/OiBFdmVudEhhbmRsZXJzO1xuXG4gICAgcHJpdmF0ZSBncmFwaERhdGVXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHN5bmNWaWV3czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gcHJpdmF0ZSBpc1JlYWR5OiBib29sZWFuID0gZmFsc2U7XG5cblxuICAgIC8qKlxuICAgICAqQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBGZ3BHcmFwaC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkb21cbiAgICAgKiBncmFwaCBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5PFZpZXdDb25maWc+fSB2aWV3Q29uZmlnc1xuICAgICAqIGdyYXBoIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihkb206IEhUTUxFbGVtZW50LCB2aWV3Q29uZmlnczogQXJyYXk8Vmlld0NvbmZpZz4sIGV2ZW50SGFuZGxlcnM/OiBFdmVudEhhbmRsZXJzLCBzeW5jVmlld3M/OiBib29sZWFuKSB7XG5cbiAgICAgICAgdGhpcy5wYXJlbnREb20gPSBkb207XG4gICAgICAgIHRoaXMuZ3JhcGhEYXRlV2luZG93ID0gWzAsIDBdO1xuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IGV2ZW50SGFuZGxlcnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYG5lZWQgdG8gc3luYyB2aWV3cz8gJHtzeW5jVmlld3N9YCk7XG4gICAgICAgIGlmIChzeW5jVmlld3MpIHtcbiAgICAgICAgICAgIHRoaXMuc3luY1ZpZXdzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaWQgPSAoTWF0aC5yYW5kb20oKSAqIDEwMDAwIHwgMCkgKyAxICsgJyc7XG5cbiAgICAgICAgLy8gaWYgaWQgZXhpc3QgdGhlbiBjaGFuZ2UgaWQgdG8gaWRcbiAgICAgICAgaWYgKHRoaXMucGFyZW50RG9tLmdldEF0dHJpYnV0ZSgnaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucGFyZW50RG9tLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHRoaXMucGFyZW50RG9tLmdldEF0dHJpYnV0ZShcImZncC1ncmFwaC1pZFwiKSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IDxzdHJpbmc+dGhpcy5wYXJlbnREb20uZ2V0QXR0cmlidXRlKFwiZmdwLWdyYXBoLWlkXCIpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgaW50ZXJ2YWxzTGFiZWxzQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogXCJmZ3AtaW50ZXJ2YWwtbGFiZWxzXCJ9XTtcbiAgICAgICAgdGhpcy5pbnRlcnZhbExhYmVsc0FyZWEgPSBEb21FbGVtZW50T3BlcmF0b3IuY3JlYXRlRWxlbWVudCgnZGl2JywgaW50ZXJ2YWxzTGFiZWxzQXR0cnMpO1xuXG4gICAgICAgIGxldCBidXR0b25zQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogXCJmZ3AtYnV0dG9uc1wifV07XG4gICAgICAgIGNvbnN0IGJ1dHRvbnNBcmVhID0gRG9tRWxlbWVudE9wZXJhdG9yLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIGJ1dHRvbnNBdHRycyk7XG5cbiAgICAgICAgbGV0IGZpbHRlckF0dHJzOiBBcnJheTxEb21BdHRycz4gPSBbe2tleTogJ2NsYXNzJywgdmFsdWU6IFwiZmdwLWZpbHRlci1idXR0b25zXCJ9XTtcbiAgICAgICAgY29uc3QgZmlsdGVyQXJlYSA9IERvbUVsZW1lbnRPcGVyYXRvci5jcmVhdGVFbGVtZW50KCdkaXYnLCBmaWx0ZXJBdHRycyk7XG5cbiAgICAgICAgbGV0IHRvb2xiYXJBcmVhQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogXCJmZ3AtdG9vbGJhci1hcmVhXCJ9XTtcbiAgICAgICAgY29uc3QgdG9vbGJhckFyZWEgPSBEb21FbGVtZW50T3BlcmF0b3IuY3JlYXRlRWxlbWVudCgnZGl2JywgdG9vbGJhckFyZWFBdHRycyk7XG5cblxuICAgICAgICAvLyBjcmVhdGUgZG9tc1xuICAgICAgICBsZXQgY29udGFpbmVyQXR0cnM6IEFycmF5PERvbUF0dHJzPiA9IFt7a2V5OiAnY2xhc3MnLCB2YWx1ZTogJ2ZncC1ncmFwaC1jb250YWluZXIgbm9zZWxlY3QnfV07XG4gICAgICAgIHRoaXMuZ3JhcGhDb250YWluZXIgPSBEb21FbGVtZW50T3BlcmF0b3IuY3JlYXRlRWxlbWVudCgnZGl2JywgY29udGFpbmVyQXR0cnMpO1xuXG5cbiAgICAgICAgbGV0IGJvZHlBdHRyczogQXJyYXk8RG9tQXR0cnM+ID0gW3trZXk6ICdjbGFzcycsIHZhbHVlOiAnZmdwLWdyYXBoLWJvZHknfV07XG4gICAgICAgIHRoaXMuYm9keSA9IERvbUVsZW1lbnRPcGVyYXRvci5jcmVhdGVFbGVtZW50KCdkaXYnLCBib2R5QXR0cnMpO1xuICAgICAgICB0aGlzLmdyYXBoQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYm9keSk7XG4gICAgICAgIHRoaXMucGFyZW50RG9tLmFwcGVuZENoaWxkKHRoaXMuZ3JhcGhDb250YWluZXIpO1xuICAgICAgICB0aGlzLnZpZXdDb25maWdzID0gdmlld0NvbmZpZ3M7XG4gICAgICAgIC8vIGxpc3RlbmluZyBmb3IgZGl2IHJlc2l6aW5nLi4uLi4uLlxuICAgICAgICBjb25zdCBkaXZSZXNpemVSbyA9IG5ldyBSZXNpemVPYnNlcnZlcigocm9lczogUmVzaXplT2JzZXJ2ZXJFbnRyeVtdLCBvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgcm9lcy5mb3JFYWNoKChkb21PYnNlcnZlckVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JhcGggJiYgZG9tT2JzZXJ2ZXJFbnRyeS50YXJnZXQuY2xhc3NOYW1lID09ICdmZ3AtZ3JhcGgtYm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXNpemluZyBkb206IFwiLCBkb21PYnNlcnZlckVudHJ5LnRhcmdldC5jbGFzc05hbWUsICdpZiBzb21lb25lIHNlZSBhIGluZmluaXRlIGxvb3AgaGVyZSwgcGxlYXNlIHJlcG9ydCBpdCB0byBhdXRob3IhJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihkb21PYnNlcnZlckVudHJ5LmNvbnRlbnRSZWN0LndpZHRoKSB8fCBpc05hTihkb21PYnNlcnZlckVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSBncmFwaCBtYW51YWxseSwgYmVjYXVzZSBkeWdyYXBoIHJlc2l6aW5nIGJhc2Ugb24gd2luZG93IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBuZXcgc2l6ZSBpczogJHtkb21PYnNlcnZlckVudHJ5LmNvbnRlbnRSZWN0LndpZHRofSAke2RvbU9ic2VydmVyRW50cnkuY29udGVudFJlY3QuaGVpZ2h0fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV2dCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudCgnVUlFdmVudHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5pbml0RXZlbnQoJ3Jlc2l6ZScsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXNpemluZyBub3Qgc3VwcG9ydCBmb3I6IFwiLCBkb21PYnNlcnZlckVudHJ5LnRhcmdldC5jbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZGl2UmVzaXplUm8ub2JzZXJ2ZSh0aGlzLmJvZHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqdXBkYXRlIGRhdGV3aW5kb3cgZm9yIGNoaWxkcmVuIGdyYXBoc1xuICAgICAqIEBwYXJhbSBkYXRld2luZG93XG4gICAgICogQHBhcmFtIGN1cnJlbnRWaWV3XG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGRhdGVXaW5kb3dIYW5kbGVyID0gKGRhdGVXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0sIGN1cnJlbnRWaWV3PzogVmlld0NvbmZpZykgPT4ge1xuXG4gICAgICAgIGlmICh0aGlzLnN5bmNWaWV3cykge1xuICAgICAgICAgICAgLy8gc3RvcmUgZGF0YVxuICAgICAgICAgICAgdGhpcy5ncmFwaERhdGVXaW5kb3cgPSBkYXRlV2luZG93O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50RGF0ZVdpbmRvdyA9IGRhdGVXaW5kb3c7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChncmFwaCA9PiB7XG4gICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZURhdGV3aW5vd1xuICAgICAgICAgICAgaWYgKGdyYXBoLmlkICE9IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICBncmFwaC51cGRhdGVEYXRld2lub3dJbnNpZGUoZGF0ZVdpbmRvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGZ1bmMgZm9yIHN3aXRjaGluZyB2aWV3XG4gICAgICogQHBhcmFtIHZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hhbmdlVmlldyA9ICh2aWV3OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY2hhbmdlIHZpZXdcbiAgICAgICAgLy8gZmluZCB2aWV3XG4gICAgICAgIHRoaXMudmlld0NvbmZpZ3MuZm9yRWFjaChjb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLnNob3cgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjb25maWcubmFtZSA9PT0gdmlldykge1xuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzaG93IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbmZpZy5zaG93ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN5bmNWaWV3cyAmJiB0aGlzLmdyYXBoRGF0ZVdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuaW5pdFJhbmdlID0ge3N0YXJ0OiB0aGlzLmdyYXBoRGF0ZVdpbmRvd1swXSwgZW5kOiB0aGlzLmdyYXBoRGF0ZVdpbmRvd1sxXX07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRvci5pbml0KGNvbmZpZywgKGdyYXBoOiBEeWdyYXBoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGdyYXBoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdXBkYXRlRGF0ZXdpbm93XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhcGguaWQgIT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgub3BlcmF0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChncmFwaCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHVwZGF0ZURhdGV3aW5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyYXBoLmlkICE9IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLm9wZXJhdG9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHRlbGwgb3RoZXJzIHRoZSB2aWV3IGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXZlbnRMaXN0ZW5lcnMgJiYgdGhpcy5ldmVudExpc3RlbmVycy5vblZpZXdDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9mIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5vblZpZXdDaGFuZ2UodGhpcywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBpbml0IGdyYXBoIHdpdGggY29uZmlndXJhdGlvblxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdEdyYXBoID0gKHJlYWR5PzogKGc6IEZncEdyYXBoKSA9PiB2b2lkLCBuZWVkU3luYz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG5ldyBHcmFwaE9wZXJhdG9yKHRoaXMuZ3JhcGgsIHRoaXMucmFuZ2VCYXJHcmFwaCwgdGhpcy5ncmFwaENvbnRhaW5lciwgdGhpcy5ib2R5LCB0aGlzLmRhdGVXaW5kb3dIYW5kbGVyLCB0aGlzLCB0aGlzLmV2ZW50TGlzdGVuZXJzLCB0aGlzLmlkLCBuZWVkU3luYyk7XG4gICAgICAgIC8vIHdoaWNoIFwidmlld1wiIHNob3VsZCBiZSBzaG93biBmaXJzdD8gZGV2aWNlIG9yIHNjYXR0ZXI/XG4gICAgICAgIGlmICh0aGlzLnZpZXdDb25maWdzKSB7XG4gICAgICAgICAgICBsZXQgc2hvd1ZpZXc6IFZpZXdDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBzaG93VmlldyBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghc2hvd1ZpZXcgJiYgdGhpcy52aWV3Q29uZmlncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2hvd1ZpZXcgPSB0aGlzLnZpZXdDb25maWdzWzBdO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvd1ZpZXcgJiYgdGhpcy52aWV3Q29uZmlncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwidmlldyBjb25maWcgbm90IGZvdW5kIVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzaG93Vmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0b3IuaW5pdChzaG93VmlldywgKGdyYXBoOiBEeWdyYXBoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGdyYXBoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdXBkYXRlRGF0ZXdpbm93XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhcGguaWQgIT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgub3BlcmF0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqdXBkYXRlIGN1cnJyZW50IGdyYXBoIGRhdGV3aW5kb3dcbiAgICAgKiBAcGFyYW0gZGF0ZXdpbmRvd1xuICAgICAqIEBtZW1iZXJvZiBGZ3BHcmFwaFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVEYXRld2lub3cgPSAoZGF0ZXdpbmRvdzogW251bWJlciwgbnVtYmVyXSkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICBjb25zb2xlLmxvZyhgbmV3IGRhdGV3aW5kb3c6ICR7ZGF0ZXdpbmRvd31gKTtcblxuICAgICAgICAvLyB1cGRhdGUgZ3JhcGhcbiAgICAgICAgaWYgKHRoaXMuZ3JhcGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBBcnJheTxudW1iZXI+ID0gdGhpcy5ncmFwaC54QXhpc1JhbmdlKCk7XG4gICAgICAgICAgICAvLyBpZiBkYXRld2luZG93IHNhbWUgdGhlbiBpZ25vcmUgdGhhdFxuICAgICAgICAgICAgaWYgKHJhbmdlWzBdICE9IGRhdGV3aW5kb3dbMF0gfHwgcmFuZ2VbMV0gIT0gZGF0ZXdpbmRvd1sxXSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbG9hZCBkYXRhIGZvciBjdXJyZW50IGdyYXBoXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRvci51cGRhdGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGRhdGV3aW5kb3cpO1xuICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgY2hpbGRyZW4gZ3JhcGhzIHRoZW4gcnVuIHVwZGF0ZVxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlRGF0ZXdpbm93SW5zaWRlKGRhdGV3aW5kb3csIHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHVwZGF0ZURhdGV3aW5vd0luc2lkZSA9IChkYXRld2luZG93OiBbbnVtYmVyLCBudW1iZXJdLCBmb3JjZVJlbG9hZD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgLy8gdXBkYXRlIGdyYXBoXG4gICAgICAgIGlmICh0aGlzLmdyYXBoKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgY3VycmVudCBkYXRlLXdpbmRvd1xuICAgICAgICAgICAgdGhpcy5ncmFwaC51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBkYXRlV2luZG93OiBkYXRld2luZG93XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3JjZVJlbG9hZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0b3IudXBkYXRlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlLCBkYXRld2luZG93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqYmluZCBjaGlsZHJlbiBncmFwaHNcbiAgICAgKiBAcGFyYW0gZ3JhcGhzXG4gICAgICogY2hpbGRyZW4gZ3JhcGhzXG4gICAgICogQG1lbWJlcm9mIEZncEdyYXBoXG4gICAgICovXG4gICAgcHVibGljIHNldENoaWxkcmVuID0gKGdyYXBoczogQXJyYXk8RmdwR3JhcGg+KSA9PiB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmNvbmNhdChncmFwaHMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBoaWdobGlnaHQgbGluZSBvbiBncmFwaFxuICAgICAqIEBwYXJhbSBzZXJpZXNcbiAgICAgKiBuYW1lIG9mIGxpbmVzXG4gICAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAgICogdW5oaWdobGlnaHQgYWZ0ZXIgPGR1cmF0aW9uPiBzZWNvbmRzICAwIG1lYW5zIGhpZ2hsaWdodCBmb3JldmVyXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgRmdwR3JhcGhcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlnaGxpZ2h0U2VyaWVzID0gKHNlcmllczogc3RyaW5nW10sIGR1cmF0aW9uOiBudW1iZXIsIHR5cGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5vcGVyYXRvci5oaWdobGlnaHRTZXJpZXMoc2VyaWVzLCBkdXJhdGlvbiwgdHlwZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHJlbG9hZCBkYXRhIGZvciBncmFwaC4gYmFzZSBvbiBzZXJpZXMgbm90IGNoYW5nZWQhXG4gICAgICovXG4gICAgcHVibGljIHJlbG9hZERhdGEgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMub3BlcmF0b3IudXBkYXRlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogZG8gaXQgbGF0ZXJcbiAgICAgKiBAcGFyYW0gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNvbmZpZyA9IChjb25maWc6IFZpZXdPcHRpb25zKSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBcIm5vdCBlbmFibGVkIGluIHRoaXMgdmVyc2lvblwiO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjbGVhciBncmFwaFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFwidW5kZXIgZGV2ZWxvcGluZyFcIilcbiAgICB9O1xuXG59XG4iXX0=