diff --git a/CHANGELOG.md b/CHANGELOG.md index 3129878f..91ab0801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,25 +6,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.0] - 2019-04-05 + ### Added -* `demos/usage-dag-edges.py`: Show different types of edges in a DAG -* `demos/usage-elements-extra.py`: Shows how to load external layouts, otherwise same app as `usage-elements.py`. -* `demos/usage-preset-animation.py`: Example of animating nodes using the preset layout. -* `demos/usage-reset-button.py`: Example of resetting the graph position using a button. -* `dash_cytoscape.load_extra_layouts()`: A new function that can be called before initializing the Dash app (`app = dash.Dash(__name__)`) to load the JS bundle containing the external layouts. -* `webpack.[dev|prod].extra.config.js`: Two new webpack configs for external layouts. +* Four new demos: + * `demos/usage-dag-edges.py`: Example of edges in a directed acyclic graph (DAG). It uses the new `dash_cytoscape.utils.Tree` class. + * `demos/usage-elements-extra.py`: Example of loading external layouts. + * `demos/usage-preset-animation.py`: Example of animating nodes using the preset layout. + * `demos/usage-reset-button.py`: Example of resetting the graph position using a button. + * `demos/usage-remove-selected-elements.py`: Example to show how to remove selected elements with button. +* `dash_cytoscape/dash_cytoscape_extra.[min|dev].js`: New bundles containing the extra layouts. Those bundles are double in size compared to the default bundles. Therefore, they are only loaded when the user uses `load_extra_layouts()` to limit bandwidth usage and maximize loading speed. Please view [fast3g-cytoscape](demos/images/fast3g-cytoscape.PNG) for an example of the impact on loading time. +* `dash_cytoscape._display_default_values()`: A helper function to display the default prop values by reading `metadata.json`. Useful for documentation. +* `dash_cytoscape.load_extra_layouts()`: A function that can be called before initializing the Dash app (`app = dash.Dash(__name__)`) to load the JS bundle containing the external layouts. * `src/lib/extra_index.js`: Loads external layouts before exporting the `Cytoscape` class. Needed to generate the new bundles. +* `webpack.[dev|prod].extra.config.js`: Two new webpack config files for external layouts. * Images of new external layouts. -* `dash_cytoscape/dash_cytoscape_extra.[min|dev].js`: New bundles containing the extra layouts. Those bundles are double in size compared to the default bundles. Therefore, they are only loaded when the user uses `load_extra_layouts()` to limit bandwidth usage and maximize loading speed. Please view [fast3g-cytoscape](demos/images/fast3g-cytoscape.PNG) for an example of the impact on loading time. -* `dash_cytoscape._display_default_values()`: A util function to display the default prop values by reading `metadata.json`. Useful for documentation. +* The ability for the user to feed a dictionary with keys `nodes` and `edges` to the `elements` prop of `Cytoscape`, instead of a list. The values corresponding to these keys will be, respectively, lists of nodes and edges in the graph. + ### Changed * `usage-events.py`: Added IDs for the edges in order to pass Percy tests. -* `src/lib/components/Cytoscape.react.js`: Updated docstring to include information about new external layouts and warning about nodes that can't be modified by a callback. Added more default props for a better expected behavior. +* `src/lib/components/Cytoscape.react.js`: Updated component docstring to include information about new external layouts and a warning about nodes that can't be modified by a callback. Added more default props for a better expected behavior. * `package.json`: Added new builds for the extra layouts, modified `npm build:all` to include new builds. Added external layouts as dependencies. +* `MANIFEST.in`: Included new `dash_cytoscape.[min|dev].js` files. * `README.md`: Moved images, added more images at the end, added useful links. +### Fixed +* Removing selected elements will now cause the corresponding JSON data to be cleared. Fixed by [PR #49](https://github.com/plotly/dash-cytoscape/pull/49), fixes [issue #45](https://github.com/plotly/dash-cytoscape/issues/45). + + ## [0.0.5] - 2019-03-08 ### Added diff --git a/MANIFEST.in b/MANIFEST.in index 45e60baf..30445a61 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,7 @@ include dash_cytoscape/dash_cytoscape.min.js include dash_cytoscape/dash_cytoscape.dev.js +include dash_cytoscape/dash_cytoscape_extra.min.js +include dash_cytoscape/dash_cytoscape_extra.dev.js include dash_cytoscape/metadata.json include dash_cytoscape/package.json include README.md diff --git a/dash_cytoscape/dash_cytoscape.dev.js b/dash_cytoscape/dash_cytoscape.dev.js index 1e58e863..b4b1015c 100644 --- a/dash_cytoscape/dash_cytoscape.dev.js +++ b/dash_cytoscape/dash_cytoscape.dev.js @@ -275,7 +275,7 @@ eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\ /***/ (function(module, exports, __webpack_require__) { "use strict"; - eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactCytoscapejs = __webpack_require__(/*! react-cytoscapejs */ \"./node_modules/react-cytoscapejs/dist/react-cytoscape.js\");\n\nvar _reactCytoscapejs2 = _interopRequireDefault(_reactCytoscapejs);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\r\n * JavaScript Requirements: cytoscape\r\n * React.js requirements: react-cytoscapejs\r\n */\n\n\n/**\r\nA Component Library for Dash aimed at facilitating network visualization in\r\nPython, wrapped around [Cytoscape.js](http://js.cytoscape.org/).\r\n */\nvar Cytoscape = function (_Component) {\n _inherits(Cytoscape, _Component);\n\n function Cytoscape(props) {\n _classCallCheck(this, Cytoscape);\n\n var _this = _possibleConstructorReturn(this, (Cytoscape.__proto__ || Object.getPrototypeOf(Cytoscape)).call(this, props));\n\n _this.handleCy = _this.handleCy.bind(_this);\n _this._handleCyCalled = false;\n return _this;\n }\n\n _createClass(Cytoscape, [{\n key: 'generateNode',\n value: function generateNode(event) {\n var ele = event.target;\n\n var isParent = ele.isParent(),\n isChildless = ele.isChildless(),\n isChild = ele.isChild(),\n isOrphan = ele.isOrphan(),\n renderedPosition = ele.renderedPosition(),\n relativePosition = ele.relativePosition(),\n parent = ele.parent(),\n style = ele.style();\n\n // Trim down the element objects to only the data contained\n var edgesData = ele.connectedEdges().map(function (ele) {\n return ele.data();\n }),\n childrenData = ele.children().map(function (ele) {\n return ele.data();\n }),\n ancestorsData = ele.ancestors().map(function (ele) {\n return ele.data();\n }),\n descendantsData = ele.descendants().map(function (ele) {\n return ele.data();\n }),\n siblingsData = ele.siblings().map(function (ele) {\n return ele.data();\n });\n\n var timeStamp = event.timeStamp;\n\n var _ele$json = ele.json(),\n classes = _ele$json.classes,\n data = _ele$json.data,\n grabbable = _ele$json.grabbable,\n group = _ele$json.group,\n locked = _ele$json.locked,\n position = _ele$json.position,\n selected = _ele$json.selected,\n selectable = _ele$json.selectable;\n\n var parentData = void 0;\n if (parent) {\n parentData = parent.data();\n } else {\n parentData = null;\n }\n\n var nodeObject = {\n // Nodes attributes\n edgesData: edgesData,\n renderedPosition: renderedPosition,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n position: position,\n selectable: selectable,\n selected: selected,\n // Compound Nodes additional attributes\n ancestorsData: ancestorsData,\n childrenData: childrenData,\n descendantsData: descendantsData,\n parentData: parentData,\n siblingsData: siblingsData,\n isParent: isParent,\n isChildless: isChildless,\n isChild: isChild,\n isOrphan: isOrphan,\n relativePosition: relativePosition,\n // Styling\n style: style\n };\n return nodeObject;\n }\n }, {\n key: 'generateEdge',\n value: function generateEdge(event) {\n var ele = event.target;\n\n var midpoint = ele.midpoint(),\n isLoop = ele.isLoop(),\n isSimple = ele.isSimple(),\n sourceData = ele.source().data(),\n sourceEndpoint = ele.sourceEndpoint(),\n style = ele.style(),\n targetData = ele.target().data(),\n targetEndpoint = ele.targetEndpoint();\n\n var timeStamp = event.timeStamp;\n\n var _ele$json2 = ele.json(),\n classes = _ele$json2.classes,\n data = _ele$json2.data,\n grabbable = _ele$json2.grabbable,\n group = _ele$json2.group,\n locked = _ele$json2.locked,\n selectable = _ele$json2.selectable,\n selected = _ele$json2.selected;\n\n var edgeObject = {\n // Edges attributes\n isLoop: isLoop,\n isSimple: isSimple,\n midpoint: midpoint,\n sourceData: sourceData,\n sourceEndpoint: sourceEndpoint,\n targetData: targetData,\n targetEndpoint: targetEndpoint,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n selectable: selectable,\n selected: selected,\n // Styling\n style: style\n };\n\n return edgeObject;\n }\n }, {\n key: 'handleCy',\n value: function handleCy(cy) {\n var _this2 = this;\n\n // If the cy pointer has not been modified, and handleCy has already\n // been called before, than we don't run this function.\n if (cy === this._cy && this._handleCyCalled) {\n return;\n }\n this._cy = cy;\n window.cy = cy;\n this._handleCyCalled = true;\n\n // ///////////////////////////////////// CONSTANTS /////////////////////////////////////////\n var SELECT_THRESHOLD = 100;\n\n var selectedNodes = cy.collection();\n var selectedEdges = cy.collection();\n\n // ///////////////////////////////////// FUNCTIONS /////////////////////////////////////////\n var refreshLayout = _lodash2.default.debounce(function () {\n /**\r\n * Refresh Layout if needed\r\n */\n var _props = _this2.props,\n autoRefreshLayout = _props.autoRefreshLayout,\n layout = _props.layout;\n\n\n if (autoRefreshLayout) {\n cy.layout(layout).run();\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedNodesData = _lodash2.default.debounce(function () {\n /**\r\n This function is repetitively called every time a node is selected\r\n or unselected, but keeps being debounced if it is called again\r\n within 100 ms (given by SELECT_THRESHOLD). Effectively, it only\r\n runs when all the nodes have been correctly selected/unselected and\r\n added/removed from the selectedNodes collection, and then updates\r\n the selectedNodeData prop.\r\n */\n var nodeData = selectedNodes.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedNodeData: nodeData\n });\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedEdgesData = _lodash2.default.debounce(function () {\n var edgeData = selectedEdges.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedEdgeData: edgeData\n });\n }\n }, SELECT_THRESHOLD);\n\n // /////////////////////////////////////// EVENTS //////////////////////////////////////////\n cy.on('tap', 'node', function (event) {\n var nodeObject = _this2.generateNode(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapNode: nodeObject,\n tapNodeData: nodeObject.data\n });\n }\n });\n\n cy.on('tap', 'edge', function (event) {\n var edgeObject = _this2.generateEdge(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapEdge: edgeObject,\n tapEdgeData: edgeObject.data\n });\n }\n });\n\n cy.on('mouseover', 'node', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverNodeData: event.target.data()\n });\n }\n });\n\n cy.on('mouseover', 'edge', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverEdgeData: event.target.data()\n });\n }\n });\n\n cy.on('select', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.merge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('unselect remove', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.unmerge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('select', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.merge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('unselect remove', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.unmerge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('add remove', function () {\n refreshLayout();\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n id = _props2.id,\n style = _props2.style,\n className = _props2.className,\n elements = _props2.elements,\n stylesheet = _props2.stylesheet,\n layout = _props2.layout,\n pan = _props2.pan,\n zoom = _props2.zoom,\n panningEnabled = _props2.panningEnabled,\n userPanningEnabled = _props2.userPanningEnabled,\n minZoom = _props2.minZoom,\n maxZoom = _props2.maxZoom,\n zoomingEnabled = _props2.zoomingEnabled,\n userZoomingEnabled = _props2.userZoomingEnabled,\n boxSelectionEnabled = _props2.boxSelectionEnabled,\n autoungrabify = _props2.autoungrabify,\n autolock = _props2.autolock,\n autounselectify = _props2.autounselectify;\n\n\n return _react2.default.createElement(_reactCytoscapejs2.default, {\n id: id,\n cy: this.handleCy,\n className: className,\n style: style,\n elements: _reactCytoscapejs2.default.normalizeElements(elements),\n stylesheet: stylesheet,\n layout: layout,\n pan: pan,\n zoom: zoom,\n panningEnabled: panningEnabled,\n userPanningEnabled: userPanningEnabled,\n minZoom: minZoom,\n maxZoom: maxZoom,\n zoomingEnabled: zoomingEnabled,\n userZoomingEnabled: userZoomingEnabled,\n boxSelectionEnabled: boxSelectionEnabled,\n autoungrabify: autoungrabify,\n autolock: autolock,\n autounselectify: autounselectify\n });\n }\n }]);\n\n return Cytoscape;\n}(_react.Component);\n\nCytoscape.propTypes = {\n // HTML attribute props\n\n /**\r\n * The ID used to identify this component in Dash callbacks.\r\n */\n id: _propTypes2.default.string,\n\n /**\r\n * Sets the class name of the element (the value of an element's html\r\n * class attribute).\r\n */\n className: _propTypes2.default.string,\n\n /**\r\n * Add inline styles to the root element.\r\n */\n style: _propTypes2.default.object,\n\n // Dash specific props\n\n /**\r\n * Dash-assigned callback that should be called whenever any of the\r\n * properties change.\r\n */\n setProps: _propTypes2.default.func,\n\n // Common props\n\n /**\r\n * A list of dictionaries representing the elements of the networks.\r\n * 1. Each dictionary describes an element, and specifies its purpose.\r\n * - `group` (string): Either 'nodes' or 'edges'. If not given, it's automatically inferred.\r\n * - `data` (dictionary): Element specific data.\r\n * - `id` (string): Reference to the element, useful for selectors and edges. Randomly assigned if not given.\r\n * - `label` (string): Optional name for the element, useful when `data(label)` is given to a style's `content` or `label`. It is only a convention.\r\n * - `parent` (string): Only for nodes. Optional reference to another node. Needed to create compound nodes.\r\n * - `source` (string): Only for edges. The id of the source node, which is where the edge starts.\r\n * - `target` (string): Only for edges. The id of the target node, where the edge ends.\r\n * - `position` (dictionary): Only for nodes. The position of the node.\r\n * - `x` (number): The x-coordinate of the node.\r\n * - `y` (number): The y-coordinate of the node.\r\n * - `selected` (boolean): If the element is selected upon initialisation.\r\n * - `selectable` (boolean): If the element can be selected.\r\n * - `locked` (boolean): Only for nodes. If the position is immutable.\r\n * - `grabbable` (boolean): Only for nodes. If the node can be grabbed and moved by the user.\r\n * - `classes` (string): Space separated string of class names of the element. Those classes can be selected by a style selector.\r\n *\r\n * 2. The [official Cytoscape.js documentation](http://js.cytoscape.org/#notation/elements-json) offers an extensive overview and examples of element declaration.\r\n */\n elements: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A list of dictionaries representing the styles of the elements.\r\n * 1. Each dictionary requires the following keys:\r\n * - `selector` (string): Which elements you are styling. Generally, you select a group of elements (node, edges, both), a class (that you declare in the element dictionary), or an element by ID.\r\n * - `style` (dictionary): What aspects of the elements you want to modify. This could be the size or color of a node, the shape of an edge arrow, or many more.\r\n *\r\n * 2. Both [the selector string](http://js.cytoscape.org/#selectors) and\r\n * [the style dictionary](http://js.cytoscape.org/#style/node-body) are\r\n * exhaustively documented in the Cytoscape.js docs. Although methods such\r\n * as `cy.elements(...)` and `cy.filter(...)` are not available, the selector\r\n * string syntax stays the same.\r\n */\n stylesheet: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A dictionary specifying how to set the position of the elements in your\r\n * graph. The `'name'` key is required, and indicates which layout (algorithm) to\r\n * use.\r\n * 1. The layouts available by default are:\r\n * - `random`: Randomly assigns positions\r\n * - `preset`: Assigns position based on the `position` key in element dictionaries\r\n * - `circle`: Single-level circle, with optional radius\r\n * - `concentric`: Multi-level circle, with optional radius\r\n * - `grid`: Square grid, optionally with numbers of `rows` and `cols`\r\n * - `breadthfirst`: Tree structure built using BFS, with optional `roots`\r\n * - `cose`: Force-directed physics simulation\r\n *\r\n * 2. Some external layouts are also included. To use them, run\r\n * `dash_cytoscape.load_extra_layouts()` before creating your Dash app. Be careful about\r\n * using the extra layouts when not necessary, since they require supplementary bandwidth\r\n * for loading, which impacts the startup time of the app.\r\n * - `cose-bilkent`: https://github.com/cytoscape/cytoscape.js-cose-bilkent\r\n * - `cola`: https://github.com/cytoscape/cytoscape.js-cola\r\n * - `euler`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `spread`: https://github.com/cytoscape/cytoscape.js-spread\r\n * - `dagre`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `klay`: https://github.com/cytoscape/cytoscape.js-klay\r\n *\r\n * 3. The keys accepted by `layout` vary depending on the algorithm, but some\r\n * keys are accepted by all layouts:\r\n * - `fit` (boolean): Whether to render the nodes in order to fit the canvas.\r\n * - `padding` (number): Padding around the sides of the canvas, if fit is enabled.\r\n * - `animate` (boolean): Whether to animate change in position when the layout changes.\r\n * - `animationDuration` (number): Duration of animation in milliseconds, if enabled.\r\n * - `boundingBox` (dictionary): How to constrain the layout in a specific area. Keys accepted are either `x1, y1, x2, y2` or `x1, y1, w, h`, all of which receive a pixel value.\r\n *\r\n * 4. The complete list of layouts and their accepted options are available\r\n * on the [Cytoscape.js docs](http://js.cytoscape.org/#layouts). For the\r\n * external layouts, the options are listed in the \"API\" section of the\r\n * README.\r\n * Note that certain keys are not supported in Dash since the value is a\r\n * JavaScript function or a callback. Please visit [this issue](https://github.com/plotly/dash-cytoscape/issues/25)\r\n * for more information.\r\n */\n layout: _propTypes2.default.object,\n\n // Viewport Manipulation\n\n /**\r\n * Dictionary indicating the initial panning position of the graph. The\r\n * following keys are accepted:\r\n * - `x` (number): The x-coordinate of the position.\r\n * - `y` (number): The y-coordinate of the position.\r\n */\n pan: _propTypes2.default.object,\n\n /**\r\n * The initial zoom level of the graph. You can set `minZoom` and\r\n * `maxZoom` to set restrictions on the zoom level.\r\n */\n zoom: _propTypes2.default.number,\n\n // Viewport Mutability and gesture Toggling\n /**\r\n * Whether panning the graph is enabled (i.e., the position of the graph is\r\n * mutable overall).\r\n */\n panningEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed to\r\n * pan the graph.\r\n */\n userPanningEnabled: _propTypes2.default.bool,\n\n /**\r\n * A minimum bound on the zoom level of the graph. The viewport can not be\r\n * scaled smaller than this zoom level.\r\n */\n minZoom: _propTypes2.default.number,\n\n /**\r\n * A maximum bound on the zoom level of the graph. The viewport can not be\r\n * scaled larger than this zoom level.\r\n */\n maxZoom: _propTypes2.default.number,\n\n /**\r\n * Whether zooming the graph is enabled (i.e., the zoom level of the graph\r\n * is mutable overall).\r\n */\n zoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed\r\n * to pan the graph.\r\n */\n userZoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether box selection (i.e. drag a box overlay around, and release it\r\n * to select) is enabled. If enabled, the user must taphold to pan the graph.\r\n */\n boxSelectionEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be ungrabified (not grabbable by user) by\r\n * default (if true, overrides individual node state).\r\n */\n autoungrabify: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be locked (not draggable at all) by default\r\n * (if true, overrides individual node state).\r\n */\n autolock: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be unselectified (immutable selection state) by\r\n * default (if true, overrides individual element state).\r\n */\n autounselectify: _propTypes2.default.bool,\n\n /**\r\n * Whether the layout should be refreshed when elements are added or removed.\r\n */\n autoRefreshLayout: _propTypes2.default.bool,\n\n // User Events Props\n\n /**\r\n * The complete node dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Node-specific items:\r\n * - `edgesData` (dictionary)\r\n * - `renderedPosition` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `position` (dictionary)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n *\r\n * 3. Items for compound nodes:\r\n * - `ancestorsData` (dictionary)\r\n * - `childrenData` (dictionary)\r\n * - `descendantsData` (dictionary)\r\n * - `parentData` (dictionary)\r\n * - `siblingsData` (dictionary)\r\n * - `isParent` (boolean)\r\n * - `isChildless` (boolean)\r\n * - `isChild` (boolean)\r\n * - `isOrphan` (boolean)\r\n * - `relativePosition` (dictionary)\r\n */\n tapNode: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you tap or click it. Read-only.\r\n */\n tapNodeData: _propTypes2.default.object,\n\n /**\r\n * The complete edge dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Edge-specific items:\r\n * - `isLoop` (boolean)\r\n * - `isSimple` (boolean)\r\n * - `midpoint` (dictionary)\r\n * - `sourceData` (dictionary)\r\n * - `sourceEndpoint` (dictionary)\r\n * - `targetData` (dictionary)\r\n * - `targetEndpoint` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n */\n tapEdge: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you tap or click it. Read-only.\r\n */\n tapEdgeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you hover over it. Read-only.\r\n */\n mouseoverNodeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you hover over it. Read-only.\r\n */\n mouseoverEdgeData: _propTypes2.default.object,\n\n /**\r\n * The list of data dictionaries of all selected nodes (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedNodeData: _propTypes2.default.array,\n\n /**\r\n * The list of data dictionaries of all selected edges (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedEdgeData: _propTypes2.default.array\n};\n\nCytoscape.defaultProps = {\n style: { width: '600px', height: '600px' },\n layout: { name: 'grid' },\n pan: { x: 0, y: 0 },\n zoom: 1,\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: true,\n userZoomingEnabled: true,\n panningEnabled: true,\n userPanningEnabled: true,\n boxSelectionEnabled: false,\n autolock: false,\n autoungrabify: false,\n autounselectify: false,\n autoRefreshLayout: true\n};\n\nexports.default = Cytoscape;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX2N5dG9zY2FwZS8uL3NyYy9saWIvY29tcG9uZW50cy9DeXRvc2NhcGUucmVhY3QuanM/NjQyYyJdLCJuYW1lcyI6WyJDeXRvc2NhcGUiLCJwcm9wcyIsImhhbmRsZUN5IiwiYmluZCIsIl9oYW5kbGVDeUNhbGxlZCIsImV2ZW50IiwiZWxlIiwidGFyZ2V0IiwiaXNQYXJlbnQiLCJpc0NoaWxkbGVzcyIsImlzQ2hpbGQiLCJpc09ycGhhbiIsInJlbmRlcmVkUG9zaXRpb24iLCJyZWxhdGl2ZVBvc2l0aW9uIiwicGFyZW50Iiwic3R5bGUiLCJlZGdlc0RhdGEiLCJjb25uZWN0ZWRFZGdlcyIsIm1hcCIsImRhdGEiLCJjaGlsZHJlbkRhdGEiLCJjaGlsZHJlbiIsImFuY2VzdG9yc0RhdGEiLCJhbmNlc3RvcnMiLCJkZXNjZW5kYW50c0RhdGEiLCJkZXNjZW5kYW50cyIsInNpYmxpbmdzRGF0YSIsInNpYmxpbmdzIiwidGltZVN0YW1wIiwianNvbiIsImNsYXNzZXMiLCJncmFiYmFibGUiLCJncm91cCIsImxvY2tlZCIsInBvc2l0aW9uIiwic2VsZWN0ZWQiLCJzZWxlY3RhYmxlIiwicGFyZW50RGF0YSIsIm5vZGVPYmplY3QiLCJtaWRwb2ludCIsImlzTG9vcCIsImlzU2ltcGxlIiwic291cmNlRGF0YSIsInNvdXJjZSIsInNvdXJjZUVuZHBvaW50IiwidGFyZ2V0RGF0YSIsInRhcmdldEVuZHBvaW50IiwiZWRnZU9iamVjdCIsImN5IiwiX2N5Iiwid2luZG93IiwiU0VMRUNUX1RIUkVTSE9MRCIsInNlbGVjdGVkTm9kZXMiLCJjb2xsZWN0aW9uIiwic2VsZWN0ZWRFZGdlcyIsInJlZnJlc2hMYXlvdXQiLCJfIiwiZGVib3VuY2UiLCJhdXRvUmVmcmVzaExheW91dCIsImxheW91dCIsInJ1biIsInNlbmRTZWxlY3RlZE5vZGVzRGF0YSIsIm5vZGVEYXRhIiwiZWwiLCJzZXRQcm9wcyIsInNlbGVjdGVkTm9kZURhdGEiLCJzZW5kU2VsZWN0ZWRFZGdlc0RhdGEiLCJlZGdlRGF0YSIsInNlbGVjdGVkRWRnZURhdGEiLCJvbiIsImdlbmVyYXRlTm9kZSIsInRhcE5vZGUiLCJ0YXBOb2RlRGF0YSIsImdlbmVyYXRlRWRnZSIsInRhcEVkZ2UiLCJ0YXBFZGdlRGF0YSIsIm1vdXNlb3Zlck5vZGVEYXRhIiwibW91c2VvdmVyRWRnZURhdGEiLCJtZXJnZSIsInVubWVyZ2UiLCJpZCIsImNsYXNzTmFtZSIsImVsZW1lbnRzIiwic3R5bGVzaGVldCIsInBhbiIsInpvb20iLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwiQ3l0b3NjYXBlQ29tcG9uZW50Iiwibm9ybWFsaXplRWxlbWVudHMiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJvYmplY3QiLCJmdW5jIiwiYXJyYXlPZiIsIm51bWJlciIsImJvb2wiLCJhcnJheSIsImRlZmF1bHRQcm9wcyIsIndpZHRoIiwiaGVpZ2h0IiwibmFtZSIsIngiLCJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUlBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7OytlQVBBOzs7Ozs7QUFVQTs7OztJQUlNQSxTOzs7QUFDRix1QkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLDBIQUNUQSxLQURTOztBQUdmLGNBQUtDLFFBQUwsR0FBZ0IsTUFBS0EsUUFBTCxDQUFjQyxJQUFkLE9BQWhCO0FBQ0EsY0FBS0MsZUFBTCxHQUF1QixLQUF2QjtBQUplO0FBS2xCOzs7O3FDQUVZQyxLLEVBQU87QUFDaEIsZ0JBQU1DLE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBLGdCQUFNQyxXQUFXRixJQUFJRSxRQUFKLEVBQWpCO0FBQUEs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QUFTNkIsb0JBQVVFLE1BL05EOztBQWlPbEI7OztBQUdBOUIsaUJBQWE0QixvQkFBVUUsTUFwT0w7O0FBc09sQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE1QixhQUFTMEIsb0JBQVVFLE1BN1BEOztBQStQbEI7OztBQUdBM0IsaUJBQWF5QixvQkFBVUUsTUFsUUw7O0FBb1FsQjs7O0FBR0ExQix1QkFBbUJ3QixvQkFBVUUsTUF2UVg7O0FBeVFsQjs7O0FBR0F6Qix1QkFBbUJ1QixvQkFBVUUsTUE1UVg7O0FBOFFsQjs7OztBQUlBckMsc0JBQWtCbUMsb0JBQVVPLEtBbFJWOztBQW9SbEI7Ozs7QUFJQXZDLHNCQUFrQmdDLG9CQUFVTztBQXhSVixDQUF0Qjs7QUEyUkEzRyxVQUFVNEcsWUFBVixHQUF5QjtBQUNyQjdGLFdBQU8sRUFBQzhGLE9BQU8sT0FBUixFQUFpQkMsUUFBUSxPQUF6QixFQURjO0FBRXJCbkQsWUFBUSxFQUFDb0QsTUFBTSxNQUFQLEVBRmE7QUFHckIzQixTQUFLLEVBQUM0QixHQUFHLENBQUosRUFBT0MsR0FBRyxDQUFWLEVBSGdCO0FBSXJCNUIsVUFBTSxDQUplO0FBS3JCRyxhQUFTLEtBTFk7QUFNckJDLGFBQVMsSUFOWTtBQU9yQkMsb0JBQWdCLElBUEs7QUFRckJDLHdCQUFvQixJQVJDO0FBU3JCTCxvQkFBZ0IsSUFUSztBQVVyQkMsd0JBQW9CLElBVkM7QUFXckJLLHlCQUFxQixLQVhBO0FBWXJCRSxjQUFVLEtBWlc7QUFhckJELG1CQUFlLEtBYk07QUFjckJFLHFCQUFpQixLQWRJO0FBZXJCckMsdUJBQW1CO0FBZkUsQ0FBekI7O2tCQWtCZTFELFMiLCJmaWxlIjoiLi9zcmMvbGliL2NvbXBvbmVudHMvQ3l0b3NjYXBlLnJlYWN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEphdmFTY3JpcHQgUmVxdWlyZW1lbnRzOiBjeXRvc2NhcGVcclxuICogUmVhY3QuanMgcmVxdWlyZW1lbnRzOiByZWFjdC1jeXRvc2NhcGVqc1xyXG4gKi9cclxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XHJcbmltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAncmVhY3QtY3l0b3NjYXBlanMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuXHJcbi8qKlxyXG5BIENvbXBvbmVudCBMaWJyYXJ5IGZvciBEYXNoIGFpbWVkIGF0IGZhY2lsaXRhdGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb24gaW5cclxuUHl0aG9uLCB3cmFwcGVkIGFyb3VuZCBbQ3l0b3NjYXBlLmpzXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8pLlxyXG4gKi9cclxuY2xhc3MgQ3l0b3NjYXBlIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZUN5ID0gdGhpcy5oYW5kbGVDeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUN5Q2FsbGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVOb2RlKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZWxlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICBjb25zdCBpc1BhcmVudCA9IGVsZS5pc1BhcmVudCgpLFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyA9IGVsZS5pc0NoaWxkbGVzcygpLFxyXG4gICAgICAgICAgICBpc0NoaWxkID0gZWxlLmlzQ2hpbGQoKSxcclxuICAgICAgICAgICAgaXNPcnBoYW4gPSBlbGUuaXNPcnBoYW4oKSxcclxuICAgICAgICAgICAgcmVuZGVyZWRQb3NpdGlvbiA9IGVsZS5yZW5kZXJlZFBvc2l0aW9uKCksXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSBlbGUucmVsYXRpdmVQb3NpdGlvbigpLFxyXG4gICAgICAgICAgICBwYXJlbnQgPSBlbGUucGFyZW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCk7XHJcblxyXG4gICAgICAgIC8vIFRyaW0gZG93biB0aGUgZWxlbWVudCBvYmplY3RzIHRvIG9ubHkgdGhlIGRhdGEgY29udGFpbmVkXHJcbiAgICAgICAgY29uc3QgZWRnZXNEYXRhID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2hpbGRyZW5EYXRhID0gZWxlLmNoaWxkcmVuKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYW5jZXN0b3JzRGF0YSA9IGVsZS5hbmNlc3RvcnMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBkZXNjZW5kYW50c0RhdGEgPSBlbGUuZGVzY2VuZGFudHMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEgPSBlbGUuc2libGluZ3MoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBwb3NpdGlvbixcclxuICAgICAgICAgICAgc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGVcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmVudERhdGE7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gcGFyZW50LmRhdGEoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGVzIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgZWRnZXNEYXRhLFxyXG4gICAgICAgICAgICByZW5kZXJlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICAgICAgLy8gQ29tcG91bmQgTm9kZXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIGFuY2VzdG9yc0RhdGEsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuRGF0YSxcclxuICAgICAgICAgICAgZGVzY2VuZGFudHNEYXRhLFxyXG4gICAgICAgICAgICBwYXJlbnREYXRhLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEsXHJcbiAgICAgICAgICAgIGlzUGFyZW50LFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyxcclxuICAgICAgICAgICAgaXNDaGlsZCxcclxuICAgICAgICAgICAgaXNPcnBoYW4sXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vIFN0eWxpbmdcclxuICAgICAgICAgICAgc3R5bGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBub2RlT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZW5lcmF0ZUVkZ2UoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG1pZHBvaW50ID0gZWxlLm1pZHBvaW50KCksXHJcbiAgICAgICAgICAgIGlzTG9vcCA9IGVsZS5pc0xvb3AoKSxcclxuICAgICAgICAgICAgaXNTaW1wbGUgPSBlbGUuaXNTaW1wbGUoKSxcclxuICAgICAgICAgICAgc291cmNlRGF0YSA9IGVsZS5zb3VyY2UoKS5kYXRhKCksXHJcbiAgICAgICAgICAgIHNvdXJjZUVuZHBvaW50ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCksXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEgPSBlbGUudGFyZ2V0KCkuZGF0YSgpLFxyXG4gICAgICAgICAgICB0YXJnZXRFbmRwb2ludCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRnZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgLy8gRWRnZXMgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICBpc0xvb3AsXHJcbiAgICAgICAgICAgIGlzU2ltcGxlLFxyXG4gICAgICAgICAgICBtaWRwb2ludCxcclxuICAgICAgICAgICAgc291cmNlRGF0YSxcclxuICAgICAgICAgICAgc291cmNlRW5kcG9pbnQsXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEsXHJcbiAgICAgICAgICAgIHRhcmdldEVuZHBvaW50LFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkLFxyXG4gICAgICAgICAgICAvLyBTdHlsaW5nXHJcbiAgICAgICAgICAgIHN0eWxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVkZ2VPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ3koY3kpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY3kgcG9pbnRlciBoYXMgbm90IGJlZW4gbW9kaWZpZWQsIGFuZCBoYW5kbGVDeSBoYXMgYWxyZWFkeVxyXG4gICAgICAgIC8vIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhhbiB3ZSBkb24ndCBydW4gdGhpcyBmdW5jdGlvbi5cclxuICAgICAgICBpZiAoY3kgPT09IHRoaXMuX2N5ICYmIHRoaXMuX2hhbmRsZUN5Q2FsbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3kgPSBjeTtcclxuICAgICAgICB3aW5kb3cuY3kgPSBjeTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVDeUNhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ09OU1RBTlRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgY29uc3QgU0VMRUNUX1RIUkVTSE9MRCA9IDEwMDtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEVkZ2VzID0gY3kuY29sbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hMYXlvdXQgPSBfLmRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFJlZnJlc2ggTGF5b3V0IGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYXV0b1JlZnJlc2hMYXlvdXQsXHJcbiAgICAgICAgICAgICAgICBsYXlvdXRcclxuICAgICAgICAgICAgfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b1JlZnJlc2hMYXlvdXQpIHtcclxuICAgICAgICAgICAgICAgIGN5LmxheW91dChsYXlvdXQpLnJ1bigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkTm9kZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcGV0aXRpdmVseSBjYWxsZWQgZXZlcnkgdGltZSBhIG5vZGUgaXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgb3IgdW5zZWxlY3RlZCwgYnV0IGtlZXBzIGJlaW5nIGRlYm91bmNlZCBpZiBpdCBpcyBjYWxsZWQgYWdhaW5cclxuICAgICAgICAgICAgd2l0aGluIDEwMCBtcyAoZ2l2ZW4gYnkgU0VMRUNUX1RIUkVTSE9MRCkuIEVmZmVjdGl2ZWx5LCBpdCBvbmx5XHJcbiAgICAgICAgICAgIHJ1bnMgd2hlbiBhbGwgdGhlIG5vZGVzIGhhdmUgYmVlbiBjb3JyZWN0bHkgc2VsZWN0ZWQvdW5zZWxlY3RlZCBhbmRcclxuICAgICAgICAgICAgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3RlZE5vZGVzIGNvbGxlY3Rpb24sIGFuZCB0aGVuIHVwZGF0ZXNcclxuICAgICAgICAgICAgdGhlIHNlbGVjdGVkTm9kZURhdGEgcHJvcC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhID0gc2VsZWN0ZWROb2Rlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWROb2RlRGF0YTogbm9kZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkRWRnZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VEYXRhID0gc2VsZWN0ZWRFZGdlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFZGdlRGF0YTogZWRnZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVWRU5UUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICBjeS5vbigndGFwJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB0aGlzLmdlbmVyYXRlTm9kZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2V0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuc2V0UHJvcHMoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcE5vZGU6IG5vZGVPYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwTm9kZURhdGE6IG5vZGVPYmplY3QuZGF0YVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3RhcCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGdlT2JqZWN0ID0gdGhpcy5nZW5lcmF0ZUVkZ2UoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICB0YXBFZGdlOiBlZGdlT2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcEVkZ2VEYXRhOiBlZGdlT2JqZWN0LmRhdGFcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGN5Lm9uKCdtb3VzZW92ZXInLCAnbm9kZScsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXJOb2RlRGF0YTogZXZlbnQudGFyZ2V0LmRhdGEoKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbignbW91c2VvdmVyJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyRWRnZURhdGE6IGV2ZW50LnRhcmdldC5kYXRhKClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdub2RlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZE5vZGVzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWROb2Rlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZEVkZ2VzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZEVkZ2VzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRWRnZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWRFZGdlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ2FkZCByZW1vdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlZnJlc2hMYXlvdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgc3R5bGUsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcclxuICAgICAgICAgICAgLy8gQ29tbW9uIHByb3BzXHJcbiAgICAgICAgICAgIGVsZW1lbnRzLFxyXG4gICAgICAgICAgICBzdHlsZXNoZWV0LFxyXG4gICAgICAgICAgICBsYXlvdXQsXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE1hbmlwdWxhdGlvblxyXG4gICAgICAgICAgICBwYW4sXHJcbiAgICAgICAgICAgIHpvb20sXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE11dGFiaWxpdHkgYW5kIGdlc3R1cmUgVG9nZ2xpbmdcclxuICAgICAgICAgICAgcGFubmluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJQYW5uaW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgbWluWm9vbSxcclxuICAgICAgICAgICAgbWF4Wm9vbSxcclxuICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJab29taW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZCxcclxuICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeSxcclxuICAgICAgICAgICAgYXV0b2xvY2ssXHJcbiAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeVxyXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8Q3l0b3NjYXBlQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgICAgICBjeT17dGhpcy5oYW5kbGVDeX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxyXG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e0N5dG9zY2FwZUNvbXBvbmVudC5ub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cyl9XHJcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0PXtzdHlsZXNoZWV0fVxyXG4gICAgICAgICAgICAgICAgbGF5b3V0PXtsYXlvdXR9XHJcbiAgICAgICAgICAgICAgICBwYW49e3Bhbn1cclxuICAgICAgICAgICAgICAgIHpvb209e3pvb219XHJcbiAgICAgICAgICAgICAgICBwYW5uaW5nRW5hYmxlZD17cGFubmluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICB1c2VyUGFubmluZ0VuYWJsZWQ9e3VzZXJQYW5uaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgICAgIG1pblpvb209e21pblpvb219XHJcbiAgICAgICAgICAgICAgICBtYXhab29tPXttYXhab29tfVxyXG4gICAgICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQ9e3pvb21pbmdFbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgdXNlclpvb21pbmdFbmFibGVkPXt1c2VyWm9vbWluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICBib3hTZWxlY3Rpb25FbmFibGVkPXtib3hTZWxlY3Rpb25FbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeT17YXV0b3VuZ3JhYmlmeX1cclxuICAgICAgICAgICAgICAgIGF1dG9sb2NrPXthdXRvbG9ja31cclxuICAgICAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeT17YXV0b3Vuc2VsZWN0aWZ5fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuXHJcbkN5dG9zY2FwZS5wcm9wVHlwZXMgPSB7XHJcbiAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjb21wb25lbnQgaW4gRGFzaCBjYWxsYmFja3MuXHJcbiAgICAgKi9cclxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZWxlbWVudCAodGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBodG1sXHJcbiAgICAgKiBjbGFzcyBhdHRyaWJ1dGUpLlxyXG4gICAgICovXHJcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgaW5saW5lIHN0eWxlcyB0byB0aGUgcm9vdCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvLyBEYXNoIHNwZWNpZmljIHByb3BzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXNoLWFzc2lnbmVkIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgb2YgdGhlXHJcbiAgICAgKiBwcm9wZXJ0aWVzIGNoYW5nZS5cclxuICAgICAqL1xyXG4gICAgc2V0UHJvcHM6IFByb3BUeXBlcy5mdW5jLFxyXG5cclxuICAgIC8vIENvbW1vbiBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBuZXR3b3Jrcy5cclxuICAgICAqICAgICAxLiBFYWNoIGRpY3Rpb25hcnkgZGVzY3JpYmVzIGFuIGVsZW1lbnQsIGFuZCBzcGVjaWZpZXMgaXRzIHB1cnBvc2UuXHJcbiAgICAgKiAgICAgICAgIC0gYGdyb3VwYCAoc3RyaW5nKTogRWl0aGVyICdub2Rlcycgb3IgJ2VkZ2VzJy4gSWYgbm90IGdpdmVuLCBpdCdzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KTogRWxlbWVudCBzcGVjaWZpYyBkYXRhLlxyXG4gICAgICogICAgICAgICAgICAgIC0gYGlkYCAoc3RyaW5nKTogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50LCB1c2VmdWwgZm9yIHNlbGVjdG9ycyBhbmQgZWRnZXMuIFJhbmRvbWx5IGFzc2lnbmVkIGlmIG5vdCBnaXZlbi5cclxuICAgICAqICAgICAgICAgICAgICAtIGBsYWJlbGAgKHN0cmluZyk6IE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBlbGVtZW50LCB1c2VmdWwgd2hlbiBgZGF0YShsYWJlbClgIGlzIGdpdmVuIHRvIGEgc3R5bGUncyBgY29udGVudGAgb3IgYGxhYmVsYC4gSXQgaXMgb25seSBhIGNvbnZlbnRpb24uXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgcGFyZW50YCAoc3RyaW5nKTogT25seSBmb3Igbm9kZXMuIE9wdGlvbmFsIHJlZmVyZW5jZSB0byBhbm90aGVyIG5vZGUuIE5lZWRlZCB0byBjcmVhdGUgY29tcG91bmQgbm9kZXMuXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgc291cmNlYCAoc3RyaW5nKTogT25seSBmb3IgZWRnZXMuIFRoZSBpZCBvZiB0aGUgc291cmNlIG5vZGUsIHdoaWNoIGlzIHdoZXJlIHRoZSBlZGdlIHN0YXJ0cy5cclxuICAgICAqICAgICAgICAgICAgICAtIGB0YXJnZXRgIChzdHJpbmcpOiBPbmx5IGZvciBlZGdlcy4gVGhlIGlkIG9mIHRoZSB0YXJnZXQgbm9kZSwgd2hlcmUgdGhlIGVkZ2UgZW5kcy5cclxuICAgICAqICAgICAgICAgLSBgcG9zaXRpb25gIChkaWN0aW9uYXJ5KTogT25seSBmb3Igbm9kZXMuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB4YCAobnVtYmVyKTogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0ZWRgIChib29sZWFuKTogSWYgdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQgdXBvbiBpbml0aWFsaXNhdGlvbi5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pOiBJZiB0aGUgZWxlbWVudCBjYW4gYmUgc2VsZWN0ZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pOiBPbmx5IGZvciBub2Rlcy4gSWYgdGhlIHBvc2l0aW9uIGlzIGltbXV0YWJsZS5cclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbik6IE9ubHkgZm9yIG5vZGVzLiBJZiB0aGUgbm9kZSBjYW4gYmUgZ3JhYmJlZCBhbmQgbW92ZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpOiBTcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGNsYXNzIG5hbWVzIG9mIHRoZSBlbGVtZW50LiBUaG9zZSBjbGFzc2VzIGNhbiBiZSBzZWxlY3RlZCBieSBhIHN0eWxlIHNlbGVjdG9yLlxyXG4gICAgICpcclxuICAgICAqICAgICAyLiBUaGUgW29mZmljaWFsIEN5dG9zY2FwZS5qcyBkb2N1bWVudGF0aW9uXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbm90YXRpb24vZWxlbWVudHMtanNvbikgb2ZmZXJzIGFuIGV4dGVuc2l2ZSBvdmVydmlldyBhbmQgZXhhbXBsZXMgb2YgZWxlbWVudCBkZWNsYXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZWxlbWVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIHN0eWxlcyBvZiB0aGUgZWxlbWVudHMuXHJcbiAgICAgKiAgICAgMS4gRWFjaCBkaWN0aW9uYXJ5IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcga2V5czpcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0b3JgIChzdHJpbmcpOiBXaGljaCBlbGVtZW50cyB5b3UgYXJlIHN0eWxpbmcuIEdlbmVyYWxseSwgeW91IHNlbGVjdCBhIGdyb3VwIG9mIGVsZW1lbnRzIChub2RlLCBlZGdlcywgYm90aCksIGEgY2xhc3MgKHRoYXQgeW91IGRlY2xhcmUgaW4gdGhlIGVsZW1lbnQgZGljdGlvbmFyeSksIG9yIGFuIGVsZW1lbnQgYnkgSUQuXHJcbiAgICAgKiAgICAgICAgIC0gYHN0eWxlYCAoZGljdGlvbmFyeSk6IFdoYXQgYXNwZWN0cyBvZiB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gbW9kaWZ5LiBUaGlzIGNvdWxkIGJlIHRoZSBzaXplIG9yIGNvbG9yIG9mIGEgbm9kZSwgdGhlIHNoYXBlIG9mIGFuIGVkZ2UgYXJyb3csIG9yIG1hbnkgbW9yZS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gQm90aCBbdGhlIHNlbGVjdG9yIHN0cmluZ10oaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3NlbGVjdG9ycykgYW5kXHJcbiAgICAgKiAgICAgW3RoZSBzdHlsZSBkaWN0aW9uYXJ5XShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGUvbm9kZS1ib2R5KSBhcmVcclxuICAgICAqICAgICBleGhhdXN0aXZlbHkgZG9jdW1lbnRlZCBpbiB0aGUgQ3l0b3NjYXBlLmpzIGRvY3MuIEFsdGhvdWdoIG1ldGhvZHMgc3VjaFxyXG4gICAgICogICAgIGFzIGBjeS5lbGVtZW50cyguLi4pYCBhbmQgYGN5LmZpbHRlciguLi4pYCBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIHNlbGVjdG9yXHJcbiAgICAgKiAgICAgc3RyaW5nIHN5bnRheCBzdGF5cyB0aGUgc2FtZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVzaGVldDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGRpY3Rpb25hcnkgc3BlY2lmeWluZyBob3cgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4geW91clxyXG4gICAgICogZ3JhcGguIFRoZSBgJ25hbWUnYCBrZXkgaXMgcmVxdWlyZWQsIGFuZCBpbmRpY2F0ZXMgd2hpY2ggbGF5b3V0IChhbGdvcml0aG0pIHRvXHJcbiAgICAgKiB1c2UuXHJcbiAgICAgKiAgICAgMS4gVGhlIGxheW91dHMgYXZhaWxhYmxlIGJ5IGRlZmF1bHQgYXJlOlxyXG4gICAgICogICAgICAgICAtIGByYW5kb21gOiBSYW5kb21seSBhc3NpZ25zIHBvc2l0aW9uc1xyXG4gICAgICogICAgICAgICAtIGBwcmVzZXRgOiBBc3NpZ25zIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBgcG9zaXRpb25gIGtleSBpbiBlbGVtZW50IGRpY3Rpb25hcmllc1xyXG4gICAgICogICAgICAgICAtIGBjaXJjbGVgOiBTaW5nbGUtbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBjb25jZW50cmljYDogTXVsdGktbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBncmlkYDogU3F1YXJlIGdyaWQsIG9wdGlvbmFsbHkgd2l0aCBudW1iZXJzIG9mIGByb3dzYCBhbmQgYGNvbHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGJyZWFkdGhmaXJzdGA6IFRyZWUgc3RydWN0dXJlIGJ1aWx0IHVzaW5nIEJGUywgd2l0aCBvcHRpb25hbCBgcm9vdHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGNvc2VgOiBGb3JjZS1kaXJlY3RlZCBwaHlzaWNzIHNpbXVsYXRpb25cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gU29tZSBleHRlcm5hbCBsYXlvdXRzIGFyZSBhbHNvIGluY2x1ZGVkLiBUbyB1c2UgdGhlbSwgcnVuXHJcbiAgICAgKiAgICAgYGRhc2hfY3l0b3NjYXBlLmxvYWRfZXh0cmFfbGF5b3V0cygpYCBiZWZvcmUgY3JlYXRpbmcgeW91ciBEYXNoIGFwcC4gQmUgY2FyZWZ1bCBhYm91dFxyXG4gICAgICogICAgIHVzaW5nIHRoZSBleHRyYSBsYXlvdXRzIHdoZW4gbm90IG5lY2Vzc2FyeSwgc2luY2UgdGhleSByZXF1aXJlIHN1cHBsZW1lbnRhcnkgYmFuZHdpZHRoXHJcbiAgICAgKiAgICAgZm9yIGxvYWRpbmcsIHdoaWNoIGltcGFjdHMgdGhlIHN0YXJ0dXAgdGltZSBvZiB0aGUgYXBwLlxyXG4gICAgICogICAgICAgICAtIGBjb3NlLWJpbGtlbnRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1jb3NlLWJpbGtlbnRcclxuICAgICAqICAgICAgICAgLSBgY29sYWA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWNvbGFcclxuICAgICAqICAgICAgICAgLSBgZXVsZXJgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBzcHJlYWRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1zcHJlYWRcclxuICAgICAqICAgICAgICAgLSBgZGFncmVgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBrbGF5YDogaHR0cHM6Ly9naXRodWIuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUuanMta2xheVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBUaGUga2V5cyBhY2NlcHRlZCBieSBgbGF5b3V0YCB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgYWxnb3JpdGhtLCBidXQgc29tZVxyXG4gICAgICogICAgIGtleXMgYXJlIGFjY2VwdGVkIGJ5IGFsbCBsYXlvdXRzOlxyXG4gICAgICogICAgICAgICAtIGBmaXRgIChib29sZWFuKTogV2hldGhlciB0byByZW5kZXIgdGhlIG5vZGVzIGluIG9yZGVyIHRvIGZpdCB0aGUgY2FudmFzLlxyXG4gICAgICogICAgICAgICAtIGBwYWRkaW5nYCAobnVtYmVyKTogUGFkZGluZyBhcm91bmQgdGhlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGlmIGZpdCBpcyBlbmFibGVkLlxyXG4gICAgICogICAgICAgICAtIGBhbmltYXRlYCAoYm9vbGVhbik6IFdoZXRoZXIgdG8gYW5pbWF0ZSBjaGFuZ2UgaW4gcG9zaXRpb24gd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMuXHJcbiAgICAgKiAgICAgICAgIC0gYGFuaW1hdGlvbkR1cmF0aW9uYCAobnVtYmVyKTogRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgaWYgZW5hYmxlZC5cclxuICAgICAqICAgICAgICAgLSBgYm91bmRpbmdCb3hgIChkaWN0aW9uYXJ5KTogSG93IHRvIGNvbnN0cmFpbiB0aGUgbGF5b3V0IGluIGEgc3BlY2lmaWMgYXJlYS4gS2V5cyBhY2NlcHRlZCBhcmUgZWl0aGVyIGB4MSwgeTEsIHgyLCB5MmAgb3IgYHgxLCB5MSwgdywgaGAsIGFsbCBvZiB3aGljaCByZWNlaXZlIGEgcGl4ZWwgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDQuIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGxheW91dHMgYW5kIHRoZWlyIGFjY2VwdGVkIG9wdGlvbnMgYXJlIGF2YWlsYWJsZVxyXG4gICAgICogICAgIG9uIHRoZSBbQ3l0b3NjYXBlLmpzIGRvY3NdKGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNsYXlvdXRzKS4gRm9yIHRoZVxyXG4gICAgICogICAgIGV4dGVybmFsIGxheW91dHMsIHRoZSBvcHRpb25zIGFyZSBsaXN0ZWQgaW4gdGhlIFwiQVBJXCIgc2VjdGlvbiBvZiB0aGVcclxuICAgICAqICAgICBSRUFETUUuXHJcbiAgICAgKiAgICAgTm90ZSB0aGF0IGNlcnRhaW4ga2V5cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBEYXNoIHNpbmNlIHRoZSB2YWx1ZSBpcyBhXHJcbiAgICAgKiAgICAgSmF2YVNjcmlwdCBmdW5jdGlvbiBvciBhIGNhbGxiYWNrLiBQbGVhc2UgdmlzaXQgW3RoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvZGFzaC1jeXRvc2NhcGUvaXNzdWVzLzI1KVxyXG4gICAgICogICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLy8gVmlld3BvcnQgTWFuaXB1bGF0aW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWN0aW9uYXJ5IGluZGljYXRpbmcgdGhlIGluaXRpYWwgcGFubmluZyBwb3NpdGlvbiBvZiB0aGUgZ3JhcGguIFRoZVxyXG4gICAgICogZm9sbG93aW5nIGtleXMgYXJlIGFjY2VwdGVkOlxyXG4gICAgICogICAgIC0gYHhgIChudW1iZXIpOiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cclxuICAgICAqICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHBhbjogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBZb3UgY2FuIHNldCBgbWluWm9vbWAgYW5kXHJcbiAgICAgKiBgbWF4Wm9vbWAgdG8gc2V0IHJlc3RyaWN0aW9ucyBvbiB0aGUgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgem9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvLyBWaWV3cG9ydCBNdXRhYmlsaXR5IGFuZCBnZXN0dXJlIFRvZ2dsaW5nXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgcGFubmluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpc1xyXG4gICAgICogbXV0YWJsZSBvdmVyYWxsKS5cclxuICAgICAqL1xyXG4gICAgcGFubmluZ0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1c2VyIGV2ZW50cyAoZS5nLiBkcmFnZ2luZyB0aGUgZ3JhcGggYmFja2dyb3VuZCkgYXJlIGFsbG93ZWQgdG9cclxuICAgICAqIHBhbiB0aGUgZ3JhcGguXHJcbiAgICAgKi9cclxuICAgIHVzZXJQYW5uaW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1pbmltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIHNtYWxsZXIgdGhhbiB0aGlzIHpvb20gbGV2ZWwuXHJcbiAgICAgKi9cclxuICAgIG1pblpvb206IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1heGltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIGxhcmdlciB0aGFuIHRoaXMgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgbWF4Wm9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgem9vbWluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoXHJcbiAgICAgKiBpcyBtdXRhYmxlIG92ZXJhbGwpLlxyXG4gICAgICovXHJcbiAgICB6b29taW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHVzZXIgZXZlbnRzIChlLmcuIGRyYWdnaW5nIHRoZSBncmFwaCBiYWNrZ3JvdW5kKSBhcmUgYWxsb3dlZFxyXG4gICAgICogdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgYm94IHNlbGVjdGlvbiAoaS5lLiBkcmFnIGEgYm94IG92ZXJsYXkgYXJvdW5kLCBhbmQgcmVsZWFzZSBpdFxyXG4gICAgICogdG8gc2VsZWN0KSBpcyBlbmFibGVkLiBJZiBlbmFibGVkLCB0aGUgdXNlciBtdXN0IHRhcGhvbGQgdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bmdyYWJpZmllZCAobm90IGdyYWJiYWJsZSBieSB1c2VyKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgbm9kZSBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bmdyYWJpZnk6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBub2RlcyBzaG91bGQgYmUgbG9ja2VkIChub3QgZHJhZ2dhYmxlIGF0IGFsbCkgYnkgZGVmYXVsdFxyXG4gICAgICogKGlmIHRydWUsIG92ZXJyaWRlcyBpbmRpdmlkdWFsIG5vZGUgc3RhdGUpLlxyXG4gICAgICovXHJcbiAgICBhdXRvbG9jazogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bnNlbGVjdGlmaWVkIChpbW11dGFibGUgc2VsZWN0aW9uIHN0YXRlKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgZWxlbWVudCBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bnNlbGVjdGlmeTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGJlIHJlZnJlc2hlZCB3aGVuIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxyXG4gICAgICovXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLy8gVXNlciBFdmVudHMgUHJvcHNcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb21wbGV0ZSBub2RlIGRpY3Rpb25hcnkgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDEuIE5vZGUtc3BlY2lmaWMgaXRlbXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGVkZ2VzRGF0YWAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbmRlcmVkUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0aW1lU3RhbXBgIChudW1iZXIpXHJcbiAgICAgKlxyXG4gICAgICogICAgIDIuIEdlbmVyYWwgaXRlbXMgKGZvciBhbGwgZWxlbWVudHMpOlxyXG4gICAgICogICAgICAgICAtIGBjbGFzc2VzYCAoc3RyaW5nKVxyXG4gICAgICogICAgICAgICAtIGBkYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgZ3JvdXBgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHBvc2l0aW9uYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBJdGVtcyBmb3IgY29tcG91bmQgbm9kZXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGFuY2VzdG9yc0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBjaGlsZHJlbkRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBkZXNjZW5kYW50c0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBwYXJlbnREYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2libGluZ3NEYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgaXNQYXJlbnRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc0NoaWxkbGVzc2AgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYGlzQ2hpbGRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc09ycGhhbmAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbGF0aXZlUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBOb2RlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhIG5vZGUgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHRhcE5vZGVEYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbXBsZXRlIGVkZ2UgZGljdGlvbmFyeSByZXR1cm5lZCB3aGVuIHlvdSB0YXAgb3IgY2xpY2sgaXQuIFJlYWQtb25seS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMS4gRWRnZS1zcGVjaWZpYyBpdGVtczpcclxuICAgICAqICAgICAgICAgLSBgaXNMb29wYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgaXNTaW1wbGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBtaWRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHNvdXJjZURhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBzb3VyY2VFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRhcmdldERhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0YXJnZXRFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRpbWVTdGFtcGAgKG51bWJlcilcclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gR2VuZXJhbCBpdGVtcyAoZm9yIGFsbCBlbGVtZW50cyk6XHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBncmFiYmFibGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBncm91cGAgKHN0cmluZylcclxuICAgICAqICAgICAgICAgLSBgbG9ja2VkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhbiBlZGdlIHJldHVybmVkIHdoZW4geW91IHRhcCBvciBjbGljayBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIGRpY3Rpb25hcnkgb2YgYSBub2RlIHJldHVybmVkIHdoZW4geW91IGhvdmVyIG92ZXIgaXQuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgbW91c2VvdmVyTm9kZURhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBkaWN0aW9uYXJ5IG9mIGFuIGVkZ2UgcmV0dXJuZWQgd2hlbiB5b3UgaG92ZXIgb3ZlciBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBtb3VzZW92ZXJFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsaXN0IG9mIGRhdGEgZGljdGlvbmFyaWVzIG9mIGFsbCBzZWxlY3RlZCBub2RlcyAoZS5nLiB1c2luZ1xyXG4gICAgICogU2hpZnQrQ2xpY2sgdG8gc2VsZWN0IG11bHRpcGxlIG5vZGVzLCBvciBTaGlmdCtEcmFnIHRvIHVzZSBib3ggc2VsZWN0aW9uKS4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBzZWxlY3RlZE5vZGVEYXRhOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlzdCBvZiBkYXRhIGRpY3Rpb25hcmllcyBvZiBhbGwgc2VsZWN0ZWQgZWRnZXMgKGUuZy4gdXNpbmdcclxuICAgICAqIFNoaWZ0K0NsaWNrIHRvIHNlbGVjdCBtdWx0aXBsZSBub2Rlcywgb3IgU2hpZnQrRHJhZyB0byB1c2UgYm94IHNlbGVjdGlvbikuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgc2VsZWN0ZWRFZGdlRGF0YTogUHJvcFR5cGVzLmFycmF5XHJcbn07XHJcblxyXG5DeXRvc2NhcGUuZGVmYXVsdFByb3BzID0ge1xyXG4gICAgc3R5bGU6IHt3aWR0aDogJzYwMHB4JywgaGVpZ2h0OiAnNjAwcHgnfSxcclxuICAgIGxheW91dDoge25hbWU6ICdncmlkJ30sXHJcbiAgICBwYW46IHt4OiAwLCB5OiAwfSxcclxuICAgIHpvb206IDEsXHJcbiAgICBtaW5ab29tOiAxZS01MCxcclxuICAgIG1heFpvb206IDFlNTAsXHJcbiAgICB6b29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHVzZXJab29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZmFsc2UsXHJcbiAgICBhdXRvbG9jazogZmFsc2UsXHJcbiAgICBhdXRvdW5ncmFiaWZ5OiBmYWxzZSxcclxuICAgIGF1dG91bnNlbGVjdGlmeTogZmFsc2UsXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogdHJ1ZVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3l0b3NjYXBlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/components/Cytoscape.react.js\n"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactCytoscapejs = __webpack_require__(/*! react-cytoscapejs */ \"./node_modules/react-cytoscapejs/dist/react-cytoscape.js\");\n\nvar _reactCytoscapejs2 = _interopRequireDefault(_reactCytoscapejs);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\r\n * JavaScript Requirements: cytoscape\r\n * React.js requirements: react-cytoscapejs\r\n */\n\n\n/**\r\nA Component Library for Dash aimed at facilitating network visualization in\r\nPython, wrapped around [Cytoscape.js](http://js.cytoscape.org/).\r\n */\nvar Cytoscape = function (_Component) {\n _inherits(Cytoscape, _Component);\n\n function Cytoscape(props) {\n _classCallCheck(this, Cytoscape);\n\n var _this = _possibleConstructorReturn(this, (Cytoscape.__proto__ || Object.getPrototypeOf(Cytoscape)).call(this, props));\n\n _this.handleCy = _this.handleCy.bind(_this);\n _this._handleCyCalled = false;\n return _this;\n }\n\n _createClass(Cytoscape, [{\n key: 'generateNode',\n value: function generateNode(event) {\n var ele = event.target;\n\n var isParent = ele.isParent(),\n isChildless = ele.isChildless(),\n isChild = ele.isChild(),\n isOrphan = ele.isOrphan(),\n renderedPosition = ele.renderedPosition(),\n relativePosition = ele.relativePosition(),\n parent = ele.parent(),\n style = ele.style();\n\n // Trim down the element objects to only the data contained\n var edgesData = ele.connectedEdges().map(function (ele) {\n return ele.data();\n }),\n childrenData = ele.children().map(function (ele) {\n return ele.data();\n }),\n ancestorsData = ele.ancestors().map(function (ele) {\n return ele.data();\n }),\n descendantsData = ele.descendants().map(function (ele) {\n return ele.data();\n }),\n siblingsData = ele.siblings().map(function (ele) {\n return ele.data();\n });\n\n var timeStamp = event.timeStamp;\n\n var _ele$json = ele.json(),\n classes = _ele$json.classes,\n data = _ele$json.data,\n grabbable = _ele$json.grabbable,\n group = _ele$json.group,\n locked = _ele$json.locked,\n position = _ele$json.position,\n selected = _ele$json.selected,\n selectable = _ele$json.selectable;\n\n var parentData = void 0;\n if (parent) {\n parentData = parent.data();\n } else {\n parentData = null;\n }\n\n var nodeObject = {\n // Nodes attributes\n edgesData: edgesData,\n renderedPosition: renderedPosition,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n position: position,\n selectable: selectable,\n selected: selected,\n // Compound Nodes additional attributes\n ancestorsData: ancestorsData,\n childrenData: childrenData,\n descendantsData: descendantsData,\n parentData: parentData,\n siblingsData: siblingsData,\n isParent: isParent,\n isChildless: isChildless,\n isChild: isChild,\n isOrphan: isOrphan,\n relativePosition: relativePosition,\n // Styling\n style: style\n };\n return nodeObject;\n }\n }, {\n key: 'generateEdge',\n value: function generateEdge(event) {\n var ele = event.target;\n\n var midpoint = ele.midpoint(),\n isLoop = ele.isLoop(),\n isSimple = ele.isSimple(),\n sourceData = ele.source().data(),\n sourceEndpoint = ele.sourceEndpoint(),\n style = ele.style(),\n targetData = ele.target().data(),\n targetEndpoint = ele.targetEndpoint();\n\n var timeStamp = event.timeStamp;\n\n var _ele$json2 = ele.json(),\n classes = _ele$json2.classes,\n data = _ele$json2.data,\n grabbable = _ele$json2.grabbable,\n group = _ele$json2.group,\n locked = _ele$json2.locked,\n selectable = _ele$json2.selectable,\n selected = _ele$json2.selected;\n\n var edgeObject = {\n // Edges attributes\n isLoop: isLoop,\n isSimple: isSimple,\n midpoint: midpoint,\n sourceData: sourceData,\n sourceEndpoint: sourceEndpoint,\n targetData: targetData,\n targetEndpoint: targetEndpoint,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n selectable: selectable,\n selected: selected,\n // Styling\n style: style\n };\n\n return edgeObject;\n }\n }, {\n key: 'handleCy',\n value: function handleCy(cy) {\n var _this2 = this;\n\n // If the cy pointer has not been modified, and handleCy has already\n // been called before, than we don't run this function.\n if (cy === this._cy && this._handleCyCalled) {\n return;\n }\n this._cy = cy;\n window.cy = cy;\n this._handleCyCalled = true;\n\n // ///////////////////////////////////// CONSTANTS /////////////////////////////////////////\n var SELECT_THRESHOLD = 100;\n\n var selectedNodes = cy.collection();\n var selectedEdges = cy.collection();\n\n // ///////////////////////////////////// FUNCTIONS /////////////////////////////////////////\n var refreshLayout = _lodash2.default.debounce(function () {\n /**\r\n * Refresh Layout if needed\r\n */\n var _props = _this2.props,\n autoRefreshLayout = _props.autoRefreshLayout,\n layout = _props.layout;\n\n\n if (autoRefreshLayout) {\n cy.layout(layout).run();\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedNodesData = _lodash2.default.debounce(function () {\n /**\r\n This function is repetitively called every time a node is selected\r\n or unselected, but keeps being debounced if it is called again\r\n within 100 ms (given by SELECT_THRESHOLD). Effectively, it only\r\n runs when all the nodes have been correctly selected/unselected and\r\n added/removed from the selectedNodes collection, and then updates\r\n the selectedNodeData prop.\r\n */\n var nodeData = selectedNodes.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedNodeData: nodeData\n });\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedEdgesData = _lodash2.default.debounce(function () {\n var edgeData = selectedEdges.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedEdgeData: edgeData\n });\n }\n }, SELECT_THRESHOLD);\n\n // /////////////////////////////////////// EVENTS //////////////////////////////////////////\n cy.on('tap', 'node', function (event) {\n var nodeObject = _this2.generateNode(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapNode: nodeObject,\n tapNodeData: nodeObject.data\n });\n }\n });\n\n cy.on('tap', 'edge', function (event) {\n var edgeObject = _this2.generateEdge(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapEdge: edgeObject,\n tapEdgeData: edgeObject.data\n });\n }\n });\n\n cy.on('mouseover', 'node', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverNodeData: event.target.data()\n });\n }\n });\n\n cy.on('mouseover', 'edge', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverEdgeData: event.target.data()\n });\n }\n });\n\n cy.on('select', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.merge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('unselect remove', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.unmerge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('select', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.merge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('unselect remove', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.unmerge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('add remove', function () {\n refreshLayout();\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n id = _props2.id,\n style = _props2.style,\n className = _props2.className,\n elements = _props2.elements,\n stylesheet = _props2.stylesheet,\n layout = _props2.layout,\n pan = _props2.pan,\n zoom = _props2.zoom,\n panningEnabled = _props2.panningEnabled,\n userPanningEnabled = _props2.userPanningEnabled,\n minZoom = _props2.minZoom,\n maxZoom = _props2.maxZoom,\n zoomingEnabled = _props2.zoomingEnabled,\n userZoomingEnabled = _props2.userZoomingEnabled,\n boxSelectionEnabled = _props2.boxSelectionEnabled,\n autoungrabify = _props2.autoungrabify,\n autolock = _props2.autolock,\n autounselectify = _props2.autounselectify;\n\n\n return _react2.default.createElement(_reactCytoscapejs2.default, {\n id: id,\n cy: this.handleCy,\n className: className,\n style: style,\n elements: _reactCytoscapejs2.default.normalizeElements(elements),\n stylesheet: stylesheet,\n layout: layout,\n pan: pan,\n zoom: zoom,\n panningEnabled: panningEnabled,\n userPanningEnabled: userPanningEnabled,\n minZoom: minZoom,\n maxZoom: maxZoom,\n zoomingEnabled: zoomingEnabled,\n userZoomingEnabled: userZoomingEnabled,\n boxSelectionEnabled: boxSelectionEnabled,\n autoungrabify: autoungrabify,\n autolock: autolock,\n autounselectify: autounselectify\n });\n }\n }]);\n\n return Cytoscape;\n}(_react.Component);\n\nCytoscape.propTypes = {\n // HTML attribute props\n\n /**\r\n * The ID used to identify this component in Dash callbacks.\r\n */\n id: _propTypes2.default.string,\n\n /**\r\n * Sets the class name of the element (the value of an element's html\r\n * class attribute).\r\n */\n className: _propTypes2.default.string,\n\n /**\r\n * Add inline styles to the root element.\r\n */\n style: _propTypes2.default.object,\n\n // Dash specific props\n\n /**\r\n * Dash-assigned callback that should be called whenever any of the\r\n * properties change.\r\n */\n setProps: _propTypes2.default.func,\n\n // Common props\n\n /**\r\n * A list of dictionaries representing the elements of the networks.\r\n * 1. Each dictionary describes an element, and specifies its purpose.\r\n * - `group` (string): Either 'nodes' or 'edges'. If not given, it's automatically inferred.\r\n * - `data` (dictionary): Element specific data.\r\n * - `id` (string): Reference to the element, useful for selectors and edges. Randomly assigned if not given.\r\n * - `label` (string): Optional name for the element, useful when `data(label)` is given to a style's `content` or `label`. It is only a convention.\r\n * - `parent` (string): Only for nodes. Optional reference to another node. Needed to create compound nodes.\r\n * - `source` (string): Only for edges. The id of the source node, which is where the edge starts.\r\n * - `target` (string): Only for edges. The id of the target node, where the edge ends.\r\n * - `position` (dictionary): Only for nodes. The position of the node.\r\n * - `x` (number): The x-coordinate of the node.\r\n * - `y` (number): The y-coordinate of the node.\r\n * - `selected` (boolean): If the element is selected upon initialisation.\r\n * - `selectable` (boolean): If the element can be selected.\r\n * - `locked` (boolean): Only for nodes. If the position is immutable.\r\n * - `grabbable` (boolean): Only for nodes. If the node can be grabbed and moved by the user.\r\n * - `classes` (string): Space separated string of class names of the element. Those classes can be selected by a style selector.\r\n *\r\n * 2. The [official Cytoscape.js documentation](http://js.cytoscape.org/#notation/elements-json) offers an extensive overview and examples of element declaration.\r\n */\n elements: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A list of dictionaries representing the styles of the elements.\r\n * 1. Each dictionary requires the following keys:\r\n * - `selector` (string): Which elements you are styling. Generally, you select a group of elements (node, edges, both), a class (that you declare in the element dictionary), or an element by ID.\r\n * - `style` (dictionary): What aspects of the elements you want to modify. This could be the size or color of a node, the shape of an edge arrow, or many more.\r\n *\r\n * 2. Both [the selector string](http://js.cytoscape.org/#selectors) and\r\n * [the style dictionary](http://js.cytoscape.org/#style/node-body) are\r\n * exhaustively documented in the Cytoscape.js docs. Although methods such\r\n * as `cy.elements(...)` and `cy.filter(...)` are not available, the selector\r\n * string syntax stays the same.\r\n */\n stylesheet: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A dictionary specifying how to set the position of the elements in your\r\n * graph. The `'name'` key is required, and indicates which layout (algorithm) to\r\n * use.\r\n * 1. The layouts available by default are:\r\n * - `random`: Randomly assigns positions\r\n * - `preset`: Assigns position based on the `position` key in element dictionaries\r\n * - `circle`: Single-level circle, with optional radius\r\n * - `concentric`: Multi-level circle, with optional radius\r\n * - `grid`: Square grid, optionally with numbers of `rows` and `cols`\r\n * - `breadthfirst`: Tree structure built using BFS, with optional `roots`\r\n * - `cose`: Force-directed physics simulation\r\n *\r\n * 2. Some external layouts are also included. To use them, run\r\n * `dash_cytoscape.load_extra_layouts()` before creating your Dash app. Be careful about\r\n * using the extra layouts when not necessary, since they require supplementary bandwidth\r\n * for loading, which impacts the startup time of the app.\r\n * - `cose-bilkent`: https://github.com/cytoscape/cytoscape.js-cose-bilkent\r\n * - `cola`: https://github.com/cytoscape/cytoscape.js-cola\r\n * - `euler`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `spread`: https://github.com/cytoscape/cytoscape.js-spread\r\n * - `dagre`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `klay`: https://github.com/cytoscape/cytoscape.js-klay\r\n *\r\n * 3. The keys accepted by `layout` vary depending on the algorithm, but some\r\n * keys are accepted by all layouts:\r\n * - `fit` (boolean): Whether to render the nodes in order to fit the canvas.\r\n * - `padding` (number): Padding around the sides of the canvas, if fit is enabled.\r\n * - `animate` (boolean): Whether to animate change in position when the layout changes.\r\n * - `animationDuration` (number): Duration of animation in milliseconds, if enabled.\r\n * - `boundingBox` (dictionary): How to constrain the layout in a specific area. Keys accepted are either `x1, y1, x2, y2` or `x1, y1, w, h`, all of which receive a pixel value.\r\n *\r\n * 4. The complete list of layouts and their accepted options are available\r\n * on the [Cytoscape.js docs](http://js.cytoscape.org/#layouts). For the\r\n * external layouts, the options are listed in the \"API\" section of the\r\n * README.\r\n * Note that certain keys are not supported in Dash since the value is a\r\n * JavaScript function or a callback. Please visit [this issue](https://github.com/plotly/dash-cytoscape/issues/25)\r\n * for more information.\r\n */\n layout: _propTypes2.default.object,\n\n // Viewport Manipulation\n\n /**\r\n * Dictionary indicating the initial panning position of the graph. The\r\n * following keys are accepted:\r\n * - `x` (number): The x-coordinate of the position.\r\n * - `y` (number): The y-coordinate of the position.\r\n */\n pan: _propTypes2.default.object,\n\n /**\r\n * The initial zoom level of the graph. You can set `minZoom` and\r\n * `maxZoom` to set restrictions on the zoom level.\r\n */\n zoom: _propTypes2.default.number,\n\n // Viewport Mutability and gesture Toggling\n /**\r\n * Whether panning the graph is enabled (i.e., the position of the graph is\r\n * mutable overall).\r\n */\n panningEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed to\r\n * pan the graph.\r\n */\n userPanningEnabled: _propTypes2.default.bool,\n\n /**\r\n * A minimum bound on the zoom level of the graph. The viewport can not be\r\n * scaled smaller than this zoom level.\r\n */\n minZoom: _propTypes2.default.number,\n\n /**\r\n * A maximum bound on the zoom level of the graph. The viewport can not be\r\n * scaled larger than this zoom level.\r\n */\n maxZoom: _propTypes2.default.number,\n\n /**\r\n * Whether zooming the graph is enabled (i.e., the zoom level of the graph\r\n * is mutable overall).\r\n */\n zoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed\r\n * to pan the graph.\r\n */\n userZoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether box selection (i.e. drag a box overlay around, and release it\r\n * to select) is enabled. If enabled, the user must taphold to pan the graph.\r\n */\n boxSelectionEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be ungrabified (not grabbable by user) by\r\n * default (if true, overrides individual node state).\r\n */\n autoungrabify: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be locked (not draggable at all) by default\r\n * (if true, overrides individual node state).\r\n */\n autolock: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be unselectified (immutable selection state) by\r\n * default (if true, overrides individual element state).\r\n */\n autounselectify: _propTypes2.default.bool,\n\n /**\r\n * Whether the layout should be refreshed when elements are added or removed.\r\n */\n autoRefreshLayout: _propTypes2.default.bool,\n\n // User Events Props\n\n /**\r\n * The complete node dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Node-specific items:\r\n * - `edgesData` (dictionary)\r\n * - `renderedPosition` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `position` (dictionary)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n *\r\n * 3. Items for compound nodes:\r\n * - `ancestorsData` (dictionary)\r\n * - `childrenData` (dictionary)\r\n * - `descendantsData` (dictionary)\r\n * - `parentData` (dictionary)\r\n * - `siblingsData` (dictionary)\r\n * - `isParent` (boolean)\r\n * - `isChildless` (boolean)\r\n * - `isChild` (boolean)\r\n * - `isOrphan` (boolean)\r\n * - `relativePosition` (dictionary)\r\n */\n tapNode: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you tap or click it. Read-only.\r\n */\n tapNodeData: _propTypes2.default.object,\n\n /**\r\n * The complete edge dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Edge-specific items:\r\n * - `isLoop` (boolean)\r\n * - `isSimple` (boolean)\r\n * - `midpoint` (dictionary)\r\n * - `sourceData` (dictionary)\r\n * - `sourceEndpoint` (dictionary)\r\n * - `targetData` (dictionary)\r\n * - `targetEndpoint` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n */\n tapEdge: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you tap or click it. Read-only.\r\n */\n tapEdgeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you hover over it. Read-only.\r\n */\n mouseoverNodeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you hover over it. Read-only.\r\n */\n mouseoverEdgeData: _propTypes2.default.object,\n\n /**\r\n * The list of data dictionaries of all selected nodes (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedNodeData: _propTypes2.default.array,\n\n /**\r\n * The list of data dictionaries of all selected edges (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedEdgeData: _propTypes2.default.array\n};\n\nCytoscape.defaultProps = {\n style: { width: '600px', height: '600px' },\n layout: { name: 'grid' },\n pan: { x: 0, y: 0 },\n zoom: 1,\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: true,\n userZoomingEnabled: true,\n panningEnabled: true,\n userPanningEnabled: true,\n boxSelectionEnabled: false,\n autolock: false,\n autoungrabify: false,\n autounselectify: false,\n autoRefreshLayout: true\n};\n\nexports.default = Cytoscape;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX2N5dG9zY2FwZS8uL3NyYy9saWIvY29tcG9uZW50cy9DeXRvc2NhcGUucmVhY3QuanM/NjQyYyJdLCJuYW1lcyI6WyJDeXRvc2NhcGUiLCJwcm9wcyIsImhhbmRsZUN5IiwiYmluZCIsIl9oYW5kbGVDeUNhbGxlZCIsImV2ZW50IiwiZWxlIiwidGFyZ2V0IiwiaXNQYXJlbnQiLCJpc0NoaWxkbGVzcyIsImlzQ2hpbGQiLCJpc09ycGhhbiIsInJlbmRlcmVkUG9zaXRpb24iLCJyZWxhdGl2ZVBvc2l0aW9uIiwicGFyZW50Iiwic3R5bGUiLCJlZGdlc0RhdGEiLCJjb25uZWN0ZWRFZGdlcyIsIm1hcCIsImRhdGEiLCJjaGlsZHJlbkRhdGEiLCJjaGlsZHJlbiIsImFuY2VzdG9yc0RhdGEiLCJhbmNlc3RvcnMiLCJkZXNjZW5kYW50c0RhdGEiLCJkZXNjZW5kYW50cyIsInNpYmxpbmdzRGF0YSIsInNpYmxpbmdzIiwidGltZVN0YW1wIiwianNvbiIsImNsYXNzZXMiLCJncmFiYmFibGUiLCJncm91cCIsImxvY2tlZCIsInBvc2l0aW9uIiwic2VsZWN0ZWQiLCJzZWxlY3RhYmxlIiwicGFyZW50RGF0YSIsIm5vZGVPYmplY3QiLCJtaWRwb2ludCIsImlzTG9vcCIsImlzU2ltcGxlIiwic291cmNlRGF0YSIsInNvdXJjZSIsInNvdXJjZUVuZHBvaW50IiwidGFyZ2V0RGF0YSIsInRhcmdldEVuZHBvaW50IiwiZWRnZU9iamVjdCIsImN5IiwiX2N5Iiwid2luZG93IiwiU0VMRUNUX1RIUkVTSE9MRCIsInNlbGVjdGVkTm9kZXMiLCJjb2xsZWN0aW9uIiwic2VsZWN0ZWRFZGdlcyIsInJlZnJlc2hMYXlvdXQiLCJfIiwiZGVib3VuY2UiLCJhdXRvUmVmcmVzaExheW91dCIsImxheW91dCIsInJ1biIsInNlbmRTZWxlY3RlZE5vZGVzRGF0YSIsIm5vZGVEYXRhIiwiZWwiLCJzZXRQcm9wcyIsInNlbGVjdGVkTm9kZURhdGEiLCJzZW5kU2VsZWN0ZWRFZGdlc0RhdGEiLCJlZGdlRGF0YSIsInNlbGVjdGVkRWRnZURhdGEiLCJvbiIsImdlbmVyYXRlTm9kZSIsInRhcE5vZGUiLCJ0YXBOb2RlRGF0YSIsImdlbmVyYXRlRWRnZSIsInRhcEVkZ2UiLCJ0YXBFZGdlRGF0YSIsIm1vdXNlb3Zlck5vZGVEYXRhIiwibW91c2VvdmVyRWRnZURhdGEiLCJtZXJnZSIsInVubWVyZ2UiLCJpZCIsImNsYXNzTmFtZSIsImVsZW1lbnRzIiwic3R5bGVzaGVldCIsInBhbiIsInpvb20iLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwiQ3l0b3NjYXBlQ29tcG9uZW50Iiwibm9ybWFsaXplRWxlbWVudHMiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJvYmplY3QiLCJmdW5jIiwiYXJyYXlPZiIsIm51bWJlciIsImJvb2wiLCJhcnJheSIsImRlZmF1bHRQcm9wcyIsIndpZHRoIiwiaGVpZ2h0IiwibmFtZSIsIngiLCJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUlBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7OytlQVBBOzs7Ozs7QUFVQTs7OztJQUlNQSxTOzs7QUFDRix1QkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLDBIQUNUQSxLQURTOztBQUdmLGNBQUtDLFFBQUwsR0FBZ0IsTUFBS0EsUUFBTCxDQUFjQyxJQUFkLE9BQWhCO0FBQ0EsY0FBS0MsZUFBTCxHQUF1QixLQUF2QjtBQUplO0FBS2xCOzs7O3FDQUVZQyxLLEVBQU87QUFDaEIsZ0JBQU1DLE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBLGdCQUFNQyxXQUFXRixJQUFJRSxRQUFKLEVBQWpCO0FBQUEs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QUFTNkIsb0JBQVVFLE1BL05EOztBQWlPbEI7OztBQUdBOUIsaUJBQWE0QixvQkFBVUUsTUFwT0w7O0FBc09sQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE1QixhQUFTMEIsb0JBQVVFLE1BN1BEOztBQStQbEI7OztBQUdBM0IsaUJBQWF5QixvQkFBVUUsTUFsUUw7O0FBb1FsQjs7O0FBR0ExQix1QkFBbUJ3QixvQkFBVUUsTUF2UVg7O0FBeVFsQjs7O0FBR0F6Qix1QkFBbUJ1QixvQkFBVUUsTUE1UVg7O0FBOFFsQjs7OztBQUlBckMsc0JBQWtCbUMsb0JBQVVPLEtBbFJWOztBQW9SbEI7Ozs7QUFJQXZDLHNCQUFrQmdDLG9CQUFVTztBQXhSVixDQUF0Qjs7QUEyUkEzRyxVQUFVNEcsWUFBVixHQUF5QjtBQUNyQjdGLFdBQU8sRUFBQzhGLE9BQU8sT0FBUixFQUFpQkMsUUFBUSxPQUF6QixFQURjO0FBRXJCbkQsWUFBUSxFQUFDb0QsTUFBTSxNQUFQLEVBRmE7QUFHckIzQixTQUFLLEVBQUM0QixHQUFHLENBQUosRUFBT0MsR0FBRyxDQUFWLEVBSGdCO0FBSXJCNUIsVUFBTSxDQUplO0FBS3JCRyxhQUFTLEtBTFk7QUFNckJDLGFBQVMsSUFOWTtBQU9yQkMsb0JBQWdCLElBUEs7QUFRckJDLHdCQUFvQixJQVJDO0FBU3JCTCxvQkFBZ0IsSUFUSztBQVVyQkMsd0JBQW9CLElBVkM7QUFXckJLLHlCQUFxQixLQVhBO0FBWXJCRSxjQUFVLEtBWlc7QUFhckJELG1CQUFlLEtBYk07QUFjckJFLHFCQUFpQixLQWRJO0FBZXJCckMsdUJBQW1CO0FBZkUsQ0FBekI7O2tCQWtCZTFELFMiLCJmaWxlIjoiLi9zcmMvbGliL2NvbXBvbmVudHMvQ3l0b3NjYXBlLnJlYWN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEphdmFTY3JpcHQgUmVxdWlyZW1lbnRzOiBjeXRvc2NhcGVcclxuICogUmVhY3QuanMgcmVxdWlyZW1lbnRzOiByZWFjdC1jeXRvc2NhcGVqc1xyXG4gKi9cclxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XHJcbmltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAncmVhY3QtY3l0b3NjYXBlanMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuXHJcbi8qKlxyXG5BIENvbXBvbmVudCBMaWJyYXJ5IGZvciBEYXNoIGFpbWVkIGF0IGZhY2lsaXRhdGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb24gaW5cclxuUHl0aG9uLCB3cmFwcGVkIGFyb3VuZCBbQ3l0b3NjYXBlLmpzXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8pLlxyXG4gKi9cclxuY2xhc3MgQ3l0b3NjYXBlIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZUN5ID0gdGhpcy5oYW5kbGVDeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUN5Q2FsbGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVOb2RlKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZWxlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICBjb25zdCBpc1BhcmVudCA9IGVsZS5pc1BhcmVudCgpLFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyA9IGVsZS5pc0NoaWxkbGVzcygpLFxyXG4gICAgICAgICAgICBpc0NoaWxkID0gZWxlLmlzQ2hpbGQoKSxcclxuICAgICAgICAgICAgaXNPcnBoYW4gPSBlbGUuaXNPcnBoYW4oKSxcclxuICAgICAgICAgICAgcmVuZGVyZWRQb3NpdGlvbiA9IGVsZS5yZW5kZXJlZFBvc2l0aW9uKCksXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSBlbGUucmVsYXRpdmVQb3NpdGlvbigpLFxyXG4gICAgICAgICAgICBwYXJlbnQgPSBlbGUucGFyZW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCk7XHJcblxyXG4gICAgICAgIC8vIFRyaW0gZG93biB0aGUgZWxlbWVudCBvYmplY3RzIHRvIG9ubHkgdGhlIGRhdGEgY29udGFpbmVkXHJcbiAgICAgICAgY29uc3QgZWRnZXNEYXRhID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2hpbGRyZW5EYXRhID0gZWxlLmNoaWxkcmVuKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYW5jZXN0b3JzRGF0YSA9IGVsZS5hbmNlc3RvcnMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBkZXNjZW5kYW50c0RhdGEgPSBlbGUuZGVzY2VuZGFudHMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEgPSBlbGUuc2libGluZ3MoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBwb3NpdGlvbixcclxuICAgICAgICAgICAgc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGVcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmVudERhdGE7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gcGFyZW50LmRhdGEoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGVzIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgZWRnZXNEYXRhLFxyXG4gICAgICAgICAgICByZW5kZXJlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICAgICAgLy8gQ29tcG91bmQgTm9kZXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIGFuY2VzdG9yc0RhdGEsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuRGF0YSxcclxuICAgICAgICAgICAgZGVzY2VuZGFudHNEYXRhLFxyXG4gICAgICAgICAgICBwYXJlbnREYXRhLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEsXHJcbiAgICAgICAgICAgIGlzUGFyZW50LFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyxcclxuICAgICAgICAgICAgaXNDaGlsZCxcclxuICAgICAgICAgICAgaXNPcnBoYW4sXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vIFN0eWxpbmdcclxuICAgICAgICAgICAgc3R5bGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBub2RlT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZW5lcmF0ZUVkZ2UoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG1pZHBvaW50ID0gZWxlLm1pZHBvaW50KCksXHJcbiAgICAgICAgICAgIGlzTG9vcCA9IGVsZS5pc0xvb3AoKSxcclxuICAgICAgICAgICAgaXNTaW1wbGUgPSBlbGUuaXNTaW1wbGUoKSxcclxuICAgICAgICAgICAgc291cmNlRGF0YSA9IGVsZS5zb3VyY2UoKS5kYXRhKCksXHJcbiAgICAgICAgICAgIHNvdXJjZUVuZHBvaW50ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCksXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEgPSBlbGUudGFyZ2V0KCkuZGF0YSgpLFxyXG4gICAgICAgICAgICB0YXJnZXRFbmRwb2ludCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRnZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgLy8gRWRnZXMgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICBpc0xvb3AsXHJcbiAgICAgICAgICAgIGlzU2ltcGxlLFxyXG4gICAgICAgICAgICBtaWRwb2ludCxcclxuICAgICAgICAgICAgc291cmNlRGF0YSxcclxuICAgICAgICAgICAgc291cmNlRW5kcG9pbnQsXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEsXHJcbiAgICAgICAgICAgIHRhcmdldEVuZHBvaW50LFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkLFxyXG4gICAgICAgICAgICAvLyBTdHlsaW5nXHJcbiAgICAgICAgICAgIHN0eWxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVkZ2VPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ3koY3kpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY3kgcG9pbnRlciBoYXMgbm90IGJlZW4gbW9kaWZpZWQsIGFuZCBoYW5kbGVDeSBoYXMgYWxyZWFkeVxyXG4gICAgICAgIC8vIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhhbiB3ZSBkb24ndCBydW4gdGhpcyBmdW5jdGlvbi5cclxuICAgICAgICBpZiAoY3kgPT09IHRoaXMuX2N5ICYmIHRoaXMuX2hhbmRsZUN5Q2FsbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3kgPSBjeTtcclxuICAgICAgICB3aW5kb3cuY3kgPSBjeTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVDeUNhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ09OU1RBTlRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgY29uc3QgU0VMRUNUX1RIUkVTSE9MRCA9IDEwMDtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEVkZ2VzID0gY3kuY29sbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hMYXlvdXQgPSBfLmRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFJlZnJlc2ggTGF5b3V0IGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYXV0b1JlZnJlc2hMYXlvdXQsXHJcbiAgICAgICAgICAgICAgICBsYXlvdXRcclxuICAgICAgICAgICAgfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b1JlZnJlc2hMYXlvdXQpIHtcclxuICAgICAgICAgICAgICAgIGN5LmxheW91dChsYXlvdXQpLnJ1bigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkTm9kZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXBldGl0aXZlbHkgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBub2RlIGlzIHNlbGVjdGVkXHJcbiAgICAgICAgICAgICBvciB1bnNlbGVjdGVkLCBidXQga2VlcHMgYmVpbmcgZGVib3VuY2VkIGlmIGl0IGlzIGNhbGxlZCBhZ2FpblxyXG4gICAgICAgICAgICAgd2l0aGluIDEwMCBtcyAoZ2l2ZW4gYnkgU0VMRUNUX1RIUkVTSE9MRCkuIEVmZmVjdGl2ZWx5LCBpdCBvbmx5XHJcbiAgICAgICAgICAgICBydW5zIHdoZW4gYWxsIHRoZSBub2RlcyBoYXZlIGJlZW4gY29ycmVjdGx5IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgYW5kXHJcbiAgICAgICAgICAgICBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIHNlbGVjdGVkTm9kZXMgY29sbGVjdGlvbiwgYW5kIHRoZW4gdXBkYXRlc1xyXG4gICAgICAgICAgICAgdGhlIHNlbGVjdGVkTm9kZURhdGEgcHJvcC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhID0gc2VsZWN0ZWROb2Rlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWROb2RlRGF0YTogbm9kZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkRWRnZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VEYXRhID0gc2VsZWN0ZWRFZGdlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFZGdlRGF0YTogZWRnZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVWRU5UUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICBjeS5vbigndGFwJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB0aGlzLmdlbmVyYXRlTm9kZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2V0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuc2V0UHJvcHMoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcE5vZGU6IG5vZGVPYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwTm9kZURhdGE6IG5vZGVPYmplY3QuZGF0YVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3RhcCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGdlT2JqZWN0ID0gdGhpcy5nZW5lcmF0ZUVkZ2UoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICB0YXBFZGdlOiBlZGdlT2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcEVkZ2VEYXRhOiBlZGdlT2JqZWN0LmRhdGFcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGN5Lm9uKCdtb3VzZW92ZXInLCAnbm9kZScsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXJOb2RlRGF0YTogZXZlbnQudGFyZ2V0LmRhdGEoKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbignbW91c2VvdmVyJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyRWRnZURhdGE6IGV2ZW50LnRhcmdldC5kYXRhKClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdub2RlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZE5vZGVzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWROb2Rlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZEVkZ2VzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZEVkZ2VzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRWRnZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWRFZGdlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ2FkZCByZW1vdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlZnJlc2hMYXlvdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgc3R5bGUsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcclxuICAgICAgICAgICAgLy8gQ29tbW9uIHByb3BzXHJcbiAgICAgICAgICAgIGVsZW1lbnRzLFxyXG4gICAgICAgICAgICBzdHlsZXNoZWV0LFxyXG4gICAgICAgICAgICBsYXlvdXQsXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE1hbmlwdWxhdGlvblxyXG4gICAgICAgICAgICBwYW4sXHJcbiAgICAgICAgICAgIHpvb20sXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE11dGFiaWxpdHkgYW5kIGdlc3R1cmUgVG9nZ2xpbmdcclxuICAgICAgICAgICAgcGFubmluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJQYW5uaW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgbWluWm9vbSxcclxuICAgICAgICAgICAgbWF4Wm9vbSxcclxuICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJab29taW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZCxcclxuICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeSxcclxuICAgICAgICAgICAgYXV0b2xvY2ssXHJcbiAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeVxyXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8Q3l0b3NjYXBlQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgICAgICBjeT17dGhpcy5oYW5kbGVDeX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxyXG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e0N5dG9zY2FwZUNvbXBvbmVudC5ub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cyl9XHJcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0PXtzdHlsZXNoZWV0fVxyXG4gICAgICAgICAgICAgICAgbGF5b3V0PXtsYXlvdXR9XHJcbiAgICAgICAgICAgICAgICBwYW49e3Bhbn1cclxuICAgICAgICAgICAgICAgIHpvb209e3pvb219XHJcbiAgICAgICAgICAgICAgICBwYW5uaW5nRW5hYmxlZD17cGFubmluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICB1c2VyUGFubmluZ0VuYWJsZWQ9e3VzZXJQYW5uaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgICAgIG1pblpvb209e21pblpvb219XHJcbiAgICAgICAgICAgICAgICBtYXhab29tPXttYXhab29tfVxyXG4gICAgICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQ9e3pvb21pbmdFbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgdXNlclpvb21pbmdFbmFibGVkPXt1c2VyWm9vbWluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICBib3hTZWxlY3Rpb25FbmFibGVkPXtib3hTZWxlY3Rpb25FbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeT17YXV0b3VuZ3JhYmlmeX1cclxuICAgICAgICAgICAgICAgIGF1dG9sb2NrPXthdXRvbG9ja31cclxuICAgICAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeT17YXV0b3Vuc2VsZWN0aWZ5fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuXHJcbkN5dG9zY2FwZS5wcm9wVHlwZXMgPSB7XHJcbiAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjb21wb25lbnQgaW4gRGFzaCBjYWxsYmFja3MuXHJcbiAgICAgKi9cclxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZWxlbWVudCAodGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBodG1sXHJcbiAgICAgKiBjbGFzcyBhdHRyaWJ1dGUpLlxyXG4gICAgICovXHJcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgaW5saW5lIHN0eWxlcyB0byB0aGUgcm9vdCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvLyBEYXNoIHNwZWNpZmljIHByb3BzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXNoLWFzc2lnbmVkIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgb2YgdGhlXHJcbiAgICAgKiBwcm9wZXJ0aWVzIGNoYW5nZS5cclxuICAgICAqL1xyXG4gICAgc2V0UHJvcHM6IFByb3BUeXBlcy5mdW5jLFxyXG5cclxuICAgIC8vIENvbW1vbiBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBuZXR3b3Jrcy5cclxuICAgICAqICAgICAxLiBFYWNoIGRpY3Rpb25hcnkgZGVzY3JpYmVzIGFuIGVsZW1lbnQsIGFuZCBzcGVjaWZpZXMgaXRzIHB1cnBvc2UuXHJcbiAgICAgKiAgICAgICAgIC0gYGdyb3VwYCAoc3RyaW5nKTogRWl0aGVyICdub2Rlcycgb3IgJ2VkZ2VzJy4gSWYgbm90IGdpdmVuLCBpdCdzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KTogRWxlbWVudCBzcGVjaWZpYyBkYXRhLlxyXG4gICAgICogICAgICAgICAgICAgIC0gYGlkYCAoc3RyaW5nKTogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50LCB1c2VmdWwgZm9yIHNlbGVjdG9ycyBhbmQgZWRnZXMuIFJhbmRvbWx5IGFzc2lnbmVkIGlmIG5vdCBnaXZlbi5cclxuICAgICAqICAgICAgICAgICAgICAtIGBsYWJlbGAgKHN0cmluZyk6IE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBlbGVtZW50LCB1c2VmdWwgd2hlbiBgZGF0YShsYWJlbClgIGlzIGdpdmVuIHRvIGEgc3R5bGUncyBgY29udGVudGAgb3IgYGxhYmVsYC4gSXQgaXMgb25seSBhIGNvbnZlbnRpb24uXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgcGFyZW50YCAoc3RyaW5nKTogT25seSBmb3Igbm9kZXMuIE9wdGlvbmFsIHJlZmVyZW5jZSB0byBhbm90aGVyIG5vZGUuIE5lZWRlZCB0byBjcmVhdGUgY29tcG91bmQgbm9kZXMuXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgc291cmNlYCAoc3RyaW5nKTogT25seSBmb3IgZWRnZXMuIFRoZSBpZCBvZiB0aGUgc291cmNlIG5vZGUsIHdoaWNoIGlzIHdoZXJlIHRoZSBlZGdlIHN0YXJ0cy5cclxuICAgICAqICAgICAgICAgICAgICAtIGB0YXJnZXRgIChzdHJpbmcpOiBPbmx5IGZvciBlZGdlcy4gVGhlIGlkIG9mIHRoZSB0YXJnZXQgbm9kZSwgd2hlcmUgdGhlIGVkZ2UgZW5kcy5cclxuICAgICAqICAgICAgICAgLSBgcG9zaXRpb25gIChkaWN0aW9uYXJ5KTogT25seSBmb3Igbm9kZXMuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB4YCAobnVtYmVyKTogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0ZWRgIChib29sZWFuKTogSWYgdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQgdXBvbiBpbml0aWFsaXNhdGlvbi5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pOiBJZiB0aGUgZWxlbWVudCBjYW4gYmUgc2VsZWN0ZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pOiBPbmx5IGZvciBub2Rlcy4gSWYgdGhlIHBvc2l0aW9uIGlzIGltbXV0YWJsZS5cclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbik6IE9ubHkgZm9yIG5vZGVzLiBJZiB0aGUgbm9kZSBjYW4gYmUgZ3JhYmJlZCBhbmQgbW92ZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpOiBTcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGNsYXNzIG5hbWVzIG9mIHRoZSBlbGVtZW50LiBUaG9zZSBjbGFzc2VzIGNhbiBiZSBzZWxlY3RlZCBieSBhIHN0eWxlIHNlbGVjdG9yLlxyXG4gICAgICpcclxuICAgICAqICAgICAyLiBUaGUgW29mZmljaWFsIEN5dG9zY2FwZS5qcyBkb2N1bWVudGF0aW9uXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbm90YXRpb24vZWxlbWVudHMtanNvbikgb2ZmZXJzIGFuIGV4dGVuc2l2ZSBvdmVydmlldyBhbmQgZXhhbXBsZXMgb2YgZWxlbWVudCBkZWNsYXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZWxlbWVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIHN0eWxlcyBvZiB0aGUgZWxlbWVudHMuXHJcbiAgICAgKiAgICAgMS4gRWFjaCBkaWN0aW9uYXJ5IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcga2V5czpcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0b3JgIChzdHJpbmcpOiBXaGljaCBlbGVtZW50cyB5b3UgYXJlIHN0eWxpbmcuIEdlbmVyYWxseSwgeW91IHNlbGVjdCBhIGdyb3VwIG9mIGVsZW1lbnRzIChub2RlLCBlZGdlcywgYm90aCksIGEgY2xhc3MgKHRoYXQgeW91IGRlY2xhcmUgaW4gdGhlIGVsZW1lbnQgZGljdGlvbmFyeSksIG9yIGFuIGVsZW1lbnQgYnkgSUQuXHJcbiAgICAgKiAgICAgICAgIC0gYHN0eWxlYCAoZGljdGlvbmFyeSk6IFdoYXQgYXNwZWN0cyBvZiB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gbW9kaWZ5LiBUaGlzIGNvdWxkIGJlIHRoZSBzaXplIG9yIGNvbG9yIG9mIGEgbm9kZSwgdGhlIHNoYXBlIG9mIGFuIGVkZ2UgYXJyb3csIG9yIG1hbnkgbW9yZS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gQm90aCBbdGhlIHNlbGVjdG9yIHN0cmluZ10oaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3NlbGVjdG9ycykgYW5kXHJcbiAgICAgKiAgICAgW3RoZSBzdHlsZSBkaWN0aW9uYXJ5XShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGUvbm9kZS1ib2R5KSBhcmVcclxuICAgICAqICAgICBleGhhdXN0aXZlbHkgZG9jdW1lbnRlZCBpbiB0aGUgQ3l0b3NjYXBlLmpzIGRvY3MuIEFsdGhvdWdoIG1ldGhvZHMgc3VjaFxyXG4gICAgICogICAgIGFzIGBjeS5lbGVtZW50cyguLi4pYCBhbmQgYGN5LmZpbHRlciguLi4pYCBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIHNlbGVjdG9yXHJcbiAgICAgKiAgICAgc3RyaW5nIHN5bnRheCBzdGF5cyB0aGUgc2FtZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVzaGVldDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGRpY3Rpb25hcnkgc3BlY2lmeWluZyBob3cgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4geW91clxyXG4gICAgICogZ3JhcGguIFRoZSBgJ25hbWUnYCBrZXkgaXMgcmVxdWlyZWQsIGFuZCBpbmRpY2F0ZXMgd2hpY2ggbGF5b3V0IChhbGdvcml0aG0pIHRvXHJcbiAgICAgKiB1c2UuXHJcbiAgICAgKiAgICAgMS4gVGhlIGxheW91dHMgYXZhaWxhYmxlIGJ5IGRlZmF1bHQgYXJlOlxyXG4gICAgICogICAgICAgICAtIGByYW5kb21gOiBSYW5kb21seSBhc3NpZ25zIHBvc2l0aW9uc1xyXG4gICAgICogICAgICAgICAtIGBwcmVzZXRgOiBBc3NpZ25zIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBgcG9zaXRpb25gIGtleSBpbiBlbGVtZW50IGRpY3Rpb25hcmllc1xyXG4gICAgICogICAgICAgICAtIGBjaXJjbGVgOiBTaW5nbGUtbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBjb25jZW50cmljYDogTXVsdGktbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBncmlkYDogU3F1YXJlIGdyaWQsIG9wdGlvbmFsbHkgd2l0aCBudW1iZXJzIG9mIGByb3dzYCBhbmQgYGNvbHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGJyZWFkdGhmaXJzdGA6IFRyZWUgc3RydWN0dXJlIGJ1aWx0IHVzaW5nIEJGUywgd2l0aCBvcHRpb25hbCBgcm9vdHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGNvc2VgOiBGb3JjZS1kaXJlY3RlZCBwaHlzaWNzIHNpbXVsYXRpb25cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gU29tZSBleHRlcm5hbCBsYXlvdXRzIGFyZSBhbHNvIGluY2x1ZGVkLiBUbyB1c2UgdGhlbSwgcnVuXHJcbiAgICAgKiAgICAgYGRhc2hfY3l0b3NjYXBlLmxvYWRfZXh0cmFfbGF5b3V0cygpYCBiZWZvcmUgY3JlYXRpbmcgeW91ciBEYXNoIGFwcC4gQmUgY2FyZWZ1bCBhYm91dFxyXG4gICAgICogICAgIHVzaW5nIHRoZSBleHRyYSBsYXlvdXRzIHdoZW4gbm90IG5lY2Vzc2FyeSwgc2luY2UgdGhleSByZXF1aXJlIHN1cHBsZW1lbnRhcnkgYmFuZHdpZHRoXHJcbiAgICAgKiAgICAgZm9yIGxvYWRpbmcsIHdoaWNoIGltcGFjdHMgdGhlIHN0YXJ0dXAgdGltZSBvZiB0aGUgYXBwLlxyXG4gICAgICogICAgICAgICAtIGBjb3NlLWJpbGtlbnRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1jb3NlLWJpbGtlbnRcclxuICAgICAqICAgICAgICAgLSBgY29sYWA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWNvbGFcclxuICAgICAqICAgICAgICAgLSBgZXVsZXJgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBzcHJlYWRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1zcHJlYWRcclxuICAgICAqICAgICAgICAgLSBgZGFncmVgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBrbGF5YDogaHR0cHM6Ly9naXRodWIuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUuanMta2xheVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBUaGUga2V5cyBhY2NlcHRlZCBieSBgbGF5b3V0YCB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgYWxnb3JpdGhtLCBidXQgc29tZVxyXG4gICAgICogICAgIGtleXMgYXJlIGFjY2VwdGVkIGJ5IGFsbCBsYXlvdXRzOlxyXG4gICAgICogICAgICAgICAtIGBmaXRgIChib29sZWFuKTogV2hldGhlciB0byByZW5kZXIgdGhlIG5vZGVzIGluIG9yZGVyIHRvIGZpdCB0aGUgY2FudmFzLlxyXG4gICAgICogICAgICAgICAtIGBwYWRkaW5nYCAobnVtYmVyKTogUGFkZGluZyBhcm91bmQgdGhlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGlmIGZpdCBpcyBlbmFibGVkLlxyXG4gICAgICogICAgICAgICAtIGBhbmltYXRlYCAoYm9vbGVhbik6IFdoZXRoZXIgdG8gYW5pbWF0ZSBjaGFuZ2UgaW4gcG9zaXRpb24gd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMuXHJcbiAgICAgKiAgICAgICAgIC0gYGFuaW1hdGlvbkR1cmF0aW9uYCAobnVtYmVyKTogRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgaWYgZW5hYmxlZC5cclxuICAgICAqICAgICAgICAgLSBgYm91bmRpbmdCb3hgIChkaWN0aW9uYXJ5KTogSG93IHRvIGNvbnN0cmFpbiB0aGUgbGF5b3V0IGluIGEgc3BlY2lmaWMgYXJlYS4gS2V5cyBhY2NlcHRlZCBhcmUgZWl0aGVyIGB4MSwgeTEsIHgyLCB5MmAgb3IgYHgxLCB5MSwgdywgaGAsIGFsbCBvZiB3aGljaCByZWNlaXZlIGEgcGl4ZWwgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDQuIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGxheW91dHMgYW5kIHRoZWlyIGFjY2VwdGVkIG9wdGlvbnMgYXJlIGF2YWlsYWJsZVxyXG4gICAgICogICAgIG9uIHRoZSBbQ3l0b3NjYXBlLmpzIGRvY3NdKGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNsYXlvdXRzKS4gRm9yIHRoZVxyXG4gICAgICogICAgIGV4dGVybmFsIGxheW91dHMsIHRoZSBvcHRpb25zIGFyZSBsaXN0ZWQgaW4gdGhlIFwiQVBJXCIgc2VjdGlvbiBvZiB0aGVcclxuICAgICAqICAgICBSRUFETUUuXHJcbiAgICAgKiAgICAgTm90ZSB0aGF0IGNlcnRhaW4ga2V5cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBEYXNoIHNpbmNlIHRoZSB2YWx1ZSBpcyBhXHJcbiAgICAgKiAgICAgSmF2YVNjcmlwdCBmdW5jdGlvbiBvciBhIGNhbGxiYWNrLiBQbGVhc2UgdmlzaXQgW3RoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvZGFzaC1jeXRvc2NhcGUvaXNzdWVzLzI1KVxyXG4gICAgICogICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLy8gVmlld3BvcnQgTWFuaXB1bGF0aW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWN0aW9uYXJ5IGluZGljYXRpbmcgdGhlIGluaXRpYWwgcGFubmluZyBwb3NpdGlvbiBvZiB0aGUgZ3JhcGguIFRoZVxyXG4gICAgICogZm9sbG93aW5nIGtleXMgYXJlIGFjY2VwdGVkOlxyXG4gICAgICogICAgIC0gYHhgIChudW1iZXIpOiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cclxuICAgICAqICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHBhbjogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBZb3UgY2FuIHNldCBgbWluWm9vbWAgYW5kXHJcbiAgICAgKiBgbWF4Wm9vbWAgdG8gc2V0IHJlc3RyaWN0aW9ucyBvbiB0aGUgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgem9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvLyBWaWV3cG9ydCBNdXRhYmlsaXR5IGFuZCBnZXN0dXJlIFRvZ2dsaW5nXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgcGFubmluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpc1xyXG4gICAgICogbXV0YWJsZSBvdmVyYWxsKS5cclxuICAgICAqL1xyXG4gICAgcGFubmluZ0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1c2VyIGV2ZW50cyAoZS5nLiBkcmFnZ2luZyB0aGUgZ3JhcGggYmFja2dyb3VuZCkgYXJlIGFsbG93ZWQgdG9cclxuICAgICAqIHBhbiB0aGUgZ3JhcGguXHJcbiAgICAgKi9cclxuICAgIHVzZXJQYW5uaW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1pbmltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIHNtYWxsZXIgdGhhbiB0aGlzIHpvb20gbGV2ZWwuXHJcbiAgICAgKi9cclxuICAgIG1pblpvb206IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1heGltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIGxhcmdlciB0aGFuIHRoaXMgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgbWF4Wm9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgem9vbWluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoXHJcbiAgICAgKiBpcyBtdXRhYmxlIG92ZXJhbGwpLlxyXG4gICAgICovXHJcbiAgICB6b29taW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHVzZXIgZXZlbnRzIChlLmcuIGRyYWdnaW5nIHRoZSBncmFwaCBiYWNrZ3JvdW5kKSBhcmUgYWxsb3dlZFxyXG4gICAgICogdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgYm94IHNlbGVjdGlvbiAoaS5lLiBkcmFnIGEgYm94IG92ZXJsYXkgYXJvdW5kLCBhbmQgcmVsZWFzZSBpdFxyXG4gICAgICogdG8gc2VsZWN0KSBpcyBlbmFibGVkLiBJZiBlbmFibGVkLCB0aGUgdXNlciBtdXN0IHRhcGhvbGQgdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bmdyYWJpZmllZCAobm90IGdyYWJiYWJsZSBieSB1c2VyKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgbm9kZSBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bmdyYWJpZnk6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBub2RlcyBzaG91bGQgYmUgbG9ja2VkIChub3QgZHJhZ2dhYmxlIGF0IGFsbCkgYnkgZGVmYXVsdFxyXG4gICAgICogKGlmIHRydWUsIG92ZXJyaWRlcyBpbmRpdmlkdWFsIG5vZGUgc3RhdGUpLlxyXG4gICAgICovXHJcbiAgICBhdXRvbG9jazogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bnNlbGVjdGlmaWVkIChpbW11dGFibGUgc2VsZWN0aW9uIHN0YXRlKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgZWxlbWVudCBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bnNlbGVjdGlmeTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGJlIHJlZnJlc2hlZCB3aGVuIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxyXG4gICAgICovXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLy8gVXNlciBFdmVudHMgUHJvcHNcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb21wbGV0ZSBub2RlIGRpY3Rpb25hcnkgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDEuIE5vZGUtc3BlY2lmaWMgaXRlbXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGVkZ2VzRGF0YWAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbmRlcmVkUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0aW1lU3RhbXBgIChudW1iZXIpXHJcbiAgICAgKlxyXG4gICAgICogICAgIDIuIEdlbmVyYWwgaXRlbXMgKGZvciBhbGwgZWxlbWVudHMpOlxyXG4gICAgICogICAgICAgICAtIGBjbGFzc2VzYCAoc3RyaW5nKVxyXG4gICAgICogICAgICAgICAtIGBkYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgZ3JvdXBgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHBvc2l0aW9uYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBJdGVtcyBmb3IgY29tcG91bmQgbm9kZXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGFuY2VzdG9yc0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBjaGlsZHJlbkRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBkZXNjZW5kYW50c0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBwYXJlbnREYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2libGluZ3NEYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgaXNQYXJlbnRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc0NoaWxkbGVzc2AgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYGlzQ2hpbGRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc09ycGhhbmAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbGF0aXZlUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBOb2RlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhIG5vZGUgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHRhcE5vZGVEYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbXBsZXRlIGVkZ2UgZGljdGlvbmFyeSByZXR1cm5lZCB3aGVuIHlvdSB0YXAgb3IgY2xpY2sgaXQuIFJlYWQtb25seS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMS4gRWRnZS1zcGVjaWZpYyBpdGVtczpcclxuICAgICAqICAgICAgICAgLSBgaXNMb29wYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgaXNTaW1wbGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBtaWRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHNvdXJjZURhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBzb3VyY2VFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRhcmdldERhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0YXJnZXRFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRpbWVTdGFtcGAgKG51bWJlcilcclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gR2VuZXJhbCBpdGVtcyAoZm9yIGFsbCBlbGVtZW50cyk6XHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBncmFiYmFibGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBncm91cGAgKHN0cmluZylcclxuICAgICAqICAgICAgICAgLSBgbG9ja2VkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhbiBlZGdlIHJldHVybmVkIHdoZW4geW91IHRhcCBvciBjbGljayBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIGRpY3Rpb25hcnkgb2YgYSBub2RlIHJldHVybmVkIHdoZW4geW91IGhvdmVyIG92ZXIgaXQuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgbW91c2VvdmVyTm9kZURhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBkaWN0aW9uYXJ5IG9mIGFuIGVkZ2UgcmV0dXJuZWQgd2hlbiB5b3UgaG92ZXIgb3ZlciBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBtb3VzZW92ZXJFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsaXN0IG9mIGRhdGEgZGljdGlvbmFyaWVzIG9mIGFsbCBzZWxlY3RlZCBub2RlcyAoZS5nLiB1c2luZ1xyXG4gICAgICogU2hpZnQrQ2xpY2sgdG8gc2VsZWN0IG11bHRpcGxlIG5vZGVzLCBvciBTaGlmdCtEcmFnIHRvIHVzZSBib3ggc2VsZWN0aW9uKS4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBzZWxlY3RlZE5vZGVEYXRhOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlzdCBvZiBkYXRhIGRpY3Rpb25hcmllcyBvZiBhbGwgc2VsZWN0ZWQgZWRnZXMgKGUuZy4gdXNpbmdcclxuICAgICAqIFNoaWZ0K0NsaWNrIHRvIHNlbGVjdCBtdWx0aXBsZSBub2Rlcywgb3IgU2hpZnQrRHJhZyB0byB1c2UgYm94IHNlbGVjdGlvbikuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgc2VsZWN0ZWRFZGdlRGF0YTogUHJvcFR5cGVzLmFycmF5XHJcbn07XHJcblxyXG5DeXRvc2NhcGUuZGVmYXVsdFByb3BzID0ge1xyXG4gICAgc3R5bGU6IHt3aWR0aDogJzYwMHB4JywgaGVpZ2h0OiAnNjAwcHgnfSxcclxuICAgIGxheW91dDoge25hbWU6ICdncmlkJ30sXHJcbiAgICBwYW46IHt4OiAwLCB5OiAwfSxcclxuICAgIHpvb206IDEsXHJcbiAgICBtaW5ab29tOiAxZS01MCxcclxuICAgIG1heFpvb206IDFlNTAsXHJcbiAgICB6b29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHVzZXJab29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZmFsc2UsXHJcbiAgICBhdXRvbG9jazogZmFsc2UsXHJcbiAgICBhdXRvdW5ncmFiaWZ5OiBmYWxzZSxcclxuICAgIGF1dG91bnNlbGVjdGlmeTogZmFsc2UsXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogdHJ1ZVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3l0b3NjYXBlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/components/Cytoscape.react.js\n"); /***/ }), diff --git a/dash_cytoscape/dash_cytoscape_extra.dev.js b/dash_cytoscape/dash_cytoscape_extra.dev.js index da282290..9b18b63e 100644 --- a/dash_cytoscape/dash_cytoscape_extra.dev.js +++ b/dash_cytoscape/dash_cytoscape_extra.dev.js @@ -5711,7 +5711,7 @@ eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\ /***/ (function(module, exports, __webpack_require__) { "use strict"; - eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactCytoscapejs = __webpack_require__(/*! react-cytoscapejs */ \"./node_modules/react-cytoscapejs/dist/react-cytoscape.js\");\n\nvar _reactCytoscapejs2 = _interopRequireDefault(_reactCytoscapejs);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\r\n * JavaScript Requirements: cytoscape\r\n * React.js requirements: react-cytoscapejs\r\n */\n\n\n/**\r\nA Component Library for Dash aimed at facilitating network visualization in\r\nPython, wrapped around [Cytoscape.js](http://js.cytoscape.org/).\r\n */\nvar Cytoscape = function (_Component) {\n _inherits(Cytoscape, _Component);\n\n function Cytoscape(props) {\n _classCallCheck(this, Cytoscape);\n\n var _this = _possibleConstructorReturn(this, (Cytoscape.__proto__ || Object.getPrototypeOf(Cytoscape)).call(this, props));\n\n _this.handleCy = _this.handleCy.bind(_this);\n _this._handleCyCalled = false;\n return _this;\n }\n\n _createClass(Cytoscape, [{\n key: 'generateNode',\n value: function generateNode(event) {\n var ele = event.target;\n\n var isParent = ele.isParent(),\n isChildless = ele.isChildless(),\n isChild = ele.isChild(),\n isOrphan = ele.isOrphan(),\n renderedPosition = ele.renderedPosition(),\n relativePosition = ele.relativePosition(),\n parent = ele.parent(),\n style = ele.style();\n\n // Trim down the element objects to only the data contained\n var edgesData = ele.connectedEdges().map(function (ele) {\n return ele.data();\n }),\n childrenData = ele.children().map(function (ele) {\n return ele.data();\n }),\n ancestorsData = ele.ancestors().map(function (ele) {\n return ele.data();\n }),\n descendantsData = ele.descendants().map(function (ele) {\n return ele.data();\n }),\n siblingsData = ele.siblings().map(function (ele) {\n return ele.data();\n });\n\n var timeStamp = event.timeStamp;\n\n var _ele$json = ele.json(),\n classes = _ele$json.classes,\n data = _ele$json.data,\n grabbable = _ele$json.grabbable,\n group = _ele$json.group,\n locked = _ele$json.locked,\n position = _ele$json.position,\n selected = _ele$json.selected,\n selectable = _ele$json.selectable;\n\n var parentData = void 0;\n if (parent) {\n parentData = parent.data();\n } else {\n parentData = null;\n }\n\n var nodeObject = {\n // Nodes attributes\n edgesData: edgesData,\n renderedPosition: renderedPosition,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n position: position,\n selectable: selectable,\n selected: selected,\n // Compound Nodes additional attributes\n ancestorsData: ancestorsData,\n childrenData: childrenData,\n descendantsData: descendantsData,\n parentData: parentData,\n siblingsData: siblingsData,\n isParent: isParent,\n isChildless: isChildless,\n isChild: isChild,\n isOrphan: isOrphan,\n relativePosition: relativePosition,\n // Styling\n style: style\n };\n return nodeObject;\n }\n }, {\n key: 'generateEdge',\n value: function generateEdge(event) {\n var ele = event.target;\n\n var midpoint = ele.midpoint(),\n isLoop = ele.isLoop(),\n isSimple = ele.isSimple(),\n sourceData = ele.source().data(),\n sourceEndpoint = ele.sourceEndpoint(),\n style = ele.style(),\n targetData = ele.target().data(),\n targetEndpoint = ele.targetEndpoint();\n\n var timeStamp = event.timeStamp;\n\n var _ele$json2 = ele.json(),\n classes = _ele$json2.classes,\n data = _ele$json2.data,\n grabbable = _ele$json2.grabbable,\n group = _ele$json2.group,\n locked = _ele$json2.locked,\n selectable = _ele$json2.selectable,\n selected = _ele$json2.selected;\n\n var edgeObject = {\n // Edges attributes\n isLoop: isLoop,\n isSimple: isSimple,\n midpoint: midpoint,\n sourceData: sourceData,\n sourceEndpoint: sourceEndpoint,\n targetData: targetData,\n targetEndpoint: targetEndpoint,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n selectable: selectable,\n selected: selected,\n // Styling\n style: style\n };\n\n return edgeObject;\n }\n }, {\n key: 'handleCy',\n value: function handleCy(cy) {\n var _this2 = this;\n\n // If the cy pointer has not been modified, and handleCy has already\n // been called before, than we don't run this function.\n if (cy === this._cy && this._handleCyCalled) {\n return;\n }\n this._cy = cy;\n window.cy = cy;\n this._handleCyCalled = true;\n\n // ///////////////////////////////////// CONSTANTS /////////////////////////////////////////\n var SELECT_THRESHOLD = 100;\n\n var selectedNodes = cy.collection();\n var selectedEdges = cy.collection();\n\n // ///////////////////////////////////// FUNCTIONS /////////////////////////////////////////\n var refreshLayout = _lodash2.default.debounce(function () {\n /**\r\n * Refresh Layout if needed\r\n */\n var _props = _this2.props,\n autoRefreshLayout = _props.autoRefreshLayout,\n layout = _props.layout;\n\n\n if (autoRefreshLayout) {\n cy.layout(layout).run();\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedNodesData = _lodash2.default.debounce(function () {\n /**\r\n This function is repetitively called every time a node is selected\r\n or unselected, but keeps being debounced if it is called again\r\n within 100 ms (given by SELECT_THRESHOLD). Effectively, it only\r\n runs when all the nodes have been correctly selected/unselected and\r\n added/removed from the selectedNodes collection, and then updates\r\n the selectedNodeData prop.\r\n */\n var nodeData = selectedNodes.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedNodeData: nodeData\n });\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedEdgesData = _lodash2.default.debounce(function () {\n var edgeData = selectedEdges.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedEdgeData: edgeData\n });\n }\n }, SELECT_THRESHOLD);\n\n // /////////////////////////////////////// EVENTS //////////////////////////////////////////\n cy.on('tap', 'node', function (event) {\n var nodeObject = _this2.generateNode(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapNode: nodeObject,\n tapNodeData: nodeObject.data\n });\n }\n });\n\n cy.on('tap', 'edge', function (event) {\n var edgeObject = _this2.generateEdge(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapEdge: edgeObject,\n tapEdgeData: edgeObject.data\n });\n }\n });\n\n cy.on('mouseover', 'node', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverNodeData: event.target.data()\n });\n }\n });\n\n cy.on('mouseover', 'edge', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverEdgeData: event.target.data()\n });\n }\n });\n\n cy.on('select', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.merge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('unselect remove', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.unmerge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('select', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.merge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('unselect remove', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.unmerge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('add remove', function () {\n refreshLayout();\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n id = _props2.id,\n style = _props2.style,\n className = _props2.className,\n elements = _props2.elements,\n stylesheet = _props2.stylesheet,\n layout = _props2.layout,\n pan = _props2.pan,\n zoom = _props2.zoom,\n panningEnabled = _props2.panningEnabled,\n userPanningEnabled = _props2.userPanningEnabled,\n minZoom = _props2.minZoom,\n maxZoom = _props2.maxZoom,\n zoomingEnabled = _props2.zoomingEnabled,\n userZoomingEnabled = _props2.userZoomingEnabled,\n boxSelectionEnabled = _props2.boxSelectionEnabled,\n autoungrabify = _props2.autoungrabify,\n autolock = _props2.autolock,\n autounselectify = _props2.autounselectify;\n\n\n return _react2.default.createElement(_reactCytoscapejs2.default, {\n id: id,\n cy: this.handleCy,\n className: className,\n style: style,\n elements: _reactCytoscapejs2.default.normalizeElements(elements),\n stylesheet: stylesheet,\n layout: layout,\n pan: pan,\n zoom: zoom,\n panningEnabled: panningEnabled,\n userPanningEnabled: userPanningEnabled,\n minZoom: minZoom,\n maxZoom: maxZoom,\n zoomingEnabled: zoomingEnabled,\n userZoomingEnabled: userZoomingEnabled,\n boxSelectionEnabled: boxSelectionEnabled,\n autoungrabify: autoungrabify,\n autolock: autolock,\n autounselectify: autounselectify\n });\n }\n }]);\n\n return Cytoscape;\n}(_react.Component);\n\nCytoscape.propTypes = {\n // HTML attribute props\n\n /**\r\n * The ID used to identify this component in Dash callbacks.\r\n */\n id: _propTypes2.default.string,\n\n /**\r\n * Sets the class name of the element (the value of an element's html\r\n * class attribute).\r\n */\n className: _propTypes2.default.string,\n\n /**\r\n * Add inline styles to the root element.\r\n */\n style: _propTypes2.default.object,\n\n // Dash specific props\n\n /**\r\n * Dash-assigned callback that should be called whenever any of the\r\n * properties change.\r\n */\n setProps: _propTypes2.default.func,\n\n // Common props\n\n /**\r\n * A list of dictionaries representing the elements of the networks.\r\n * 1. Each dictionary describes an element, and specifies its purpose.\r\n * - `group` (string): Either 'nodes' or 'edges'. If not given, it's automatically inferred.\r\n * - `data` (dictionary): Element specific data.\r\n * - `id` (string): Reference to the element, useful for selectors and edges. Randomly assigned if not given.\r\n * - `label` (string): Optional name for the element, useful when `data(label)` is given to a style's `content` or `label`. It is only a convention.\r\n * - `parent` (string): Only for nodes. Optional reference to another node. Needed to create compound nodes.\r\n * - `source` (string): Only for edges. The id of the source node, which is where the edge starts.\r\n * - `target` (string): Only for edges. The id of the target node, where the edge ends.\r\n * - `position` (dictionary): Only for nodes. The position of the node.\r\n * - `x` (number): The x-coordinate of the node.\r\n * - `y` (number): The y-coordinate of the node.\r\n * - `selected` (boolean): If the element is selected upon initialisation.\r\n * - `selectable` (boolean): If the element can be selected.\r\n * - `locked` (boolean): Only for nodes. If the position is immutable.\r\n * - `grabbable` (boolean): Only for nodes. If the node can be grabbed and moved by the user.\r\n * - `classes` (string): Space separated string of class names of the element. Those classes can be selected by a style selector.\r\n *\r\n * 2. The [official Cytoscape.js documentation](http://js.cytoscape.org/#notation/elements-json) offers an extensive overview and examples of element declaration.\r\n */\n elements: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A list of dictionaries representing the styles of the elements.\r\n * 1. Each dictionary requires the following keys:\r\n * - `selector` (string): Which elements you are styling. Generally, you select a group of elements (node, edges, both), a class (that you declare in the element dictionary), or an element by ID.\r\n * - `style` (dictionary): What aspects of the elements you want to modify. This could be the size or color of a node, the shape of an edge arrow, or many more.\r\n *\r\n * 2. Both [the selector string](http://js.cytoscape.org/#selectors) and\r\n * [the style dictionary](http://js.cytoscape.org/#style/node-body) are\r\n * exhaustively documented in the Cytoscape.js docs. Although methods such\r\n * as `cy.elements(...)` and `cy.filter(...)` are not available, the selector\r\n * string syntax stays the same.\r\n */\n stylesheet: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A dictionary specifying how to set the position of the elements in your\r\n * graph. The `'name'` key is required, and indicates which layout (algorithm) to\r\n * use.\r\n * 1. The layouts available by default are:\r\n * - `random`: Randomly assigns positions\r\n * - `preset`: Assigns position based on the `position` key in element dictionaries\r\n * - `circle`: Single-level circle, with optional radius\r\n * - `concentric`: Multi-level circle, with optional radius\r\n * - `grid`: Square grid, optionally with numbers of `rows` and `cols`\r\n * - `breadthfirst`: Tree structure built using BFS, with optional `roots`\r\n * - `cose`: Force-directed physics simulation\r\n *\r\n * 2. Some external layouts are also included. To use them, run\r\n * `dash_cytoscape.load_extra_layouts()` before creating your Dash app. Be careful about\r\n * using the extra layouts when not necessary, since they require supplementary bandwidth\r\n * for loading, which impacts the startup time of the app.\r\n * - `cose-bilkent`: https://github.com/cytoscape/cytoscape.js-cose-bilkent\r\n * - `cola`: https://github.com/cytoscape/cytoscape.js-cola\r\n * - `euler`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `spread`: https://github.com/cytoscape/cytoscape.js-spread\r\n * - `dagre`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `klay`: https://github.com/cytoscape/cytoscape.js-klay\r\n *\r\n * 3. The keys accepted by `layout` vary depending on the algorithm, but some\r\n * keys are accepted by all layouts:\r\n * - `fit` (boolean): Whether to render the nodes in order to fit the canvas.\r\n * - `padding` (number): Padding around the sides of the canvas, if fit is enabled.\r\n * - `animate` (boolean): Whether to animate change in position when the layout changes.\r\n * - `animationDuration` (number): Duration of animation in milliseconds, if enabled.\r\n * - `boundingBox` (dictionary): How to constrain the layout in a specific area. Keys accepted are either `x1, y1, x2, y2` or `x1, y1, w, h`, all of which receive a pixel value.\r\n *\r\n * 4. The complete list of layouts and their accepted options are available\r\n * on the [Cytoscape.js docs](http://js.cytoscape.org/#layouts). For the\r\n * external layouts, the options are listed in the \"API\" section of the\r\n * README.\r\n * Note that certain keys are not supported in Dash since the value is a\r\n * JavaScript function or a callback. Please visit [this issue](https://github.com/plotly/dash-cytoscape/issues/25)\r\n * for more information.\r\n */\n layout: _propTypes2.default.object,\n\n // Viewport Manipulation\n\n /**\r\n * Dictionary indicating the initial panning position of the graph. The\r\n * following keys are accepted:\r\n * - `x` (number): The x-coordinate of the position.\r\n * - `y` (number): The y-coordinate of the position.\r\n */\n pan: _propTypes2.default.object,\n\n /**\r\n * The initial zoom level of the graph. You can set `minZoom` and\r\n * `maxZoom` to set restrictions on the zoom level.\r\n */\n zoom: _propTypes2.default.number,\n\n // Viewport Mutability and gesture Toggling\n /**\r\n * Whether panning the graph is enabled (i.e., the position of the graph is\r\n * mutable overall).\r\n */\n panningEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed to\r\n * pan the graph.\r\n */\n userPanningEnabled: _propTypes2.default.bool,\n\n /**\r\n * A minimum bound on the zoom level of the graph. The viewport can not be\r\n * scaled smaller than this zoom level.\r\n */\n minZoom: _propTypes2.default.number,\n\n /**\r\n * A maximum bound on the zoom level of the graph. The viewport can not be\r\n * scaled larger than this zoom level.\r\n */\n maxZoom: _propTypes2.default.number,\n\n /**\r\n * Whether zooming the graph is enabled (i.e., the zoom level of the graph\r\n * is mutable overall).\r\n */\n zoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed\r\n * to pan the graph.\r\n */\n userZoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether box selection (i.e. drag a box overlay around, and release it\r\n * to select) is enabled. If enabled, the user must taphold to pan the graph.\r\n */\n boxSelectionEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be ungrabified (not grabbable by user) by\r\n * default (if true, overrides individual node state).\r\n */\n autoungrabify: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be locked (not draggable at all) by default\r\n * (if true, overrides individual node state).\r\n */\n autolock: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be unselectified (immutable selection state) by\r\n * default (if true, overrides individual element state).\r\n */\n autounselectify: _propTypes2.default.bool,\n\n /**\r\n * Whether the layout should be refreshed when elements are added or removed.\r\n */\n autoRefreshLayout: _propTypes2.default.bool,\n\n // User Events Props\n\n /**\r\n * The complete node dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Node-specific items:\r\n * - `edgesData` (dictionary)\r\n * - `renderedPosition` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `position` (dictionary)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n *\r\n * 3. Items for compound nodes:\r\n * - `ancestorsData` (dictionary)\r\n * - `childrenData` (dictionary)\r\n * - `descendantsData` (dictionary)\r\n * - `parentData` (dictionary)\r\n * - `siblingsData` (dictionary)\r\n * - `isParent` (boolean)\r\n * - `isChildless` (boolean)\r\n * - `isChild` (boolean)\r\n * - `isOrphan` (boolean)\r\n * - `relativePosition` (dictionary)\r\n */\n tapNode: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you tap or click it. Read-only.\r\n */\n tapNodeData: _propTypes2.default.object,\n\n /**\r\n * The complete edge dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Edge-specific items:\r\n * - `isLoop` (boolean)\r\n * - `isSimple` (boolean)\r\n * - `midpoint` (dictionary)\r\n * - `sourceData` (dictionary)\r\n * - `sourceEndpoint` (dictionary)\r\n * - `targetData` (dictionary)\r\n * - `targetEndpoint` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n */\n tapEdge: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you tap or click it. Read-only.\r\n */\n tapEdgeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you hover over it. Read-only.\r\n */\n mouseoverNodeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you hover over it. Read-only.\r\n */\n mouseoverEdgeData: _propTypes2.default.object,\n\n /**\r\n * The list of data dictionaries of all selected nodes (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedNodeData: _propTypes2.default.array,\n\n /**\r\n * The list of data dictionaries of all selected edges (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedEdgeData: _propTypes2.default.array\n};\n\nCytoscape.defaultProps = {\n style: { width: '600px', height: '600px' },\n layout: { name: 'grid' },\n pan: { x: 0, y: 0 },\n zoom: 1,\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: true,\n userZoomingEnabled: true,\n panningEnabled: true,\n userPanningEnabled: true,\n boxSelectionEnabled: false,\n autolock: false,\n autoungrabify: false,\n autounselectify: false,\n autoRefreshLayout: true\n};\n\nexports.default = Cytoscape;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX2N5dG9zY2FwZS8uL3NyYy9saWIvY29tcG9uZW50cy9DeXRvc2NhcGUucmVhY3QuanM/NjQyYyJdLCJuYW1lcyI6WyJDeXRvc2NhcGUiLCJwcm9wcyIsImhhbmRsZUN5IiwiYmluZCIsIl9oYW5kbGVDeUNhbGxlZCIsImV2ZW50IiwiZWxlIiwidGFyZ2V0IiwiaXNQYXJlbnQiLCJpc0NoaWxkbGVzcyIsImlzQ2hpbGQiLCJpc09ycGhhbiIsInJlbmRlcmVkUG9zaXRpb24iLCJyZWxhdGl2ZVBvc2l0aW9uIiwicGFyZW50Iiwic3R5bGUiLCJlZGdlc0RhdGEiLCJjb25uZWN0ZWRFZGdlcyIsIm1hcCIsImRhdGEiLCJjaGlsZHJlbkRhdGEiLCJjaGlsZHJlbiIsImFuY2VzdG9yc0RhdGEiLCJhbmNlc3RvcnMiLCJkZXNjZW5kYW50c0RhdGEiLCJkZXNjZW5kYW50cyIsInNpYmxpbmdzRGF0YSIsInNpYmxpbmdzIiwidGltZVN0YW1wIiwianNvbiIsImNsYXNzZXMiLCJncmFiYmFibGUiLCJncm91cCIsImxvY2tlZCIsInBvc2l0aW9uIiwic2VsZWN0ZWQiLCJzZWxlY3RhYmxlIiwicGFyZW50RGF0YSIsIm5vZGVPYmplY3QiLCJtaWRwb2ludCIsImlzTG9vcCIsImlzU2ltcGxlIiwic291cmNlRGF0YSIsInNvdXJjZSIsInNvdXJjZUVuZHBvaW50IiwidGFyZ2V0RGF0YSIsInRhcmdldEVuZHBvaW50IiwiZWRnZU9iamVjdCIsImN5IiwiX2N5Iiwid2luZG93IiwiU0VMRUNUX1RIUkVTSE9MRCIsInNlbGVjdGVkTm9kZXMiLCJjb2xsZWN0aW9uIiwic2VsZWN0ZWRFZGdlcyIsInJlZnJlc2hMYXlvdXQiLCJfIiwiZGVib3VuY2UiLCJhdXRvUmVmcmVzaExheW91dCIsImxheW91dCIsInJ1biIsInNlbmRTZWxlY3RlZE5vZGVzRGF0YSIsIm5vZGVEYXRhIiwiZWwiLCJzZXRQcm9wcyIsInNlbGVjdGVkTm9kZURhdGEiLCJzZW5kU2VsZWN0ZWRFZGdlc0RhdGEiLCJlZGdlRGF0YSIsInNlbGVjdGVkRWRnZURhdGEiLCJvbiIsImdlbmVyYXRlTm9kZSIsInRhcE5vZGUiLCJ0YXBOb2RlRGF0YSIsImdlbmVyYXRlRWRnZSIsInRhcEVkZ2UiLCJ0YXBFZGdlRGF0YSIsIm1vdXNlb3Zlck5vZGVEYXRhIiwibW91c2VvdmVyRWRnZURhdGEiLCJtZXJnZSIsInVubWVyZ2UiLCJpZCIsImNsYXNzTmFtZSIsImVsZW1lbnRzIiwic3R5bGVzaGVldCIsInBhbiIsInpvb20iLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwiQ3l0b3NjYXBlQ29tcG9uZW50Iiwibm9ybWFsaXplRWxlbWVudHMiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJvYmplY3QiLCJmdW5jIiwiYXJyYXlPZiIsIm51bWJlciIsImJvb2wiLCJhcnJheSIsImRlZmF1bHRQcm9wcyIsIndpZHRoIiwiaGVpZ2h0IiwibmFtZSIsIngiLCJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUlBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7OytlQVBBOzs7Ozs7QUFVQTs7OztJQUlNQSxTOzs7QUFDRix1QkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLDBIQUNUQSxLQURTOztBQUdmLGNBQUtDLFFBQUwsR0FBZ0IsTUFBS0EsUUFBTCxDQUFjQyxJQUFkLE9BQWhCO0FBQ0EsY0FBS0MsZUFBTCxHQUF1QixLQUF2QjtBQUplO0FBS2xCOzs7O3FDQUVZQyxLLEVBQU87QUFDaEIsZ0JBQU1DLE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBLGdCQUFNQyxXQUFXRixJQUFJRSxRQUFKLEVBQWpCO0FBQUEs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QUFTNkIsb0JBQVVFLE1BL05EOztBQWlPbEI7OztBQUdBOUIsaUJBQWE0QixvQkFBVUUsTUFwT0w7O0FBc09sQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE1QixhQUFTMEIsb0JBQVVFLE1BN1BEOztBQStQbEI7OztBQUdBM0IsaUJBQWF5QixvQkFBVUUsTUFsUUw7O0FBb1FsQjs7O0FBR0ExQix1QkFBbUJ3QixvQkFBVUUsTUF2UVg7O0FBeVFsQjs7O0FBR0F6Qix1QkFBbUJ1QixvQkFBVUUsTUE1UVg7O0FBOFFsQjs7OztBQUlBckMsc0JBQWtCbUMsb0JBQVVPLEtBbFJWOztBQW9SbEI7Ozs7QUFJQXZDLHNCQUFrQmdDLG9CQUFVTztBQXhSVixDQUF0Qjs7QUEyUkEzRyxVQUFVNEcsWUFBVixHQUF5QjtBQUNyQjdGLFdBQU8sRUFBQzhGLE9BQU8sT0FBUixFQUFpQkMsUUFBUSxPQUF6QixFQURjO0FBRXJCbkQsWUFBUSxFQUFDb0QsTUFBTSxNQUFQLEVBRmE7QUFHckIzQixTQUFLLEVBQUM0QixHQUFHLENBQUosRUFBT0MsR0FBRyxDQUFWLEVBSGdCO0FBSXJCNUIsVUFBTSxDQUplO0FBS3JCRyxhQUFTLEtBTFk7QUFNckJDLGFBQVMsSUFOWTtBQU9yQkMsb0JBQWdCLElBUEs7QUFRckJDLHdCQUFvQixJQVJDO0FBU3JCTCxvQkFBZ0IsSUFUSztBQVVyQkMsd0JBQW9CLElBVkM7QUFXckJLLHlCQUFxQixLQVhBO0FBWXJCRSxjQUFVLEtBWlc7QUFhckJELG1CQUFlLEtBYk07QUFjckJFLHFCQUFpQixLQWRJO0FBZXJCckMsdUJBQW1CO0FBZkUsQ0FBekI7O2tCQWtCZTFELFMiLCJmaWxlIjoiLi9zcmMvbGliL2NvbXBvbmVudHMvQ3l0b3NjYXBlLnJlYWN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEphdmFTY3JpcHQgUmVxdWlyZW1lbnRzOiBjeXRvc2NhcGVcclxuICogUmVhY3QuanMgcmVxdWlyZW1lbnRzOiByZWFjdC1jeXRvc2NhcGVqc1xyXG4gKi9cclxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XHJcbmltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAncmVhY3QtY3l0b3NjYXBlanMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuXHJcbi8qKlxyXG5BIENvbXBvbmVudCBMaWJyYXJ5IGZvciBEYXNoIGFpbWVkIGF0IGZhY2lsaXRhdGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb24gaW5cclxuUHl0aG9uLCB3cmFwcGVkIGFyb3VuZCBbQ3l0b3NjYXBlLmpzXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8pLlxyXG4gKi9cclxuY2xhc3MgQ3l0b3NjYXBlIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZUN5ID0gdGhpcy5oYW5kbGVDeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUN5Q2FsbGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVOb2RlKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZWxlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICBjb25zdCBpc1BhcmVudCA9IGVsZS5pc1BhcmVudCgpLFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyA9IGVsZS5pc0NoaWxkbGVzcygpLFxyXG4gICAgICAgICAgICBpc0NoaWxkID0gZWxlLmlzQ2hpbGQoKSxcclxuICAgICAgICAgICAgaXNPcnBoYW4gPSBlbGUuaXNPcnBoYW4oKSxcclxuICAgICAgICAgICAgcmVuZGVyZWRQb3NpdGlvbiA9IGVsZS5yZW5kZXJlZFBvc2l0aW9uKCksXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSBlbGUucmVsYXRpdmVQb3NpdGlvbigpLFxyXG4gICAgICAgICAgICBwYXJlbnQgPSBlbGUucGFyZW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCk7XHJcblxyXG4gICAgICAgIC8vIFRyaW0gZG93biB0aGUgZWxlbWVudCBvYmplY3RzIHRvIG9ubHkgdGhlIGRhdGEgY29udGFpbmVkXHJcbiAgICAgICAgY29uc3QgZWRnZXNEYXRhID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2hpbGRyZW5EYXRhID0gZWxlLmNoaWxkcmVuKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYW5jZXN0b3JzRGF0YSA9IGVsZS5hbmNlc3RvcnMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBkZXNjZW5kYW50c0RhdGEgPSBlbGUuZGVzY2VuZGFudHMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEgPSBlbGUuc2libGluZ3MoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBwb3NpdGlvbixcclxuICAgICAgICAgICAgc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGVcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmVudERhdGE7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gcGFyZW50LmRhdGEoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGVzIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgZWRnZXNEYXRhLFxyXG4gICAgICAgICAgICByZW5kZXJlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICAgICAgLy8gQ29tcG91bmQgTm9kZXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIGFuY2VzdG9yc0RhdGEsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuRGF0YSxcclxuICAgICAgICAgICAgZGVzY2VuZGFudHNEYXRhLFxyXG4gICAgICAgICAgICBwYXJlbnREYXRhLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEsXHJcbiAgICAgICAgICAgIGlzUGFyZW50LFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyxcclxuICAgICAgICAgICAgaXNDaGlsZCxcclxuICAgICAgICAgICAgaXNPcnBoYW4sXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vIFN0eWxpbmdcclxuICAgICAgICAgICAgc3R5bGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBub2RlT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZW5lcmF0ZUVkZ2UoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG1pZHBvaW50ID0gZWxlLm1pZHBvaW50KCksXHJcbiAgICAgICAgICAgIGlzTG9vcCA9IGVsZS5pc0xvb3AoKSxcclxuICAgICAgICAgICAgaXNTaW1wbGUgPSBlbGUuaXNTaW1wbGUoKSxcclxuICAgICAgICAgICAgc291cmNlRGF0YSA9IGVsZS5zb3VyY2UoKS5kYXRhKCksXHJcbiAgICAgICAgICAgIHNvdXJjZUVuZHBvaW50ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCksXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEgPSBlbGUudGFyZ2V0KCkuZGF0YSgpLFxyXG4gICAgICAgICAgICB0YXJnZXRFbmRwb2ludCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRnZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgLy8gRWRnZXMgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICBpc0xvb3AsXHJcbiAgICAgICAgICAgIGlzU2ltcGxlLFxyXG4gICAgICAgICAgICBtaWRwb2ludCxcclxuICAgICAgICAgICAgc291cmNlRGF0YSxcclxuICAgICAgICAgICAgc291cmNlRW5kcG9pbnQsXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEsXHJcbiAgICAgICAgICAgIHRhcmdldEVuZHBvaW50LFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkLFxyXG4gICAgICAgICAgICAvLyBTdHlsaW5nXHJcbiAgICAgICAgICAgIHN0eWxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVkZ2VPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ3koY3kpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY3kgcG9pbnRlciBoYXMgbm90IGJlZW4gbW9kaWZpZWQsIGFuZCBoYW5kbGVDeSBoYXMgYWxyZWFkeVxyXG4gICAgICAgIC8vIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhhbiB3ZSBkb24ndCBydW4gdGhpcyBmdW5jdGlvbi5cclxuICAgICAgICBpZiAoY3kgPT09IHRoaXMuX2N5ICYmIHRoaXMuX2hhbmRsZUN5Q2FsbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3kgPSBjeTtcclxuICAgICAgICB3aW5kb3cuY3kgPSBjeTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVDeUNhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ09OU1RBTlRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgY29uc3QgU0VMRUNUX1RIUkVTSE9MRCA9IDEwMDtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEVkZ2VzID0gY3kuY29sbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hMYXlvdXQgPSBfLmRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFJlZnJlc2ggTGF5b3V0IGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYXV0b1JlZnJlc2hMYXlvdXQsXHJcbiAgICAgICAgICAgICAgICBsYXlvdXRcclxuICAgICAgICAgICAgfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b1JlZnJlc2hMYXlvdXQpIHtcclxuICAgICAgICAgICAgICAgIGN5LmxheW91dChsYXlvdXQpLnJ1bigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkTm9kZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcGV0aXRpdmVseSBjYWxsZWQgZXZlcnkgdGltZSBhIG5vZGUgaXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgb3IgdW5zZWxlY3RlZCwgYnV0IGtlZXBzIGJlaW5nIGRlYm91bmNlZCBpZiBpdCBpcyBjYWxsZWQgYWdhaW5cclxuICAgICAgICAgICAgd2l0aGluIDEwMCBtcyAoZ2l2ZW4gYnkgU0VMRUNUX1RIUkVTSE9MRCkuIEVmZmVjdGl2ZWx5LCBpdCBvbmx5XHJcbiAgICAgICAgICAgIHJ1bnMgd2hlbiBhbGwgdGhlIG5vZGVzIGhhdmUgYmVlbiBjb3JyZWN0bHkgc2VsZWN0ZWQvdW5zZWxlY3RlZCBhbmRcclxuICAgICAgICAgICAgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3RlZE5vZGVzIGNvbGxlY3Rpb24sIGFuZCB0aGVuIHVwZGF0ZXNcclxuICAgICAgICAgICAgdGhlIHNlbGVjdGVkTm9kZURhdGEgcHJvcC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhID0gc2VsZWN0ZWROb2Rlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWROb2RlRGF0YTogbm9kZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkRWRnZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VEYXRhID0gc2VsZWN0ZWRFZGdlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFZGdlRGF0YTogZWRnZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVWRU5UUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICBjeS5vbigndGFwJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB0aGlzLmdlbmVyYXRlTm9kZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2V0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuc2V0UHJvcHMoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcE5vZGU6IG5vZGVPYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwTm9kZURhdGE6IG5vZGVPYmplY3QuZGF0YVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3RhcCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGdlT2JqZWN0ID0gdGhpcy5nZW5lcmF0ZUVkZ2UoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICB0YXBFZGdlOiBlZGdlT2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcEVkZ2VEYXRhOiBlZGdlT2JqZWN0LmRhdGFcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGN5Lm9uKCdtb3VzZW92ZXInLCAnbm9kZScsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXJOb2RlRGF0YTogZXZlbnQudGFyZ2V0LmRhdGEoKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbignbW91c2VvdmVyJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyRWRnZURhdGE6IGV2ZW50LnRhcmdldC5kYXRhKClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdub2RlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZE5vZGVzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWROb2Rlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZEVkZ2VzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZEVkZ2VzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRWRnZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWRFZGdlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ2FkZCByZW1vdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlZnJlc2hMYXlvdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgc3R5bGUsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcclxuICAgICAgICAgICAgLy8gQ29tbW9uIHByb3BzXHJcbiAgICAgICAgICAgIGVsZW1lbnRzLFxyXG4gICAgICAgICAgICBzdHlsZXNoZWV0LFxyXG4gICAgICAgICAgICBsYXlvdXQsXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE1hbmlwdWxhdGlvblxyXG4gICAgICAgICAgICBwYW4sXHJcbiAgICAgICAgICAgIHpvb20sXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE11dGFiaWxpdHkgYW5kIGdlc3R1cmUgVG9nZ2xpbmdcclxuICAgICAgICAgICAgcGFubmluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJQYW5uaW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgbWluWm9vbSxcclxuICAgICAgICAgICAgbWF4Wm9vbSxcclxuICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJab29taW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZCxcclxuICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeSxcclxuICAgICAgICAgICAgYXV0b2xvY2ssXHJcbiAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeVxyXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8Q3l0b3NjYXBlQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgICAgICBjeT17dGhpcy5oYW5kbGVDeX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxyXG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e0N5dG9zY2FwZUNvbXBvbmVudC5ub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cyl9XHJcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0PXtzdHlsZXNoZWV0fVxyXG4gICAgICAgICAgICAgICAgbGF5b3V0PXtsYXlvdXR9XHJcbiAgICAgICAgICAgICAgICBwYW49e3Bhbn1cclxuICAgICAgICAgICAgICAgIHpvb209e3pvb219XHJcbiAgICAgICAgICAgICAgICBwYW5uaW5nRW5hYmxlZD17cGFubmluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICB1c2VyUGFubmluZ0VuYWJsZWQ9e3VzZXJQYW5uaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgICAgIG1pblpvb209e21pblpvb219XHJcbiAgICAgICAgICAgICAgICBtYXhab29tPXttYXhab29tfVxyXG4gICAgICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQ9e3pvb21pbmdFbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgdXNlclpvb21pbmdFbmFibGVkPXt1c2VyWm9vbWluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICBib3hTZWxlY3Rpb25FbmFibGVkPXtib3hTZWxlY3Rpb25FbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeT17YXV0b3VuZ3JhYmlmeX1cclxuICAgICAgICAgICAgICAgIGF1dG9sb2NrPXthdXRvbG9ja31cclxuICAgICAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeT17YXV0b3Vuc2VsZWN0aWZ5fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuXHJcbkN5dG9zY2FwZS5wcm9wVHlwZXMgPSB7XHJcbiAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjb21wb25lbnQgaW4gRGFzaCBjYWxsYmFja3MuXHJcbiAgICAgKi9cclxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZWxlbWVudCAodGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBodG1sXHJcbiAgICAgKiBjbGFzcyBhdHRyaWJ1dGUpLlxyXG4gICAgICovXHJcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgaW5saW5lIHN0eWxlcyB0byB0aGUgcm9vdCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvLyBEYXNoIHNwZWNpZmljIHByb3BzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXNoLWFzc2lnbmVkIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgb2YgdGhlXHJcbiAgICAgKiBwcm9wZXJ0aWVzIGNoYW5nZS5cclxuICAgICAqL1xyXG4gICAgc2V0UHJvcHM6IFByb3BUeXBlcy5mdW5jLFxyXG5cclxuICAgIC8vIENvbW1vbiBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBuZXR3b3Jrcy5cclxuICAgICAqICAgICAxLiBFYWNoIGRpY3Rpb25hcnkgZGVzY3JpYmVzIGFuIGVsZW1lbnQsIGFuZCBzcGVjaWZpZXMgaXRzIHB1cnBvc2UuXHJcbiAgICAgKiAgICAgICAgIC0gYGdyb3VwYCAoc3RyaW5nKTogRWl0aGVyICdub2Rlcycgb3IgJ2VkZ2VzJy4gSWYgbm90IGdpdmVuLCBpdCdzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KTogRWxlbWVudCBzcGVjaWZpYyBkYXRhLlxyXG4gICAgICogICAgICAgICAgICAgIC0gYGlkYCAoc3RyaW5nKTogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50LCB1c2VmdWwgZm9yIHNlbGVjdG9ycyBhbmQgZWRnZXMuIFJhbmRvbWx5IGFzc2lnbmVkIGlmIG5vdCBnaXZlbi5cclxuICAgICAqICAgICAgICAgICAgICAtIGBsYWJlbGAgKHN0cmluZyk6IE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBlbGVtZW50LCB1c2VmdWwgd2hlbiBgZGF0YShsYWJlbClgIGlzIGdpdmVuIHRvIGEgc3R5bGUncyBgY29udGVudGAgb3IgYGxhYmVsYC4gSXQgaXMgb25seSBhIGNvbnZlbnRpb24uXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgcGFyZW50YCAoc3RyaW5nKTogT25seSBmb3Igbm9kZXMuIE9wdGlvbmFsIHJlZmVyZW5jZSB0byBhbm90aGVyIG5vZGUuIE5lZWRlZCB0byBjcmVhdGUgY29tcG91bmQgbm9kZXMuXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgc291cmNlYCAoc3RyaW5nKTogT25seSBmb3IgZWRnZXMuIFRoZSBpZCBvZiB0aGUgc291cmNlIG5vZGUsIHdoaWNoIGlzIHdoZXJlIHRoZSBlZGdlIHN0YXJ0cy5cclxuICAgICAqICAgICAgICAgICAgICAtIGB0YXJnZXRgIChzdHJpbmcpOiBPbmx5IGZvciBlZGdlcy4gVGhlIGlkIG9mIHRoZSB0YXJnZXQgbm9kZSwgd2hlcmUgdGhlIGVkZ2UgZW5kcy5cclxuICAgICAqICAgICAgICAgLSBgcG9zaXRpb25gIChkaWN0aW9uYXJ5KTogT25seSBmb3Igbm9kZXMuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB4YCAobnVtYmVyKTogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0ZWRgIChib29sZWFuKTogSWYgdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQgdXBvbiBpbml0aWFsaXNhdGlvbi5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pOiBJZiB0aGUgZWxlbWVudCBjYW4gYmUgc2VsZWN0ZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pOiBPbmx5IGZvciBub2Rlcy4gSWYgdGhlIHBvc2l0aW9uIGlzIGltbXV0YWJsZS5cclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbik6IE9ubHkgZm9yIG5vZGVzLiBJZiB0aGUgbm9kZSBjYW4gYmUgZ3JhYmJlZCBhbmQgbW92ZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpOiBTcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGNsYXNzIG5hbWVzIG9mIHRoZSBlbGVtZW50LiBUaG9zZSBjbGFzc2VzIGNhbiBiZSBzZWxlY3RlZCBieSBhIHN0eWxlIHNlbGVjdG9yLlxyXG4gICAgICpcclxuICAgICAqICAgICAyLiBUaGUgW29mZmljaWFsIEN5dG9zY2FwZS5qcyBkb2N1bWVudGF0aW9uXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbm90YXRpb24vZWxlbWVudHMtanNvbikgb2ZmZXJzIGFuIGV4dGVuc2l2ZSBvdmVydmlldyBhbmQgZXhhbXBsZXMgb2YgZWxlbWVudCBkZWNsYXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZWxlbWVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIHN0eWxlcyBvZiB0aGUgZWxlbWVudHMuXHJcbiAgICAgKiAgICAgMS4gRWFjaCBkaWN0aW9uYXJ5IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcga2V5czpcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0b3JgIChzdHJpbmcpOiBXaGljaCBlbGVtZW50cyB5b3UgYXJlIHN0eWxpbmcuIEdlbmVyYWxseSwgeW91IHNlbGVjdCBhIGdyb3VwIG9mIGVsZW1lbnRzIChub2RlLCBlZGdlcywgYm90aCksIGEgY2xhc3MgKHRoYXQgeW91IGRlY2xhcmUgaW4gdGhlIGVsZW1lbnQgZGljdGlvbmFyeSksIG9yIGFuIGVsZW1lbnQgYnkgSUQuXHJcbiAgICAgKiAgICAgICAgIC0gYHN0eWxlYCAoZGljdGlvbmFyeSk6IFdoYXQgYXNwZWN0cyBvZiB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gbW9kaWZ5LiBUaGlzIGNvdWxkIGJlIHRoZSBzaXplIG9yIGNvbG9yIG9mIGEgbm9kZSwgdGhlIHNoYXBlIG9mIGFuIGVkZ2UgYXJyb3csIG9yIG1hbnkgbW9yZS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gQm90aCBbdGhlIHNlbGVjdG9yIHN0cmluZ10oaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3NlbGVjdG9ycykgYW5kXHJcbiAgICAgKiAgICAgW3RoZSBzdHlsZSBkaWN0aW9uYXJ5XShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGUvbm9kZS1ib2R5KSBhcmVcclxuICAgICAqICAgICBleGhhdXN0aXZlbHkgZG9jdW1lbnRlZCBpbiB0aGUgQ3l0b3NjYXBlLmpzIGRvY3MuIEFsdGhvdWdoIG1ldGhvZHMgc3VjaFxyXG4gICAgICogICAgIGFzIGBjeS5lbGVtZW50cyguLi4pYCBhbmQgYGN5LmZpbHRlciguLi4pYCBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIHNlbGVjdG9yXHJcbiAgICAgKiAgICAgc3RyaW5nIHN5bnRheCBzdGF5cyB0aGUgc2FtZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVzaGVldDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGRpY3Rpb25hcnkgc3BlY2lmeWluZyBob3cgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4geW91clxyXG4gICAgICogZ3JhcGguIFRoZSBgJ25hbWUnYCBrZXkgaXMgcmVxdWlyZWQsIGFuZCBpbmRpY2F0ZXMgd2hpY2ggbGF5b3V0IChhbGdvcml0aG0pIHRvXHJcbiAgICAgKiB1c2UuXHJcbiAgICAgKiAgICAgMS4gVGhlIGxheW91dHMgYXZhaWxhYmxlIGJ5IGRlZmF1bHQgYXJlOlxyXG4gICAgICogICAgICAgICAtIGByYW5kb21gOiBSYW5kb21seSBhc3NpZ25zIHBvc2l0aW9uc1xyXG4gICAgICogICAgICAgICAtIGBwcmVzZXRgOiBBc3NpZ25zIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBgcG9zaXRpb25gIGtleSBpbiBlbGVtZW50IGRpY3Rpb25hcmllc1xyXG4gICAgICogICAgICAgICAtIGBjaXJjbGVgOiBTaW5nbGUtbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBjb25jZW50cmljYDogTXVsdGktbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBncmlkYDogU3F1YXJlIGdyaWQsIG9wdGlvbmFsbHkgd2l0aCBudW1iZXJzIG9mIGByb3dzYCBhbmQgYGNvbHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGJyZWFkdGhmaXJzdGA6IFRyZWUgc3RydWN0dXJlIGJ1aWx0IHVzaW5nIEJGUywgd2l0aCBvcHRpb25hbCBgcm9vdHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGNvc2VgOiBGb3JjZS1kaXJlY3RlZCBwaHlzaWNzIHNpbXVsYXRpb25cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gU29tZSBleHRlcm5hbCBsYXlvdXRzIGFyZSBhbHNvIGluY2x1ZGVkLiBUbyB1c2UgdGhlbSwgcnVuXHJcbiAgICAgKiAgICAgYGRhc2hfY3l0b3NjYXBlLmxvYWRfZXh0cmFfbGF5b3V0cygpYCBiZWZvcmUgY3JlYXRpbmcgeW91ciBEYXNoIGFwcC4gQmUgY2FyZWZ1bCBhYm91dFxyXG4gICAgICogICAgIHVzaW5nIHRoZSBleHRyYSBsYXlvdXRzIHdoZW4gbm90IG5lY2Vzc2FyeSwgc2luY2UgdGhleSByZXF1aXJlIHN1cHBsZW1lbnRhcnkgYmFuZHdpZHRoXHJcbiAgICAgKiAgICAgZm9yIGxvYWRpbmcsIHdoaWNoIGltcGFjdHMgdGhlIHN0YXJ0dXAgdGltZSBvZiB0aGUgYXBwLlxyXG4gICAgICogICAgICAgICAtIGBjb3NlLWJpbGtlbnRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1jb3NlLWJpbGtlbnRcclxuICAgICAqICAgICAgICAgLSBgY29sYWA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWNvbGFcclxuICAgICAqICAgICAgICAgLSBgZXVsZXJgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBzcHJlYWRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1zcHJlYWRcclxuICAgICAqICAgICAgICAgLSBgZGFncmVgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBrbGF5YDogaHR0cHM6Ly9naXRodWIuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUuanMta2xheVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBUaGUga2V5cyBhY2NlcHRlZCBieSBgbGF5b3V0YCB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgYWxnb3JpdGhtLCBidXQgc29tZVxyXG4gICAgICogICAgIGtleXMgYXJlIGFjY2VwdGVkIGJ5IGFsbCBsYXlvdXRzOlxyXG4gICAgICogICAgICAgICAtIGBmaXRgIChib29sZWFuKTogV2hldGhlciB0byByZW5kZXIgdGhlIG5vZGVzIGluIG9yZGVyIHRvIGZpdCB0aGUgY2FudmFzLlxyXG4gICAgICogICAgICAgICAtIGBwYWRkaW5nYCAobnVtYmVyKTogUGFkZGluZyBhcm91bmQgdGhlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGlmIGZpdCBpcyBlbmFibGVkLlxyXG4gICAgICogICAgICAgICAtIGBhbmltYXRlYCAoYm9vbGVhbik6IFdoZXRoZXIgdG8gYW5pbWF0ZSBjaGFuZ2UgaW4gcG9zaXRpb24gd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMuXHJcbiAgICAgKiAgICAgICAgIC0gYGFuaW1hdGlvbkR1cmF0aW9uYCAobnVtYmVyKTogRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgaWYgZW5hYmxlZC5cclxuICAgICAqICAgICAgICAgLSBgYm91bmRpbmdCb3hgIChkaWN0aW9uYXJ5KTogSG93IHRvIGNvbnN0cmFpbiB0aGUgbGF5b3V0IGluIGEgc3BlY2lmaWMgYXJlYS4gS2V5cyBhY2NlcHRlZCBhcmUgZWl0aGVyIGB4MSwgeTEsIHgyLCB5MmAgb3IgYHgxLCB5MSwgdywgaGAsIGFsbCBvZiB3aGljaCByZWNlaXZlIGEgcGl4ZWwgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDQuIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGxheW91dHMgYW5kIHRoZWlyIGFjY2VwdGVkIG9wdGlvbnMgYXJlIGF2YWlsYWJsZVxyXG4gICAgICogICAgIG9uIHRoZSBbQ3l0b3NjYXBlLmpzIGRvY3NdKGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNsYXlvdXRzKS4gRm9yIHRoZVxyXG4gICAgICogICAgIGV4dGVybmFsIGxheW91dHMsIHRoZSBvcHRpb25zIGFyZSBsaXN0ZWQgaW4gdGhlIFwiQVBJXCIgc2VjdGlvbiBvZiB0aGVcclxuICAgICAqICAgICBSRUFETUUuXHJcbiAgICAgKiAgICAgTm90ZSB0aGF0IGNlcnRhaW4ga2V5cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBEYXNoIHNpbmNlIHRoZSB2YWx1ZSBpcyBhXHJcbiAgICAgKiAgICAgSmF2YVNjcmlwdCBmdW5jdGlvbiBvciBhIGNhbGxiYWNrLiBQbGVhc2UgdmlzaXQgW3RoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvZGFzaC1jeXRvc2NhcGUvaXNzdWVzLzI1KVxyXG4gICAgICogICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLy8gVmlld3BvcnQgTWFuaXB1bGF0aW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWN0aW9uYXJ5IGluZGljYXRpbmcgdGhlIGluaXRpYWwgcGFubmluZyBwb3NpdGlvbiBvZiB0aGUgZ3JhcGguIFRoZVxyXG4gICAgICogZm9sbG93aW5nIGtleXMgYXJlIGFjY2VwdGVkOlxyXG4gICAgICogICAgIC0gYHhgIChudW1iZXIpOiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cclxuICAgICAqICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHBhbjogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBZb3UgY2FuIHNldCBgbWluWm9vbWAgYW5kXHJcbiAgICAgKiBgbWF4Wm9vbWAgdG8gc2V0IHJlc3RyaWN0aW9ucyBvbiB0aGUgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgem9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvLyBWaWV3cG9ydCBNdXRhYmlsaXR5IGFuZCBnZXN0dXJlIFRvZ2dsaW5nXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgcGFubmluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpc1xyXG4gICAgICogbXV0YWJsZSBvdmVyYWxsKS5cclxuICAgICAqL1xyXG4gICAgcGFubmluZ0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1c2VyIGV2ZW50cyAoZS5nLiBkcmFnZ2luZyB0aGUgZ3JhcGggYmFja2dyb3VuZCkgYXJlIGFsbG93ZWQgdG9cclxuICAgICAqIHBhbiB0aGUgZ3JhcGguXHJcbiAgICAgKi9cclxuICAgIHVzZXJQYW5uaW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1pbmltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIHNtYWxsZXIgdGhhbiB0aGlzIHpvb20gbGV2ZWwuXHJcbiAgICAgKi9cclxuICAgIG1pblpvb206IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1heGltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIGxhcmdlciB0aGFuIHRoaXMgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgbWF4Wm9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgem9vbWluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoXHJcbiAgICAgKiBpcyBtdXRhYmxlIG92ZXJhbGwpLlxyXG4gICAgICovXHJcbiAgICB6b29taW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHVzZXIgZXZlbnRzIChlLmcuIGRyYWdnaW5nIHRoZSBncmFwaCBiYWNrZ3JvdW5kKSBhcmUgYWxsb3dlZFxyXG4gICAgICogdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgYm94IHNlbGVjdGlvbiAoaS5lLiBkcmFnIGEgYm94IG92ZXJsYXkgYXJvdW5kLCBhbmQgcmVsZWFzZSBpdFxyXG4gICAgICogdG8gc2VsZWN0KSBpcyBlbmFibGVkLiBJZiBlbmFibGVkLCB0aGUgdXNlciBtdXN0IHRhcGhvbGQgdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bmdyYWJpZmllZCAobm90IGdyYWJiYWJsZSBieSB1c2VyKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgbm9kZSBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bmdyYWJpZnk6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBub2RlcyBzaG91bGQgYmUgbG9ja2VkIChub3QgZHJhZ2dhYmxlIGF0IGFsbCkgYnkgZGVmYXVsdFxyXG4gICAgICogKGlmIHRydWUsIG92ZXJyaWRlcyBpbmRpdmlkdWFsIG5vZGUgc3RhdGUpLlxyXG4gICAgICovXHJcbiAgICBhdXRvbG9jazogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bnNlbGVjdGlmaWVkIChpbW11dGFibGUgc2VsZWN0aW9uIHN0YXRlKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgZWxlbWVudCBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bnNlbGVjdGlmeTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGJlIHJlZnJlc2hlZCB3aGVuIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxyXG4gICAgICovXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLy8gVXNlciBFdmVudHMgUHJvcHNcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb21wbGV0ZSBub2RlIGRpY3Rpb25hcnkgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDEuIE5vZGUtc3BlY2lmaWMgaXRlbXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGVkZ2VzRGF0YWAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbmRlcmVkUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0aW1lU3RhbXBgIChudW1iZXIpXHJcbiAgICAgKlxyXG4gICAgICogICAgIDIuIEdlbmVyYWwgaXRlbXMgKGZvciBhbGwgZWxlbWVudHMpOlxyXG4gICAgICogICAgICAgICAtIGBjbGFzc2VzYCAoc3RyaW5nKVxyXG4gICAgICogICAgICAgICAtIGBkYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgZ3JvdXBgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHBvc2l0aW9uYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBJdGVtcyBmb3IgY29tcG91bmQgbm9kZXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGFuY2VzdG9yc0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBjaGlsZHJlbkRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBkZXNjZW5kYW50c0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBwYXJlbnREYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2libGluZ3NEYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgaXNQYXJlbnRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc0NoaWxkbGVzc2AgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYGlzQ2hpbGRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc09ycGhhbmAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbGF0aXZlUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBOb2RlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhIG5vZGUgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHRhcE5vZGVEYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbXBsZXRlIGVkZ2UgZGljdGlvbmFyeSByZXR1cm5lZCB3aGVuIHlvdSB0YXAgb3IgY2xpY2sgaXQuIFJlYWQtb25seS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMS4gRWRnZS1zcGVjaWZpYyBpdGVtczpcclxuICAgICAqICAgICAgICAgLSBgaXNMb29wYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgaXNTaW1wbGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBtaWRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHNvdXJjZURhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBzb3VyY2VFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRhcmdldERhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0YXJnZXRFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRpbWVTdGFtcGAgKG51bWJlcilcclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gR2VuZXJhbCBpdGVtcyAoZm9yIGFsbCBlbGVtZW50cyk6XHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBncmFiYmFibGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBncm91cGAgKHN0cmluZylcclxuICAgICAqICAgICAgICAgLSBgbG9ja2VkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhbiBlZGdlIHJldHVybmVkIHdoZW4geW91IHRhcCBvciBjbGljayBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIGRpY3Rpb25hcnkgb2YgYSBub2RlIHJldHVybmVkIHdoZW4geW91IGhvdmVyIG92ZXIgaXQuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgbW91c2VvdmVyTm9kZURhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBkaWN0aW9uYXJ5IG9mIGFuIGVkZ2UgcmV0dXJuZWQgd2hlbiB5b3UgaG92ZXIgb3ZlciBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBtb3VzZW92ZXJFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsaXN0IG9mIGRhdGEgZGljdGlvbmFyaWVzIG9mIGFsbCBzZWxlY3RlZCBub2RlcyAoZS5nLiB1c2luZ1xyXG4gICAgICogU2hpZnQrQ2xpY2sgdG8gc2VsZWN0IG11bHRpcGxlIG5vZGVzLCBvciBTaGlmdCtEcmFnIHRvIHVzZSBib3ggc2VsZWN0aW9uKS4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBzZWxlY3RlZE5vZGVEYXRhOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlzdCBvZiBkYXRhIGRpY3Rpb25hcmllcyBvZiBhbGwgc2VsZWN0ZWQgZWRnZXMgKGUuZy4gdXNpbmdcclxuICAgICAqIFNoaWZ0K0NsaWNrIHRvIHNlbGVjdCBtdWx0aXBsZSBub2Rlcywgb3IgU2hpZnQrRHJhZyB0byB1c2UgYm94IHNlbGVjdGlvbikuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgc2VsZWN0ZWRFZGdlRGF0YTogUHJvcFR5cGVzLmFycmF5XHJcbn07XHJcblxyXG5DeXRvc2NhcGUuZGVmYXVsdFByb3BzID0ge1xyXG4gICAgc3R5bGU6IHt3aWR0aDogJzYwMHB4JywgaGVpZ2h0OiAnNjAwcHgnfSxcclxuICAgIGxheW91dDoge25hbWU6ICdncmlkJ30sXHJcbiAgICBwYW46IHt4OiAwLCB5OiAwfSxcclxuICAgIHpvb206IDEsXHJcbiAgICBtaW5ab29tOiAxZS01MCxcclxuICAgIG1heFpvb206IDFlNTAsXHJcbiAgICB6b29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHVzZXJab29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZmFsc2UsXHJcbiAgICBhdXRvbG9jazogZmFsc2UsXHJcbiAgICBhdXRvdW5ncmFiaWZ5OiBmYWxzZSxcclxuICAgIGF1dG91bnNlbGVjdGlmeTogZmFsc2UsXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogdHJ1ZVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3l0b3NjYXBlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/components/Cytoscape.react.js\n"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactCytoscapejs = __webpack_require__(/*! react-cytoscapejs */ \"./node_modules/react-cytoscapejs/dist/react-cytoscape.js\");\n\nvar _reactCytoscapejs2 = _interopRequireDefault(_reactCytoscapejs);\n\nvar _lodash = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\n\nvar _lodash2 = _interopRequireDefault(_lodash);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\r\n * JavaScript Requirements: cytoscape\r\n * React.js requirements: react-cytoscapejs\r\n */\n\n\n/**\r\nA Component Library for Dash aimed at facilitating network visualization in\r\nPython, wrapped around [Cytoscape.js](http://js.cytoscape.org/).\r\n */\nvar Cytoscape = function (_Component) {\n _inherits(Cytoscape, _Component);\n\n function Cytoscape(props) {\n _classCallCheck(this, Cytoscape);\n\n var _this = _possibleConstructorReturn(this, (Cytoscape.__proto__ || Object.getPrototypeOf(Cytoscape)).call(this, props));\n\n _this.handleCy = _this.handleCy.bind(_this);\n _this._handleCyCalled = false;\n return _this;\n }\n\n _createClass(Cytoscape, [{\n key: 'generateNode',\n value: function generateNode(event) {\n var ele = event.target;\n\n var isParent = ele.isParent(),\n isChildless = ele.isChildless(),\n isChild = ele.isChild(),\n isOrphan = ele.isOrphan(),\n renderedPosition = ele.renderedPosition(),\n relativePosition = ele.relativePosition(),\n parent = ele.parent(),\n style = ele.style();\n\n // Trim down the element objects to only the data contained\n var edgesData = ele.connectedEdges().map(function (ele) {\n return ele.data();\n }),\n childrenData = ele.children().map(function (ele) {\n return ele.data();\n }),\n ancestorsData = ele.ancestors().map(function (ele) {\n return ele.data();\n }),\n descendantsData = ele.descendants().map(function (ele) {\n return ele.data();\n }),\n siblingsData = ele.siblings().map(function (ele) {\n return ele.data();\n });\n\n var timeStamp = event.timeStamp;\n\n var _ele$json = ele.json(),\n classes = _ele$json.classes,\n data = _ele$json.data,\n grabbable = _ele$json.grabbable,\n group = _ele$json.group,\n locked = _ele$json.locked,\n position = _ele$json.position,\n selected = _ele$json.selected,\n selectable = _ele$json.selectable;\n\n var parentData = void 0;\n if (parent) {\n parentData = parent.data();\n } else {\n parentData = null;\n }\n\n var nodeObject = {\n // Nodes attributes\n edgesData: edgesData,\n renderedPosition: renderedPosition,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n position: position,\n selectable: selectable,\n selected: selected,\n // Compound Nodes additional attributes\n ancestorsData: ancestorsData,\n childrenData: childrenData,\n descendantsData: descendantsData,\n parentData: parentData,\n siblingsData: siblingsData,\n isParent: isParent,\n isChildless: isChildless,\n isChild: isChild,\n isOrphan: isOrphan,\n relativePosition: relativePosition,\n // Styling\n style: style\n };\n return nodeObject;\n }\n }, {\n key: 'generateEdge',\n value: function generateEdge(event) {\n var ele = event.target;\n\n var midpoint = ele.midpoint(),\n isLoop = ele.isLoop(),\n isSimple = ele.isSimple(),\n sourceData = ele.source().data(),\n sourceEndpoint = ele.sourceEndpoint(),\n style = ele.style(),\n targetData = ele.target().data(),\n targetEndpoint = ele.targetEndpoint();\n\n var timeStamp = event.timeStamp;\n\n var _ele$json2 = ele.json(),\n classes = _ele$json2.classes,\n data = _ele$json2.data,\n grabbable = _ele$json2.grabbable,\n group = _ele$json2.group,\n locked = _ele$json2.locked,\n selectable = _ele$json2.selectable,\n selected = _ele$json2.selected;\n\n var edgeObject = {\n // Edges attributes\n isLoop: isLoop,\n isSimple: isSimple,\n midpoint: midpoint,\n sourceData: sourceData,\n sourceEndpoint: sourceEndpoint,\n targetData: targetData,\n targetEndpoint: targetEndpoint,\n timeStamp: timeStamp,\n // From ele.json()\n classes: classes,\n data: data,\n grabbable: grabbable,\n group: group,\n locked: locked,\n selectable: selectable,\n selected: selected,\n // Styling\n style: style\n };\n\n return edgeObject;\n }\n }, {\n key: 'handleCy',\n value: function handleCy(cy) {\n var _this2 = this;\n\n // If the cy pointer has not been modified, and handleCy has already\n // been called before, than we don't run this function.\n if (cy === this._cy && this._handleCyCalled) {\n return;\n }\n this._cy = cy;\n window.cy = cy;\n this._handleCyCalled = true;\n\n // ///////////////////////////////////// CONSTANTS /////////////////////////////////////////\n var SELECT_THRESHOLD = 100;\n\n var selectedNodes = cy.collection();\n var selectedEdges = cy.collection();\n\n // ///////////////////////////////////// FUNCTIONS /////////////////////////////////////////\n var refreshLayout = _lodash2.default.debounce(function () {\n /**\r\n * Refresh Layout if needed\r\n */\n var _props = _this2.props,\n autoRefreshLayout = _props.autoRefreshLayout,\n layout = _props.layout;\n\n\n if (autoRefreshLayout) {\n cy.layout(layout).run();\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedNodesData = _lodash2.default.debounce(function () {\n /**\r\n This function is repetitively called every time a node is selected\r\n or unselected, but keeps being debounced if it is called again\r\n within 100 ms (given by SELECT_THRESHOLD). Effectively, it only\r\n runs when all the nodes have been correctly selected/unselected and\r\n added/removed from the selectedNodes collection, and then updates\r\n the selectedNodeData prop.\r\n */\n var nodeData = selectedNodes.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedNodeData: nodeData\n });\n }\n }, SELECT_THRESHOLD);\n\n var sendSelectedEdgesData = _lodash2.default.debounce(function () {\n var edgeData = selectedEdges.map(function (el) {\n return el.data();\n });\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n selectedEdgeData: edgeData\n });\n }\n }, SELECT_THRESHOLD);\n\n // /////////////////////////////////////// EVENTS //////////////////////////////////////////\n cy.on('tap', 'node', function (event) {\n var nodeObject = _this2.generateNode(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapNode: nodeObject,\n tapNodeData: nodeObject.data\n });\n }\n });\n\n cy.on('tap', 'edge', function (event) {\n var edgeObject = _this2.generateEdge(event);\n\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n tapEdge: edgeObject,\n tapEdgeData: edgeObject.data\n });\n }\n });\n\n cy.on('mouseover', 'node', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverNodeData: event.target.data()\n });\n }\n });\n\n cy.on('mouseover', 'edge', function (event) {\n if (typeof _this2.props.setProps === 'function') {\n _this2.props.setProps({\n mouseoverEdgeData: event.target.data()\n });\n }\n });\n\n cy.on('select', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.merge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('unselect remove', 'node', function (event) {\n var ele = event.target;\n\n selectedNodes.unmerge(ele);\n sendSelectedNodesData();\n });\n\n cy.on('select', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.merge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('unselect remove', 'edge', function (event) {\n var ele = event.target;\n\n selectedEdges.unmerge(ele);\n sendSelectedEdgesData();\n });\n\n cy.on('add remove', function () {\n refreshLayout();\n });\n }\n }, {\n key: 'render',\n value: function render() {\n var _props2 = this.props,\n id = _props2.id,\n style = _props2.style,\n className = _props2.className,\n elements = _props2.elements,\n stylesheet = _props2.stylesheet,\n layout = _props2.layout,\n pan = _props2.pan,\n zoom = _props2.zoom,\n panningEnabled = _props2.panningEnabled,\n userPanningEnabled = _props2.userPanningEnabled,\n minZoom = _props2.minZoom,\n maxZoom = _props2.maxZoom,\n zoomingEnabled = _props2.zoomingEnabled,\n userZoomingEnabled = _props2.userZoomingEnabled,\n boxSelectionEnabled = _props2.boxSelectionEnabled,\n autoungrabify = _props2.autoungrabify,\n autolock = _props2.autolock,\n autounselectify = _props2.autounselectify;\n\n\n return _react2.default.createElement(_reactCytoscapejs2.default, {\n id: id,\n cy: this.handleCy,\n className: className,\n style: style,\n elements: _reactCytoscapejs2.default.normalizeElements(elements),\n stylesheet: stylesheet,\n layout: layout,\n pan: pan,\n zoom: zoom,\n panningEnabled: panningEnabled,\n userPanningEnabled: userPanningEnabled,\n minZoom: minZoom,\n maxZoom: maxZoom,\n zoomingEnabled: zoomingEnabled,\n userZoomingEnabled: userZoomingEnabled,\n boxSelectionEnabled: boxSelectionEnabled,\n autoungrabify: autoungrabify,\n autolock: autolock,\n autounselectify: autounselectify\n });\n }\n }]);\n\n return Cytoscape;\n}(_react.Component);\n\nCytoscape.propTypes = {\n // HTML attribute props\n\n /**\r\n * The ID used to identify this component in Dash callbacks.\r\n */\n id: _propTypes2.default.string,\n\n /**\r\n * Sets the class name of the element (the value of an element's html\r\n * class attribute).\r\n */\n className: _propTypes2.default.string,\n\n /**\r\n * Add inline styles to the root element.\r\n */\n style: _propTypes2.default.object,\n\n // Dash specific props\n\n /**\r\n * Dash-assigned callback that should be called whenever any of the\r\n * properties change.\r\n */\n setProps: _propTypes2.default.func,\n\n // Common props\n\n /**\r\n * A list of dictionaries representing the elements of the networks.\r\n * 1. Each dictionary describes an element, and specifies its purpose.\r\n * - `group` (string): Either 'nodes' or 'edges'. If not given, it's automatically inferred.\r\n * - `data` (dictionary): Element specific data.\r\n * - `id` (string): Reference to the element, useful for selectors and edges. Randomly assigned if not given.\r\n * - `label` (string): Optional name for the element, useful when `data(label)` is given to a style's `content` or `label`. It is only a convention.\r\n * - `parent` (string): Only for nodes. Optional reference to another node. Needed to create compound nodes.\r\n * - `source` (string): Only for edges. The id of the source node, which is where the edge starts.\r\n * - `target` (string): Only for edges. The id of the target node, where the edge ends.\r\n * - `position` (dictionary): Only for nodes. The position of the node.\r\n * - `x` (number): The x-coordinate of the node.\r\n * - `y` (number): The y-coordinate of the node.\r\n * - `selected` (boolean): If the element is selected upon initialisation.\r\n * - `selectable` (boolean): If the element can be selected.\r\n * - `locked` (boolean): Only for nodes. If the position is immutable.\r\n * - `grabbable` (boolean): Only for nodes. If the node can be grabbed and moved by the user.\r\n * - `classes` (string): Space separated string of class names of the element. Those classes can be selected by a style selector.\r\n *\r\n * 2. The [official Cytoscape.js documentation](http://js.cytoscape.org/#notation/elements-json) offers an extensive overview and examples of element declaration.\r\n */\n elements: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A list of dictionaries representing the styles of the elements.\r\n * 1. Each dictionary requires the following keys:\r\n * - `selector` (string): Which elements you are styling. Generally, you select a group of elements (node, edges, both), a class (that you declare in the element dictionary), or an element by ID.\r\n * - `style` (dictionary): What aspects of the elements you want to modify. This could be the size or color of a node, the shape of an edge arrow, or many more.\r\n *\r\n * 2. Both [the selector string](http://js.cytoscape.org/#selectors) and\r\n * [the style dictionary](http://js.cytoscape.org/#style/node-body) are\r\n * exhaustively documented in the Cytoscape.js docs. Although methods such\r\n * as `cy.elements(...)` and `cy.filter(...)` are not available, the selector\r\n * string syntax stays the same.\r\n */\n stylesheet: _propTypes2.default.arrayOf(_propTypes2.default.object),\n\n /**\r\n * A dictionary specifying how to set the position of the elements in your\r\n * graph. The `'name'` key is required, and indicates which layout (algorithm) to\r\n * use.\r\n * 1. The layouts available by default are:\r\n * - `random`: Randomly assigns positions\r\n * - `preset`: Assigns position based on the `position` key in element dictionaries\r\n * - `circle`: Single-level circle, with optional radius\r\n * - `concentric`: Multi-level circle, with optional radius\r\n * - `grid`: Square grid, optionally with numbers of `rows` and `cols`\r\n * - `breadthfirst`: Tree structure built using BFS, with optional `roots`\r\n * - `cose`: Force-directed physics simulation\r\n *\r\n * 2. Some external layouts are also included. To use them, run\r\n * `dash_cytoscape.load_extra_layouts()` before creating your Dash app. Be careful about\r\n * using the extra layouts when not necessary, since they require supplementary bandwidth\r\n * for loading, which impacts the startup time of the app.\r\n * - `cose-bilkent`: https://github.com/cytoscape/cytoscape.js-cose-bilkent\r\n * - `cola`: https://github.com/cytoscape/cytoscape.js-cola\r\n * - `euler`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `spread`: https://github.com/cytoscape/cytoscape.js-spread\r\n * - `dagre`: https://github.com/cytoscape/cytoscape.js-dagre\r\n * - `klay`: https://github.com/cytoscape/cytoscape.js-klay\r\n *\r\n * 3. The keys accepted by `layout` vary depending on the algorithm, but some\r\n * keys are accepted by all layouts:\r\n * - `fit` (boolean): Whether to render the nodes in order to fit the canvas.\r\n * - `padding` (number): Padding around the sides of the canvas, if fit is enabled.\r\n * - `animate` (boolean): Whether to animate change in position when the layout changes.\r\n * - `animationDuration` (number): Duration of animation in milliseconds, if enabled.\r\n * - `boundingBox` (dictionary): How to constrain the layout in a specific area. Keys accepted are either `x1, y1, x2, y2` or `x1, y1, w, h`, all of which receive a pixel value.\r\n *\r\n * 4. The complete list of layouts and their accepted options are available\r\n * on the [Cytoscape.js docs](http://js.cytoscape.org/#layouts). For the\r\n * external layouts, the options are listed in the \"API\" section of the\r\n * README.\r\n * Note that certain keys are not supported in Dash since the value is a\r\n * JavaScript function or a callback. Please visit [this issue](https://github.com/plotly/dash-cytoscape/issues/25)\r\n * for more information.\r\n */\n layout: _propTypes2.default.object,\n\n // Viewport Manipulation\n\n /**\r\n * Dictionary indicating the initial panning position of the graph. The\r\n * following keys are accepted:\r\n * - `x` (number): The x-coordinate of the position.\r\n * - `y` (number): The y-coordinate of the position.\r\n */\n pan: _propTypes2.default.object,\n\n /**\r\n * The initial zoom level of the graph. You can set `minZoom` and\r\n * `maxZoom` to set restrictions on the zoom level.\r\n */\n zoom: _propTypes2.default.number,\n\n // Viewport Mutability and gesture Toggling\n /**\r\n * Whether panning the graph is enabled (i.e., the position of the graph is\r\n * mutable overall).\r\n */\n panningEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed to\r\n * pan the graph.\r\n */\n userPanningEnabled: _propTypes2.default.bool,\n\n /**\r\n * A minimum bound on the zoom level of the graph. The viewport can not be\r\n * scaled smaller than this zoom level.\r\n */\n minZoom: _propTypes2.default.number,\n\n /**\r\n * A maximum bound on the zoom level of the graph. The viewport can not be\r\n * scaled larger than this zoom level.\r\n */\n maxZoom: _propTypes2.default.number,\n\n /**\r\n * Whether zooming the graph is enabled (i.e., the zoom level of the graph\r\n * is mutable overall).\r\n */\n zoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether user events (e.g. dragging the graph background) are allowed\r\n * to pan the graph.\r\n */\n userZoomingEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether box selection (i.e. drag a box overlay around, and release it\r\n * to select) is enabled. If enabled, the user must taphold to pan the graph.\r\n */\n boxSelectionEnabled: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be ungrabified (not grabbable by user) by\r\n * default (if true, overrides individual node state).\r\n */\n autoungrabify: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be locked (not draggable at all) by default\r\n * (if true, overrides individual node state).\r\n */\n autolock: _propTypes2.default.bool,\n\n /**\r\n * Whether nodes should be unselectified (immutable selection state) by\r\n * default (if true, overrides individual element state).\r\n */\n autounselectify: _propTypes2.default.bool,\n\n /**\r\n * Whether the layout should be refreshed when elements are added or removed.\r\n */\n autoRefreshLayout: _propTypes2.default.bool,\n\n // User Events Props\n\n /**\r\n * The complete node dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Node-specific items:\r\n * - `edgesData` (dictionary)\r\n * - `renderedPosition` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `position` (dictionary)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n *\r\n * 3. Items for compound nodes:\r\n * - `ancestorsData` (dictionary)\r\n * - `childrenData` (dictionary)\r\n * - `descendantsData` (dictionary)\r\n * - `parentData` (dictionary)\r\n * - `siblingsData` (dictionary)\r\n * - `isParent` (boolean)\r\n * - `isChildless` (boolean)\r\n * - `isChild` (boolean)\r\n * - `isOrphan` (boolean)\r\n * - `relativePosition` (dictionary)\r\n */\n tapNode: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you tap or click it. Read-only.\r\n */\n tapNodeData: _propTypes2.default.object,\n\n /**\r\n * The complete edge dictionary returned when you tap or click it. Read-only.\r\n *\r\n * 1. Edge-specific items:\r\n * - `isLoop` (boolean)\r\n * - `isSimple` (boolean)\r\n * - `midpoint` (dictionary)\r\n * - `sourceData` (dictionary)\r\n * - `sourceEndpoint` (dictionary)\r\n * - `targetData` (dictionary)\r\n * - `targetEndpoint` (dictionary)\r\n * - `timeStamp` (number)\r\n *\r\n * 2. General items (for all elements):\r\n * - `classes` (string)\r\n * - `data` (dictionary)\r\n * - `grabbable` (boolean)\r\n * - `group` (string)\r\n * - `locked` (boolean)\r\n * - `selectable` (boolean)\r\n * - `selected` (boolean)\r\n * - `style` (dictionary)\r\n */\n tapEdge: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you tap or click it. Read-only.\r\n */\n tapEdgeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of a node returned when you hover over it. Read-only.\r\n */\n mouseoverNodeData: _propTypes2.default.object,\n\n /**\r\n * The data dictionary of an edge returned when you hover over it. Read-only.\r\n */\n mouseoverEdgeData: _propTypes2.default.object,\n\n /**\r\n * The list of data dictionaries of all selected nodes (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedNodeData: _propTypes2.default.array,\n\n /**\r\n * The list of data dictionaries of all selected edges (e.g. using\r\n * Shift+Click to select multiple nodes, or Shift+Drag to use box selection). Read-only.\r\n */\n selectedEdgeData: _propTypes2.default.array\n};\n\nCytoscape.defaultProps = {\n style: { width: '600px', height: '600px' },\n layout: { name: 'grid' },\n pan: { x: 0, y: 0 },\n zoom: 1,\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: true,\n userZoomingEnabled: true,\n panningEnabled: true,\n userPanningEnabled: true,\n boxSelectionEnabled: false,\n autolock: false,\n autoungrabify: false,\n autounselectify: false,\n autoRefreshLayout: true\n};\n\nexports.default = Cytoscape;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX2N5dG9zY2FwZS8uL3NyYy9saWIvY29tcG9uZW50cy9DeXRvc2NhcGUucmVhY3QuanM/NjQyYyJdLCJuYW1lcyI6WyJDeXRvc2NhcGUiLCJwcm9wcyIsImhhbmRsZUN5IiwiYmluZCIsIl9oYW5kbGVDeUNhbGxlZCIsImV2ZW50IiwiZWxlIiwidGFyZ2V0IiwiaXNQYXJlbnQiLCJpc0NoaWxkbGVzcyIsImlzQ2hpbGQiLCJpc09ycGhhbiIsInJlbmRlcmVkUG9zaXRpb24iLCJyZWxhdGl2ZVBvc2l0aW9uIiwicGFyZW50Iiwic3R5bGUiLCJlZGdlc0RhdGEiLCJjb25uZWN0ZWRFZGdlcyIsIm1hcCIsImRhdGEiLCJjaGlsZHJlbkRhdGEiLCJjaGlsZHJlbiIsImFuY2VzdG9yc0RhdGEiLCJhbmNlc3RvcnMiLCJkZXNjZW5kYW50c0RhdGEiLCJkZXNjZW5kYW50cyIsInNpYmxpbmdzRGF0YSIsInNpYmxpbmdzIiwidGltZVN0YW1wIiwianNvbiIsImNsYXNzZXMiLCJncmFiYmFibGUiLCJncm91cCIsImxvY2tlZCIsInBvc2l0aW9uIiwic2VsZWN0ZWQiLCJzZWxlY3RhYmxlIiwicGFyZW50RGF0YSIsIm5vZGVPYmplY3QiLCJtaWRwb2ludCIsImlzTG9vcCIsImlzU2ltcGxlIiwic291cmNlRGF0YSIsInNvdXJjZSIsInNvdXJjZUVuZHBvaW50IiwidGFyZ2V0RGF0YSIsInRhcmdldEVuZHBvaW50IiwiZWRnZU9iamVjdCIsImN5IiwiX2N5Iiwid2luZG93IiwiU0VMRUNUX1RIUkVTSE9MRCIsInNlbGVjdGVkTm9kZXMiLCJjb2xsZWN0aW9uIiwic2VsZWN0ZWRFZGdlcyIsInJlZnJlc2hMYXlvdXQiLCJfIiwiZGVib3VuY2UiLCJhdXRvUmVmcmVzaExheW91dCIsImxheW91dCIsInJ1biIsInNlbmRTZWxlY3RlZE5vZGVzRGF0YSIsIm5vZGVEYXRhIiwiZWwiLCJzZXRQcm9wcyIsInNlbGVjdGVkTm9kZURhdGEiLCJzZW5kU2VsZWN0ZWRFZGdlc0RhdGEiLCJlZGdlRGF0YSIsInNlbGVjdGVkRWRnZURhdGEiLCJvbiIsImdlbmVyYXRlTm9kZSIsInRhcE5vZGUiLCJ0YXBOb2RlRGF0YSIsImdlbmVyYXRlRWRnZSIsInRhcEVkZ2UiLCJ0YXBFZGdlRGF0YSIsIm1vdXNlb3Zlck5vZGVEYXRhIiwibW91c2VvdmVyRWRnZURhdGEiLCJtZXJnZSIsInVubWVyZ2UiLCJpZCIsImNsYXNzTmFtZSIsImVsZW1lbnRzIiwic3R5bGVzaGVldCIsInBhbiIsInpvb20iLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwiQ3l0b3NjYXBlQ29tcG9uZW50Iiwibm9ybWFsaXplRWxlbWVudHMiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJvYmplY3QiLCJmdW5jIiwiYXJyYXlPZiIsIm51bWJlciIsImJvb2wiLCJhcnJheSIsImRlZmF1bHRQcm9wcyIsIndpZHRoIiwiaGVpZ2h0IiwibmFtZSIsIngiLCJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUlBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7OytlQVBBOzs7Ozs7QUFVQTs7OztJQUlNQSxTOzs7QUFDRix1QkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLDBIQUNUQSxLQURTOztBQUdmLGNBQUtDLFFBQUwsR0FBZ0IsTUFBS0EsUUFBTCxDQUFjQyxJQUFkLE9BQWhCO0FBQ0EsY0FBS0MsZUFBTCxHQUF1QixLQUF2QjtBQUplO0FBS2xCOzs7O3FDQUVZQyxLLEVBQU87QUFDaEIsZ0JBQU1DLE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBLGdCQUFNQyxXQUFXRixJQUFJRSxRQUFKLEVBQWpCO0FBQUEsZ0JBQ0lDLGNBQWNILElBQUlHLFdBQUosRUFEbEI7QUFBQSxnQkFFSUMsVUFBVUosSUFBSUksT0FBSixFQUZkO0FBQUEsZ0JBR0lDLFdBQVdMLElBQUlLLFFBQUosRUFIZjtBQUFBLGdCQUlJQyxtQkFBbUJOLElBQUlNLGdCQUFKLEVBSnZCO0FBQUEsZ0JBS0lDLG1CQUFtQlAsSUFBSU8sZ0JBQUosRUFMdkI7QUFBQSxnQkFNSUMsU0FBU1IsSUFBSVEsTUFBSixFQU5iO0FBQUEsZ0JBT0lDLFFBQVFULElBQUlTLEtBQUosRUFQWjs7QUFTQTtBQUNBLGdCQUFNQyxZQUFZVixJQUFJVyxjQUFKLEdBQXFCQyxHQUFyQixDQUF5QixlQUFPO0FBQzFDLHVCQUFPWixJQUFJYSxJQUFKLEVBQVA7QUFDSCxhQUZhLENBQWxCO0FBQUEsZ0JBR0lDLGVBQWVkLElBQUllLFFBQUosR0FBZUgsR0FBZixDQUFtQixlQUFPO0FBQ3JDLHVCQUFPWixJQUFJYSxJQUFKLEVBQVA7QUFDSCxhQUZjLENBSG5CO0FBQUEsZ0JBTUlHLGdCQUFnQmhCLElBQUlpQixTQUFKLEdBQWdCTCxHQUFoQixDQUFvQixlQUFPO0FBQ3ZDLHVCQUFPWixJQUFJYSxJQUFKLEVBQVA7QUFDSCxhQUZlLENBTnBCO0FBQUEsZ0JBU0lLLGtCQUFrQmxCLElBQUltQixXQUFKLEdBQWtCUCxHQUFsQixDQUFzQixlQUFPO0FBQzNDLHVCQUFPWixJQUFJYSxJQUFKLEVBQVA7QUFDSCxhQUZpQixDQVR0QjtBQUFBLGdCQVlJTyxlQUFlcEIsSUFBSXFCLFFBQUosR0FBZVQsR0FBZixDQUFtQixlQUFPO0FBQ3JDLHVCQUFPWixJQUFJYSxJQUFKLEVBQVA7QUFDSCxhQUZjLENBWm5COztBQWJnQixnQkE2QlRTLFNBN0JTLEdBNkJJdkIsS0E3QkosQ0E2QlR1QixTQTdCUzs7QUFBQSw0QkF1Q1p0QixJQUFJdUIsSUFBSixFQXZDWTtBQUFBLGdCQStCWkMsT0EvQlksYUErQlpBLE9BL0JZO0FBQUEsZ0JBZ0NaWCxJQWhDWSxhQWdDWkEsSUFoQ1k7QUFBQSxnQkFpQ1pZLFNBakNZLGFBaUNaQSxTQWpDWTtBQUFBLGdCQWtDWkMsS0FsQ1ksYUFrQ1pBLEtBbENZO0FBQUEsZ0JBbUNaQyxNQW5DWSxhQW1DWkEsTUFuQ1k7QUFBQSxnQkFvQ1pDLFFBcENZLGFBb0NaQSxRQXBDWTtBQUFBLGdCQXFDWkMsUUFyQ1ksYUFxQ1pBLFFBckNZO0FBQUEsZ0JBc0NaQyxVQXRDWSxhQXNDWkEsVUF0Q1k7O0FBeUNoQixnQkFBSUMsbUJBQUo7QUFDQSxnQkFBSXZCLE1BQUosRUFBWTtBQUNSdUIsNkJBQWF2QixPQUFPSyxJQUFQLEVBQWI7QUFDSCxhQUZELE1BRU87QUFDSGtCLDZCQUFhLElBQWI7QUFDSDs7QUFFRCxnQkFBTUMsYUFBYTtBQUNmO0FBQ0F0QixvQ0FGZTtBQUdmSixrREFIZTtBQUlmZ0Isb0NBSmU7QUFLZjtBQUNBRSxnQ0FOZTtBQU9mWCwwQkFQZTtBQVFmWSxvQ0FSZTtBQVNmQyw0QkFUZTtBQVVmQyw4QkFWZTtBQVdmQyxrQ0FYZTtBQVlmRSxzQ0FaZTtBQWFmRCxrQ0FiZTtBQWNmO0FBQ0FiLDRDQWZlO0FBZ0JmRiwwQ0FoQmU7QUFpQmZJLGdEQWpCZTtBQWtCZmEsc0NBbEJlO0FBbUJmWCwwQ0FuQmU7QUFvQmZsQixrQ0FwQmU7QUFxQmZDLHdDQXJCZTtBQXNCZkMsZ0NBdEJlO0FBdUJmQyxrQ0F2QmU7QUF3QmZFLGtEQXhCZTtBQXlCZjtBQUNBRTtBQTFCZSxhQUFuQjtBQTRCQSxtQkFBT3VCLFVBQVA7QUFDSDs7O3FDQUdZakMsSyxFQUFPO0FBQ2hCLGdCQUFNQyxNQUFNRCxNQUFNRSxNQUFsQjs7QUFFQSxnQkFBTWdDLFdBQVdqQyxJQUFJaUMsUUFBSixFQUFqQjtBQUFBLGdCQUNJQyxTQUFTbEMsSUFBSWtDLE1BQUosRUFEYjtBQUFBLGdCQUVJQyxXQUFXbkMsSUFBSW1DLFFBQUosRUFGZjtBQUFBLGdCQUdJQyxhQUFhcEMsSUFBSXFDLE1BQUosR0FBYXhCLElBQWIsRUFIakI7QUFBQSxnQkFJSXlCLGlCQUFpQnRDLElBQUlzQyxjQUFKLEVBSnJCO0FBQUEsZ0JBS0k3QixRQUFRVCxJQUFJUyxLQUFKLEVBTFo7QUFBQSxnQkFNSThCLGFBQWF2QyxJQUFJQyxNQUFKLEdBQWFZLElBQWIsRUFOakI7QUFBQSxnQkFPSTJCLGlCQUFpQnhDLElBQUl3QyxjQUFKLEVBUHJCOztBQUhnQixnQkFZVGxCLFNBWlMsR0FZSXZCLEtBWkosQ0FZVHVCLFNBWlM7O0FBQUEsNkJBcUJadEIsSUFBSXVCLElBQUosRUFyQlk7QUFBQSxnQkFjWkMsT0FkWSxjQWNaQSxPQWRZO0FBQUEsZ0JBZVpYLElBZlksY0FlWkEsSUFmWTtBQUFBLGdCQWdCWlksU0FoQlksY0FnQlpBLFNBaEJZO0FBQUEsZ0JBaUJaQyxLQWpCWSxjQWlCWkEsS0FqQlk7QUFBQSxnQkFrQlpDLE1BbEJZLGNBa0JaQSxNQWxCWTtBQUFBLGdCQW1CWkcsVUFuQlksY0FtQlpBLFVBbkJZO0FBQUEsZ0JBb0JaRCxRQXBCWSxjQW9CWkEsUUFwQlk7O0FBdUJoQixnQkFBTVksYUFBYTtBQUNmO0FBQ0FQLDhCQUZlO0FBR2ZDLGtDQUhlO0FBSWZGLGtDQUplO0FBS2ZHLHNDQUxlO0FBTWZFLDhDQU5lO0FBT2ZDLHNDQVBlO0FBUWZDLDhDQVJlO0FBU2ZsQixvQ0FUZTtBQVVmO0FBQ0FFLGdDQVhlO0FBWWZYLDBCQVplO0FBYWZZLG9DQWJlO0FBY2ZDLDRCQWRlO0FBZWZDLDhCQWZlO0FBZ0JmRyxzQ0FoQmU7QUFpQmZELGtDQWpCZTtBQWtCZjtBQUNBcEI7QUFuQmUsYUFBbkI7O0FBc0JBLG1CQUFPZ0MsVUFBUDtBQUNIOzs7aUNBRVFDLEUsRUFBSTtBQUFBOztBQUNUO0FBQ0E7QUFDQSxnQkFBSUEsT0FBTyxLQUFLQyxHQUFaLElBQW1CLEtBQUs3QyxlQUE1QixFQUE2QztBQUN6QztBQUNIO0FBQ0QsaUJBQUs2QyxHQUFMLEdBQVdELEVBQVg7QUFDQUUsbUJBQU9GLEVBQVAsR0FBWUEsRUFBWjtBQUNBLGlCQUFLNUMsZUFBTCxHQUF1QixJQUF2Qjs7QUFFQTtBQUNBLGdCQUFNK0MsbUJBQW1CLEdBQXpCOztBQUVBLGdCQUFNQyxnQkFBZ0JKLEdBQUdLLFVBQUgsRUFBdEI7QUFDQSxnQkFBTUMsZ0JBQWdCTixHQUFHSyxVQUFILEVBQXRCOztBQUVBO0FBQ0EsZ0JBQU1FLGdCQUFnQkMsaUJBQUVDLFFBQUYsQ0FBVyxZQUFNO0FBQ25DOzs7QUFEbUMsNkJBTy9CLE9BQUt4RCxLQVAwQjtBQUFBLG9CQUsvQnlELGlCQUwrQixVQUsvQkEsaUJBTCtCO0FBQUEsb0JBTS9CQyxNQU4rQixVQU0vQkEsTUFOK0I7OztBQVNuQyxvQkFBSUQsaUJBQUosRUFBdUI7QUFDbkJWLHVCQUFHVyxNQUFILENBQVVBLE1BQVYsRUFBa0JDLEdBQWxCO0FBQ0g7QUFDSixhQVpxQixFQVluQlQsZ0JBWm1CLENBQXRCOztBQWNBLGdCQUFNVSx3QkFBd0JMLGlCQUFFQyxRQUFGLENBQVcsWUFBTTtBQUMzQzs7Ozs7Ozs7QUFRQSxvQkFBTUssV0FBV1YsY0FBY2xDLEdBQWQsQ0FBa0I7QUFBQSwyQkFBTTZDLEdBQUc1QyxJQUFILEVBQU47QUFBQSxpQkFBbEIsQ0FBakI7O0FBRUEsb0JBQUksT0FBTyxPQUFLbEIsS0FBTCxDQUFXK0QsUUFBbEIsS0FBK0IsVUFBbkMsRUFBK0M7QUFDM0MsMkJBQUsvRCxLQUFMLENBQVcrRCxRQUFYLENBQW9CO0FBQ2hCQywwQ0FBa0JIO0FBREYscUJBQXBCO0FBR0g7QUFDSixhQWhCNkIsRUFnQjNCWCxnQkFoQjJCLENBQTlCOztBQWtCQSxnQkFBTWUsd0JBQXdCVixpQkFBRUMsUUFBRixDQUFXLFlBQU07QUFDM0Msb0JBQU1VLFdBQVdiLGNBQWNwQyxHQUFkLENBQWtCO0FBQUEsMkJBQU02QyxHQUFHNUMsSUFBSCxFQUFOO0FBQUEsaUJBQWxCLENBQWpCOztBQUVBLG9CQUFJLE9BQU8sT0FBS2xCLEtBQUwsQ0FBVytELFFBQWxCLEtBQStCLFVBQW5DLEVBQStDO0FBQzNDLDJCQUFLL0QsS0FBTCxDQUFXK0QsUUFBWCxDQUFvQjtBQUNoQkksMENBQWtCRDtBQURGLHFCQUFwQjtBQUdIO0FBQ0osYUFSNkIsRUFRM0JoQixnQkFSMkIsQ0FBOUI7O0FBVUE7QUFDQUgsZUFBR3FCLEVBQUgsQ0FBTSxLQUFOLEVBQWEsTUFBYixFQUFxQixpQkFBUztBQUMxQixvQkFBTS9CLGFBQWEsT0FBS2dDLFlBQUwsQ0FBa0JqRSxLQUFsQixDQUFuQjs7QUFFQSxvQkFBSSxPQUFPLE9BQUtKLEtBQUwsQ0FBVytELFFBQWxCLEtBQStCLFVBQW5DLEVBQStDO0FBQzNDLDJCQUFLL0QsS0FBTCxDQUFXK0QsUUFBWCxDQUFvQjtBQUNoQk8saUNBQVNqQyxVQURPO0FBRWhCa0MscUNBQWFsQyxXQUFXbkI7QUFGUixxQkFBcEI7QUFJSDtBQUNKLGFBVEQ7O0FBV0E2QixlQUFHcUIsRUFBSCxDQUFNLEtBQU4sRUFBYSxNQUFiLEVBQXFCLGlCQUFTO0FBQzFCLG9CQUFNdEIsYUFBYSxPQUFLMEIsWUFBTCxDQUFrQnBFLEtBQWxCLENBQW5COztBQUVBLG9CQUFJLE9BQU8sT0FBS0osS0FBTCxDQUFXK0QsUUFBbEIsS0FBK0IsVUFBbkMsRUFBK0M7QUFDM0MsMkJBQUsvRCxLQUFMLENBQVcrRCxRQUFYLENBQW9CO0FBQ2hCVSxpQ0FBUzNCLFVBRE87QUFFaEI0QixxQ0FBYTVCLFdBQVc1QjtBQUZSLHFCQUFwQjtBQUlIO0FBQ0osYUFURDs7QUFXQTZCLGVBQUdxQixFQUFILENBQU0sV0FBTixFQUFtQixNQUFuQixFQUEyQixpQkFBUztBQUNoQyxvQkFBSSxPQUFPLE9BQUtwRSxLQUFMLENBQVcrRCxRQUFsQixLQUErQixVQUFuQyxFQUErQztBQUMzQywyQkFBSy9ELEtBQUwsQ0FBVytELFFBQVgsQ0FBb0I7QUFDaEJZLDJDQUFtQnZFLE1BQU1FLE1BQU4sQ0FBYVksSUFBYjtBQURILHFCQUFwQjtBQUdIO0FBQ0osYUFORDs7QUFRQTZCLGVBQUdxQixFQUFILENBQU0sV0FBTixFQUFtQixNQUFuQixFQUEyQixpQkFBUztBQUNoQyxvQkFBSSxPQUFPLE9BQUtwRSxLQUFMLENBQVcrRCxRQUFsQixLQUErQixVQUFuQyxFQUErQztBQUMzQywyQkFBSy9ELEtBQUwsQ0FBVytELFFBQVgsQ0FBb0I7QUFDaEJhLDJDQUFtQnhFLE1BQU1FLE1BQU4sQ0FBYVksSUFBYjtBQURILHFCQUFwQjtBQUdIO0FBQ0osYUFORDs7QUFRQTZCLGVBQUdxQixFQUFILENBQU0sUUFBTixFQUFnQixNQUFoQixFQUF3QixpQkFBUztBQUM3QixvQkFBTS9ELE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBNkMsOEJBQWMwQixLQUFkLENBQW9CeEUsR0FBcEI7QUFDQXVEO0FBQ0gsYUFMRDs7QUFPQWIsZUFBR3FCLEVBQUgsQ0FBTSxpQkFBTixFQUF5QixNQUF6QixFQUFpQyxpQkFBUztBQUN0QyxvQkFBTS9ELE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBNkMsOEJBQWMyQixPQUFkLENBQXNCekUsR0FBdEI7QUFDQXVEO0FBQ0gsYUFMRDs7QUFPQWIsZUFBR3FCLEVBQUgsQ0FBTSxRQUFOLEVBQWdCLE1BQWhCLEVBQXdCLGlCQUFTO0FBQzdCLG9CQUFNL0QsTUFBTUQsTUFBTUUsTUFBbEI7O0FBRUErQyw4QkFBY3dCLEtBQWQsQ0FBb0J4RSxHQUFwQjtBQUNBNEQ7QUFDSCxhQUxEOztBQU9BbEIsZUFBR3FCLEVBQUgsQ0FBTSxpQkFBTixFQUF5QixNQUF6QixFQUFpQyxpQkFBUztBQUN0QyxvQkFBTS9ELE1BQU1ELE1BQU1FLE1BQWxCOztBQUVBK0MsOEJBQWN5QixPQUFkLENBQXNCekUsR0FBdEI7QUFDQTREO0FBQ0gsYUFMRDs7QUFPQWxCLGVBQUdxQixFQUFILENBQU0sWUFBTixFQUFvQixZQUFNO0FBQ3RCZDtBQUNILGFBRkQ7QUFHSDs7O2lDQUVRO0FBQUEsMEJBd0JELEtBQUt0RCxLQXhCSjtBQUFBLGdCQUdEK0UsRUFIQyxXQUdEQSxFQUhDO0FBQUEsZ0JBSURqRSxLQUpDLFdBSURBLEtBSkM7QUFBQSxnQkFLRGtFLFNBTEMsV0FLREEsU0FMQztBQUFBLGdCQU9EQyxRQVBDLFdBT0RBLFFBUEM7QUFBQSxnQkFRREMsVUFSQyxXQVFEQSxVQVJDO0FBQUEsZ0JBU0R4QixNQVRDLFdBU0RBLE1BVEM7QUFBQSxnQkFXRHlCLEdBWEMsV0FXREEsR0FYQztBQUFBLGdCQVlEQyxJQVpDLFdBWURBLElBWkM7QUFBQSxnQkFjREMsY0FkQyxXQWNEQSxjQWRDO0FBQUEsZ0JBZURDLGtCQWZDLFdBZURBLGtCQWZDO0FBQUEsZ0JBZ0JEQyxPQWhCQyxXQWdCREEsT0FoQkM7QUFBQSxnQkFpQkRDLE9BakJDLFdBaUJEQSxPQWpCQztBQUFBLGdCQWtCREMsY0FsQkMsV0FrQkRBLGNBbEJDO0FBQUEsZ0JBbUJEQyxrQkFuQkMsV0FtQkRBLGtCQW5CQztBQUFBLGdCQW9CREMsbUJBcEJDLFdBb0JEQSxtQkFwQkM7QUFBQSxnQkFxQkRDLGFBckJDLFdBcUJEQSxhQXJCQztBQUFBLGdCQXNCREMsUUF0QkMsV0FzQkRBLFFBdEJDO0FBQUEsZ0JBdUJEQyxlQXZCQyxXQXVCREEsZUF2QkM7OztBQTBCTCxtQkFDSSw4QkFBQywwQkFBRDtBQUNJLG9CQUFJZixFQURSO0FBRUksb0JBQUksS0FBSzlFLFFBRmI7QUFHSSwyQkFBVytFLFNBSGY7QUFJSSx1QkFBT2xFLEtBSlg7QUFLSSwwQkFBVWlGLDJCQUFtQkMsaUJBQW5CLENBQXFDZixRQUFyQyxDQUxkO0FBTUksNEJBQVlDLFVBTmhCO0FBT0ksd0JBQVF4QixNQVBaO0FBUUkscUJBQUt5QixHQVJUO0FBU0ksc0JBQU1DLElBVFY7QUFVSSxnQ0FBZ0JDLGNBVnBCO0FBV0ksb0NBQW9CQyxrQkFYeEI7QUFZSSx5QkFBU0MsT0FaYjtBQWFJLHlCQUFTQyxPQWJiO0FBY0ksZ0NBQWdCQyxjQWRwQjtBQWVJLG9DQUFvQkMsa0JBZnhCO0FBZ0JJLHFDQUFxQkMsbUJBaEJ6QjtBQWlCSSwrQkFBZUMsYUFqQm5CO0FBa0JJLDBCQUFVQyxRQWxCZDtBQW1CSSxpQ0FBaUJDO0FBbkJyQixjQURKO0FBdUJIOzs7O0VBNVRtQkcsZ0I7O0FBZ1V4QmxHLFVBQVVtRyxTQUFWLEdBQXNCO0FBQ2xCOztBQUVBOzs7QUFHQW5CLFFBQUlvQixvQkFBVUMsTUFOSTs7QUFRbEI7Ozs7QUFJQXBCLGVBQVdtQixvQkFBVUMsTUFaSDs7QUFjbEI7OztBQUdBdEYsV0FBT3FGLG9CQUFVRSxNQWpCQzs7QUFtQmxCOztBQUVBOzs7O0FBSUF0QyxjQUFVb0Msb0JBQVVHLElBekJGOztBQTJCbEI7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQXJCLGNBQVVrQixvQkFBVUksT0FBVixDQUFrQkosb0JBQVVFLE1BQTVCLENBbERROztBQW9EbEI7Ozs7Ozs7Ozs7OztBQVlBbkIsZ0JBQVlpQixvQkFBVUksT0FBVixDQUFrQkosb0JBQVVFLE1BQTVCLENBaEVNOztBQWtFbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Q0EzQyxZQUFReUMsb0JBQVVFLE1BMUdBOztBQTRHbEI7O0FBRUE7Ozs7OztBQU1BbEIsU0FBS2dCLG9CQUFVRSxNQXBIRzs7QUFzSGxCOzs7O0FBSUFqQixVQUFNZSxvQkFBVUssTUExSEU7O0FBNEhsQjtBQUNBOzs7O0FBSUFuQixvQkFBZ0JjLG9CQUFVTSxJQWpJUjs7QUFtSWxCOzs7O0FBSUFuQix3QkFBb0JhLG9CQUFVTSxJQXZJWjs7QUF5SWxCOzs7O0FBSUFsQixhQUFTWSxvQkFBVUssTUE3SUQ7O0FBK0lsQjs7OztBQUlBaEIsYUFBU1csb0JBQVVLLE1BbkpEOztBQXFKbEI7Ozs7QUFJQWYsb0JBQWdCVSxvQkFBVU0sSUF6SlI7O0FBMkpsQjs7OztBQUlBZix3QkFBb0JTLG9CQUFVTSxJQS9KWjs7QUFpS2xCOzs7O0FBSUFkLHlCQUFxQlEsb0JBQVVNLElBcktiOztBQXVLbEI7Ozs7QUFJQWIsbUJBQWVPLG9CQUFVTSxJQTNLUDs7QUE2S2xCOzs7O0FBSUFaLGNBQVVNLG9CQUFVTSxJQWpMRjs7QUFtTGxCOzs7O0FBSUFYLHFCQUFpQkssb0JBQVVNLElBdkxUOztBQXlMbEI7OztBQUdBaEQsdUJBQW1CMEMsb0JBQVVNLElBNUxYOztBQThMbEI7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkFuQyxhQUFTNkIsb0JBQVVFLE1BL05EOztBQWlPbEI7OztBQUdBOUIsaUJBQWE0QixvQkFBVUUsTUFwT0w7O0FBc09sQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE1QixhQUFTMEIsb0JBQVVFLE1BN1BEOztBQStQbEI7OztBQUdBM0IsaUJBQWF5QixvQkFBVUUsTUFsUUw7O0FBb1FsQjs7O0FBR0ExQix1QkFBbUJ3QixvQkFBVUUsTUF2UVg7O0FBeVFsQjs7O0FBR0F6Qix1QkFBbUJ1QixvQkFBVUUsTUE1UVg7O0FBOFFsQjs7OztBQUlBckMsc0JBQWtCbUMsb0JBQVVPLEtBbFJWOztBQW9SbEI7Ozs7QUFJQXZDLHNCQUFrQmdDLG9CQUFVTztBQXhSVixDQUF0Qjs7QUEyUkEzRyxVQUFVNEcsWUFBVixHQUF5QjtBQUNyQjdGLFdBQU8sRUFBQzhGLE9BQU8sT0FBUixFQUFpQkMsUUFBUSxPQUF6QixFQURjO0FBRXJCbkQsWUFBUSxFQUFDb0QsTUFBTSxNQUFQLEVBRmE7QUFHckIzQixTQUFLLEVBQUM0QixHQUFHLENBQUosRUFBT0MsR0FBRyxDQUFWLEVBSGdCO0FBSXJCNUIsVUFBTSxDQUplO0FBS3JCRyxhQUFTLEtBTFk7QUFNckJDLGFBQVMsSUFOWTtBQU9yQkMsb0JBQWdCLElBUEs7QUFRckJDLHdCQUFvQixJQVJDO0FBU3JCTCxvQkFBZ0IsSUFUSztBQVVyQkMsd0JBQW9CLElBVkM7QUFXckJLLHlCQUFxQixLQVhBO0FBWXJCRSxjQUFVLEtBWlc7QUFhckJELG1CQUFlLEtBYk07QUFjckJFLHFCQUFpQixLQWRJO0FBZXJCckMsdUJBQW1CO0FBZkUsQ0FBekI7O2tCQWtCZTFELFMiLCJmaWxlIjoiLi9zcmMvbGliL2NvbXBvbmVudHMvQ3l0b3NjYXBlLnJlYWN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEphdmFTY3JpcHQgUmVxdWlyZW1lbnRzOiBjeXRvc2NhcGVcclxuICogUmVhY3QuanMgcmVxdWlyZW1lbnRzOiByZWFjdC1jeXRvc2NhcGVqc1xyXG4gKi9cclxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XHJcbmltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAncmVhY3QtY3l0b3NjYXBlanMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuXHJcbi8qKlxyXG5BIENvbXBvbmVudCBMaWJyYXJ5IGZvciBEYXNoIGFpbWVkIGF0IGZhY2lsaXRhdGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb24gaW5cclxuUHl0aG9uLCB3cmFwcGVkIGFyb3VuZCBbQ3l0b3NjYXBlLmpzXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8pLlxyXG4gKi9cclxuY2xhc3MgQ3l0b3NjYXBlIGV4dGVuZHMgQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZUN5ID0gdGhpcy5oYW5kbGVDeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUN5Q2FsbGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVOb2RlKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZWxlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICBjb25zdCBpc1BhcmVudCA9IGVsZS5pc1BhcmVudCgpLFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyA9IGVsZS5pc0NoaWxkbGVzcygpLFxyXG4gICAgICAgICAgICBpc0NoaWxkID0gZWxlLmlzQ2hpbGQoKSxcclxuICAgICAgICAgICAgaXNPcnBoYW4gPSBlbGUuaXNPcnBoYW4oKSxcclxuICAgICAgICAgICAgcmVuZGVyZWRQb3NpdGlvbiA9IGVsZS5yZW5kZXJlZFBvc2l0aW9uKCksXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSBlbGUucmVsYXRpdmVQb3NpdGlvbigpLFxyXG4gICAgICAgICAgICBwYXJlbnQgPSBlbGUucGFyZW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCk7XHJcblxyXG4gICAgICAgIC8vIFRyaW0gZG93biB0aGUgZWxlbWVudCBvYmplY3RzIHRvIG9ubHkgdGhlIGRhdGEgY29udGFpbmVkXHJcbiAgICAgICAgY29uc3QgZWRnZXNEYXRhID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2hpbGRyZW5EYXRhID0gZWxlLmNoaWxkcmVuKCkubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoKVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYW5jZXN0b3JzRGF0YSA9IGVsZS5hbmNlc3RvcnMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBkZXNjZW5kYW50c0RhdGEgPSBlbGUuZGVzY2VuZGFudHMoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEgPSBlbGUuc2libGluZ3MoKS5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBwb3NpdGlvbixcclxuICAgICAgICAgICAgc2VsZWN0ZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGVcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmVudERhdGE7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gcGFyZW50LmRhdGEoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJlbnREYXRhID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGVzIGF0dHJpYnV0ZXNcclxuICAgICAgICAgICAgZWRnZXNEYXRhLFxyXG4gICAgICAgICAgICByZW5kZXJlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICAgICAgLy8gQ29tcG91bmQgTm9kZXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIGFuY2VzdG9yc0RhdGEsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuRGF0YSxcclxuICAgICAgICAgICAgZGVzY2VuZGFudHNEYXRhLFxyXG4gICAgICAgICAgICBwYXJlbnREYXRhLFxyXG4gICAgICAgICAgICBzaWJsaW5nc0RhdGEsXHJcbiAgICAgICAgICAgIGlzUGFyZW50LFxyXG4gICAgICAgICAgICBpc0NoaWxkbGVzcyxcclxuICAgICAgICAgICAgaXNDaGlsZCxcclxuICAgICAgICAgICAgaXNPcnBoYW4sXHJcbiAgICAgICAgICAgIHJlbGF0aXZlUG9zaXRpb24sXHJcbiAgICAgICAgICAgIC8vIFN0eWxpbmdcclxuICAgICAgICAgICAgc3R5bGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBub2RlT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZW5lcmF0ZUVkZ2UoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG1pZHBvaW50ID0gZWxlLm1pZHBvaW50KCksXHJcbiAgICAgICAgICAgIGlzTG9vcCA9IGVsZS5pc0xvb3AoKSxcclxuICAgICAgICAgICAgaXNTaW1wbGUgPSBlbGUuaXNTaW1wbGUoKSxcclxuICAgICAgICAgICAgc291cmNlRGF0YSA9IGVsZS5zb3VyY2UoKS5kYXRhKCksXHJcbiAgICAgICAgICAgIHNvdXJjZUVuZHBvaW50ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXHJcbiAgICAgICAgICAgIHN0eWxlID0gZWxlLnN0eWxlKCksXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEgPSBlbGUudGFyZ2V0KCkuZGF0YSgpLFxyXG4gICAgICAgICAgICB0YXJnZXRFbmRwb2ludCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xyXG5cclxuICAgICAgICBjb25zdCB7dGltZVN0YW1wfSA9IGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgY2xhc3NlcyxcclxuICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgZ3JhYmJhYmxlLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgbG9ja2VkLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICB9ID0gZWxlLmpzb24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWRnZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgLy8gRWRnZXMgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICBpc0xvb3AsXHJcbiAgICAgICAgICAgIGlzU2ltcGxlLFxyXG4gICAgICAgICAgICBtaWRwb2ludCxcclxuICAgICAgICAgICAgc291cmNlRGF0YSxcclxuICAgICAgICAgICAgc291cmNlRW5kcG9pbnQsXHJcbiAgICAgICAgICAgIHRhcmdldERhdGEsXHJcbiAgICAgICAgICAgIHRhcmdldEVuZHBvaW50LFxyXG4gICAgICAgICAgICB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIC8vIEZyb20gZWxlLmpzb24oKVxyXG4gICAgICAgICAgICBjbGFzc2VzLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBncmFiYmFibGUsXHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBsb2NrZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkLFxyXG4gICAgICAgICAgICAvLyBTdHlsaW5nXHJcbiAgICAgICAgICAgIHN0eWxlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVkZ2VPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ3koY3kpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY3kgcG9pbnRlciBoYXMgbm90IGJlZW4gbW9kaWZpZWQsIGFuZCBoYW5kbGVDeSBoYXMgYWxyZWFkeVxyXG4gICAgICAgIC8vIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhhbiB3ZSBkb24ndCBydW4gdGhpcyBmdW5jdGlvbi5cclxuICAgICAgICBpZiAoY3kgPT09IHRoaXMuX2N5ICYmIHRoaXMuX2hhbmRsZUN5Q2FsbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3kgPSBjeTtcclxuICAgICAgICB3aW5kb3cuY3kgPSBjeTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVDeUNhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ09OU1RBTlRTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgY29uc3QgU0VMRUNUX1RIUkVTSE9MRCA9IDEwMDtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEVkZ2VzID0gY3kuY29sbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hMYXlvdXQgPSBfLmRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFJlZnJlc2ggTGF5b3V0IGlmIG5lZWRlZFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYXV0b1JlZnJlc2hMYXlvdXQsXHJcbiAgICAgICAgICAgICAgICBsYXlvdXRcclxuICAgICAgICAgICAgfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b1JlZnJlc2hMYXlvdXQpIHtcclxuICAgICAgICAgICAgICAgIGN5LmxheW91dChsYXlvdXQpLnJ1bigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkTm9kZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXBldGl0aXZlbHkgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBub2RlIGlzIHNlbGVjdGVkXHJcbiAgICAgICAgICAgICBvciB1bnNlbGVjdGVkLCBidXQga2VlcHMgYmVpbmcgZGVib3VuY2VkIGlmIGl0IGlzIGNhbGxlZCBhZ2FpblxyXG4gICAgICAgICAgICAgd2l0aGluIDEwMCBtcyAoZ2l2ZW4gYnkgU0VMRUNUX1RIUkVTSE9MRCkuIEVmZmVjdGl2ZWx5LCBpdCBvbmx5XHJcbiAgICAgICAgICAgICBydW5zIHdoZW4gYWxsIHRoZSBub2RlcyBoYXZlIGJlZW4gY29ycmVjdGx5IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgYW5kXHJcbiAgICAgICAgICAgICBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIHNlbGVjdGVkTm9kZXMgY29sbGVjdGlvbiwgYW5kIHRoZW4gdXBkYXRlc1xyXG4gICAgICAgICAgICAgdGhlIHNlbGVjdGVkTm9kZURhdGEgcHJvcC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhID0gc2VsZWN0ZWROb2Rlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWROb2RlRGF0YTogbm9kZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VuZFNlbGVjdGVkRWRnZXNEYXRhID0gXy5kZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VEYXRhID0gc2VsZWN0ZWRFZGdlcy5tYXAoZWwgPT4gZWwuZGF0YSgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFZGdlRGF0YTogZWRnZURhdGFcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBTRUxFQ1RfVEhSRVNIT0xEKTtcclxuXHJcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVWRU5UUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICBjeS5vbigndGFwJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVPYmplY3QgPSB0aGlzLmdlbmVyYXRlTm9kZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2V0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuc2V0UHJvcHMoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcE5vZGU6IG5vZGVPYmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFwTm9kZURhdGE6IG5vZGVPYmplY3QuZGF0YVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3RhcCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGdlT2JqZWN0ID0gdGhpcy5nZW5lcmF0ZUVkZ2UoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICB0YXBFZGdlOiBlZGdlT2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcEVkZ2VEYXRhOiBlZGdlT2JqZWN0LmRhdGFcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGN5Lm9uKCdtb3VzZW92ZXInLCAnbm9kZScsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFByb3BzKHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXJOb2RlRGF0YTogZXZlbnQudGFyZ2V0LmRhdGEoKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbignbW91c2VvdmVyJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRQcm9wcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyRWRnZURhdGE6IGV2ZW50LnRhcmdldC5kYXRhKClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdub2RlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZE5vZGVzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ25vZGUnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWROb2Rlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ3NlbGVjdCcsICdlZGdlJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZEVkZ2VzLm1lcmdlKGVsZSk7XHJcbiAgICAgICAgICAgIHNlbmRTZWxlY3RlZEVkZ2VzRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjeS5vbigndW5zZWxlY3QgcmVtb3ZlJywgJ2VkZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGVkRWRnZXMudW5tZXJnZShlbGUpO1xyXG4gICAgICAgICAgICBzZW5kU2VsZWN0ZWRFZGdlc0RhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY3kub24oJ2FkZCByZW1vdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlZnJlc2hMYXlvdXQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgc3R5bGUsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcclxuICAgICAgICAgICAgLy8gQ29tbW9uIHByb3BzXHJcbiAgICAgICAgICAgIGVsZW1lbnRzLFxyXG4gICAgICAgICAgICBzdHlsZXNoZWV0LFxyXG4gICAgICAgICAgICBsYXlvdXQsXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE1hbmlwdWxhdGlvblxyXG4gICAgICAgICAgICBwYW4sXHJcbiAgICAgICAgICAgIHpvb20sXHJcbiAgICAgICAgICAgIC8vIFZpZXdwb3J0IE11dGFiaWxpdHkgYW5kIGdlc3R1cmUgVG9nZ2xpbmdcclxuICAgICAgICAgICAgcGFubmluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJQYW5uaW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgbWluWm9vbSxcclxuICAgICAgICAgICAgbWF4Wm9vbSxcclxuICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIHVzZXJab29taW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZCxcclxuICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeSxcclxuICAgICAgICAgICAgYXV0b2xvY2ssXHJcbiAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeVxyXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8Q3l0b3NjYXBlQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgICAgICBjeT17dGhpcy5oYW5kbGVDeX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxyXG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e0N5dG9zY2FwZUNvbXBvbmVudC5ub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cyl9XHJcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0PXtzdHlsZXNoZWV0fVxyXG4gICAgICAgICAgICAgICAgbGF5b3V0PXtsYXlvdXR9XHJcbiAgICAgICAgICAgICAgICBwYW49e3Bhbn1cclxuICAgICAgICAgICAgICAgIHpvb209e3pvb219XHJcbiAgICAgICAgICAgICAgICBwYW5uaW5nRW5hYmxlZD17cGFubmluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICB1c2VyUGFubmluZ0VuYWJsZWQ9e3VzZXJQYW5uaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgICAgIG1pblpvb209e21pblpvb219XHJcbiAgICAgICAgICAgICAgICBtYXhab29tPXttYXhab29tfVxyXG4gICAgICAgICAgICAgICAgem9vbWluZ0VuYWJsZWQ9e3pvb21pbmdFbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgdXNlclpvb21pbmdFbmFibGVkPXt1c2VyWm9vbWluZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgICBib3hTZWxlY3Rpb25FbmFibGVkPXtib3hTZWxlY3Rpb25FbmFibGVkfVxyXG4gICAgICAgICAgICAgICAgYXV0b3VuZ3JhYmlmeT17YXV0b3VuZ3JhYmlmeX1cclxuICAgICAgICAgICAgICAgIGF1dG9sb2NrPXthdXRvbG9ja31cclxuICAgICAgICAgICAgICAgIGF1dG91bnNlbGVjdGlmeT17YXV0b3Vuc2VsZWN0aWZ5fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuXHJcbkN5dG9zY2FwZS5wcm9wVHlwZXMgPSB7XHJcbiAgICAvLyBIVE1MIGF0dHJpYnV0ZSBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBjb21wb25lbnQgaW4gRGFzaCBjYWxsYmFja3MuXHJcbiAgICAgKi9cclxuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZWxlbWVudCAodGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQncyBodG1sXHJcbiAgICAgKiBjbGFzcyBhdHRyaWJ1dGUpLlxyXG4gICAgICovXHJcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgaW5saW5lIHN0eWxlcyB0byB0aGUgcm9vdCBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvLyBEYXNoIHNwZWNpZmljIHByb3BzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXNoLWFzc2lnbmVkIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgb2YgdGhlXHJcbiAgICAgKiBwcm9wZXJ0aWVzIGNoYW5nZS5cclxuICAgICAqL1xyXG4gICAgc2V0UHJvcHM6IFByb3BUeXBlcy5mdW5jLFxyXG5cclxuICAgIC8vIENvbW1vbiBwcm9wc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBuZXR3b3Jrcy5cclxuICAgICAqICAgICAxLiBFYWNoIGRpY3Rpb25hcnkgZGVzY3JpYmVzIGFuIGVsZW1lbnQsIGFuZCBzcGVjaWZpZXMgaXRzIHB1cnBvc2UuXHJcbiAgICAgKiAgICAgICAgIC0gYGdyb3VwYCAoc3RyaW5nKTogRWl0aGVyICdub2Rlcycgb3IgJ2VkZ2VzJy4gSWYgbm90IGdpdmVuLCBpdCdzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KTogRWxlbWVudCBzcGVjaWZpYyBkYXRhLlxyXG4gICAgICogICAgICAgICAgICAgIC0gYGlkYCAoc3RyaW5nKTogUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50LCB1c2VmdWwgZm9yIHNlbGVjdG9ycyBhbmQgZWRnZXMuIFJhbmRvbWx5IGFzc2lnbmVkIGlmIG5vdCBnaXZlbi5cclxuICAgICAqICAgICAgICAgICAgICAtIGBsYWJlbGAgKHN0cmluZyk6IE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBlbGVtZW50LCB1c2VmdWwgd2hlbiBgZGF0YShsYWJlbClgIGlzIGdpdmVuIHRvIGEgc3R5bGUncyBgY29udGVudGAgb3IgYGxhYmVsYC4gSXQgaXMgb25seSBhIGNvbnZlbnRpb24uXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgcGFyZW50YCAoc3RyaW5nKTogT25seSBmb3Igbm9kZXMuIE9wdGlvbmFsIHJlZmVyZW5jZSB0byBhbm90aGVyIG5vZGUuIE5lZWRlZCB0byBjcmVhdGUgY29tcG91bmQgbm9kZXMuXHJcbiAgICAgKiAgICAgICAgICAgICAgLSBgc291cmNlYCAoc3RyaW5nKTogT25seSBmb3IgZWRnZXMuIFRoZSBpZCBvZiB0aGUgc291cmNlIG5vZGUsIHdoaWNoIGlzIHdoZXJlIHRoZSBlZGdlIHN0YXJ0cy5cclxuICAgICAqICAgICAgICAgICAgICAtIGB0YXJnZXRgIChzdHJpbmcpOiBPbmx5IGZvciBlZGdlcy4gVGhlIGlkIG9mIHRoZSB0YXJnZXQgbm9kZSwgd2hlcmUgdGhlIGVkZ2UgZW5kcy5cclxuICAgICAqICAgICAgICAgLSBgcG9zaXRpb25gIChkaWN0aW9uYXJ5KTogT25seSBmb3Igbm9kZXMuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB4YCAobnVtYmVyKTogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbm9kZS5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0ZWRgIChib29sZWFuKTogSWYgdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQgdXBvbiBpbml0aWFsaXNhdGlvbi5cclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pOiBJZiB0aGUgZWxlbWVudCBjYW4gYmUgc2VsZWN0ZWQuXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pOiBPbmx5IGZvciBub2Rlcy4gSWYgdGhlIHBvc2l0aW9uIGlzIGltbXV0YWJsZS5cclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbik6IE9ubHkgZm9yIG5vZGVzLiBJZiB0aGUgbm9kZSBjYW4gYmUgZ3JhYmJlZCBhbmQgbW92ZWQgYnkgdGhlIHVzZXIuXHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpOiBTcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGNsYXNzIG5hbWVzIG9mIHRoZSBlbGVtZW50LiBUaG9zZSBjbGFzc2VzIGNhbiBiZSBzZWxlY3RlZCBieSBhIHN0eWxlIHNlbGVjdG9yLlxyXG4gICAgICpcclxuICAgICAqICAgICAyLiBUaGUgW29mZmljaWFsIEN5dG9zY2FwZS5qcyBkb2N1bWVudGF0aW9uXShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbm90YXRpb24vZWxlbWVudHMtanNvbikgb2ZmZXJzIGFuIGV4dGVuc2l2ZSBvdmVydmlldyBhbmQgZXhhbXBsZXMgb2YgZWxlbWVudCBkZWNsYXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZWxlbWVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIGRpY3Rpb25hcmllcyByZXByZXNlbnRpbmcgdGhlIHN0eWxlcyBvZiB0aGUgZWxlbWVudHMuXHJcbiAgICAgKiAgICAgMS4gRWFjaCBkaWN0aW9uYXJ5IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcga2V5czpcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0b3JgIChzdHJpbmcpOiBXaGljaCBlbGVtZW50cyB5b3UgYXJlIHN0eWxpbmcuIEdlbmVyYWxseSwgeW91IHNlbGVjdCBhIGdyb3VwIG9mIGVsZW1lbnRzIChub2RlLCBlZGdlcywgYm90aCksIGEgY2xhc3MgKHRoYXQgeW91IGRlY2xhcmUgaW4gdGhlIGVsZW1lbnQgZGljdGlvbmFyeSksIG9yIGFuIGVsZW1lbnQgYnkgSUQuXHJcbiAgICAgKiAgICAgICAgIC0gYHN0eWxlYCAoZGljdGlvbmFyeSk6IFdoYXQgYXNwZWN0cyBvZiB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gbW9kaWZ5LiBUaGlzIGNvdWxkIGJlIHRoZSBzaXplIG9yIGNvbG9yIG9mIGEgbm9kZSwgdGhlIHNoYXBlIG9mIGFuIGVkZ2UgYXJyb3csIG9yIG1hbnkgbW9yZS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gQm90aCBbdGhlIHNlbGVjdG9yIHN0cmluZ10oaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3NlbGVjdG9ycykgYW5kXHJcbiAgICAgKiAgICAgW3RoZSBzdHlsZSBkaWN0aW9uYXJ5XShodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGUvbm9kZS1ib2R5KSBhcmVcclxuICAgICAqICAgICBleGhhdXN0aXZlbHkgZG9jdW1lbnRlZCBpbiB0aGUgQ3l0b3NjYXBlLmpzIGRvY3MuIEFsdGhvdWdoIG1ldGhvZHMgc3VjaFxyXG4gICAgICogICAgIGFzIGBjeS5lbGVtZW50cyguLi4pYCBhbmQgYGN5LmZpbHRlciguLi4pYCBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIHNlbGVjdG9yXHJcbiAgICAgKiAgICAgc3RyaW5nIHN5bnRheCBzdGF5cyB0aGUgc2FtZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVzaGVldDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGRpY3Rpb25hcnkgc3BlY2lmeWluZyBob3cgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgaW4geW91clxyXG4gICAgICogZ3JhcGguIFRoZSBgJ25hbWUnYCBrZXkgaXMgcmVxdWlyZWQsIGFuZCBpbmRpY2F0ZXMgd2hpY2ggbGF5b3V0IChhbGdvcml0aG0pIHRvXHJcbiAgICAgKiB1c2UuXHJcbiAgICAgKiAgICAgMS4gVGhlIGxheW91dHMgYXZhaWxhYmxlIGJ5IGRlZmF1bHQgYXJlOlxyXG4gICAgICogICAgICAgICAtIGByYW5kb21gOiBSYW5kb21seSBhc3NpZ25zIHBvc2l0aW9uc1xyXG4gICAgICogICAgICAgICAtIGBwcmVzZXRgOiBBc3NpZ25zIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBgcG9zaXRpb25gIGtleSBpbiBlbGVtZW50IGRpY3Rpb25hcmllc1xyXG4gICAgICogICAgICAgICAtIGBjaXJjbGVgOiBTaW5nbGUtbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBjb25jZW50cmljYDogTXVsdGktbGV2ZWwgY2lyY2xlLCB3aXRoIG9wdGlvbmFsIHJhZGl1c1xyXG4gICAgICogICAgICAgICAtIGBncmlkYDogU3F1YXJlIGdyaWQsIG9wdGlvbmFsbHkgd2l0aCBudW1iZXJzIG9mIGByb3dzYCBhbmQgYGNvbHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGJyZWFkdGhmaXJzdGA6IFRyZWUgc3RydWN0dXJlIGJ1aWx0IHVzaW5nIEJGUywgd2l0aCBvcHRpb25hbCBgcm9vdHNgXHJcbiAgICAgKiAgICAgICAgIC0gYGNvc2VgOiBGb3JjZS1kaXJlY3RlZCBwaHlzaWNzIHNpbXVsYXRpb25cclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gU29tZSBleHRlcm5hbCBsYXlvdXRzIGFyZSBhbHNvIGluY2x1ZGVkLiBUbyB1c2UgdGhlbSwgcnVuXHJcbiAgICAgKiAgICAgYGRhc2hfY3l0b3NjYXBlLmxvYWRfZXh0cmFfbGF5b3V0cygpYCBiZWZvcmUgY3JlYXRpbmcgeW91ciBEYXNoIGFwcC4gQmUgY2FyZWZ1bCBhYm91dFxyXG4gICAgICogICAgIHVzaW5nIHRoZSBleHRyYSBsYXlvdXRzIHdoZW4gbm90IG5lY2Vzc2FyeSwgc2luY2UgdGhleSByZXF1aXJlIHN1cHBsZW1lbnRhcnkgYmFuZHdpZHRoXHJcbiAgICAgKiAgICAgZm9yIGxvYWRpbmcsIHdoaWNoIGltcGFjdHMgdGhlIHN0YXJ0dXAgdGltZSBvZiB0aGUgYXBwLlxyXG4gICAgICogICAgICAgICAtIGBjb3NlLWJpbGtlbnRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1jb3NlLWJpbGtlbnRcclxuICAgICAqICAgICAgICAgLSBgY29sYWA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jeXRvc2NhcGUvY3l0b3NjYXBlLmpzLWNvbGFcclxuICAgICAqICAgICAgICAgLSBgZXVsZXJgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBzcHJlYWRgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1zcHJlYWRcclxuICAgICAqICAgICAgICAgLSBgZGFncmVgOiBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy1kYWdyZVxyXG4gICAgICogICAgICAgICAtIGBrbGF5YDogaHR0cHM6Ly9naXRodWIuY29tL2N5dG9zY2FwZS9jeXRvc2NhcGUuanMta2xheVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBUaGUga2V5cyBhY2NlcHRlZCBieSBgbGF5b3V0YCB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgYWxnb3JpdGhtLCBidXQgc29tZVxyXG4gICAgICogICAgIGtleXMgYXJlIGFjY2VwdGVkIGJ5IGFsbCBsYXlvdXRzOlxyXG4gICAgICogICAgICAgICAtIGBmaXRgIChib29sZWFuKTogV2hldGhlciB0byByZW5kZXIgdGhlIG5vZGVzIGluIG9yZGVyIHRvIGZpdCB0aGUgY2FudmFzLlxyXG4gICAgICogICAgICAgICAtIGBwYWRkaW5nYCAobnVtYmVyKTogUGFkZGluZyBhcm91bmQgdGhlIHNpZGVzIG9mIHRoZSBjYW52YXMsIGlmIGZpdCBpcyBlbmFibGVkLlxyXG4gICAgICogICAgICAgICAtIGBhbmltYXRlYCAoYm9vbGVhbik6IFdoZXRoZXIgdG8gYW5pbWF0ZSBjaGFuZ2UgaW4gcG9zaXRpb24gd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMuXHJcbiAgICAgKiAgICAgICAgIC0gYGFuaW1hdGlvbkR1cmF0aW9uYCAobnVtYmVyKTogRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgaWYgZW5hYmxlZC5cclxuICAgICAqICAgICAgICAgLSBgYm91bmRpbmdCb3hgIChkaWN0aW9uYXJ5KTogSG93IHRvIGNvbnN0cmFpbiB0aGUgbGF5b3V0IGluIGEgc3BlY2lmaWMgYXJlYS4gS2V5cyBhY2NlcHRlZCBhcmUgZWl0aGVyIGB4MSwgeTEsIHgyLCB5MmAgb3IgYHgxLCB5MSwgdywgaGAsIGFsbCBvZiB3aGljaCByZWNlaXZlIGEgcGl4ZWwgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDQuIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGxheW91dHMgYW5kIHRoZWlyIGFjY2VwdGVkIG9wdGlvbnMgYXJlIGF2YWlsYWJsZVxyXG4gICAgICogICAgIG9uIHRoZSBbQ3l0b3NjYXBlLmpzIGRvY3NdKGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNsYXlvdXRzKS4gRm9yIHRoZVxyXG4gICAgICogICAgIGV4dGVybmFsIGxheW91dHMsIHRoZSBvcHRpb25zIGFyZSBsaXN0ZWQgaW4gdGhlIFwiQVBJXCIgc2VjdGlvbiBvZiB0aGVcclxuICAgICAqICAgICBSRUFETUUuXHJcbiAgICAgKiAgICAgTm90ZSB0aGF0IGNlcnRhaW4ga2V5cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBEYXNoIHNpbmNlIHRoZSB2YWx1ZSBpcyBhXHJcbiAgICAgKiAgICAgSmF2YVNjcmlwdCBmdW5jdGlvbiBvciBhIGNhbGxiYWNrLiBQbGVhc2UgdmlzaXQgW3RoaXMgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9wbG90bHkvZGFzaC1jeXRvc2NhcGUvaXNzdWVzLzI1KVxyXG4gICAgICogICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBsYXlvdXQ6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLy8gVmlld3BvcnQgTWFuaXB1bGF0aW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWN0aW9uYXJ5IGluZGljYXRpbmcgdGhlIGluaXRpYWwgcGFubmluZyBwb3NpdGlvbiBvZiB0aGUgZ3JhcGguIFRoZVxyXG4gICAgICogZm9sbG93aW5nIGtleXMgYXJlIGFjY2VwdGVkOlxyXG4gICAgICogICAgIC0gYHhgIChudW1iZXIpOiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cclxuICAgICAqICAgICAtIGB5YCAobnVtYmVyKTogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHBhbjogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBZb3UgY2FuIHNldCBgbWluWm9vbWAgYW5kXHJcbiAgICAgKiBgbWF4Wm9vbWAgdG8gc2V0IHJlc3RyaWN0aW9ucyBvbiB0aGUgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgem9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvLyBWaWV3cG9ydCBNdXRhYmlsaXR5IGFuZCBnZXN0dXJlIFRvZ2dsaW5nXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgcGFubmluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpc1xyXG4gICAgICogbXV0YWJsZSBvdmVyYWxsKS5cclxuICAgICAqL1xyXG4gICAgcGFubmluZ0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB1c2VyIGV2ZW50cyAoZS5nLiBkcmFnZ2luZyB0aGUgZ3JhcGggYmFja2dyb3VuZCkgYXJlIGFsbG93ZWQgdG9cclxuICAgICAqIHBhbiB0aGUgZ3JhcGguXHJcbiAgICAgKi9cclxuICAgIHVzZXJQYW5uaW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1pbmltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIHNtYWxsZXIgdGhhbiB0aGlzIHpvb20gbGV2ZWwuXHJcbiAgICAgKi9cclxuICAgIG1pblpvb206IFByb3BUeXBlcy5udW1iZXIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1heGltdW0gYm91bmQgb24gdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLiBUaGUgdmlld3BvcnQgY2FuIG5vdCBiZVxyXG4gICAgICogc2NhbGVkIGxhcmdlciB0aGFuIHRoaXMgem9vbSBsZXZlbC5cclxuICAgICAqL1xyXG4gICAgbWF4Wm9vbTogUHJvcFR5cGVzLm51bWJlcixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgem9vbWluZyB0aGUgZ3JhcGggaXMgZW5hYmxlZCAoaS5lLiwgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoXHJcbiAgICAgKiBpcyBtdXRhYmxlIG92ZXJhbGwpLlxyXG4gICAgICovXHJcbiAgICB6b29taW5nRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHVzZXIgZXZlbnRzIChlLmcuIGRyYWdnaW5nIHRoZSBncmFwaCBiYWNrZ3JvdW5kKSBhcmUgYWxsb3dlZFxyXG4gICAgICogdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgYm94IHNlbGVjdGlvbiAoaS5lLiBkcmFnIGEgYm94IG92ZXJsYXkgYXJvdW5kLCBhbmQgcmVsZWFzZSBpdFxyXG4gICAgICogdG8gc2VsZWN0KSBpcyBlbmFibGVkLiBJZiBlbmFibGVkLCB0aGUgdXNlciBtdXN0IHRhcGhvbGQgdG8gcGFuIHRoZSBncmFwaC5cclxuICAgICAqL1xyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bmdyYWJpZmllZCAobm90IGdyYWJiYWJsZSBieSB1c2VyKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgbm9kZSBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bmdyYWJpZnk6IFByb3BUeXBlcy5ib29sLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBub2RlcyBzaG91bGQgYmUgbG9ja2VkIChub3QgZHJhZ2dhYmxlIGF0IGFsbCkgYnkgZGVmYXVsdFxyXG4gICAgICogKGlmIHRydWUsIG92ZXJyaWRlcyBpbmRpdmlkdWFsIG5vZGUgc3RhdGUpLlxyXG4gICAgICovXHJcbiAgICBhdXRvbG9jazogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5vZGVzIHNob3VsZCBiZSB1bnNlbGVjdGlmaWVkIChpbW11dGFibGUgc2VsZWN0aW9uIHN0YXRlKSBieVxyXG4gICAgICogZGVmYXVsdCAoaWYgdHJ1ZSwgb3ZlcnJpZGVzIGluZGl2aWR1YWwgZWxlbWVudCBzdGF0ZSkuXHJcbiAgICAgKi9cclxuICAgIGF1dG91bnNlbGVjdGlmeTogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGJlIHJlZnJlc2hlZCB3aGVuIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxyXG4gICAgICovXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogUHJvcFR5cGVzLmJvb2wsXHJcblxyXG4gICAgLy8gVXNlciBFdmVudHMgUHJvcHNcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb21wbGV0ZSBub2RlIGRpY3Rpb25hcnkgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKlxyXG4gICAgICogICAgIDEuIE5vZGUtc3BlY2lmaWMgaXRlbXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGVkZ2VzRGF0YWAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbmRlcmVkUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0aW1lU3RhbXBgIChudW1iZXIpXHJcbiAgICAgKlxyXG4gICAgICogICAgIDIuIEdlbmVyYWwgaXRlbXMgKGZvciBhbGwgZWxlbWVudHMpOlxyXG4gICAgICogICAgICAgICAtIGBjbGFzc2VzYCAoc3RyaW5nKVxyXG4gICAgICogICAgICAgICAtIGBkYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgZ3JhYmJhYmxlYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgZ3JvdXBgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGxvY2tlZGAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHBvc2l0aW9uYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICpcclxuICAgICAqICAgICAzLiBJdGVtcyBmb3IgY29tcG91bmQgbm9kZXM6XHJcbiAgICAgKiAgICAgICAgIC0gYGFuY2VzdG9yc0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBjaGlsZHJlbkRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBkZXNjZW5kYW50c0RhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBwYXJlbnREYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgc2libGluZ3NEYXRhYCAoZGljdGlvbmFyeSlcclxuICAgICAqICAgICAgICAgLSBgaXNQYXJlbnRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc0NoaWxkbGVzc2AgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYGlzQ2hpbGRgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBpc09ycGhhbmAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHJlbGF0aXZlUG9zaXRpb25gIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBOb2RlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhIG5vZGUgcmV0dXJuZWQgd2hlbiB5b3UgdGFwIG9yIGNsaWNrIGl0LiBSZWFkLW9ubHkuXHJcbiAgICAgKi9cclxuICAgIHRhcE5vZGVEYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbXBsZXRlIGVkZ2UgZGljdGlvbmFyeSByZXR1cm5lZCB3aGVuIHlvdSB0YXAgb3IgY2xpY2sgaXQuIFJlYWQtb25seS5cclxuICAgICAqXHJcbiAgICAgKiAgICAgMS4gRWRnZS1zcGVjaWZpYyBpdGVtczpcclxuICAgICAqICAgICAgICAgLSBgaXNMb29wYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgaXNTaW1wbGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBtaWRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHNvdXJjZURhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBzb3VyY2VFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRhcmdldERhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGB0YXJnZXRFbmRwb2ludGAgKGRpY3Rpb25hcnkpXHJcbiAgICAgKiAgICAgICAgIC0gYHRpbWVTdGFtcGAgKG51bWJlcilcclxuICAgICAqXHJcbiAgICAgKiAgICAgMi4gR2VuZXJhbCBpdGVtcyAoZm9yIGFsbCBlbGVtZW50cyk6XHJcbiAgICAgKiAgICAgICAgIC0gYGNsYXNzZXNgIChzdHJpbmcpXHJcbiAgICAgKiAgICAgICAgIC0gYGRhdGFgIChkaWN0aW9uYXJ5KVxyXG4gICAgICogICAgICAgICAtIGBncmFiYmFibGVgIChib29sZWFuKVxyXG4gICAgICogICAgICAgICAtIGBncm91cGAgKHN0cmluZylcclxuICAgICAqICAgICAgICAgLSBgbG9ja2VkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc2VsZWN0YWJsZWAgKGJvb2xlYW4pXHJcbiAgICAgKiAgICAgICAgIC0gYHNlbGVjdGVkYCAoYm9vbGVhbilcclxuICAgICAqICAgICAgICAgLSBgc3R5bGVgIChkaWN0aW9uYXJ5KVxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlOiBQcm9wVHlwZXMub2JqZWN0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgZGljdGlvbmFyeSBvZiBhbiBlZGdlIHJldHVybmVkIHdoZW4geW91IHRhcCBvciBjbGljayBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICB0YXBFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkYXRhIGRpY3Rpb25hcnkgb2YgYSBub2RlIHJldHVybmVkIHdoZW4geW91IGhvdmVyIG92ZXIgaXQuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgbW91c2VvdmVyTm9kZURhdGE6IFByb3BUeXBlcy5vYmplY3QsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBkaWN0aW9uYXJ5IG9mIGFuIGVkZ2UgcmV0dXJuZWQgd2hlbiB5b3UgaG92ZXIgb3ZlciBpdC4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBtb3VzZW92ZXJFZGdlRGF0YTogUHJvcFR5cGVzLm9iamVjdCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsaXN0IG9mIGRhdGEgZGljdGlvbmFyaWVzIG9mIGFsbCBzZWxlY3RlZCBub2RlcyAoZS5nLiB1c2luZ1xyXG4gICAgICogU2hpZnQrQ2xpY2sgdG8gc2VsZWN0IG11bHRpcGxlIG5vZGVzLCBvciBTaGlmdCtEcmFnIHRvIHVzZSBib3ggc2VsZWN0aW9uKS4gUmVhZC1vbmx5LlxyXG4gICAgICovXHJcbiAgICBzZWxlY3RlZE5vZGVEYXRhOiBQcm9wVHlwZXMuYXJyYXksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlzdCBvZiBkYXRhIGRpY3Rpb25hcmllcyBvZiBhbGwgc2VsZWN0ZWQgZWRnZXMgKGUuZy4gdXNpbmdcclxuICAgICAqIFNoaWZ0K0NsaWNrIHRvIHNlbGVjdCBtdWx0aXBsZSBub2Rlcywgb3IgU2hpZnQrRHJhZyB0byB1c2UgYm94IHNlbGVjdGlvbikuIFJlYWQtb25seS5cclxuICAgICAqL1xyXG4gICAgc2VsZWN0ZWRFZGdlRGF0YTogUHJvcFR5cGVzLmFycmF5XHJcbn07XHJcblxyXG5DeXRvc2NhcGUuZGVmYXVsdFByb3BzID0ge1xyXG4gICAgc3R5bGU6IHt3aWR0aDogJzYwMHB4JywgaGVpZ2h0OiAnNjAwcHgnfSxcclxuICAgIGxheW91dDoge25hbWU6ICdncmlkJ30sXHJcbiAgICBwYW46IHt4OiAwLCB5OiAwfSxcclxuICAgIHpvb206IDEsXHJcbiAgICBtaW5ab29tOiAxZS01MCxcclxuICAgIG1heFpvb206IDFlNTAsXHJcbiAgICB6b29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHVzZXJab29taW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZmFsc2UsXHJcbiAgICBhdXRvbG9jazogZmFsc2UsXHJcbiAgICBhdXRvdW5ncmFiaWZ5OiBmYWxzZSxcclxuICAgIGF1dG91bnNlbGVjdGlmeTogZmFsc2UsXHJcbiAgICBhdXRvUmVmcmVzaExheW91dDogdHJ1ZVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3l0b3NjYXBlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/components/Cytoscape.react.js\n"); /***/ }), diff --git a/dash_cytoscape/package.json b/dash_cytoscape/package.json index 24830c28..78a09c0c 100644 --- a/dash_cytoscape/package.json +++ b/dash_cytoscape/package.json @@ -1,6 +1,6 @@ { "name": "dash-cytoscape", - "version": "0.0.5", + "version": "0.1.0", "description": "A Component Library for Dash aimed at facilitating network visualization in Python, wrapped around Cytoscape.js", "main": "build/index.js", "scripts": { diff --git a/package.json b/package.json index 24830c28..78a09c0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dash-cytoscape", - "version": "0.0.5", + "version": "0.1.0", "description": "A Component Library for Dash aimed at facilitating network visualization in Python, wrapped around Cytoscape.js", "main": "build/index.js", "scripts": {