@pie-lib/mask-markup 2.0.0-beta.2 → 2.1.0-next.0

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.
Files changed (80) hide show
  1. package/CHANGELOG.json +1 -871
  2. package/CHANGELOG.md +296 -2
  3. package/LICENSE.md +5 -0
  4. package/NEXT.CHANGELOG.json +1 -0
  5. package/lib/__tests__/drag-in-the-blank.test.js +129 -0
  6. package/lib/__tests__/index.test.js +42 -0
  7. package/lib/__tests__/mask.test.js +163 -0
  8. package/lib/__tests__/serialization.test.js +44 -0
  9. package/lib/__tests__/utils.js +14 -0
  10. package/lib/__tests__/with-mask.test.js +110 -0
  11. package/lib/choices/__tests__/index.test.js +101 -0
  12. package/lib/choices/choice.js +100 -119
  13. package/lib/choices/choice.js.map +1 -1
  14. package/lib/choices/index.js +24 -20
  15. package/lib/choices/index.js.map +1 -1
  16. package/lib/componentize.js +2 -3
  17. package/lib/componentize.js.map +1 -1
  18. package/lib/components/__tests__/blank.test.js +189 -0
  19. package/lib/components/__tests__/correct-input.test.js +132 -0
  20. package/lib/components/__tests__/dropdown.test.js +134 -0
  21. package/lib/components/__tests__/input.test.js +129 -0
  22. package/lib/components/blank.js +316 -222
  23. package/lib/components/blank.js.map +1 -1
  24. package/lib/components/correct-input.js +40 -43
  25. package/lib/components/correct-input.js.map +1 -1
  26. package/lib/components/dropdown.js +394 -125
  27. package/lib/components/dropdown.js.map +1 -1
  28. package/lib/components/input.js +2 -3
  29. package/lib/components/input.js.map +1 -1
  30. package/lib/constructed-response.js +83 -27
  31. package/lib/constructed-response.js.map +1 -1
  32. package/lib/customizable.js +44 -0
  33. package/lib/customizable.js.map +1 -0
  34. package/lib/drag-in-the-blank.js +155 -62
  35. package/lib/drag-in-the-blank.js.map +1 -1
  36. package/lib/index.js +8 -1
  37. package/lib/index.js.map +1 -1
  38. package/lib/inline-dropdown.js +5 -4
  39. package/lib/inline-dropdown.js.map +1 -1
  40. package/lib/mask.js +90 -57
  41. package/lib/mask.js.map +1 -1
  42. package/lib/serialization.js +31 -43
  43. package/lib/serialization.js.map +1 -1
  44. package/lib/with-mask.js +49 -21
  45. package/lib/with-mask.js.map +1 -1
  46. package/package.json +18 -15
  47. package/src/__tests__/drag-in-the-blank.test.js +111 -0
  48. package/src/__tests__/index.test.js +39 -0
  49. package/src/__tests__/mask.test.js +187 -0
  50. package/src/__tests__/serialization.test.js +54 -0
  51. package/src/__tests__/utils.js +1 -0
  52. package/src/__tests__/with-mask.test.js +76 -0
  53. package/src/choices/__tests__/index.test.js +75 -0
  54. package/src/choices/choice.jsx +83 -96
  55. package/src/choices/index.jsx +11 -5
  56. package/src/components/__tests__/blank.test.js +138 -0
  57. package/src/components/__tests__/correct-input.test.js +90 -0
  58. package/src/components/__tests__/dropdown.test.js +93 -0
  59. package/src/components/__tests__/input.test.js +102 -0
  60. package/src/components/blank.jsx +316 -204
  61. package/src/components/correct-input.jsx +37 -38
  62. package/src/components/dropdown.jsx +371 -125
  63. package/src/constructed-response.jsx +71 -18
  64. package/src/customizable.jsx +35 -0
  65. package/src/drag-in-the-blank.jsx +152 -40
  66. package/src/index.js +10 -1
  67. package/src/inline-dropdown.jsx +2 -0
  68. package/src/mask.jsx +71 -25
  69. package/src/serialization.js +22 -34
  70. package/src/with-mask.jsx +43 -3
  71. package/README.md +0 -14
  72. package/lib/new-serialization.js +0 -267
  73. package/lib/new-serialization.js.map +0 -1
  74. package/lib/parse-html.js +0 -17
  75. package/lib/parse-html.js.map +0 -1
  76. package/lib/test-serializer.js +0 -164
  77. package/lib/test-serializer.js.map +0 -1
  78. package/src/new-serialization.jsx +0 -291
  79. package/src/parse-html.js +0 -8
  80. package/src/test-serializer.js +0 -163
@@ -1,263 +1,357 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
- exports["default"] = exports.DRAG_TYPE = exports.BlankContent = void 0;
8
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
12
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
8
+ exports["default"] = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
14
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
- var _react = _interopRequireDefault(require("react"));
16
- var _reactDom = _interopRequireDefault(require("react-dom"));
12
+ var _react = _interopRequireWildcard(require("react"));
17
13
  var _propTypes = _interopRequireDefault(require("prop-types"));
18
14
  var _mathRendering = require("@pie-lib/math-rendering");
19
15
  var _debug = _interopRequireDefault(require("debug"));
20
- var _drag = require("@pie-lib/drag");
21
- var _styles = require("@material-ui/core/styles");
22
- var _Chip = _interopRequireDefault(require("@material-ui/core/Chip"));
23
- var _classnames3 = _interopRequireDefault(require("classnames"));
16
+ var _core = require("@dnd-kit/core");
17
+ var _utilities = require("@dnd-kit/utilities");
18
+ var _styles = require("@mui/material/styles");
19
+ var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
20
+ var _classnames = _interopRequireDefault(require("classnames"));
24
21
  var _renderUi = require("@pie-lib/render-ui");
25
- var _excluded = ["connectDragSource", "connectDropTarget"];
26
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
27
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
28
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
29
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
22
+ var _colors = require("@mui/material/colors");
23
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
24
+ 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; }
25
+ 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; }
30
26
  var log = (0, _debug["default"])('pie-lib:mask-markup:blank');
