@pie-lib/graphing-solution-set 3.1.0-next.0 → 3.1.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/package.json +9 -9
- package/lib/__tests__/graph-with-controls.test.js +0 -199
- package/lib/__tests__/graph.test.js +0 -114
- package/lib/__tests__/grid.test.js +0 -29
- package/lib/__tests__/labels.test.js +0 -45
- package/lib/__tests__/mark-label.test.js +0 -133
- package/lib/__tests__/toggle-bar.test.js +0 -89
- package/lib/__tests__/tool-menu.test.js +0 -41
- package/lib/__tests__/undo-redo.test.js +0 -31
- package/lib/__tests__/use-debounce.test.js +0 -24
- package/lib/__tests__/utils.js +0 -70
- package/lib/__tests__/utils.test.js +0 -123
- package/lib/axis/__tests__/arrow.test.js +0 -60
- package/lib/axis/__tests__/axes.test.js +0 -162
- package/lib/axis/arrow.js +0 -79
- package/lib/axis/arrow.js.map +0 -1
- package/lib/axis/axes.js +0 -325
- package/lib/axis/axes.js.map +0 -1
- package/lib/axis/index.js +0 -21
- package/lib/axis/index.js.map +0 -1
- package/lib/bg.js +0 -111
- package/lib/bg.js.map +0 -1
- package/lib/container/actions.js +0 -18
- package/lib/container/actions.js.map +0 -1
- package/lib/container/index.js +0 -120
- package/lib/container/index.js.map +0 -1
- package/lib/container/marks.js +0 -22
- package/lib/container/marks.js.map +0 -1
- package/lib/container/middleware.js +0 -19
- package/lib/container/middleware.js.map +0 -1
- package/lib/container/reducer.js +0 -18
- package/lib/container/reducer.js.map +0 -1
- package/lib/coordinates-label.js +0 -77
- package/lib/coordinates-label.js.map +0 -1
- package/lib/graph-with-controls.js +0 -298
- package/lib/graph-with-controls.js.map +0 -1
- package/lib/graph.js +0 -354
- package/lib/graph.js.map +0 -1
- package/lib/grid-setup.js +0 -406
- package/lib/grid-setup.js.map +0 -1
- package/lib/grid.js +0 -131
- package/lib/grid.js.map +0 -1
- package/lib/index.js +0 -40
- package/lib/index.js.map +0 -1
- package/lib/labels.js +0 -199
- package/lib/labels.js.map +0 -1
- package/lib/mark-label.js +0 -159
- package/lib/mark-label.js.map +0 -1
- package/lib/toggle-bar.js +0 -248
- package/lib/toggle-bar.js.map +0 -1
- package/lib/tool-menu.js +0 -218
- package/lib/tool-menu.js.map +0 -1
- package/lib/tools/index.js +0 -24
- package/lib/tools/index.js.map +0 -1
- package/lib/tools/line/__tests__/component.test.js +0 -45
- package/lib/tools/line/component.js +0 -92
- package/lib/tools/line/component.js.map +0 -1
- package/lib/tools/line/index.js +0 -11
- package/lib/tools/line/index.js.map +0 -1
- package/lib/tools/polygon/__tests__/component.test.js +0 -81
- package/lib/tools/polygon/__tests__/index.test.js +0 -92
- package/lib/tools/polygon/__tests__/line.test.js +0 -30
- package/lib/tools/polygon/__tests__/polygon.test.js +0 -61
- package/lib/tools/polygon/component.js +0 -360
- package/lib/tools/polygon/component.js.map +0 -1
- package/lib/tools/polygon/index.js +0 -89
- package/lib/tools/polygon/index.js.map +0 -1
- package/lib/tools/polygon/line.js +0 -114
- package/lib/tools/polygon/line.js.map +0 -1
- package/lib/tools/polygon/polygon.js +0 -131
- package/lib/tools/polygon/polygon.js.map +0 -1
- package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
- package/lib/tools/shared/arrow-head.js +0 -62
- package/lib/tools/shared/arrow-head.js.map +0 -1
- package/lib/tools/shared/line/__tests__/index.test.js +0 -129
- package/lib/tools/shared/line/__tests__/line-path.test.js +0 -64
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -83
- package/lib/tools/shared/line/index.js +0 -541
- package/lib/tools/shared/line/index.js.map +0 -1
- package/lib/tools/shared/line/line-path.js +0 -121
- package/lib/tools/shared/line/line-path.js.map +0 -1
- package/lib/tools/shared/line/with-root-edge.js +0 -121
- package/lib/tools/shared/line/with-root-edge.js.map +0 -1
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
- package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
- package/lib/tools/shared/point/arrow-point.js +0 -86
- package/lib/tools/shared/point/arrow-point.js.map +0 -1
- package/lib/tools/shared/point/arrow.js +0 -70
- package/lib/tools/shared/point/arrow.js.map +0 -1
- package/lib/tools/shared/point/base-point.js +0 -137
- package/lib/tools/shared/point/base-point.js.map +0 -1
- package/lib/tools/shared/point/index.js +0 -80
- package/lib/tools/shared/point/index.js.map +0 -1
- package/lib/tools/shared/styles.js +0 -26
- package/lib/tools/shared/styles.js.map +0 -1
- package/lib/tools/shared/types.js +0 -15
- package/lib/tools/shared/types.js.map +0 -1
- package/lib/undo-redo.js +0 -67
- package/lib/undo-redo.js.map +0 -1
- package/lib/use-debounce.js +0 -25
- package/lib/use-debounce.js.map +0 -1
- package/lib/utils.js +0 -239
- package/lib/utils.js.map +0 -1
|
@@ -1,541 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.styles = exports.lineToolComponent = exports.lineTool = exports.lineBase = void 0;
|
|
8
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
11
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
12
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
13
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
var _react = _interopRequireDefault(require("react"));
|
|
16
|
-
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
17
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
18
|
-
var _point = require("../point");
|
|
19
|
-
var _plot = require("@pie-lib/plot");
|
|
20
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
21
|
-
var _styles = require("../styles");
|
|
22
|
-
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
23
|
-
var _markLabel = _interopRequireDefault(require("../../../mark-label"));
|
|
24
|
-
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
25
|
-
var _renderUi = require("@pie-lib/render-ui");
|
|
26
|
-
var _utils = require("../../../utils");
|
|
27
|
-
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
28
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
29
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
30
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
31
|
-
var lineTool = exports.lineTool = function lineTool(type, Component) {
|
|
32
|
-
return function () {
|
|
33
|
-
return {
|
|
34
|
-
type: type,
|
|
35
|
-
Component: Component,
|
|
36
|
-
addPoint: function addPoint(point, mark) {
|
|
37
|
-
if (mark && (0, _utils.equalPoints)(mark.root, point)) {
|
|
38
|
-
return mark;
|
|
39
|
-
}
|
|
40
|
-
if (!mark) {
|
|
41
|
-
return {
|
|
42
|
-
type: type,
|
|
43
|
-
building: true,
|
|
44
|
-
from: point
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
if ((0, _utils.equalPoints)(point, mark.from)) {
|
|
48
|
-
return _objectSpread({}, mark);
|
|
49
|
-
}
|
|
50
|
-
return _objectSpread(_objectSpread({}, mark), {}, {
|
|
51
|
-
building: false,
|
|
52
|
-
to: point
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
};
|
|
58
|
-
var lineToolComponent = exports.lineToolComponent = function lineToolComponent(Component) {
|
|
59
|
-
var _LineToolComponent;
|
|
60
|
-
return _LineToolComponent = /*#__PURE__*/function (_React$Component) {
|
|
61
|
-
function LineToolComponent(props) {
|
|
62
|
-
var _this;
|
|
63
|
-
(0, _classCallCheck2["default"])(this, LineToolComponent);
|
|
64
|
-
_this = _callSuper(this, LineToolComponent, [props]);
|
|
65
|
-
(0, _defineProperty2["default"])(_this, "startDrag", function () {
|
|
66
|
-
return _this.setState({
|
|
67
|
-
mark: _objectSpread({}, _this.props.mark)
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
(0, _defineProperty2["default"])(_this, "stopDrag", function () {
|
|
71
|
-
var _this$props = _this.props,
|
|
72
|
-
onChange = _this$props.onChange,
|
|
73
|
-
mark = _this$props.mark;
|
|
74
|
-
var update = _objectSpread({}, _this.state.mark);
|
|
75
|
-
_this.setState({
|
|
76
|
-
mark: undefined
|
|
77
|
-
}, function () {
|
|
78
|
-
var type = update.type;
|
|
79
|
-
var shouldNotChange = type && (type === 'parabola' || type === 'sine' || type === 'absolute' || type === 'exponential') && (0, _utils.sameAxes)(update.from, update.to);
|
|
80
|
-
if (!shouldNotChange && type && type === 'exponential' && update.from && update.to) {
|
|
81
|
-
shouldNotChange = update.from.y === 0 || update.to.y === 0 || update.from.y * update.to.y < 0;
|
|
82
|
-
}
|
|
83
|
-
if (!(0, _isEqual["default"])(mark, update) && !shouldNotChange) {
|
|
84
|
-
onChange(mark, update);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
(0, _defineProperty2["default"])(_this, "changeMark", function (_ref) {
|
|
89
|
-
var from = _ref.from,
|
|
90
|
-
to = _ref.to,
|
|
91
|
-
middle = _ref.middle;
|
|
92
|
-
var mark = _objectSpread(_objectSpread({}, _this.state.mark), {}, {
|
|
93
|
-
from: from,
|
|
94
|
-
to: to
|
|
95
|
-
});
|
|
96
|
-
if (middle) {
|
|
97
|
-
mark = _objectSpread(_objectSpread({}, mark), {}, {
|
|
98
|
-
middle: middle
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
_this.setState({
|
|
102
|
-
mark: mark
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
(0, _defineProperty2["default"])(_this, "changeMarkProps", function (_ref2) {
|
|
106
|
-
var from = _ref2.from,
|
|
107
|
-
to = _ref2.to,
|
|
108
|
-
middle = _ref2.middle;
|
|
109
|
-
var _this$props2 = _this.props,
|
|
110
|
-
onChange = _this$props2.onChange,
|
|
111
|
-
mark = _this$props2.mark;
|
|
112
|
-
var update = _objectSpread(_objectSpread({}, mark), _this.state.mark);
|
|
113
|
-
if (from) {
|
|
114
|
-
update = _objectSpread(_objectSpread({}, update), {}, {
|
|
115
|
-
from: from
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
if (to) {
|
|
119
|
-
update = _objectSpread(_objectSpread({}, update), {}, {
|
|
120
|
-
to: to
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
if (middle) {
|
|
124
|
-
update = _objectSpread(_objectSpread({}, update), {}, {
|
|
125
|
-
middle: middle
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
if (!(0, _isEqual["default"])(mark, update)) {
|
|
129
|
-
onChange(mark, update);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
_this.state = {};
|
|
133
|
-
return _this;
|
|
134
|
-
}
|
|
135
|
-
(0, _inherits2["default"])(LineToolComponent, _React$Component);
|
|
136
|
-
return (0, _createClass2["default"])(LineToolComponent, [{
|
|
137
|
-
key: "render",
|
|
138
|
-
value: function render() {
|
|
139
|
-
var _this$props3 = this.props,
|
|
140
|
-
graphProps = _this$props3.graphProps,
|
|
141
|
-
onClick = _this$props3.onClick,
|
|
142
|
-
labelNode = _this$props3.labelNode,
|
|
143
|
-
labelModeEnabled = _this$props3.labelModeEnabled,
|
|
144
|
-
coordinatesOnHover = _this$props3.coordinatesOnHover,
|
|
145
|
-
gssLineData = _this$props3.gssLineData;
|
|
146
|
-
var mark = this.state.mark ? this.state.mark : this.props.mark;
|
|
147
|
-
var from = (0, _cloneDeep["default"])(mark.from);
|
|
148
|
-
var to = (0, _cloneDeep["default"])(mark.to);
|
|
149
|
-
var middle = (0, _cloneDeep["default"])(mark.middle);
|
|
150
|
-
|
|
151
|
-
// SET DISABLED
|
|
152
|
-
// if it's a background mark, we need to force disable it
|
|
153
|
-
if (from && mark.isBackground) {
|
|
154
|
-
from.disabled = true;
|
|
155
|
-
}
|
|
156
|
-
if (to && mark.isBackground) {
|
|
157
|
-
to.disabled = true;
|
|
158
|
-
}
|
|
159
|
-
if (middle && mark.isBackground) {
|
|
160
|
-
middle.disabled = true;
|
|
161
|
-
}
|
|
162
|
-
return /*#__PURE__*/_react["default"].createElement(Component, {
|
|
163
|
-
disabled: mark.disabled,
|
|
164
|
-
coordinatesOnHover: coordinatesOnHover,
|
|
165
|
-
correctness: mark.correctness,
|
|
166
|
-
from: from,
|
|
167
|
-
to: to,
|
|
168
|
-
middle: middle,
|
|
169
|
-
graphProps: graphProps,
|
|
170
|
-
fill: mark && mark.fill,
|
|
171
|
-
gssLineData: gssLineData,
|
|
172
|
-
onChange: this.changeMark,
|
|
173
|
-
changeMarkProps: this.changeMarkProps,
|
|
174
|
-
onClick: onClick,
|
|
175
|
-
onDragStart: this.startDrag,
|
|
176
|
-
onDragStop: this.stopDrag,
|
|
177
|
-
labelNode: labelNode,
|
|
178
|
-
labelModeEnabled: labelModeEnabled
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}]);
|
|
182
|
-
}(_react["default"].Component), (0, _defineProperty2["default"])(_LineToolComponent, "propTypes", _objectSpread(_objectSpread({}, _plot.types.ToolPropTypeFields), {}, {
|
|
183
|
-
graphProps: _plot.types.GraphPropsType.isRequired
|
|
184
|
-
})), _LineToolComponent;
|
|
185
|
-
};
|
|
186
|
-
var dragOpts = function dragOpts() {
|
|
187
|
-
return {
|
|
188
|
-
bounds: function bounds(props, _ref3) {
|
|
189
|
-
var domain = _ref3.domain,
|
|
190
|
-
range = _ref3.range;
|
|
191
|
-
var area = _plot.utils.lineToArea(props.from, props.to);
|
|
192
|
-
return _plot.utils.bounds(area, domain, range);
|
|
193
|
-
},
|
|
194
|
-
anchorPoint: function anchorPoint(props) {
|
|
195
|
-
var from = props.from;
|
|
196
|
-
return from;
|
|
197
|
-
},
|
|
198
|
-
fromDelta: function fromDelta(props, delta) {
|
|
199
|
-
var from = props.from,
|
|
200
|
-
to = props.to;
|
|
201
|
-
return {
|
|
202
|
-
from: _plot.utils.point(from).add(_plot.utils.point(delta)),
|
|
203
|
-
to: _plot.utils.point(to).add(_plot.utils.point(delta))
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
};
|
|
208
|
-
var lineBase = exports.lineBase = function lineBase(Comp, opts) {
|
|
209
|
-
var DraggableComp = (0, _plot.gridDraggable)(dragOpts())(Comp);
|
|
210
|
-
var FromPoint = opts && opts.from ? opts.from : _point.BasePoint;
|
|
211
|
-
var ToPoint = opts && opts.to ? opts.to : _point.BasePoint;
|
|
212
|
-
var LineBase = /*#__PURE__*/function (_React$Component2) {
|
|
213
|
-
function LineBase() {
|
|
214
|
-
var _this2;
|
|
215
|
-
(0, _classCallCheck2["default"])(this, LineBase);
|
|
216
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
217
|
-
args[_key] = arguments[_key];
|
|
218
|
-
}
|
|
219
|
-
_this2 = _callSuper(this, LineBase, [].concat(args));
|
|
220
|
-
(0, _defineProperty2["default"])(_this2, "onChangePoint", function (point) {
|
|
221
|
-
var _this2$props = _this2.props,
|
|
222
|
-
middle = _this2$props.middle,
|
|
223
|
-
onChange = _this2$props.onChange;
|
|
224
|
-
var from = point.from,
|
|
225
|
-
to = point.to;
|
|
226
|
-
|
|
227
|
-
// because point.from.label and point.to.label can be different
|
|
228
|
-
if (!(0, _utils.equalPoints)(from, to)) {
|
|
229
|
-
if (middle) {
|
|
230
|
-
point.middle = _objectSpread(_objectSpread({}, middle), (0, _utils.getMiddleOfTwoPoints)(from, to));
|
|
231
|
-
}
|
|
232
|
-
onChange(point);
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
(0, _defineProperty2["default"])(_this2, "dragComp", function (_ref4) {
|
|
236
|
-
var draggedFrom = _ref4.from,
|
|
237
|
-
draggedTo = _ref4.to;
|
|
238
|
-
var _this2$props2 = _this2.props,
|
|
239
|
-
from = _this2$props2.from,
|
|
240
|
-
to = _this2$props2.to,
|
|
241
|
-
onChange = _this2$props2.onChange,
|
|
242
|
-
middle = _this2$props2.middle;
|
|
243
|
-
if (from.label) {
|
|
244
|
-
draggedFrom.label = from.label;
|
|
245
|
-
}
|
|
246
|
-
if (to.label) {
|
|
247
|
-
draggedTo.label = to.label;
|
|
248
|
-
}
|
|
249
|
-
var updated = {
|
|
250
|
-
from: draggedFrom,
|
|
251
|
-
to: draggedTo
|
|
252
|
-
};
|
|
253
|
-
if (middle) {
|
|
254
|
-
updated.middle = _objectSpread(_objectSpread({}, middle), (0, _utils.getMiddleOfTwoPoints)(draggedFrom, draggedTo));
|
|
255
|
-
}
|
|
256
|
-
onChange(updated);
|
|
257
|
-
});
|
|
258
|
-
(0, _defineProperty2["default"])(_this2, "dragFrom", function (draggedFrom) {
|
|
259
|
-
var _this2$props3 = _this2.props,
|
|
260
|
-
from = _this2$props3.from,
|
|
261
|
-
to = _this2$props3.to;
|
|
262
|
-
if (from.label) {
|
|
263
|
-
draggedFrom.label = from.label;
|
|
264
|
-
}
|
|
265
|
-
if (!(0, _utils.equalPoints)(draggedFrom, to)) {
|
|
266
|
-
_this2.onChangePoint({
|
|
267
|
-
from: draggedFrom,
|
|
268
|
-
to: to
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
(0, _defineProperty2["default"])(_this2, "dragTo", function (draggedTo) {
|
|
273
|
-
var _this2$props4 = _this2.props,
|
|
274
|
-
from = _this2$props4.from,
|
|
275
|
-
to = _this2$props4.to;
|
|
276
|
-
if (to.label) {
|
|
277
|
-
draggedTo.label = to.label;
|
|
278
|
-
}
|
|
279
|
-
if (!(0, _utils.equalPoints)(from, draggedTo)) {
|
|
280
|
-
_this2.onChangePoint({
|
|
281
|
-
from: from,
|
|
282
|
-
to: draggedTo
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
(0, _defineProperty2["default"])(_this2, "labelChange", function (point, type) {
|
|
287
|
-
var changeMarkProps = _this2.props.changeMarkProps;
|
|
288
|
-
var update = _objectSpread({}, point);
|
|
289
|
-
if (!point.label || (0, _isEmpty["default"])(point.label)) {
|
|
290
|
-
delete update.label;
|
|
291
|
-
}
|
|
292
|
-
changeMarkProps((0, _defineProperty2["default"])({}, type, update));
|
|
293
|
-
});
|
|
294
|
-
(0, _defineProperty2["default"])(_this2, "clickPoint", function (point, type, data) {
|
|
295
|
-
var _this2$props5 = _this2.props,
|
|
296
|
-
changeMarkProps = _this2$props5.changeMarkProps,
|
|
297
|
-
disabled = _this2$props5.disabled,
|
|
298
|
-
from = _this2$props5.from,
|
|
299
|
-
to = _this2$props5.to,
|
|
300
|
-
labelModeEnabled = _this2$props5.labelModeEnabled,
|
|
301
|
-
onClick = _this2$props5.onClick;
|
|
302
|
-
if (!labelModeEnabled) {
|
|
303
|
-
onClick(point || data);
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
if (disabled) {
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
if (type === 'middle' && !point && from && to) {
|
|
310
|
-
point = _objectSpread(_objectSpread({}, point), (0, _utils.getMiddleOfTwoPoints)(from, to));
|
|
311
|
-
}
|
|
312
|
-
changeMarkProps((0, _defineProperty2["default"])({
|
|
313
|
-
from: from,
|
|
314
|
-
to: to
|
|
315
|
-
}, type, _objectSpread({
|
|
316
|
-
label: ''
|
|
317
|
-
}, point)));
|
|
318
|
-
if (_this2.input[type]) {
|
|
319
|
-
_this2.input[type].focus();
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
// IMPORTANT, do not remove
|
|
323
|
-
(0, _defineProperty2["default"])(_this2, "input", {});
|
|
324
|
-
return _this2;
|
|
325
|
-
}
|
|
326
|
-
(0, _inherits2["default"])(LineBase, _React$Component2);
|
|
327
|
-
return (0, _createClass2["default"])(LineBase, [{
|
|
328
|
-
key: "render",
|
|
329
|
-
value: function render() {
|
|
330
|
-
var _this3 = this;
|
|
331
|
-
var _this$props4 = this.props,
|
|
332
|
-
coordinatesOnHover = _this$props4.coordinatesOnHover,
|
|
333
|
-
graphProps = _this$props4.graphProps,
|
|
334
|
-
fill = _this$props4.fill,
|
|
335
|
-
gssLineData = _this$props4.gssLineData,
|
|
336
|
-
onDragStart = _this$props4.onDragStart,
|
|
337
|
-
onDragStop = _this$props4.onDragStop,
|
|
338
|
-
from = _this$props4.from,
|
|
339
|
-
to = _this$props4.to,
|
|
340
|
-
middle = _this$props4.middle,
|
|
341
|
-
disabled = _this$props4.disabled,
|
|
342
|
-
correctness = _this$props4.correctness,
|
|
343
|
-
onClick = _this$props4.onClick,
|
|
344
|
-
labelNode = _this$props4.labelNode,
|
|
345
|
-
labelModeEnabled = _this$props4.labelModeEnabled;
|
|
346
|
-
var common = {
|
|
347
|
-
graphProps: graphProps,
|
|
348
|
-
fill: fill,
|
|
349
|
-
onDragStart: onDragStart,
|
|
350
|
-
onDragStop: onDragStop,
|
|
351
|
-
disabled: disabled,
|
|
352
|
-
correctness: correctness,
|
|
353
|
-
onClick: onClick
|
|
354
|
-
};
|
|
355
|
-
if (gssLineData && gssLineData.selectedTool === 'solutionSet') {
|
|
356
|
-
//removing dragging option for line if solution set is clicked.
|
|
357
|
-
common = {
|
|
358
|
-
graphProps: graphProps,
|
|
359
|
-
fill: fill,
|
|
360
|
-
disabled: disabled,
|
|
361
|
-
correctness: correctness,
|
|
362
|
-
onClick: onClick
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
var angle = to ? _plot.trig.toDegrees(_plot.trig.angle(from, to)) : 0;
|
|
366
|
-
var fromLabelNode = null;
|
|
367
|
-
var toLabelNode = null;
|
|
368
|
-
var lineLabelNode = null;
|
|
369
|
-
if (labelNode) {
|
|
370
|
-
if (from && Object.prototype.hasOwnProperty.call(from, 'label')) {
|
|
371
|
-
fromLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
|
|
372
|
-
inputRef: function inputRef(r) {
|
|
373
|
-
return _this3.input.from = r;
|
|
374
|
-
},
|
|
375
|
-
disabled: !labelModeEnabled,
|
|
376
|
-
mark: from,
|
|
377
|
-
graphProps: graphProps,
|
|
378
|
-
onChange: function onChange(label) {
|
|
379
|
-
return _this3.labelChange(_objectSpread(_objectSpread({}, from), {}, {
|
|
380
|
-
label: label
|
|
381
|
-
}), 'from');
|
|
382
|
-
}
|
|
383
|
-
}), labelNode);
|
|
384
|
-
}
|
|
385
|
-
if (to && Object.prototype.hasOwnProperty.call(to, 'label')) {
|
|
386
|
-
toLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
|
|
387
|
-
inputRef: function inputRef(r) {
|
|
388
|
-
return _this3.input.to = r;
|
|
389
|
-
},
|
|
390
|
-
disabled: !labelModeEnabled,
|
|
391
|
-
mark: to,
|
|
392
|
-
graphProps: graphProps,
|
|
393
|
-
onChange: function onChange(label) {
|
|
394
|
-
return _this3.labelChange(_objectSpread(_objectSpread({}, to), {}, {
|
|
395
|
-
label: label
|
|
396
|
-
}), 'to');
|
|
397
|
-
}
|
|
398
|
-
}), labelNode);
|
|
399
|
-
}
|
|
400
|
-
if (middle && Object.prototype.hasOwnProperty.call(middle, 'label')) {
|
|
401
|
-
lineLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
|
|
402
|
-
inputRef: function inputRef(r) {
|
|
403
|
-
return _this3.input.middle = r;
|
|
404
|
-
},
|
|
405
|
-
disabled: !labelModeEnabled,
|
|
406
|
-
mark: middle,
|
|
407
|
-
graphProps: graphProps,
|
|
408
|
-
onChange: function onChange(label) {
|
|
409
|
-
return _this3.labelChange(_objectSpread(_objectSpread({}, middle), {}, {
|
|
410
|
-
label: label
|
|
411
|
-
}), 'middle');
|
|
412
|
-
}
|
|
413
|
-
}), labelNode);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
if (gssLineData && gssLineData.selectedTool === 'solutionSet') {
|
|
417
|
-
//removing dragging feature of line and point if solution set is true.
|
|
418
|
-
return /*#__PURE__*/_react["default"].createElement("g", null, to && /*#__PURE__*/_react["default"].createElement(DraggableComp, (0, _extends2["default"])({
|
|
419
|
-
from: from,
|
|
420
|
-
to: to,
|
|
421
|
-
middle: middle
|
|
422
|
-
}, common)), lineLabelNode, /*#__PURE__*/_react["default"].createElement(FromPoint, (0, _extends2["default"])({
|
|
423
|
-
x: from.x,
|
|
424
|
-
y: from.y,
|
|
425
|
-
labelNode: labelNode,
|
|
426
|
-
coordinatesOnHover: coordinatesOnHover
|
|
427
|
-
}, common)), fromLabelNode, to && /*#__PURE__*/_react["default"].createElement(ToPoint, (0, _extends2["default"])({
|
|
428
|
-
x: to.x,
|
|
429
|
-
y: to.y,
|
|
430
|
-
angle: angle //angle + 45}
|
|
431
|
-
,
|
|
432
|
-
labelNode: labelNode,
|
|
433
|
-
coordinatesOnHover: coordinatesOnHover
|
|
434
|
-
}, common)), toLabelNode);
|
|
435
|
-
} else {
|
|
436
|
-
return /*#__PURE__*/_react["default"].createElement("g", null, to && /*#__PURE__*/_react["default"].createElement(DraggableComp, (0, _extends2["default"])({
|
|
437
|
-
from: from,
|
|
438
|
-
to: to,
|
|
439
|
-
middle: middle,
|
|
440
|
-
onDrag: this.dragComp
|
|
441
|
-
}, common, {
|
|
442
|
-
onClick: function onClick(data) {
|
|
443
|
-
return _this3.clickPoint(middle, 'middle', data);
|
|
444
|
-
}
|
|
445
|
-
})), lineLabelNode, /*#__PURE__*/_react["default"].createElement(FromPoint, (0, _extends2["default"])({
|
|
446
|
-
x: from.x,
|
|
447
|
-
y: from.y,
|
|
448
|
-
labelNode: labelNode,
|
|
449
|
-
coordinatesOnHover: coordinatesOnHover,
|
|
450
|
-
onDrag: this.dragFrom
|
|
451
|
-
}, common, {
|
|
452
|
-
onClick: function onClick(data) {
|
|
453
|
-
return _this3.clickPoint(from, 'from', data);
|
|
454
|
-
}
|
|
455
|
-
})), fromLabelNode, to && /*#__PURE__*/_react["default"].createElement(ToPoint, (0, _extends2["default"])({
|
|
456
|
-
x: to.x,
|
|
457
|
-
y: to.y,
|
|
458
|
-
angle: angle //angle + 45}
|
|
459
|
-
,
|
|
460
|
-
labelNode: labelNode,
|
|
461
|
-
coordinatesOnHover: coordinatesOnHover,
|
|
462
|
-
onDrag: this.dragTo
|
|
463
|
-
}, common, {
|
|
464
|
-
onClick: function onClick(data) {
|
|
465
|
-
return _this3.clickPoint(to, 'to', data);
|
|
466
|
-
}
|
|
467
|
-
})), toLabelNode);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}]);
|
|
471
|
-
}(_react["default"].Component);
|
|
472
|
-
(0, _defineProperty2["default"])(LineBase, "propTypes", {
|
|
473
|
-
coordinatesOnHover: _propTypes["default"].bool,
|
|
474
|
-
graphProps: _plot.types.GraphPropsType,
|
|
475
|
-
from: _plot.types.PointType,
|
|
476
|
-
to: _plot.types.PointType,
|
|
477
|
-
middle: _plot.types.PointType,
|
|
478
|
-
onChange: _propTypes["default"].func,
|
|
479
|
-
onDragStart: _propTypes["default"].func,
|
|
480
|
-
onDragStop: _propTypes["default"].func,
|
|
481
|
-
onClick: _propTypes["default"].func,
|
|
482
|
-
correctness: _propTypes["default"].string,
|
|
483
|
-
fill: _propTypes["default"].string,
|
|
484
|
-
gssLineData: _propTypes["default"].object,
|
|
485
|
-
disabled: _propTypes["default"].bool,
|
|
486
|
-
labelNode: _propTypes["default"].object,
|
|
487
|
-
labelModeEnabled: _propTypes["default"].bool,
|
|
488
|
-
changeMarkProps: _propTypes["default"].func
|
|
489
|
-
});
|
|
490
|
-
return LineBase;
|
|
491
|
-
};
|
|
492
|
-
var styles = exports.styles = {
|
|
493
|
-
line: function line() {
|
|
494
|
-
return {
|
|
495
|
-
fill: 'transparent',
|
|
496
|
-
stroke: _renderUi.color.defaults.BLACK,
|
|
497
|
-
strokeWidth: 4,
|
|
498
|
-
transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
|
|
499
|
-
'&:hover': {
|
|
500
|
-
strokeWidth: 6,
|
|
501
|
-
stroke: _renderUi.color.defaults.BLACK
|
|
502
|
-
}
|
|
503
|
-
};
|
|
504
|
-
},
|
|
505
|
-
dashedLine: function dashedLine() {
|
|
506
|
-
return {
|
|
507
|
-
fill: 'transparent',
|
|
508
|
-
stroke: _renderUi.color.defaults.BLACK,
|
|
509
|
-
strokeWidth: 4,
|
|
510
|
-
transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
|
|
511
|
-
'&:hover': {
|
|
512
|
-
strokeWidth: 6,
|
|
513
|
-
stroke: _renderUi.color.defaults.BLACK
|
|
514
|
-
},
|
|
515
|
-
strokeDasharray: '3,3'
|
|
516
|
-
};
|
|
517
|
-
},
|
|
518
|
-
arrow: function arrow() {
|
|
519
|
-
return {
|
|
520
|
-
fill: _renderUi.color.defaults.SECONDARY
|
|
521
|
-
};
|
|
522
|
-
},
|
|
523
|
-
disabledArrow: function disabledArrow() {
|
|
524
|
-
return _objectSpread({}, (0, _styles.disabled)());
|
|
525
|
-
},
|
|
526
|
-
disabled: function disabled() {
|
|
527
|
-
return _objectSpread(_objectSpread({}, (0, _styles.disabled)('stroke')), {}, {
|
|
528
|
-
strokeWidth: 2
|
|
529
|
-
});
|
|
530
|
-
},
|
|
531
|
-
correct: function correct(theme, key) {
|
|
532
|
-
return _objectSpread({}, (0, _styles.correct)(key));
|
|
533
|
-
},
|
|
534
|
-
incorrect: function incorrect(theme, key) {
|
|
535
|
-
return _objectSpread({}, (0, _styles.incorrect)(key));
|
|
536
|
-
},
|
|
537
|
-
missing: function missing(theme, key) {
|
|
538
|
-
return _objectSpread({}, (0, _styles.missing)(key));
|
|
539
|
-
}
|
|
540
|
-
};
|
|
541
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2Nsb25lRGVlcCIsIl9wb2ludCIsIl9wbG90IiwiX3Byb3BUeXBlcyIsIl9zdHlsZXMiLCJfcmVhY3REb20iLCJfbWFya0xhYmVsIiwiX2lzRW1wdHkiLCJfcmVuZGVyVWkiLCJfdXRpbHMiLCJfY2FsbFN1cGVyIiwidCIsIm8iLCJlIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsIm93bktleXMiLCJyIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImxpbmVUb29sIiwiZXhwb3J0cyIsInR5cGUiLCJDb21wb25lbnQiLCJhZGRQb2ludCIsInBvaW50IiwibWFyayIsImVxdWFsUG9pbnRzIiwicm9vdCIsImJ1aWxkaW5nIiwiZnJvbSIsInRvIiwibGluZVRvb2xDb21wb25lbnQiLCJfTGluZVRvb2xDb21wb25lbnQiLCJfUmVhY3QkQ29tcG9uZW50IiwiTGluZVRvb2xDb21wb25lbnQiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInNldFN0YXRlIiwiX3RoaXMkcHJvcHMiLCJvbkNoYW5nZSIsInVwZGF0ZSIsInN0YXRlIiwidW5kZWZpbmVkIiwic2hvdWxkTm90Q2hhbmdlIiwic2FtZUF4ZXMiLCJ5IiwiaXNFcXVhbCIsIl9yZWYiLCJtaWRkbGUiLCJfcmVmMiIsIl90aGlzJHByb3BzMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJyZW5kZXIiLCJfdGhpcyRwcm9wczMiLCJncmFwaFByb3BzIiwib25DbGljayIsImxhYmVsTm9kZSIsImxhYmVsTW9kZUVuYWJsZWQiLCJjb29yZGluYXRlc09uSG92ZXIiLCJnc3NMaW5lRGF0YSIsImNsb25lRGVlcCIsImlzQmFja2dyb3VuZCIsImRpc2FibGVkIiwiY3JlYXRlRWxlbWVudCIsImNvcnJlY3RuZXNzIiwiZmlsbCIsImNoYW5nZU1hcmsiLCJjaGFuZ2VNYXJrUHJvcHMiLCJvbkRyYWdTdGFydCIsInN0YXJ0RHJhZyIsIm9uRHJhZ1N0b3AiLCJzdG9wRHJhZyIsIlJlYWN0IiwidHlwZXMiLCJUb29sUHJvcFR5cGVGaWVsZHMiLCJHcmFwaFByb3BzVHlwZSIsImlzUmVxdWlyZWQiLCJkcmFnT3B0cyIsImJvdW5kcyIsIl9yZWYzIiwiZG9tYWluIiwicmFuZ2UiLCJhcmVhIiwidXRpbHMiLCJsaW5lVG9BcmVhIiwiYW5jaG9yUG9pbnQiLCJmcm9tRGVsdGEiLCJkZWx0YSIsImFkZCIsImxpbmVCYXNlIiwiQ29tcCIsIm9wdHMiLCJEcmFnZ2FibGVDb21wIiwiZ3JpZERyYWdnYWJsZSIsIkZyb21Qb2ludCIsIkJhc2VQb2ludCIsIlRvUG9pbnQiLCJMaW5lQmFzZSIsIl9SZWFjdCRDb21wb25lbnQyIiwiX3RoaXMyIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjb25jYXQiLCJfdGhpczIkcHJvcHMiLCJnZXRNaWRkbGVPZlR3b1BvaW50cyIsIl9yZWY0IiwiZHJhZ2dlZEZyb20iLCJkcmFnZ2VkVG8iLCJfdGhpczIkcHJvcHMyIiwibGFiZWwiLCJ1cGRhdGVkIiwiX3RoaXMyJHByb3BzMyIsIm9uQ2hhbmdlUG9pbnQiLCJfdGhpczIkcHJvcHM0IiwiaXNFbXB0eSIsImRhdGEiLCJfdGhpczIkcHJvcHM1IiwiaW5wdXQiLCJmb2N1cyIsIl90aGlzMyIsIl90aGlzJHByb3BzNCIsImNvbW1vbiIsInNlbGVjdGVkVG9vbCIsImFuZ2xlIiwidHJpZyIsInRvRGVncmVlcyIsImZyb21MYWJlbE5vZGUiLCJ0b0xhYmVsTm9kZSIsImxpbmVMYWJlbE5vZGUiLCJoYXNPd25Qcm9wZXJ0eSIsIlJlYWN0RE9NIiwiY3JlYXRlUG9ydGFsIiwiaW5wdXRSZWYiLCJsYWJlbENoYW5nZSIsIl9leHRlbmRzMiIsIngiLCJvbkRyYWciLCJkcmFnQ29tcCIsImNsaWNrUG9pbnQiLCJkcmFnRnJvbSIsImRyYWdUbyIsIlByb3BUeXBlcyIsImJvb2wiLCJQb2ludFR5cGUiLCJmdW5jIiwic3RyaW5nIiwib2JqZWN0Iiwic3R5bGVzIiwibGluZSIsInN0cm9rZSIsImNvbG9yIiwiZGVmYXVsdHMiLCJCTEFDSyIsInN0cm9rZVdpZHRoIiwidHJhbnNpdGlvbiIsImRhc2hlZExpbmUiLCJzdHJva2VEYXNoYXJyYXkiLCJhcnJvdyIsIlNFQ09OREFSWSIsImRpc2FibGVkQXJyb3ciLCJjb3JyZWN0IiwidGhlbWUiLCJpbmNvcnJlY3QiLCJtaXNzaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rvb2xzL3NoYXJlZC9saW5lL2luZGV4LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCB7IEJhc2VQb2ludCB9IGZyb20gJy4uL3BvaW50JztcbmltcG9ydCB7IHR5cGVzLCB1dGlscywgZ3JpZERyYWdnYWJsZSwgdHJpZyB9IGZyb20gJ0BwaWUtbGliL3Bsb3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGRpc2FibGVkLCBjb3JyZWN0LCBpbmNvcnJlY3QsIG1pc3NpbmcgfSBmcm9tICcuLi9zdHlsZXMnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgTWFya0xhYmVsIGZyb20gJy4uLy4uLy4uL21hcmstbGFiZWwnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuaW1wb3J0IHsgZ2V0TWlkZGxlT2ZUd29Qb2ludHMsIGVxdWFsUG9pbnRzLCBzYW1lQXhlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGxpbmVUb29sID0gKHR5cGUsIENvbXBvbmVudCkgPT4gKCkgPT4gKHtcbiAgdHlwZSxcbiAgQ29tcG9uZW50LFxuICBhZGRQb2ludDogKHBvaW50LCBtYXJrKSA9PiB7XG4gICAgaWYgKG1hcmsgJiYgZXF1YWxQb2ludHMobWFyay5yb290LCBwb2ludCkpIHtcbiAgICAgIHJldHVybiBtYXJrO1xuICAgIH1cblxuICAgIGlmICghbWFyaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGZyb206IHBvaW50LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZXF1YWxQb2ludHMocG9pbnQsIG1hcmsuZnJvbSkpIHtcbiAgICAgIHJldHVybiB7IC4uLm1hcmsgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5tYXJrLCBidWlsZGluZzogZmFsc2UsIHRvOiBwb2ludCB9O1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBsaW5lVG9vbENvbXBvbmVudCA9IChDb21wb25lbnQpID0+IHtcbiAgcmV0dXJuIGNsYXNzIExpbmVUb29sQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgLi4udHlwZXMuVG9vbFByb3BUeXBlRmllbGRzLFxuICAgICAgZ3JhcGhQcm9wczogdHlwZXMuR3JhcGhQcm9wc1R5cGUuaXNSZXF1aXJlZCxcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBzdGFydERyYWcgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgbWFyazogeyAuLi50aGlzLnByb3BzLm1hcmsgfSB9KTtcblxuICAgIHN0b3BEcmFnID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBvbkNoYW5nZSwgbWFyayB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgLi4udGhpcy5zdGF0ZS5tYXJrIH07XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXJrOiB1bmRlZmluZWQgfSwgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHR5cGUgfSA9IHVwZGF0ZTtcbiAgICAgICAgbGV0IHNob3VsZE5vdENoYW5nZSA9XG4gICAgICAgICAgdHlwZSAmJlxuICAgICAgICAgICh0eXBlID09PSAncGFyYWJvbGEnIHx8IHR5cGUgPT09ICdzaW5lJyB8fCB0eXBlID09PSAnYWJzb2x1dGUnIHx8IHR5cGUgPT09ICdleHBvbmVudGlhbCcpICYmXG4gICAgICAgICAgc2FtZUF4ZXModXBkYXRlLmZyb20sIHVwZGF0ZS50byk7XG4gICAgICAgIGlmICghc2hvdWxkTm90Q2hhbmdlICYmIHR5cGUgJiYgdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyAmJiB1cGRhdGUuZnJvbSAmJiB1cGRhdGUudG8pIHtcbiAgICAgICAgICBzaG91bGROb3RDaGFuZ2UgPSB1cGRhdGUuZnJvbS55ID09PSAwIHx8IHVwZGF0ZS50by55ID09PSAwIHx8IHVwZGF0ZS5mcm9tLnkgKiB1cGRhdGUudG8ueSA8IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKG1hcmssIHVwZGF0ZSkgJiYgIXNob3VsZE5vdENoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKG1hcmssIHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjaGFuZ2VNYXJrID0gKHsgZnJvbSwgdG8sIG1pZGRsZSB9KSA9PiB7XG4gICAgICBsZXQgbWFyayA9IHsgLi4udGhpcy5zdGF0ZS5tYXJrLCBmcm9tLCB0byB9O1xuXG4gICAgICBpZiAobWlkZGxlKSB7XG4gICAgICAgIG1hcmsgPSB7IC4uLm1hcmssIG1pZGRsZSB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHsgbWFyayB9KTtcbiAgICB9O1xuXG4gICAgY2hhbmdlTWFya1Byb3BzID0gKHsgZnJvbSwgdG8sIG1pZGRsZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IG9uQ2hhbmdlLCBtYXJrIH0gPSB0aGlzLnByb3BzO1xuICAgICAgbGV0IHVwZGF0ZSA9IHsgLi4ubWFyaywgLi4udGhpcy5zdGF0ZS5tYXJrIH07XG5cbiAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsgLi4udXBkYXRlLCBmcm9tIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0bykge1xuICAgICAgICB1cGRhdGUgPSB7IC4uLnVwZGF0ZSwgdG8gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1pZGRsZSkge1xuICAgICAgICB1cGRhdGUgPSB7IC4uLnVwZGF0ZSwgbWlkZGxlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNFcXVhbChtYXJrLCB1cGRhdGUpKSB7XG4gICAgICAgIG9uQ2hhbmdlKG1hcmssIHVwZGF0ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHsgZ3JhcGhQcm9wcywgb25DbGljaywgbGFiZWxOb2RlLCBsYWJlbE1vZGVFbmFibGVkLCBjb29yZGluYXRlc09uSG92ZXIsIGdzc0xpbmVEYXRhIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgbWFyayA9IHRoaXMuc3RhdGUubWFyayA/IHRoaXMuc3RhdGUubWFyayA6IHRoaXMucHJvcHMubWFyaztcblxuICAgICAgY29uc3QgZnJvbSA9IGNsb25lRGVlcChtYXJrLmZyb20pO1xuICAgICAgY29uc3QgdG8gPSBjbG9uZURlZXAobWFyay50byk7XG4gICAgICBjb25zdCBtaWRkbGUgPSBjbG9uZURlZXAobWFyay5taWRkbGUpO1xuXG4gICAgICAvLyBTRVQgRElTQUJMRURcbiAgICAgIC8vIGlmIGl0J3MgYSBiYWNrZ3JvdW5kIG1hcmssIHdlIG5lZWQgdG8gZm9yY2UgZGlzYWJsZSBpdFxuICAgICAgaWYgKGZyb20gJiYgbWFyay5pc0JhY2tncm91bmQpIHtcbiAgICAgICAgZnJvbS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0byAmJiBtYXJrLmlzQmFja2dyb3VuZCkge1xuICAgICAgICB0by5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtaWRkbGUgJiYgbWFyay5pc0JhY2tncm91bmQpIHtcbiAgICAgICAgbWlkZGxlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENvbXBvbmVudFxuICAgICAgICAgIGRpc2FibGVkPXttYXJrLmRpc2FibGVkfVxuICAgICAgICAgIGNvb3JkaW5hdGVzT25Ib3Zlcj17Y29vcmRpbmF0ZXNPbkhvdmVyfVxuICAgICAgICAgIGNvcnJlY3RuZXNzPXttYXJrLmNvcnJlY3RuZXNzfVxuICAgICAgICAgIGZyb209e2Zyb219XG4gICAgICAgICAgdG89e3RvfVxuICAgICAgICAgIG1pZGRsZT17bWlkZGxlfVxuICAgICAgICAgIGdyYXBoUHJvcHM9e2dyYXBoUHJvcHN9XG4gICAgICAgICAgZmlsbD17bWFyayAmJiBtYXJrLmZpbGx9XG4gICAgICAgICAgZ3NzTGluZURhdGE9e2dzc0xpbmVEYXRhfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZU1hcmt9XG4gICAgICAgICAgY2hhbmdlTWFya1Byb3BzPXt0aGlzLmNoYW5nZU1hcmtQcm9wc31cbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgIG9uRHJhZ1N0YXJ0PXt0aGlzLnN0YXJ0RHJhZ31cbiAgICAgICAgICBvbkRyYWdTdG9wPXt0aGlzLnN0b3BEcmFnfVxuICAgICAgICAgIGxhYmVsTm9kZT17bGFiZWxOb2RlfVxuICAgICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ9e2xhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGRyYWdPcHRzID0gKCkgPT4gKHtcbiAgYm91bmRzOiAocHJvcHMsIHsgZG9tYWluLCByYW5nZSB9KSA9PiB7XG4gICAgY29uc3QgYXJlYSA9IHV0aWxzLmxpbmVUb0FyZWEocHJvcHMuZnJvbSwgcHJvcHMudG8pO1xuICAgIHJldHVybiB1dGlscy5ib3VuZHMoYXJlYSwgZG9tYWluLCByYW5nZSk7XG4gIH0sXG4gIGFuY2hvclBvaW50OiAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IGZyb20gfSA9IHByb3BzO1xuICAgIHJldHVybiBmcm9tO1xuICB9LFxuICBmcm9tRGVsdGE6IChwcm9wcywgZGVsdGEpID0+IHtcbiAgICBjb25zdCB7IGZyb20sIHRvIH0gPSBwcm9wcztcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogdXRpbHMucG9pbnQoZnJvbSkuYWRkKHV0aWxzLnBvaW50KGRlbHRhKSksXG4gICAgICB0bzogdXRpbHMucG9pbnQodG8pLmFkZCh1dGlscy5wb2ludChkZWx0YSkpLFxuICAgIH07XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGxpbmVCYXNlID0gKENvbXAsIG9wdHMpID0+IHtcbiAgY29uc3QgRHJhZ2dhYmxlQ29tcCA9IGdyaWREcmFnZ2FibGUoZHJhZ09wdHMoKSkoQ29tcCk7XG5cbiAgY29uc3QgRnJvbVBvaW50ID0gb3B0cyAmJiBvcHRzLmZyb20gPyBvcHRzLmZyb20gOiBCYXNlUG9pbnQ7XG4gIGNvbnN0IFRvUG9pbnQgPSBvcHRzICYmIG9wdHMudG8gPyBvcHRzLnRvIDogQmFzZVBvaW50O1xuXG4gIGNsYXNzIExpbmVCYXNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGdyYXBoUHJvcHM6IHR5cGVzLkdyYXBoUHJvcHNUeXBlLFxuICAgICAgZnJvbTogdHlwZXMuUG9pbnRUeXBlLFxuICAgICAgdG86IHR5cGVzLlBvaW50VHlwZSxcbiAgICAgIG1pZGRsZTogdHlwZXMuUG9pbnRUeXBlLFxuICAgICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgb25EcmFnU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgb25EcmFnU3RvcDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGNvcnJlY3RuZXNzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgZmlsbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGdzc0xpbmVEYXRhOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgICAgbGFiZWxOb2RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgbGFiZWxNb2RlRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBjaGFuZ2VNYXJrUHJvcHM6IFByb3BUeXBlcy5mdW5jLFxuICAgIH07XG5cbiAgICBvbkNoYW5nZVBvaW50ID0gKHBvaW50KSA9PiB7XG4gICAgICBjb25zdCB7IG1pZGRsZSwgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSBwb2ludDtcblxuICAgICAgLy8gYmVjYXVzZSBwb2ludC5mcm9tLmxhYmVsIGFuZCBwb2ludC50by5sYWJlbCBjYW4gYmUgZGlmZmVyZW50XG4gICAgICBpZiAoIWVxdWFsUG9pbnRzKGZyb20sIHRvKSkge1xuICAgICAgICBpZiAobWlkZGxlKSB7XG4gICAgICAgICAgcG9pbnQubWlkZGxlID0geyAuLi5taWRkbGUsIC4uLmdldE1pZGRsZU9mVHdvUG9pbnRzKGZyb20sIHRvKSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2UocG9pbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkcmFnQ29tcCA9ICh7IGZyb206IGRyYWdnZWRGcm9tLCB0bzogZHJhZ2dlZFRvIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8sIG9uQ2hhbmdlLCBtaWRkbGUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmIChmcm9tLmxhYmVsKSB7XG4gICAgICAgIGRyYWdnZWRGcm9tLmxhYmVsID0gZnJvbS5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvLmxhYmVsKSB7XG4gICAgICAgIGRyYWdnZWRUby5sYWJlbCA9IHRvLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkID0geyBmcm9tOiBkcmFnZ2VkRnJvbSwgdG86IGRyYWdnZWRUbyB9O1xuXG4gICAgICBpZiAobWlkZGxlKSB7XG4gICAgICAgIHVwZGF0ZWQubWlkZGxlID0geyAuLi5taWRkbGUsIC4uLmdldE1pZGRsZU9mVHdvUG9pbnRzKGRyYWdnZWRGcm9tLCBkcmFnZ2VkVG8pIH07XG4gICAgICB9XG5cbiAgICAgIG9uQ2hhbmdlKHVwZGF0ZWQpO1xuICAgIH07XG5cbiAgICBkcmFnRnJvbSA9IChkcmFnZ2VkRnJvbSkgPT4ge1xuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKGZyb20ubGFiZWwpIHtcbiAgICAgICAgZHJhZ2dlZEZyb20ubGFiZWwgPSBmcm9tLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVxdWFsUG9pbnRzKGRyYWdnZWRGcm9tLCB0bykpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZVBvaW50KHsgZnJvbTogZHJhZ2dlZEZyb20sIHRvOiB0byB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZHJhZ1RvID0gKGRyYWdnZWRUbykgPT4ge1xuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHRvLmxhYmVsKSB7XG4gICAgICAgIGRyYWdnZWRUby5sYWJlbCA9IHRvLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVxdWFsUG9pbnRzKGZyb20sIGRyYWdnZWRUbykpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZVBvaW50KHsgZnJvbTogZnJvbSwgdG86IGRyYWdnZWRUbyB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGFiZWxDaGFuZ2UgPSAocG9pbnQsIHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHsgY2hhbmdlTWFya1Byb3BzIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgdXBkYXRlID0geyAuLi5wb2ludCB9O1xuXG4gICAgICBpZiAoIXBvaW50LmxhYmVsIHx8IGlzRW1wdHkocG9pbnQubGFiZWwpKSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGUubGFiZWw7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZU1hcmtQcm9wcyh7IFt0eXBlXTogdXBkYXRlIH0pO1xuICAgIH07XG5cbiAgICBjbGlja1BvaW50ID0gKHBvaW50LCB0eXBlLCBkYXRhKSA9PiB7XG4gICAgICBjb25zdCB7IGNoYW5nZU1hcmtQcm9wcywgZGlzYWJsZWQsIGZyb20sIHRvLCBsYWJlbE1vZGVFbmFibGVkLCBvbkNsaWNrIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBpZiAoIWxhYmVsTW9kZUVuYWJsZWQpIHtcbiAgICAgICAgb25DbGljayhwb2ludCB8fCBkYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ21pZGRsZScgJiYgIXBvaW50ICYmIGZyb20gJiYgdG8pIHtcbiAgICAgICAgcG9pbnQgPSB7IC4uLnBvaW50LCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhmcm9tLCB0bykgfTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlTWFya1Byb3BzKHsgZnJvbSwgdG8sIFt0eXBlXTogeyBsYWJlbDogJycsIC4uLnBvaW50IH0gfSk7XG5cbiAgICAgIGlmICh0aGlzLmlucHV0W3R5cGVdKSB7XG4gICAgICAgIHRoaXMuaW5wdXRbdHlwZV0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSU1QT1JUQU5ULCBkbyBub3QgcmVtb3ZlXG4gICAgaW5wdXQgPSB7fTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyLFxuICAgICAgICBncmFwaFByb3BzLFxuICAgICAgICBmaWxsLFxuICAgICAgICBnc3NMaW5lRGF0YSxcbiAgICAgICAgb25EcmFnU3RhcnQsXG4gICAgICAgIG9uRHJhZ1N0b3AsXG4gICAgICAgIGZyb20sXG4gICAgICAgIHRvLFxuICAgICAgICBtaWRkbGUsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBjb3JyZWN0bmVzcyxcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBsYWJlbE1vZGVFbmFibGVkLFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICBsZXQgY29tbW9uID0geyBncmFwaFByb3BzLCBmaWxsLCBvbkRyYWdTdGFydCwgb25EcmFnU3RvcCwgZGlzYWJsZWQsIGNvcnJlY3RuZXNzLCBvbkNsaWNrIH07XG4gICAgICBpZiAoZ3NzTGluZURhdGEgJiYgZ3NzTGluZURhdGEuc2VsZWN0ZWRUb29sID09PSAnc29sdXRpb25TZXQnKSB7XG4gICAgICAgIC8vcmVtb3ZpbmcgZHJhZ2dpbmcgb3B0aW9uIGZvciBsaW5lIGlmIHNvbHV0aW9uIHNldCBpcyBjbGlja2VkLlxuICAgICAgICBjb21tb24gPSB7IGdyYXBoUHJvcHMsIGZpbGwsIGRpc2FibGVkLCBjb3JyZWN0bmVzcywgb25DbGljayB9O1xuICAgICAgfVxuICAgICAgY29uc3QgYW5nbGUgPSB0byA/IHRyaWcudG9EZWdyZWVzKHRyaWcuYW5nbGUoZnJvbSwgdG8pKSA6IDA7XG5cbiAgICAgIGxldCBmcm9tTGFiZWxOb2RlID0gbnVsbDtcbiAgICAgIGxldCB0b0xhYmVsTm9kZSA9IG51bGw7XG4gICAgICBsZXQgbGluZUxhYmVsTm9kZSA9IG51bGw7XG5cbiAgICAgIGlmIChsYWJlbE5vZGUpIHtcbiAgICAgICAgaWYgKGZyb20gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sICdsYWJlbCcpKSB7XG4gICAgICAgICAgZnJvbUxhYmVsTm9kZSA9IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxNYXJrTGFiZWxcbiAgICAgICAgICAgICAgaW5wdXRSZWY9eyhyKSA9PiAodGhpcy5pbnB1dC5mcm9tID0gcil9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXshbGFiZWxNb2RlRW5hYmxlZH1cbiAgICAgICAgICAgICAgbWFyaz17ZnJvbX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhsYWJlbCkgPT4gdGhpcy5sYWJlbENoYW5nZSh7IC4uLmZyb20sIGxhYmVsIH0sICdmcm9tJyl9XG4gICAgICAgICAgICAvPixcbiAgICAgICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0bywgJ2xhYmVsJykpIHtcbiAgICAgICAgICB0b0xhYmVsTm9kZSA9IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxNYXJrTGFiZWxcbiAgICAgICAgICAgICAgaW5wdXRSZWY9eyhyKSA9PiAodGhpcy5pbnB1dC50byA9IHIpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWxhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIG1hcms9e3RvfVxuICAgICAgICAgICAgICBncmFwaFByb3BzPXtncmFwaFByb3BzfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGxhYmVsKSA9PiB0aGlzLmxhYmVsQ2hhbmdlKHsgLi4udG8sIGxhYmVsIH0sICd0bycpfVxuICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWRkbGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1pZGRsZSwgJ2xhYmVsJykpIHtcbiAgICAgICAgICBsaW5lTGFiZWxOb2RlID0gUmVhY3RET00uY3JlYXRlUG9ydGFsKFxuICAgICAgICAgICAgPE1hcmtMYWJlbFxuICAgICAgICAgICAgICBpbnB1dFJlZj17KHIpID0+ICh0aGlzLmlucHV0Lm1pZGRsZSA9IHIpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWxhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIG1hcms9e21pZGRsZX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhsYWJlbCkgPT4gdGhpcy5sYWJlbENoYW5nZSh7IC4uLm1pZGRsZSwgbGFiZWwgfSwgJ21pZGRsZScpfVxuICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdzc0xpbmVEYXRhICYmIGdzc0xpbmVEYXRhLnNlbGVjdGVkVG9vbCA9PT0gJ3NvbHV0aW9uU2V0Jykge1xuICAgICAgICAvL3JlbW92aW5nIGRyYWdnaW5nIGZlYXR1cmUgb2YgbGluZSBhbmQgcG9pbnQgaWYgc29sdXRpb24gc2V0IGlzIHRydWUuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGc+XG4gICAgICAgICAgICB7dG8gJiYgPERyYWdnYWJsZUNvbXAgZnJvbT17ZnJvbX0gdG89e3RvfSBtaWRkbGU9e21pZGRsZX0gey4uLmNvbW1vbn0gLz59XG4gICAgICAgICAgICB7bGluZUxhYmVsTm9kZX1cblxuICAgICAgICAgICAgPEZyb21Qb2ludFxuICAgICAgICAgICAgICB4PXtmcm9tLnh9XG4gICAgICAgICAgICAgIHk9e2Zyb20ueX1cbiAgICAgICAgICAgICAgbGFiZWxOb2RlPXtsYWJlbE5vZGV9XG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzT25Ib3Zlcj17Y29vcmRpbmF0ZXNPbkhvdmVyfVxuICAgICAgICAgICAgICB7Li4uY29tbW9ufVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtmcm9tTGFiZWxOb2RlfVxuXG4gICAgICAgICAgICB7dG8gJiYgKFxuICAgICAgICAgICAgICA8VG9Qb2ludFxuICAgICAgICAgICAgICAgIHg9e3RvLnh9XG4gICAgICAgICAgICAgICAgeT17dG8ueX1cbiAgICAgICAgICAgICAgICBhbmdsZT17YW5nbGV9IC8vYW5nbGUgKyA0NX1cbiAgICAgICAgICAgICAgICBsYWJlbE5vZGU9e2xhYmVsTm9kZX1cbiAgICAgICAgICAgICAgICBjb29yZGluYXRlc09uSG92ZXI9e2Nvb3JkaW5hdGVzT25Ib3Zlcn1cbiAgICAgICAgICAgICAgICB7Li4uY29tbW9ufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0b0xhYmVsTm9kZX1cbiAgICAgICAgICA8L2c+XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxnPlxuICAgICAgICAgICAge3RvICYmIChcbiAgICAgICAgICAgICAgPERyYWdnYWJsZUNvbXBcbiAgICAgICAgICAgICAgICBmcm9tPXtmcm9tfVxuICAgICAgICAgICAgICAgIHRvPXt0b31cbiAgICAgICAgICAgICAgICBtaWRkbGU9e21pZGRsZX1cbiAgICAgICAgICAgICAgICBvbkRyYWc9e3RoaXMuZHJhZ0NvbXB9XG4gICAgICAgICAgICAgICAgey4uLmNvbW1vbn1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KG1pZGRsZSwgJ21pZGRsZScsIGRhdGEpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtsaW5lTGFiZWxOb2RlfVxuXG4gICAgICAgICAgICA8RnJvbVBvaW50XG4gICAgICAgICAgICAgIHg9e2Zyb20ueH1cbiAgICAgICAgICAgICAgeT17ZnJvbS55fVxuICAgICAgICAgICAgICBsYWJlbE5vZGU9e2xhYmVsTm9kZX1cbiAgICAgICAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyPXtjb29yZGluYXRlc09uSG92ZXJ9XG4gICAgICAgICAgICAgIG9uRHJhZz17dGhpcy5kcmFnRnJvbX1cbiAgICAgICAgICAgICAgey4uLmNvbW1vbn1cbiAgICAgICAgICAgICAgb25DbGljaz17KGRhdGEpID0+IHRoaXMuY2xpY2tQb2ludChmcm9tLCAnZnJvbScsIGRhdGEpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtmcm9tTGFiZWxOb2RlfVxuXG4gICAgICAgICAgICB7dG8gJiYgKFxuICAgICAgICAgICAgICA8VG9Qb2ludFxuICAgICAgICAgICAgICAgIHg9e3RvLnh9XG4gICAgICAgICAgICAgICAgeT17dG8ueX1cbiAgICAgICAgICAgICAgICBhbmdsZT17YW5nbGV9IC8vYW5nbGUgKyA0NX1cbiAgICAgICAgICAgICAgICBsYWJlbE5vZGU9e2xhYmVsTm9kZX1cbiAgICAgICAgICAgICAgICBjb29yZGluYXRlc09uSG92ZXI9e2Nvb3JkaW5hdGVzT25Ib3Zlcn1cbiAgICAgICAgICAgICAgICBvbkRyYWc9e3RoaXMuZHJhZ1RvfVxuICAgICAgICAgICAgICAgIHsuLi5jb21tb259XG4gICAgICAgICAgICAgICAgb25DbGljaz17KGRhdGEpID0+IHRoaXMuY2xpY2tQb2ludCh0bywgJ3RvJywgZGF0YSl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RvTGFiZWxOb2RlfVxuICAgICAgICAgIDwvZz5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gTGluZUJhc2U7XG59O1xuXG5leHBvcnQgY29uc3Qgc3R5bGVzID0ge1xuICBsaW5lOiAoKSA9PiAoe1xuICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgc3Ryb2tlOiBjb2xvci5kZWZhdWx0cy5CTEFDSyxcbiAgICBzdHJva2VXaWR0aDogNCxcbiAgICB0cmFuc2l0aW9uOiAnc3Ryb2tlIDIwMG1zIGVhc2UtaW4sIHN0cm9rZS13aWR0aCAyMDBtcyBlYXNlLWluJyxcbiAgICAnJjpob3Zlcic6IHtcbiAgICAgIHN0cm9rZVdpZHRoOiA2LFxuICAgICAgc3Ryb2tlOiBjb2xvci5kZWZhdWx0cy5CTEFDSyxcbiAgICB9LFxuICB9KSxcbiAgZGFzaGVkTGluZTogKCkgPT4gKHtcbiAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgIHN0cm9rZTogY29sb3IuZGVmYXVsdHMuQkxBQ0ssXG4gICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgdHJhbnNpdGlvbjogJ3N0cm9rZSAyMDBtcyBlYXNlLWluLCBzdHJva2Utd2lkdGggMjAwbXMgZWFzZS1pbicsXG4gICAgJyY6aG92ZXInOiB7XG4gICAgICBzdHJva2VXaWR0aDogNixcbiAgICAgIHN0cm9rZTogY29sb3IuZGVmYXVsdHMuQkxBQ0ssXG4gICAgfSxcbiAgICBzdHJva2VEYXNoYXJyYXk6ICczLDMnLFxuICB9KSxcbiAgYXJyb3c6ICgpID0+ICh7XG4gICAgZmlsbDogY29sb3IuZGVmYXVsdHMuU0VDT05EQVJZLFxuICB9KSxcbiAgZGlzYWJsZWRBcnJvdzogKCkgPT4gKHtcbiAgICAuLi5kaXNhYmxlZCgpLFxuICB9KSxcbiAgZGlzYWJsZWQ6ICgpID0+ICh7XG4gICAgLi4uZGlzYWJsZWQoJ3N0cm9rZScpLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICB9KSxcbiAgY29ycmVjdDogKHRoZW1lLCBrZXkpID0+ICh7XG4gICAgLi4uY29ycmVjdChrZXkpLFxuICB9KSxcbiAgaW5jb3JyZWN0OiAodGhlbWUsIGtleSkgPT4gKHtcbiAgICAuLi5pbmNvcnJlY3Qoa2V5KSxcbiAgfSksXG4gIG1pc3Npbmc6ICh0aGVtZSwga2V5KSA9PiAoe1xuICAgIC4uLm1pc3Npbmcoa2V5KSxcbiAgfSksXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFNBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLFVBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLFFBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFNBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLE1BQUEsR0FBQVgsT0FBQTtBQUE2RSxTQUFBWSxXQUFBQyxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxXQUFBRCxDQUFBLE9BQUFFLGdCQUFBLGFBQUFGLENBQUEsT0FBQUcsMkJBQUEsYUFBQUosQ0FBQSxFQUFBSyx5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQU4sQ0FBQSxFQUFBQyxDQUFBLFlBQUFDLGdC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
|