31
- var DRAG_TYPE = 'MaskBlank';
32
- exports.DRAG_TYPE = DRAG_TYPE;
33
- var useStyles = (0, _styles.withStyles)(function () {
27
+ var StyledContent = (0, _styles.styled)('span')(function (_ref) {
28
+ var dragged = _ref.dragged,
29
+ over = _ref.over;
30
+ return _objectSpread(_objectSpread({
31
+ border: "solid 0px ".concat(_renderUi.color.primary()),
32
+ minWidth: '200px',
33
+ touchAction: 'none',
34
+ overflow: 'hidden',
35
+ whiteSpace: 'nowrap',
36
+ opacity: 1
37
+ }, over && {
38
+ whiteSpace: 'nowrap',
39
+ overflow: 'hidden'
40
+ }), dragged && {
41
+ opacity: 0.5
42
+ });
43
+ });
44
+ var StyledChip = (0, _styles.styled)(_Chip["default"])(function () {
34
45
  return {
35
- content: {
36
- border: "solid 0px ".concat(_renderUi.color.primary()),
37
- minWidth: '200px',
38
- touchAction: 'none',
46
+ backgroundColor: _renderUi.color.background(),
47
+ border: "2px dashed ".concat(_renderUi.color.text()),
48
+ color: _renderUi.color.text(),
49
+ fontSize: 'inherit',
50
+ maxWidth: '374px',
51
+ position: 'relative',
52
+ borderRadius: '3px',
53
+ '&.over': {
54
+ whiteSpace: 'nowrap',
39
55
  overflow: 'hidden'
40
56
  },
41
- chip: {
42
- backgroundColor: _renderUi.color.background(),
43
- border: "1px solid ".concat(_renderUi.color.text()),
44
- color: _renderUi.color.text(),
45
- minWidth: '90px',
46
- fontSize: 'inherit',
47
- minHeight: '32px',
48
- height: 'auto',
49
- maxWidth: '374px',
50
- position: 'relative'
57
+ '&.parentOver': {
58
+ border: "1px solid ".concat(_colors.grey[500]),
59
+ backgroundColor: "".concat(_colors.grey[300])
51
60
  },
52
- chipLabel: {
53
- whiteSpace: 'pre-wrap',
54
- // Added for touch devices, for image content.
55
- // This will prevent the context menu from appearing and not allowing other interactions with the image.
56
- // If interactions with the image in the token will be requested we should handle only the context Menu.
57
- pointerEvents: 'none',
58
- '& img': {
59
- display: 'block',
60
- padding: '2px 0'
61
- }
61
+ '&.correct': {
62
+ border: "solid 1px ".concat(_renderUi.color.correct())
62
63
  },
63
- hidden: {
64
- color: 'transparent',
65
- opacity: 0
64
+ '&.incorrect': {
65
+ border: "solid 1px ".concat(_renderUi.color.incorrect())
66
66
  },
67
- dragged: {
68
- position: 'absolute',
69
- left: 16,
70
- maxWidth: '60px'
67
+ '&.Mui-disabled': {
68
+ opacity: 1
69
+ }
70
+ };
71
+ });
72
+ var StyledChipLabel = (0, _styles.styled)('span')(function () {
73
+ return {
74
+ whiteSpace: 'normal',
75
+ // Added for touch devices, for image content.
76
+ // This will prevent the context menu from appearing and not allowing other interactions with the image.
77
+ // If interactions with the image in the token will be requested we should handle only the context Menu.
78
+ pointerEvents: 'none',
79
+ '& img': {
80
+ display: 'block',
81
+ padding: '2px 0'
71
82
  },
72
- correct: {
73
- border: "solid 1px ".concat(_renderUi.color.correct())
83
+ // Remove default <p> margins to ensure consistent spacing across all wrapped content (p, span, div, math)
84
+ // Padding for top and bottom will instead be controlled by the container for consistent layout
85
+ // Ensures consistent behavior with pie-api-browser, where marginTop is already removed by a Bootstrap stylesheet
86
+ '& p': {
87
+ marginTop: '0',
88
+ marginBottom: '0'
74
89
  },
75
- incorrect: {
76
- border: "solid 1px ".concat(_renderUi.color.incorrect())
90
+ '& mjx-frac': {
91
+ fontSize: '120% !important'
77
92
  },
78
- over: {
93
+ '&.over': {
79
94
  whiteSpace: 'nowrap',
80
95
  overflow: 'hidden'
96
+ },
97
+ '&.hidden': {
98
+ color: 'transparent',
99
+ opacity: 0
100
+ },
101
+ '&.dragged': {
102
+ position: 'absolute',
103
+ left: 16,
104
+ maxWidth: '60px'
81
105
  }
82
106
  };
83
107
  });
84
- var BlankContent = /*#__PURE__*/function (_React$Component) {
85
- (0, _inherits2["default"])(BlankContent, _React$Component);
86
- var _super = _createSuper(BlankContent);
87
- function BlankContent() {
88
- var _this;
89
- (0, _classCallCheck2["default"])(this, BlankContent);
90
- _this = _super.call(this);
91
- _this.state = {
92
- height: 0
108
+ function BlankContent(_ref2) {
109
+ var _dragItem$choice, _frozenRef$current, _frozenRef$current2;
110
+ var disabled = _ref2.disabled,
111
+ choice = _ref2.choice,
112
+ isOver = _ref2.isOver,
113
+ isDragging = _ref2.isDragging,
114
+ dragItem = _ref2.dragItem,
115
+ correct = _ref2.correct,
116
+ emptyResponseAreaWidth = _ref2.emptyResponseAreaWidth,
117
+ emptyResponseAreaHeight = _ref2.emptyResponseAreaHeight;
118
+ var rootRef = (0, _react.useRef)(null);
119
+ var spanRef = (0, _react.useRef)(null);
120
+ var frozenRef = (0, _react.useRef)(null); // to use during dragging to prevent flickering
121
+ var _useState = (0, _react.useState)({
122
+ height: 0,
123
+ width: 0
124
+ }),
125
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
126
+ dimensions = _useState2[0],
127
+ setDimensions = _useState2[1];
128
+ var handleImageLoad = function handleImageLoad() {
129
+ updateDimensions();
130
+ };
131
+ var handleElements = function handleElements() {
132
+ var _spanRef$current;
133
+ var imageElement = (_spanRef$current = spanRef.current) === null || _spanRef$current === void 0 ? void 0 : _spanRef$current.querySelector('img');
134
+ if (imageElement) {
135
+ imageElement.onload = handleImageLoad;
136
+ } else {
137
+ setTimeout(function () {
138
+ updateDimensions();
139
+ }, 300);
140
+ }
141
+ };
142
+ var updateDimensions = function updateDimensions() {
143
+ if (spanRef.current && rootRef.current) {
144
+ // Temporarily set rootRef width to 'auto' for natural measurement
145
+ rootRef.current.style.width = 'auto';
146
+
147
+ // Get the natural dimensions of the content
148
+ var width = spanRef.current.offsetWidth || 0;
149
+ var height = spanRef.current.offsetHeight || 0;
150
+ var widthWithPadding = width + 24; // 12px padding on each side
151
+ var heightWithPadding = height + 24; // 12px padding on top and bottom
152
+
153
+ var responseAreaWidth = parseFloat(emptyResponseAreaWidth) || 0;
154
+ var responseAreaHeight = parseFloat(emptyResponseAreaHeight) || 0;
155
+ var adjustedWidth = widthWithPadding <= responseAreaWidth ? responseAreaWidth : widthWithPadding;
156
+ var adjustedHeight = heightWithPadding <= responseAreaHeight ? responseAreaHeight : heightWithPadding;
157
+ setDimensions(function (prevState) {
158
+ return {
159
+ width: adjustedWidth > responseAreaWidth ? adjustedWidth : prevState.width,
160
+ height: adjustedHeight > responseAreaHeight ? adjustedHeight : prevState.height
161
+ };
162
+ });
163
+ rootRef.current.style.width = "".concat(adjustedWidth, "px");
164
+ rootRef.current.style.height = "".concat(adjustedHeight, "px");
165
+ }
166
+ };
167
+ var getRootDimensions = function getRootDimensions() {
168
+ // Handle potential non-numeric values
169
+ var responseAreaWidth = !isNaN(parseFloat(emptyResponseAreaWidth)) ? parseFloat(emptyResponseAreaWidth) : 0;
170
+ var responseAreaHeight = !isNaN(parseFloat(emptyResponseAreaHeight)) ? parseFloat(emptyResponseAreaHeight) : 0;
171
+ var rootStyle = {
172
+ height: dimensions.height || responseAreaHeight,
173
+ width: dimensions.width || responseAreaWidth
93
174
  };
94
- return _this;
95
- }
96
- (0, _createClass2["default"])(BlankContent, [{
97
- key: "componentDidUpdate",
98
- value: function componentDidUpdate(prevProps) {
99
- var _this2 = this;
100
- (0, _mathRendering.renderMath)(this.rootRef);
101
- var currentChoice = this.props.choice;
102
- var prevChoice = prevProps.choice;
103
- if (JSON.stringify(currentChoice) !== JSON.stringify(prevChoice)) {
104
- if (!currentChoice) {
105
- this.setState({
106
- height: 0
107
- });
108
- return;
109
- }
110
- setTimeout(function () {
111
- _this2.setState({
112
- height: _this2.spanRef.offsetHeight
113
- });
114
- }, 300);
115
- }
175
+
176
+ // add minWidth, minHeight if width and height are not defined
177
+ return _objectSpread(_objectSpread(_objectSpread({}, rootStyle), responseAreaWidth ? {} : {
178
+ minWidth: 90
179
+ }), responseAreaHeight ? {} : {
180
+ minHeight: 32
181
+ });
182
+ };
183
+ (0, _react.useEffect)(function () {
184
+ handleElements();
185
+ }, []);
186
+
187
+ // Render math for the placeholder/preview when dragging over
188
+ (0, _react.useEffect)(function () {
189
+ if (rootRef.current) {
190
+ (0, _mathRendering.renderMath)(rootRef.current);
116
191
  }
117
- }, {
118
- key: "addDraggableFalseAttributes",
119
- value: function addDraggableFalseAttributes(parent) {
120
- parent.childNodes.forEach(function (elem) {
121
- if (elem instanceof Element || elem instanceof HTMLDocument) {
122
- elem.setAttribute('draggable', false);
123
- }
192
+ }, [isOver, dragItem === null || dragItem === void 0 || (_dragItem$choice = dragItem.choice) === null || _dragItem$choice === void 0 ? void 0 : _dragItem$choice.value]);
193
+ (0, _react.useEffect)(function () {
194
+ if (!choice) {
195
+ setDimensions({
196
+ height: 0,
197
+ width: 0
124
198
  });
199
+ return;
125
200
  }
126
- }, {
127
- key: "render",
128
- value: function render() {
129
- var _this3 = this,
130
- _classnames2;
131
- var _this$props = this.props,
132
- disabled = _this$props.disabled,
133
- choice = _this$props.choice,
134
- classes = _this$props.classes,
135
- isOver = _this$props.isOver,
136
- dragItem = _this$props.dragItem,
137
- correct = _this$props.correct;
138
- var draggedLabel = dragItem && isOver && dragItem.choice.value;
139
- var label = choice && choice.value;
140
- return (
141
- /*#__PURE__*/
142
- // TODO the Chip element is causing drag problems on touch devices. Avoid using Chip and consider refactoring the code. Keep in mind that Chip is a span with a button role, which interferes with seamless touch device dragging.
143
- _react["default"].createElement(_Chip["default"], {
144
- clickable: false,
145
- disabled: true,
146
- ref: function ref(_ref3) {
147
- //eslint-disable-next-line
148
- _this3.rootRef = _reactDom["default"].findDOMNode(_ref3);
149
- },
150
- component: "span",
151
- label: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", {
152
- className: (0, _classnames3["default"])(classes.chipLabel, isOver && classes.over, (0, _defineProperty2["default"])({}, classes.hidden, draggedLabel)),
153
- ref: function ref(_ref) {
154
- if (_ref) {
155
- //eslint-disable-next-line
156
- _this3.spanRef = _reactDom["default"].findDOMNode(_ref);
157
- _ref.innerHTML = label || '';
158
- _this3.addDraggableFalseAttributes(_ref);
159
- }
160
- }
161
- }, ' '), draggedLabel && /*#__PURE__*/_react["default"].createElement("span", {
162
- className: (0, _classnames3["default"])(classes.chipLabel, isOver && classes.over, classes.dragged),
163
- ref: function ref(_ref2) {
164
- if (_ref2) {
165
- //eslint-disable-next-line
166
- _this3.spanRef = _reactDom["default"].findDOMNode(_ref2);
167
- _ref2.innerHTML = draggedLabel || '';
168
- _this3.addDraggableFalseAttributes(_ref2);
169
- }
170
- }
171
- }, ' ')),
172
- className: (0, _classnames3["default"])(classes.chip, isOver && classes.over, (_classnames2 = {}, (0, _defineProperty2["default"])(_classnames2, classes.correct, correct !== undefined && correct), (0, _defineProperty2["default"])(_classnames2, classes.incorrect, correct !== undefined && !correct), _classnames2)),
173
- variant: disabled ? 'outlined' : undefined,
174
- style: _objectSpread({}, this.state.height ? {
175
- height: this.state.height
176
- } : {}),
177
- classes: {
178
- label: isOver && classes.over
179
- }
180
- })
181
- );
201
+ handleElements();
202
+ }, [choice]);
203
+ (0, _react.useEffect)(function () {
204
+ if (!isOver && !isDragging) {
205
+ frozenRef.current = {
206
+ width: rootRef.current.offsetWidth,
207
+ height: rootRef.current.offsetHeight
208
+ };
182
209
  }
183
- }]);
184
- return BlankContent;
185
- }(_react["default"].Component);
186
- exports.BlankContent = BlankContent;
187
- (0, _defineProperty2["default"])(BlankContent, "propTypes", {
210
+ }, [choice, isOver, isDragging]);
211
+ var draggedLabel = dragItem && isOver && dragItem.choice && dragItem.choice.value;
212
+ var label = choice && choice.value;
213
+ var style = isOver || isDragging ? {
214
+ width: (_frozenRef$current = frozenRef.current) === null || _frozenRef$current === void 0 ? void 0 : _frozenRef$current.width,
215
+ height: (_frozenRef$current2 = frozenRef.current) === null || _frozenRef$current2 === void 0 ? void 0 : _frozenRef$current2.height
216
+ } : getRootDimensions();
217
+ return /*#__PURE__*/_react["default"].createElement(StyledChip, {
218
+ clickable: false,
219
+ disabled: disabled,
220
+ ref: rootRef,
221
+ component: "span",
222
+ label: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledChipLabel, {
223
+ ref: spanRef,
224
+ draggable: true,
225
+ className: (0, _classnames["default"])({
226
+ over: isOver,
227
+ hidden: draggedLabel
228
+ }),
229
+ dangerouslySetInnerHTML: {
230
+ __html: label || ''
231
+ }
232
+ }), draggedLabel && /*#__PURE__*/_react["default"].createElement(StyledChipLabel, {
233
+ draggable: true,
234
+ className: (0, _classnames["default"])({
235
+ over: isOver,
236
+ dragged: true
237
+ }),
238
+ dangerouslySetInnerHTML: {
239
+ __html: draggedLabel || ''
240
+ }
241
+ })),
242
+ className: (0, _classnames["default"])({
243
+ over: isOver,
244
+ parentOver: isOver,
245
+ correct: correct !== undefined && correct,
246
+ incorrect: correct !== undefined && !correct
247
+ }),
248
+ variant: disabled ? 'outlined' : undefined,
249
+ style: style
250
+ });
251
+ }
252
+ BlankContent.defaultProps = {
253
+ emptyResponseAreaWidth: 0,
254
+ emptyResponseAreaHeight: 0
255
+ };
256
+ BlankContent.propTypes = {
188
257
  id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
189
258
  disabled: _propTypes["default"].bool,
190
259
  duplicates: _propTypes["default"].bool,
191
260
  choice: _propTypes["default"].object,
192
- classes: _propTypes["default"].object,
193
261
  isOver: _propTypes["default"].bool,
194
262
  dragItem: _propTypes["default"].object,
195
263
  correct: _propTypes["default"].bool,
196
- onChange: _propTypes["default"].func
197
- });
198
- var StyledBlankContent = useStyles(BlankContent);
199
- var connectedBlankContent = useStyles(function (_ref4) {
200
- var connectDragSource = _ref4.connectDragSource,
201
- connectDropTarget = _ref4.connectDropTarget,
202
- props = (0, _objectWithoutProperties2["default"])(_ref4, _excluded);
203
- var classes = props.classes,
204
- isOver = props.isOver;
205
- return connectDropTarget(connectDragSource( /*#__PURE__*/_react["default"].createElement("span", {
206
- className: (0, _classnames3["default"])(classes.content, isOver && classes.over)
207
- }, /*#__PURE__*/_react["default"].createElement(StyledBlankContent, props))));
208
- });
209
- var tileTarget = {
210
- drop: function drop(props, monitor) {
211
- var draggedItem = monitor.getItem();
212
- log('props.instanceId', props.instanceId, 'draggedItem.instanceId:', draggedItem.instanceId);
213
- if (draggedItem.id !== props.id) {
214
- props.onChange(props.id, draggedItem.choice.id);
215
- }
216
- return {
217
- dropped: draggedItem.id !== props.id
218
- };
219
- },
220
- canDrop: function canDrop(props, monitor) {
221
- var draggedItem = monitor.getItem();
222
- return draggedItem.instanceId === props.instanceId;
223
- }
264
+ onChange: _propTypes["default"].func,
265
+ emptyResponseAreaWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
266
+ emptyResponseAreaHeight: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
267
+ instanceId: _propTypes["default"].string
224
268
  };
225
- var DropTile = (0, _drag.DropTarget)(DRAG_TYPE, tileTarget, function (connect, monitor) {
226
- return {
227
- connectDropTarget: connect.dropTarget(),
228
- isOver: monitor.isOver(),
229
- dragItem: monitor.getItem()
230
- };
231
- })(connectedBlankContent);
232
- var tileSource = {
233
- canDrag: function canDrag(props) {
234
- return !props.disabled && !!props.choice;
235
- },
236
- beginDrag: function beginDrag(props) {
237
- return {
238
- id: props.id,
239
- choice: props.choice,
240
- instanceId: props.instanceId,
241
- fromChoice: true
242
- };
243
- },
244
- endDrag: function endDrag(props, monitor) {
245
- // this will be null if it did not drop
246
- var dropResult = monitor.getDropResult();
247
- if (!dropResult || dropResult.dropped && !props.duplicates) {
248
- var draggedItem = monitor.getItem();
249
- if (draggedItem.fromChoice) {
250
- props.onChange(props.id, undefined);
269
+
270
+ // New functional component using @dnd-kit hooks
271
+ function DragDropBlank(_ref3) {
272
+ var _dragItem$data;
273
+ var id = _ref3.id,
274
+ disabled = _ref3.disabled,
275
+ duplicates = _ref3.duplicates,
276
+ choice = _ref3.choice,
277
+ correct = _ref3.correct,
278
+ onChange = _ref3.onChange,
279
+ emptyResponseAreaWidth = _ref3.emptyResponseAreaWidth,
280
+ emptyResponseAreaHeight = _ref3.emptyResponseAreaHeight,
281
+ instanceId = _ref3.instanceId;
282
+ // Setup draggable functionality
283
+ var _useDraggable = (0, _core.useDraggable)({
284
+ id: "mask-blank-drag-".concat(id),
285
+ disabled: disabled || !choice,
286
+ data: {
287
+ id: id,
288
+ choice: choice,
289
+ instanceId: instanceId,
290
+ fromChoice: false,
291
+ // This is from a blank, not from choices
292
+ type: 'MaskBlank'
251
293
  }
252
- }
253
- }
254
- };
255
- var DragDropTile = (0, _drag.DragSource)(DRAG_TYPE, tileSource, function (connect, monitor) {
256
- return {
257
- connectDragSource: connect.dragSource(),
258
- isDragging: monitor.isDragging()
294
+ }),
295
+ dragAttributes = _useDraggable.attributes,
296
+ dragListeners = _useDraggable.listeners,
297
+ setDragNodeRef = _useDraggable.setNodeRef,
298
+ transform = _useDraggable.transform,
299
+ isDragging = _useDraggable.isDragging;
300
+
301
+ // Setup droppable functionality
302
+ var _useDroppable = (0, _core.useDroppable)({
303
+ id: "mask-blank-drop-".concat(id),
304
+ data: {
305
+ id: id,
306
+ accepts: ['MaskBlank'],
307
+ instanceId: instanceId
308
+ }
309
+ }),
310
+ setDropNodeRef = _useDroppable.setNodeRef,
311
+ isOver = _useDroppable.isOver,
312
+ dragItem = _useDroppable.active;
313
+
314
+ // Combine refs for both drag and drop
315
+ var setNodeRef = function setNodeRef(node) {
316
+ setDragNodeRef(node);
317
+ setDropNodeRef(node);
318
+ };
319
+ var style = {
320
+ transform: _utilities.CSS.Translate.toString(transform)
259
321
  };
260
- })(DropTile);
261
- var _default = DragDropTile;
262
- exports["default"] = _default;
263
- //# sourceMappingURL=blank.js.map
322
+ return /*#__PURE__*/_react["default"].createElement(StyledContent, (0, _extends2["default"])({
323
+ ref: setNodeRef,
324
+ style: style,
325
+ dragged: isDragging,
326
+ over: isOver
327
+ }, dragAttributes, dragListeners), /*#__PURE__*/_react["default"].createElement(BlankContent, {
328
+ id: id,
329
+ disabled: disabled,
330
+ duplicates: duplicates,
331
+ choice: choice,
332
+ isOver: isOver,
333
+ dragItem: dragItem === null || dragItem === void 0 || (_dragItem$data = dragItem.data) === null || _dragItem$data === void 0 ? void 0 : _dragItem$data.current,
334
+ correct: correct,
335
+ onChange: onChange,
336
+ emptyResponseAreaWidth: emptyResponseAreaWidth,
337
+ emptyResponseAreaHeight: emptyResponseAreaHeight,
338
+ instanceId: instanceId
339
+ }));
340
+ }
341
+ DragDropBlank.defaultProps = {
342
+ emptyResponseAreaWidth: 0,
343
+ emptyResponseAreaHeight: 0
344
+ };
345
+ DragDropBlank.propTypes = {
346
+ id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
347
+ disabled: _propTypes["default"].bool,
348
+ duplicates: _propTypes["default"].bool,
349
+ choice: _propTypes["default"].object,
350
+ correct: _propTypes["default"].bool,
351
+ onChange: _propTypes["default"].func,
352
+ emptyResponseAreaWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
353
+ emptyResponseAreaHeight: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
354
+ instanceId: _propTypes["default"].string
355
+ };
356
+ var _default = exports["default"] = DragDropBlank;
357
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXRoUmVuZGVyaW5nIiwiX2RlYnVnIiwiX2NvcmUiLCJfdXRpbGl0aWVzIiwiX3N0eWxlcyIsIl9DaGlwIiwiX2NsYXNzbmFtZXMiLCJfcmVuZGVyVWkiLCJfY29sb3JzIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImxvZyIsImRlYnVnIiwiU3R5bGVkQ29udGVudCIsInN0eWxlZCIsIl9yZWYiLCJkcmFnZ2VkIiwib3ZlciIsImJvcmRlciIsImNvbmNhdCIsImNvbG9yIiwicHJpbWFyeSIsIm1pbldpZHRoIiwidG91Y2hBY3Rpb24iLCJvdmVyZmxvdyIsIndoaXRlU3BhY2UiLCJvcGFjaXR5IiwiU3R5bGVkQ2hpcCIsIkNoaXAiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kIiwidGV4dCIsImZvbnRTaXplIiwibWF4V2lkdGgiLCJwb3NpdGlvbiIsImJvcmRlclJhZGl1cyIsImdyZXkiLCJjb3JyZWN0IiwiaW5jb3JyZWN0IiwiU3R5bGVkQ2hpcExhYmVsIiwicG9pbnRlckV2ZW50cyIsImRpc3BsYXkiLCJwYWRkaW5nIiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwibGVmdCIsIkJsYW5rQ29udGVudCIsIl9yZWYyIiwiX2RyYWdJdGVtJGNob2ljZSIsIl9mcm96ZW5SZWYkY3VycmVudCIsIl9mcm96ZW5SZWYkY3VycmVudDIiLCJkaXNhYmxlZCIsImNob2ljZSIsImlzT3ZlciIsImlzRHJhZ2dpbmciLCJkcmFnSXRlbSIsImVtcHR5UmVzcG9uc2VBcmVhV2lkdGgiLCJlbXB0eVJlc3BvbnNlQXJlYUhlaWdodCIsInJvb3RSZWYiLCJ1c2VSZWYiLCJzcGFuUmVmIiwiZnJvemVuUmVmIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJoZWlnaHQiLCJ3aWR0aCIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJkaW1lbnNpb25zIiwic2V0RGltZW5zaW9ucyIsImhhbmRsZUltYWdlTG9hZCIsInVwZGF0ZURpbWVuc2lvbnMiLCJoYW5kbGVFbGVtZW50cyIsIl9zcGFuUmVmJGN1cnJlbnQiLCJpbWFnZUVsZW1lbnQiLCJjdXJyZW50IiwicXVlcnlTZWxlY3RvciIsIm9ubG9hZCIsInNldFRpbWVvdXQiLCJzdHlsZSIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0Iiwid2lkdGhXaXRoUGFkZGluZyIsImhlaWdodFdpdGhQYWRkaW5nIiwicmVzcG9uc2VBcmVhV2lkdGgiLCJwYXJzZUZsb2F0IiwicmVzcG9uc2VBcmVhSGVpZ2h0IiwiYWRqdXN0ZWRXaWR0aCIsImFkanVzdGVkSGVpZ2h0IiwicHJldlN0YXRlIiwiZ2V0Um9vdERpbWVuc2lvbnMiLCJpc05hTiIsInJvb3RTdHlsZSIsIm1pbkhlaWdodCIsInVzZUVmZmVjdCIsInJlbmRlck1hdGgiLCJ2YWx1ZSIsImRyYWdnZWRMYWJlbCIsImxhYmVsIiwiY3JlYXRlRWxlbWVudCIsImNsaWNrYWJsZSIsInJlZiIsImNvbXBvbmVudCIsIkZyYWdtZW50IiwiZHJhZ2dhYmxlIiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsImhpZGRlbiIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwicGFyZW50T3ZlciIsInVuZGVmaW5lZCIsInZhcmlhbnQiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJpZCIsIlByb3BUeXBlcyIsIm9uZU9mVHlwZSIsInN0cmluZyIsIm51bWJlciIsImJvb2wiLCJkdXBsaWNhdGVzIiwib2JqZWN0Iiwib25DaGFuZ2UiLCJmdW5jIiwiaW5zdGFuY2VJZCIsIkRyYWdEcm9wQmxhbmsiLCJfcmVmMyIsIl9kcmFnSXRlbSRkYXRhIiwiX3VzZURyYWdnYWJsZSIsInVzZURyYWdnYWJsZSIsImRhdGEiLCJmcm9tQ2hvaWNlIiwidHlwZSIsImRyYWdBdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsImRyYWdMaXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJzZXREcmFnTm9kZVJlZiIsInNldE5vZGVSZWYiLCJ0cmFuc2Zvcm0iLCJfdXNlRHJvcHBhYmxlIiwidXNlRHJvcHBhYmxlIiwiYWNjZXB0cyIsInNldERyb3BOb2RlUmVmIiwiYWN0aXZlIiwibm9kZSIsIkNTUyIsIlRyYW5zbGF0ZSIsInRvU3RyaW5nIiwiX2V4dGVuZHMyIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvYmxhbmsuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgcmVuZGVyTWF0aCB9IGZyb20gJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyB1c2VEcmFnZ2FibGUsIHVzZURyb3BwYWJsZSB9IGZyb20gJ0BkbmQta2l0L2NvcmUnO1xuaW1wb3J0IHsgQ1NTIH0gZnJvbSAnQGRuZC1raXQvdXRpbGl0aWVzJztcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCBDaGlwIGZyb20gJ0BtdWkvbWF0ZXJpYWwvQ2hpcCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCB7IGdyZXkgfSBmcm9tICdAbXVpL21hdGVyaWFsL2NvbG9ycyc7XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdwaWUtbGliOm1hc2stbWFya3VwOmJsYW5rJyk7XG5cbmNvbnN0IFN0eWxlZENvbnRlbnQgPSBzdHlsZWQoJ3NwYW4nKSgoeyBkcmFnZ2VkLCBvdmVyIH0pID0+ICh7XG4gIGJvcmRlcjogYHNvbGlkIDBweCAke2NvbG9yLnByaW1hcnkoKX1gLFxuICBtaW5XaWR0aDogJzIwMHB4JyxcbiAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgb3BhY2l0eTogMSxcbiAgLi4uKG92ZXIgJiYge1xuICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgfSksXG4gIC4uLihkcmFnZ2VkICYmIHtcbiAgICBvcGFjaXR5OiAwLjUsXG4gIH0pLFxufSkpO1xuXG5jb25zdCBTdHlsZWRDaGlwID0gc3R5bGVkKENoaXApKCgpID0+ICh7XG4gIGJhY2tncm91bmRDb2xvcjogY29sb3IuYmFja2dyb3VuZCgpLFxuICBib3JkZXI6IGAycHggZGFzaGVkICR7Y29sb3IudGV4dCgpfWAsXG4gIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gIGZvbnRTaXplOiAnaW5oZXJpdCcsXG4gIG1heFdpZHRoOiAnMzc0cHgnLFxuICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgJyYub3Zlcic6IHtcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIH0sXG4gICcmLnBhcmVudE92ZXInOiB7XG4gICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7Z3JleVs1MDBdfWAsXG4gICAgYmFja2dyb3VuZENvbG9yOiBgJHtncmV5WzMwMF19YCxcbiAgfSxcbiAgJyYuY29ycmVjdCc6IHtcbiAgICBib3JkZXI6IGBzb2xpZCAxcHggJHtjb2xvci5jb3JyZWN0KCl9YCxcbiAgfSxcbiAgJyYuaW5jb3JyZWN0Jzoge1xuICAgIGJvcmRlcjogYHNvbGlkIDFweCAke2NvbG9yLmluY29ycmVjdCgpfWAsXG4gIH0sXG4gICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICBvcGFjaXR5OiAxLFxuICB9LFxufSkpO1xuXG5jb25zdCBTdHlsZWRDaGlwTGFiZWwgPSBzdHlsZWQoJ3NwYW4nKSgoKSA9PiAoe1xuICB3aGl0ZVNwYWNlOiAnbm9ybWFsJyxcbiAgLy8gQWRkZWQgZm9yIHRvdWNoIGRldmljZXMsIGZvciBpbWFnZSBjb250ZW50LlxuICAvLyBUaGlzIHdpbGwgcHJldmVudCB0aGUgY29udGV4dCBtZW51IGZyb20gYXBwZWFyaW5nIGFuZCBub3QgYWxsb3dpbmcgb3RoZXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGltYWdlLlxuICAvLyBJZiBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgaW1hZ2UgaW4gdGhlIHRva2VuIHdpbGwgYmUgcmVxdWVzdGVkIHdlIHNob3VsZCBoYW5kbGUgb25seSB0aGUgY29udGV4dCBNZW51LlxuICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICcmIGltZyc6IHtcbiAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgIHBhZGRpbmc6ICcycHggMCcsXG4gIH0sXG4gIC8vIFJlbW92ZSBkZWZhdWx0IDxwPiBtYXJnaW5zIHRvIGVuc3VyZSBjb25zaXN0ZW50IHNwYWNpbmcgYWNyb3NzIGFsbCB3cmFwcGVkIGNvbnRlbnQgKHAsIHNwYW4sIGRpdiwgbWF0aClcbiAgLy8gUGFkZGluZyBmb3IgdG9wIGFuZCBib3R0b20gd2lsbCBpbnN0ZWFkIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRhaW5lciBmb3IgY29uc2lzdGVudCBsYXlvdXRcbiAgLy8gRW5zdXJlcyBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggcGllLWFwaS1icm93c2VyLCB3aGVyZSBtYXJnaW5Ub3AgaXMgYWxyZWFkeSByZW1vdmVkIGJ5IGEgQm9vdHN0cmFwIHN0eWxlc2hlZXRcbiAgJyYgcCc6IHtcbiAgICBtYXJnaW5Ub3A6ICcwJyxcbiAgICBtYXJnaW5Cb3R0b206ICcwJyxcbiAgfSxcbiAgJyYgbWp4LWZyYWMnOiB7XG4gICAgZm9udFNpemU6ICcxMjAlICFpbXBvcnRhbnQnLFxuICB9LFxuICAnJi5vdmVyJzoge1xuICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgfSxcbiAgJyYuaGlkZGVuJzoge1xuICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIG9wYWNpdHk6IDAsXG4gIH0sXG4gICcmLmRyYWdnZWQnOiB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgbGVmdDogMTYsXG4gICAgbWF4V2lkdGg6ICc2MHB4JyxcbiAgfSxcbn0pKTtcblxuZnVuY3Rpb24gQmxhbmtDb250ZW50KHtcbiAgZGlzYWJsZWQsXG4gIGNob2ljZSxcbiAgaXNPdmVyLFxuICBpc0RyYWdnaW5nLFxuICBkcmFnSXRlbSxcbiAgY29ycmVjdCxcbiAgZW1wdHlSZXNwb25zZUFyZWFXaWR0aCxcbiAgZW1wdHlSZXNwb25zZUFyZWFIZWlnaHQsXG59KSB7XG4gIGNvbnN0IHJvb3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHNwYW5SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGZyb3plblJlZiA9IHVzZVJlZihudWxsKTsgLy8gdG8gdXNlIGR1cmluZyBkcmFnZ2luZyB0byBwcmV2ZW50IGZsaWNrZXJpbmdcbiAgY29uc3QgW2RpbWVuc2lvbnMsIHNldERpbWVuc2lvbnNdID0gdXNlU3RhdGUoeyBoZWlnaHQ6IDAsIHdpZHRoOiAwIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUltYWdlTG9hZCA9ICgpID0+IHtcbiAgICB1cGRhdGVEaW1lbnNpb25zKCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRWxlbWVudHMgPSAoKSA9PiB7XG4gICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gc3BhblJlZi5jdXJyZW50Py5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICBpZiAoaW1hZ2VFbGVtZW50KSB7XG4gICAgICBpbWFnZUVsZW1lbnQub25sb2FkID0gaGFuZGxlSW1hZ2VMb2FkO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdXBkYXRlRGltZW5zaW9ucygpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlRGltZW5zaW9ucyA9ICgpID0+IHtcbiAgICBpZiAoc3BhblJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudCkge1xuICAgICAgLy8gVGVtcG9yYXJpbHkgc2V0IHJvb3RSZWYgd2lkdGggdG8gJ2F1dG8nIGZvciBuYXR1cmFsIG1lYXN1cmVtZW50XG4gICAgICByb290UmVmLmN1cnJlbnQuc3R5bGUud2lkdGggPSAnYXV0byc7XG5cbiAgICAgIC8vIEdldCB0aGUgbmF0dXJhbCBkaW1lbnNpb25zIG9mIHRoZSBjb250ZW50XG4gICAgICBjb25zdCB3aWR0aCA9IHNwYW5SZWYuY3VycmVudC5vZmZzZXRXaWR0aCB8fCAwO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gc3BhblJlZi5jdXJyZW50Lm9mZnNldEhlaWdodCB8fCAwO1xuXG4gICAgICBjb25zdCB3aWR0aFdpdGhQYWRkaW5nID0gd2lkdGggKyAyNDsgLy8gMTJweCBwYWRkaW5nIG9uIGVhY2ggc2lkZVxuICAgICAgY29uc3QgaGVpZ2h0V2l0aFBhZGRpbmcgPSBoZWlnaHQgKyAyNDsgLy8gMTJweCBwYWRkaW5nIG9uIHRvcCBhbmQgYm90dG9tXG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJlYVdpZHRoID0gcGFyc2VGbG9hdChlbXB0eVJlc3BvbnNlQXJlYVdpZHRoKSB8fCAwO1xuICAgICAgY29uc3QgcmVzcG9uc2VBcmVhSGVpZ2h0ID0gcGFyc2VGbG9hdChlbXB0eVJlc3BvbnNlQXJlYUhlaWdodCkgfHwgMDtcblxuICAgICAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHdpZHRoV2l0aFBhZGRpbmcgPD0gcmVzcG9uc2VBcmVhV2lkdGggPyByZXNwb25zZUFyZWFXaWR0aCA6IHdpZHRoV2l0aFBhZGRpbmc7XG4gICAgICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IGhlaWdodFdpdGhQYWRkaW5nIDw9IHJlc3BvbnNlQXJlYUhlaWdodCA/IHJlc3BvbnNlQXJlYUhlaWdodCA6IGhlaWdodFdpdGhQYWRkaW5nO1xuXG4gICAgICBzZXREaW1lbnNpb25zKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIHdpZHRoOiBhZGp1c3RlZFdpZHRoID4gcmVzcG9uc2VBcmVhV2lkdGggPyBhZGp1c3RlZFdpZHRoIDogcHJldlN0YXRlLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IGFkanVzdGVkSGVpZ2h0ID4gcmVzcG9uc2VBcmVhSGVpZ2h0ID8gYWRqdXN0ZWRIZWlnaHQgOiBwcmV2U3RhdGUuaGVpZ2h0LFxuICAgICAgfSkpO1xuXG4gICAgICByb290UmVmLmN1cnJlbnQuc3R5bGUud2lkdGggPSBgJHthZGp1c3RlZFdpZHRofXB4YDtcbiAgICAgIHJvb3RSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBgJHthZGp1c3RlZEhlaWdodH1weGA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldFJvb3REaW1lbnNpb25zID0gKCkgPT4ge1xuICAgIC8vIEhhbmRsZSBwb3RlbnRpYWwgbm9uLW51bWVyaWMgdmFsdWVzXG4gICAgY29uc3QgcmVzcG9uc2VBcmVhV2lkdGggPSAhaXNOYU4ocGFyc2VGbG9hdChlbXB0eVJlc3BvbnNlQXJlYVdpZHRoKSkgPyBwYXJzZUZsb2F0KGVtcHR5UmVzcG9uc2VBcmVhV2lkdGgpIDogMDtcbiAgICBjb25zdCByZXNwb25zZUFyZWFIZWlnaHQgPSAhaXNOYU4ocGFyc2VGbG9hdChlbXB0eVJlc3BvbnNlQXJlYUhlaWdodCkpID8gcGFyc2VGbG9hdChlbXB0eVJlc3BvbnNlQXJlYUhlaWdodCkgOiAwO1xuXG4gICAgY29uc3Qgcm9vdFN0eWxlID0ge1xuICAgICAgaGVpZ2h0OiBkaW1lbnNpb25zLmhlaWdodCB8fCByZXNwb25zZUFyZWFIZWlnaHQsXG4gICAgICB3aWR0aDogZGltZW5zaW9ucy53aWR0aCB8fCByZXNwb25zZUFyZWFXaWR0aCxcbiAgICB9O1xuXG4gICAgLy8gYWRkIG1pbldpZHRoLCBtaW5IZWlnaHQgaWYgd2lkdGggYW5kIGhlaWdodCBhcmUgbm90IGRlZmluZWRcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucm9vdFN0eWxlLFxuICAgICAgLi4uKHJlc3BvbnNlQXJlYVdpZHRoID8ge30gOiB7IG1pbldpZHRoOiA5MCB9KSxcbiAgICAgIC4uLihyZXNwb25zZUFyZWFIZWlnaHQgPyB7fSA6IHsgbWluSGVpZ2h0OiAzMiB9KSxcbiAgICB9O1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaGFuZGxlRWxlbWVudHMoKTtcbiAgfSwgW10pO1xuXG4gIC8vIFJlbmRlciBtYXRoIGZvciB0aGUgcGxhY2Vob2xkZXIvcHJldmlldyB3aGVuIGRyYWdnaW5nIG92ZXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocm9vdFJlZi5jdXJyZW50KSB7XG4gICAgICByZW5kZXJNYXRoKHJvb3RSZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbaXNPdmVyLCBkcmFnSXRlbT8uY2hvaWNlPy52YWx1ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjaG9pY2UpIHtcbiAgICAgIHNldERpbWVuc2lvbnMoeyBoZWlnaHQ6IDAsIHdpZHRoOiAwIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVFbGVtZW50cygpO1xuICB9LCBbY2hvaWNlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzT3ZlciAmJiAhaXNEcmFnZ2luZykge1xuICAgICAgZnJvemVuUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIHdpZHRoOiByb290UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgIGhlaWdodDogcm9vdFJlZi5jdXJyZW50Lm9mZnNldEhlaWdodCxcbiAgICAgIH07XG4gICAgfVxuICB9LCBbY2hvaWNlLCBpc092ZXIsIGlzRHJhZ2dpbmddKTtcblxuICBjb25zdCBkcmFnZ2VkTGFiZWwgPSBkcmFnSXRlbSAmJiBpc092ZXIgJiYgZHJhZ0l0ZW0uY2hvaWNlICYmIGRyYWdJdGVtLmNob2ljZS52YWx1ZTtcbiAgY29uc3QgbGFiZWwgPSBjaG9pY2UgJiYgY2hvaWNlLnZhbHVlO1xuICBjb25zdCBzdHlsZSA9XG4gICAgaXNPdmVyIHx8IGlzRHJhZ2dpbmdcbiAgICAgID8ge1xuICAgICAgICAgIHdpZHRoOiBmcm96ZW5SZWYuY3VycmVudD8ud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBmcm96ZW5SZWYuY3VycmVudD8uaGVpZ2h0LFxuICAgICAgICB9XG4gICAgICA6IGdldFJvb3REaW1lbnNpb25zKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQ2hpcFxuICAgICAgY2xpY2thYmxlPXtmYWxzZX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHJlZj17cm9vdFJlZn1cbiAgICAgIGNvbXBvbmVudD1cInNwYW5cIlxuICAgICAgbGFiZWw9e1xuICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgPFN0eWxlZENoaXBMYWJlbFxuICAgICAgICAgICAgcmVmPXtzcGFuUmVmfVxuICAgICAgICAgICAgZHJhZ2dhYmxlPXt0cnVlfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKHtcbiAgICAgICAgICAgICAgb3ZlcjogaXNPdmVyLFxuICAgICAgICAgICAgICBoaWRkZW46IGRyYWdnZWRMYWJlbCxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBsYWJlbCB8fCAnJyB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICAge2RyYWdnZWRMYWJlbCAmJiAoXG4gICAgICAgICAgICA8U3R5bGVkQ2hpcExhYmVsXG4gICAgICAgICAgICAgIGRyYWdnYWJsZT17dHJ1ZX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKHtcbiAgICAgICAgICAgICAgICBvdmVyOiBpc092ZXIsXG4gICAgICAgICAgICAgICAgZHJhZ2dlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogZHJhZ2dlZExhYmVsIHx8ICcnIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICB9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoe1xuICAgICAgICBvdmVyOiBpc092ZXIsXG4gICAgICAgIHBhcmVudE92ZXI6IGlzT3ZlcixcbiAgICAgICAgY29ycmVjdDogY29ycmVjdCAhPT0gdW5kZWZpbmVkICYmIGNvcnJlY3QsXG4gICAgICAgIGluY29ycmVjdDogY29ycmVjdCAhPT0gdW5kZWZpbmVkICYmICFjb3JyZWN0LFxuICAgICAgfSl9XG4gICAgICB2YXJpYW50PXtkaXNhYmxlZCA/ICdvdXRsaW5lZCcgOiB1bmRlZmluZWR9XG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgLz5cbiAgKTtcbn1cblxuQmxhbmtDb250ZW50LmRlZmF1bHRQcm9wcyA9IHtcbiAgZW1wdHlSZXNwb25zZUFyZWFXaWR0aDogMCxcbiAgZW1wdHlSZXNwb25zZUFyZWFIZWlnaHQ6IDAsXG59O1xuXG5CbGFua0NvbnRlbnQucHJvcFR5cGVzID0ge1xuICBpZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGR1cGxpY2F0ZXM6IFByb3BUeXBlcy5ib29sLFxuICBjaG9pY2U6IFByb3BUeXBlcy5vYmplY3QsXG4gIGlzT3ZlcjogUHJvcFR5cGVzLmJvb2wsXG4gIGRyYWdJdGVtOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjb3JyZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBlbXB0eVJlc3BvbnNlQXJlYVdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIGVtcHR5UmVzcG9uc2VBcmVhSGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIGluc3RhbmNlSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG59O1xuXG4vLyBOZXcgZnVuY3Rpb25hbCBjb21wb25lbnQgdXNpbmcgQGRuZC1raXQgaG9va3NcbmZ1bmN0aW9uIERyYWdEcm9wQmxhbmsoe1xuICBpZCxcbiAgZGlzYWJsZWQsXG4gIGR1cGxpY2F0ZXMsXG4gIGNob2ljZSxcbiAgY29ycmVjdCxcbiAgb25DaGFuZ2UsXG4gIGVtcHR5UmVzcG9uc2VBcmVhV2lkdGgsXG4gIGVtcHR5UmVzcG9uc2VBcmVhSGVpZ2h0LFxuICBpbnN0YW5jZUlkLFxufSkge1xuICAvLyBTZXR1cCBkcmFnZ2FibGUgZnVuY3Rpb25hbGl0eVxuICBjb25zdCB7XG4gICAgYXR0cmlidXRlczogZHJhZ0F0dHJpYnV0ZXMsXG4gICAgbGlzdGVuZXJzOiBkcmFnTGlzdGVuZXJzLFxuICAgIHNldE5vZGVSZWY6IHNldERyYWdOb2RlUmVmLFxuICAgIHRyYW5zZm9ybSxcbiAgICBpc0RyYWdnaW5nLFxuICB9ID0gdXNlRHJhZ2dhYmxlKHtcbiAgICBpZDogYG1hc2stYmxhbmstZHJhZy0ke2lkfWAsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkIHx8ICFjaG9pY2UsXG4gICAgZGF0YToge1xuICAgICAgaWQ6IGlkLFxuICAgICAgY2hvaWNlOiBjaG9pY2UsXG4gICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZUlkLFxuICAgICAgZnJvbUNob2ljZTogZmFsc2UsIC8vIFRoaXMgaXMgZnJvbSBhIGJsYW5rLCBub3QgZnJvbSBjaG9pY2VzXG4gICAgICB0eXBlOiAnTWFza0JsYW5rJyxcbiAgICB9LFxuICB9KTtcblxuICAvLyBTZXR1cCBkcm9wcGFibGUgZnVuY3Rpb25hbGl0eVxuICBjb25zdCB7IHNldE5vZGVSZWY6IHNldERyb3BOb2RlUmVmLCBpc092ZXIsIGFjdGl2ZTogZHJhZ0l0ZW0gfSA9IHVzZURyb3BwYWJsZSh7XG4gICAgaWQ6IGBtYXNrLWJsYW5rLWRyb3AtJHtpZH1gLFxuICAgIGRhdGE6IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGFjY2VwdHM6IFsnTWFza0JsYW5rJ10sXG4gICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZUlkLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIENvbWJpbmUgcmVmcyBmb3IgYm90aCBkcmFnIGFuZCBkcm9wXG4gIGNvbnN0IHNldE5vZGVSZWYgPSAobm9kZSkgPT4ge1xuICAgIHNldERyYWdOb2RlUmVmKG5vZGUpO1xuICAgIHNldERyb3BOb2RlUmVmKG5vZGUpO1xuICB9O1xuXG4gIGNvbnN0IHN0eWxlID0ge1xuICAgIHRyYW5zZm9ybTogQ1NTLlRyYW5zbGF0ZS50b1N0cmluZyh0cmFuc2Zvcm0pLFxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZENvbnRlbnRcbiAgICAgIHJlZj17c2V0Tm9kZVJlZn1cbiAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgIGRyYWdnZWQ9e2lzRHJhZ2dpbmd9XG4gICAgICBvdmVyPXtpc092ZXJ9XG4gICAgICB7Li4uZHJhZ0F0dHJpYnV0ZXN9XG4gICAgICB7Li4uZHJhZ0xpc3RlbmVyc31cbiAgICA+XG4gICAgICA8QmxhbmtDb250ZW50XG4gICAgICAgIGlkPXtpZH1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBkdXBsaWNhdGVzPXtkdXBsaWNhdGVzfVxuICAgICAgICBjaG9pY2U9e2Nob2ljZX1cbiAgICAgICAgaXNPdmVyPXtpc092ZXJ9XG4gICAgICAgIGRyYWdJdGVtPXtkcmFnSXRlbT8uZGF0YT8uY3VycmVudH1cbiAgICAgICAgY29ycmVjdD17Y29ycmVjdH1cbiAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICBlbXB0eVJlc3BvbnNlQXJlYVdpZHRoPXtlbXB0eVJlc3BvbnNlQXJlYVdpZHRofVxuICAgICAgICBlbXB0eVJlc3BvbnNlQXJlYUhlaWdodD17ZW1wdHlSZXNwb25zZUFyZWFIZWlnaHR9XG4gICAgICAgIGluc3RhbmNlSWQ9e2luc3RhbmNlSWR9XG4gICAgICAvPlxuICAgIDwvU3R5bGVkQ29udGVudD5cbiAgKTtcbn1cblxuRHJhZ0Ryb3BCbGFuay5kZWZhdWx0UHJvcHMgPSB7XG4gIGVtcHR5UmVzcG9uc2VBcmVhV2lkdGg6IDAsXG4gIGVtcHR5UmVzcG9uc2VBcmVhSGVpZ2h0OiAwLFxufTtcblxuRHJhZ0Ryb3BCbGFuay5wcm9wVHlwZXMgPSB7XG4gIGlkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgZHVwbGljYXRlczogUHJvcFR5cGVzLmJvb2wsXG4gIGNob2ljZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgY29ycmVjdDogUHJvcFR5cGVzLmJvb2wsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgZW1wdHlSZXNwb25zZUFyZWFXaWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICBlbXB0eVJlc3BvbnNlQXJlYUhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICBpbnN0YW5jZUlkOiBQcm9wVHlwZXMuc3RyaW5nLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRHJhZ0Ryb3BCbGFuaztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxjQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxLQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxVQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxPQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxLQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxXQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxTQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxPQUFBLEdBQUFYLE9BQUE7QUFBNEMsU0FBQUQsd0JBQUFhLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFmLHVCQUFBLFlBQUFBLHdCQUFBYSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsbUJBQUFULENBQUEsaUJBQUFBLENBQUEsZ0JBQUFVLE9BQUEsQ0FBQVYsQ0FBQSwwQkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFB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