@pie-lib/mask-markup 3.1.5 → 3.1.6-beta.10
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 +0 -105
- package/lib/__tests__/drag-in-the-blank.test.js +129 -0
- package/lib/__tests__/index.test.js +39 -0
- package/lib/__tests__/keyboard-coordinates.test.js +449 -0
- package/lib/__tests__/mask.test.js +344 -0
- package/lib/__tests__/serialization.test.js +44 -0
- package/lib/__tests__/utils.js +14 -0
- package/lib/__tests__/with-mask.test.js +110 -0
- package/lib/choices/__tests__/index.test.js +139 -0
- package/lib/choices/choice.js +6 -24
- package/lib/choices/choice.js.map +1 -1
- package/lib/choices/index.js +9 -32
- package/lib/choices/index.js.map +1 -1
- package/lib/components/__tests__/blank.test.js +293 -0
- package/lib/components/__tests__/correct-input.test.js +132 -0
- package/lib/components/__tests__/dropdown.test.js +202 -0
- package/lib/components/__tests__/input.test.js +129 -0
- package/lib/components/blank.js +29 -106
- package/lib/components/blank.js.map +1 -1
- package/lib/components/dropdown.js +9 -6
- package/lib/components/dropdown.js.map +1 -1
- package/lib/drag-in-the-blank.js +30 -139
- package/lib/drag-in-the-blank.js.map +1 -1
- package/lib/keyboard-coordinates.js +1 -1
- package/lib/mask.js +15 -20
- package/lib/mask.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/drag-in-the-blank.test.js +2 -147
- package/src/__tests__/mask.test.js +0 -98
- package/src/choices/__tests__/index.test.js +1 -104
- package/src/choices/choice.jsx +3 -16
- package/src/choices/index.jsx +3 -27
- package/src/components/__tests__/blank.test.js +5 -186
- package/src/components/blank.jsx +35 -108
- package/src/components/dropdown.jsx +9 -7
- package/src/drag-in-the-blank.jsx +22 -132
- package/src/mask.jsx +11 -13
- package/LICENSE.md +0 -5
- package/lib/keyboard-coordinates.js.map +0 -1
- package/src/__tests__/keyboard-coordinates.test.js +0 -202
- package/src/keyboard-coordinates.js +0 -147
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
6
|
+
var React = _interopRequireWildcard(require("react"));
|
|
7
|
+
var _react2 = require("@testing-library/react");
|
|
8
|
+
var _blank = _interopRequireDefault(require("../blank"));
|
|
9
|
+
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); }
|
|
10
|
+
// Mock @dnd-kit hooks to avoid DndContext requirement
|
|
11
|
+
jest.mock('@dnd-kit/core', function () {
|
|
12
|
+
return {
|
|
13
|
+
useDraggable: jest.fn(function () {
|
|
14
|
+
return {
|
|
15
|
+
attributes: {},
|
|
16
|
+
listeners: {},
|
|
17
|
+
setNodeRef: jest.fn(),
|
|
18
|
+
transform: null,
|
|
19
|
+
isDragging: false
|
|
20
|
+
};
|
|
21
|
+
}),
|
|
22
|
+
useDroppable: jest.fn(function () {
|
|
23
|
+
return {
|
|
24
|
+
setNodeRef: jest.fn(),
|
|
25
|
+
isOver: false,
|
|
26
|
+
active: null
|
|
27
|
+
};
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
jest.mock('@dnd-kit/utilities', function () {
|
|
32
|
+
return {
|
|
33
|
+
CSS: {
|
|
34
|
+
Translate: {
|
|
35
|
+
toString: jest.fn(function () {
|
|
36
|
+
return 'translate3d(0, 0, 0)';
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
jest.mock('@pie-lib/math-rendering', function () {
|
|
43
|
+
return {
|
|
44
|
+
renderMath: jest.fn()
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Collect the CSS rules emotion/MUI injected into the document (jsdom uses insertRule).
|
|
49
|
+
var collectEmotionRules = function collectEmotionRules() {
|
|
50
|
+
var rules = [];
|
|
51
|
+
for (var _i = 0, _Array$from = Array.from(document.styleSheets); _i < _Array$from.length; _i++) {
|
|
52
|
+
var sheet = _Array$from[_i];
|
|
53
|
+
try {
|
|
54
|
+
for (var _i2 = 0, _Array$from2 = Array.from(sheet.cssRules); _i2 < _Array$from2.length; _i2++) {
|
|
55
|
+
var rule = _Array$from2[_i2];
|
|
56
|
+
rules.push(rule.cssText);
|
|
57
|
+
}
|
|
58
|
+
} catch (e) {
|
|
59
|
+
/* inaccessible stylesheet */
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return rules;
|
|
63
|
+
};
|
|
64
|
+
describe('Blank', function () {
|
|
65
|
+
var _require = require('@pie-lib/math-rendering'),
|
|
66
|
+
renderMath = _require.renderMath;
|
|
67
|
+
var onChange = jest.fn();
|
|
68
|
+
var defaultProps = {
|
|
69
|
+
disabled: false,
|
|
70
|
+
choice: {
|
|
71
|
+
value: 'Cow'
|
|
72
|
+
},
|
|
73
|
+
isOver: false,
|
|
74
|
+
dragItem: {},
|
|
75
|
+
correct: false,
|
|
76
|
+
onChange: onChange
|
|
77
|
+
};
|
|
78
|
+
beforeEach(function () {
|
|
79
|
+
onChange.mockClear();
|
|
80
|
+
renderMath.mockClear();
|
|
81
|
+
});
|
|
82
|
+
describe('rendering', function () {
|
|
83
|
+
it('renders with default props', function () {
|
|
84
|
+
var _render = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps)),
|
|
85
|
+
container = _render.container;
|
|
86
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
87
|
+
});
|
|
88
|
+
it('displays the value when provided', function () {
|
|
89
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps));
|
|
90
|
+
expect(_react2.screen.getByText('Cow')).toBeInTheDocument();
|
|
91
|
+
});
|
|
92
|
+
it('renders as disabled when disabled prop is true', function () {
|
|
93
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
94
|
+
disabled: true
|
|
95
|
+
})));
|
|
96
|
+
// Check that delete button is not present when disabled
|
|
97
|
+
expect(_react2.screen.queryByRole('button', {
|
|
98
|
+
name: /delete/i
|
|
99
|
+
})).not.toBeInTheDocument();
|
|
100
|
+
});
|
|
101
|
+
it('renders with dragged item preview', function () {
|
|
102
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
103
|
+
dragItem: {
|
|
104
|
+
choice: {
|
|
105
|
+
value: 'Dog'
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
})));
|
|
109
|
+
// Blank component should render
|
|
110
|
+
expect(_react2.screen.getByText('Cow')).toBeInTheDocument();
|
|
111
|
+
});
|
|
112
|
+
it('shows hover state when isOver is true', function () {
|
|
113
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
114
|
+
dragItem: {
|
|
115
|
+
choice: {
|
|
116
|
+
value: 'Dog'
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
isOver: true
|
|
120
|
+
}))),
|
|
121
|
+
container = _render2.container;
|
|
122
|
+
// Component should have hover styling
|
|
123
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
124
|
+
});
|
|
125
|
+
it('shows correct state when correct is true', function () {
|
|
126
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
127
|
+
correct: true
|
|
128
|
+
}))),
|
|
129
|
+
container = _render3.container;
|
|
130
|
+
// Component should indicate correctness
|
|
131
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('delete functionality', function () {
|
|
135
|
+
it('does not show delete button when disabled', function () {
|
|
136
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
137
|
+
disabled: true
|
|
138
|
+
})));
|
|
139
|
+
expect(_react2.screen.queryByRole('button', {
|
|
140
|
+
name: /delete/i
|
|
141
|
+
})).not.toBeInTheDocument();
|
|
142
|
+
});
|
|
143
|
+
it('does not show delete button when no value is set', function () {
|
|
144
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
145
|
+
choice: undefined
|
|
146
|
+
})));
|
|
147
|
+
expect(_react2.screen.queryByRole('button', {
|
|
148
|
+
name: /delete/i
|
|
149
|
+
})).not.toBeInTheDocument();
|
|
150
|
+
});
|
|
151
|
+
it('shows delete button when value is present and not disabled', function () {
|
|
152
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps));
|
|
153
|
+
// If delete button is present, it should be clickable
|
|
154
|
+
var deleteButton = _react2.screen.queryByRole('button');
|
|
155
|
+
if (deleteButton) {
|
|
156
|
+
expect(deleteButton).toBeInTheDocument();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe('dimensions', function () {
|
|
161
|
+
it('renders with custom dimensions when provided', function () {
|
|
162
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
163
|
+
emptyResponseAreaHeight: 100,
|
|
164
|
+
emptyResponseAreaWidth: 200
|
|
165
|
+
}))),
|
|
166
|
+
container = _render4.container;
|
|
167
|
+
var element = container.firstChild;
|
|
168
|
+
expect(element).toBeInTheDocument();
|
|
169
|
+
});
|
|
170
|
+
it('renders with min dimensions by default', function () {
|
|
171
|
+
var _render5 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps)),
|
|
172
|
+
container = _render5.container;
|
|
173
|
+
var element = container.firstChild;
|
|
174
|
+
expect(element).toBeInTheDocument();
|
|
175
|
+
// Component should have minimum dimensions applied
|
|
176
|
+
});
|
|
177
|
+
it('handles non-numeric dimension props gracefully', function () {
|
|
178
|
+
var _render6 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
179
|
+
emptyResponseAreaHeight: "non-numeric",
|
|
180
|
+
emptyResponseAreaWidth: "non-numeric"
|
|
181
|
+
}))),
|
|
182
|
+
container = _render6.container;
|
|
183
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
184
|
+
});
|
|
185
|
+
it('computes chip dimensions based on content when no emptyResponseArea size is provided', function () {
|
|
186
|
+
jest.useFakeTimers();
|
|
187
|
+
// Mock getBoundingClientRect to simulate measured content size
|
|
188
|
+
var rectSpy = jest.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockReturnValue({
|
|
189
|
+
width: 100,
|
|
190
|
+
height: 20,
|
|
191
|
+
top: 0,
|
|
192
|
+
left: 0,
|
|
193
|
+
right: 100,
|
|
194
|
+
bottom: 20
|
|
195
|
+
});
|
|
196
|
+
var _render7 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
197
|
+
// Force measurement path that uses getMeasureNode / updateDimensions
|
|
198
|
+
emptyResponseAreaHeight: 0,
|
|
199
|
+
emptyResponseAreaWidth: 0
|
|
200
|
+
}))),
|
|
201
|
+
container = _render7.container;
|
|
202
|
+
|
|
203
|
+
// Let the internal timeout in handleElements / updateDimensions run
|
|
204
|
+
(0, _react2.act)(function () {
|
|
205
|
+
jest.runAllTimers();
|
|
206
|
+
});
|
|
207
|
+
var wrapper = container.firstChild; // StyledContent
|
|
208
|
+
var chip = wrapper && wrapper.firstChild; // StyledChip (rootRef)
|
|
209
|
+
|
|
210
|
+
// Width and height should include padding (24px) around measured content
|
|
211
|
+
expect(chip.style.width).toBe('129px');
|
|
212
|
+
expect(chip.style.height).toBe('49px');
|
|
213
|
+
rectSpy.mockRestore();
|
|
214
|
+
jest.useRealTimers();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe('math rendering', function () {
|
|
218
|
+
it('calls renderMath on mount when choice has content', function () {
|
|
219
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps));
|
|
220
|
+
expect(renderMath).toHaveBeenCalled();
|
|
221
|
+
});
|
|
222
|
+
it('calls renderMath again when correct changes', function () {
|
|
223
|
+
var _render8 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
224
|
+
correct: false
|
|
225
|
+
}))),
|
|
226
|
+
rerender = _render8.rerender;
|
|
227
|
+
var callsAfterMount = renderMath.mock.calls.length;
|
|
228
|
+
expect(callsAfterMount).toBeGreaterThan(0);
|
|
229
|
+
rerender(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
230
|
+
correct: true
|
|
231
|
+
})));
|
|
232
|
+
expect(renderMath.mock.calls.length).toBeGreaterThan(callsAfterMount);
|
|
233
|
+
});
|
|
234
|
+
it('does not call renderMath again when correct is unchanged', function () {
|
|
235
|
+
var _render9 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
236
|
+
correct: true
|
|
237
|
+
}))),
|
|
238
|
+
rerender = _render9.rerender;
|
|
239
|
+
var callsAfterMount = renderMath.mock.calls.length;
|
|
240
|
+
rerender(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
241
|
+
correct: true
|
|
242
|
+
})));
|
|
243
|
+
expect(renderMath.mock.calls.length).toBe(callsAfterMount);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('fraction math styling', function () {
|
|
247
|
+
it('enlarges numerator/denominator digits adjacent to a fraction to 120%', function () {
|
|
248
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps));
|
|
249
|
+
var rule = collectEmotionRules().find(function (r) {
|
|
250
|
+
return r.includes('mjx-mn') && r.includes('mjx-mfrac');
|
|
251
|
+
});
|
|
252
|
+
expect(rule).toBeDefined();
|
|
253
|
+
expect(rule).toMatch(/mjx-mn:has\(~\s*mjx-mfrac\)/);
|
|
254
|
+
expect(rule).toMatch(/mjx-mfrac\s*~\s*mjx-mn/);
|
|
255
|
+
expect(rule).toMatch(/font-size:\s*120%\s*!important/i);
|
|
256
|
+
});
|
|
257
|
+
it('keeps the existing mjx-frac 120% rule', function () {
|
|
258
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], defaultProps));
|
|
259
|
+
var rule = collectEmotionRules().find(function (r) {
|
|
260
|
+
return /(^|[^-])mjx-frac/.test(r) && !r.includes('mjx-mfrac');
|
|
261
|
+
});
|
|
262
|
+
expect(rule).toBeDefined();
|
|
263
|
+
expect(rule).toMatch(/font-size:\s*120%\s*!important/i);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
describe('drag and drop', function () {
|
|
267
|
+
it('accepts drag item when not disabled', function () {
|
|
268
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
269
|
+
isOver: true,
|
|
270
|
+
dragItem: {
|
|
271
|
+
choice: {
|
|
272
|
+
value: 'Dog'
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
})));
|
|
276
|
+
expect(_react2.screen.getByText('Cow')).toBeInTheDocument();
|
|
277
|
+
});
|
|
278
|
+
it('shows drag preview when dragging over', function () {
|
|
279
|
+
var _render0 = (0, _react2.render)(/*#__PURE__*/React.createElement(_blank["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
280
|
+
isOver: true,
|
|
281
|
+
dragItem: {
|
|
282
|
+
choice: {
|
|
283
|
+
value: 'Dog'
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}))),
|
|
287
|
+
container = _render0.container;
|
|
288
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
289
|
+
// Should show visual feedback for drag over
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfYmxhbmsiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJqZXN0IiwibW9jayIsInVzZURyYWdnYWJsZSIsImZuIiwiYXR0cmlidXRlcyIsImxpc3RlbmVycyIsInNldE5vZGVSZWYiLCJ0cmFuc2Zvcm0iLCJpc0RyYWdnaW5nIiwidXNlRHJvcHBhYmxlIiwiaXNPdmVyIiwiYWN0aXZlIiwiQ1NTIiwiVHJhbnNsYXRlIiwidG9TdHJpbmciLCJyZW5kZXJNYXRoIiwiY29sbGVjdEVtb3Rpb25SdWxlcyIsInJ1bGVzIiwiX2kiLCJfQXJyYXkkZnJvbSIsIkFycmF5IiwiZnJvbSIsImRvY3VtZW50Iiwic3R5bGVTaGVldHMiLCJsZW5ndGgiLCJzaGVldCIsIl9pMiIsIl9BcnJheSRmcm9tMiIsImNzc1J1bGVzIiwicnVsZSIsInB1c2giLCJjc3NUZXh0IiwiZGVzY3JpYmUiLCJfcmVxdWlyZSIsIm9uQ2hhbmdlIiwiZGVmYXVsdFByb3BzIiwiZGlzYWJsZWQiLCJjaG9pY2UiLCJ2YWx1ZSIsImRyYWdJdGVtIiwiY29ycmVjdCIsImJlZm9yZUVhY2giLCJtb2NrQ2xlYXIiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwiZmlyc3RDaGlsZCIsInRvQmVJblRoZURvY3VtZW50Iiwic2NyZWVuIiwiZ2V0QnlUZXh0IiwiX2V4dGVuZHMyIiwicXVlcnlCeVJvbGUiLCJuYW1lIiwibm90IiwiX3JlbmRlcjIiLCJfcmVuZGVyMyIsInVuZGVmaW5lZCIsImRlbGV0ZUJ1dHRvbiIsIl9yZW5kZXI0IiwiZW1wdHlSZXNwb25zZUFyZWFIZWlnaHQiLCJlbXB0eVJlc3BvbnNlQXJlYVdpZHRoIiwiZWxlbWVudCIsIl9yZW5kZXI1IiwiX3JlbmRlcjYiLCJ1c2VGYWtlVGltZXJzIiwicmVjdFNweSIsInNweU9uIiwiSFRNTEVsZW1lbnQiLCJwcm90b3R5cGUiLCJtb2NrUmV0dXJuVmFsdWUiLCJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiLCJyaWdodCIsImJvdHRvbSIsIl9yZW5kZXI3IiwiYWN0IiwicnVuQWxsVGltZXJzIiwid3JhcHBlciIsImNoaXAiLCJzdHlsZSIsInRvQmUiLCJtb2NrUmVzdG9yZSIsInVzZVJlYWxUaW1lcnMiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX3JlbmRlcjgiLCJyZXJlbmRlciIsImNhbGxzQWZ0ZXJNb3VudCIsImNhbGxzIiwidG9CZUdyZWF0ZXJUaGFuIiwiX3JlbmRlcjkiLCJmaW5kIiwiaW5jbHVkZXMiLCJ0b0JlRGVmaW5lZCIsInRvTWF0Y2giLCJ0ZXN0IiwiX3JlbmRlcjAiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9fX3Rlc3RzX18vYmxhbmsudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHNjcmVlbiwgYWN0IH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgQmxhbmsgZnJvbSAnLi4vYmxhbmsnO1xuXG4vLyBNb2NrIEBkbmQta2l0IGhvb2tzIHRvIGF2b2lkIERuZENvbnRleHQgcmVxdWlyZW1lbnRcbmplc3QubW9jaygnQGRuZC1raXQvY29yZScsICgpID0+ICh7XG4gIHVzZURyYWdnYWJsZTogamVzdC5mbigoKSA9PiAoe1xuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGxpc3RlbmVyczoge30sXG4gICAgc2V0Tm9kZVJlZjogamVzdC5mbigpLFxuICAgIHRyYW5zZm9ybTogbnVsbCxcbiAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgfSkpLFxuICB1c2VEcm9wcGFibGU6IGplc3QuZm4oKCkgPT4gKHtcbiAgICBzZXROb2RlUmVmOiBqZXN0LmZuKCksXG4gICAgaXNPdmVyOiBmYWxzZSxcbiAgICBhY3RpdmU6IG51bGwsXG4gIH0pKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAZG5kLWtpdC91dGlsaXRpZXMnLCAoKSA9PiAoe1xuICBDU1M6IHtcbiAgICBUcmFuc2xhdGU6IHtcbiAgICAgIHRvU3RyaW5nOiBqZXN0LmZuKCgpID0+ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScpLFxuICAgIH0sXG4gIH0sXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICByZW5kZXJNYXRoOiBqZXN0LmZuKCksXG59KSk7XG5cbi8vIENvbGxlY3QgdGhlIENTUyBydWxlcyBlbW90aW9uL01VSSBpbmplY3RlZCBpbnRvIHRoZSBkb2N1bWVudCAoanNkb20gdXNlcyBpbnNlcnRSdWxlKS5cbmNvbnN0IGNvbGxlY3RFbW90aW9uUnVsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IHJ1bGVzID0gW107XG4gIGZvciAoY29uc3Qgc2hlZXQgb2YgQXJyYXkuZnJvbShkb2N1bWVudC5zdHlsZVNoZWV0cykpIHtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBydWxlIG9mIEFycmF5LmZyb20oc2hlZXQuY3NzUnVsZXMpKSB7XG4gICAgICAgIHJ1bGVzLnB1c2gocnVsZS5jc3NUZXh0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBpbmFjY2Vzc2libGUgc3R5bGVzaGVldCAqL1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnVsZXM7XG59O1xuXG5kZXNjcmliZSgnQmxhbmsnLCAoKSA9PiB7XG4gIGNvbnN0IHsgcmVuZGVyTWF0aCB9ID0gcmVxdWlyZSgnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnKTtcbiAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgY2hvaWNlOiB7IHZhbHVlOiAnQ293JyB9LFxuICAgIGlzT3ZlcjogZmFsc2UsXG4gICAgZHJhZ0l0ZW06IHt9LFxuICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2hhbmdlLm1vY2tDbGVhcigpO1xuICAgIHJlbmRlck1hdGgubW9ja0NsZWFyKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkZWZhdWx0IHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc3BsYXlzIHRoZSB2YWx1ZSB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ293JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBhcyBkaXNhYmxlZCB3aGVuIGRpc2FibGVkIHByb3AgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gZGlzYWJsZWQ9e3RydWV9IC8+KTtcbiAgICAgIC8vIENoZWNrIHRoYXQgZGVsZXRlIGJ1dHRvbiBpcyBub3QgcHJlc2VudCB3aGVuIGRpc2FibGVkXG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6IC9kZWxldGUvaSB9KSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGRyYWdnZWQgaXRlbSBwcmV2aWV3JywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSBkcmFnSXRlbT17eyBjaG9pY2U6IHsgdmFsdWU6ICdEb2cnIH0gfX0gLz4pO1xuICAgICAgLy8gQmxhbmsgY29tcG9uZW50IHNob3VsZCByZW5kZXJcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdDb3cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG93cyBob3ZlciBzdGF0ZSB3aGVuIGlzT3ZlciBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gZHJhZ0l0ZW09e3sgY2hvaWNlOiB7IHZhbHVlOiAnRG9nJyB9IH19IGlzT3Zlcj17dHJ1ZX0gLz4pO1xuICAgICAgLy8gQ29tcG9uZW50IHNob3VsZCBoYXZlIGhvdmVyIHN0eWxpbmdcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG93cyBjb3JyZWN0IHN0YXRlIHdoZW4gY29ycmVjdCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gY29ycmVjdD17dHJ1ZX0gLz4pO1xuICAgICAgLy8gQ29tcG9uZW50IHNob3VsZCBpbmRpY2F0ZSBjb3JyZWN0bmVzc1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVsZXRlIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2RvZXMgbm90IHNob3cgZGVsZXRlIGJ1dHRvbiB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSBkaXNhYmxlZD17dHJ1ZX0gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5xdWVyeUJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAvZGVsZXRlL2kgfSkpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHNob3cgZGVsZXRlIGJ1dHRvbiB3aGVuIG5vIHZhbHVlIGlzIHNldCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gY2hvaWNlPXt1bmRlZmluZWR9IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogL2RlbGV0ZS9pIH0pKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG93cyBkZWxldGUgYnV0dG9uIHdoZW4gdmFsdWUgaXMgcHJlc2VudCBhbmQgbm90IGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICAvLyBJZiBkZWxldGUgYnV0dG9uIGlzIHByZXNlbnQsIGl0IHNob3VsZCBiZSBjbGlja2FibGVcbiAgICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHNjcmVlbi5xdWVyeUJ5Um9sZSgnYnV0dG9uJyk7XG4gICAgICBpZiAoZGVsZXRlQnV0dG9uKSB7XG4gICAgICAgIGV4cGVjdChkZWxldGVCdXR0b24pLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaW1lbnNpb25zJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggY3VzdG9tIGRpbWVuc2lvbnMgd2hlbiBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSBlbXB0eVJlc3BvbnNlQXJlYUhlaWdodD17MTAwfSBlbXB0eVJlc3BvbnNlQXJlYVdpZHRoPXsyMDB9IC8+LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIGV4cGVjdChlbGVtZW50KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBtaW4gZGltZW5zaW9ucyBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGNvbnRhaW5lci5maXJzdENoaWxkO1xuICAgICAgZXhwZWN0KGVsZW1lbnQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyBDb21wb25lbnQgc2hvdWxkIGhhdmUgbWluaW11bSBkaW1lbnNpb25zIGFwcGxpZWRcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG5vbi1udW1lcmljIGRpbWVuc2lvbiBwcm9wcyBncmFjZWZ1bGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPEJsYW5rIHsuLi5kZWZhdWx0UHJvcHN9IGVtcHR5UmVzcG9uc2VBcmVhSGVpZ2h0PVwibm9uLW51bWVyaWNcIiBlbXB0eVJlc3BvbnNlQXJlYVdpZHRoPVwibm9uLW51bWVyaWNcIiAvPixcbiAgICAgICk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29tcHV0ZXMgY2hpcCBkaW1lbnNpb25zIGJhc2VkIG9uIGNvbnRlbnQgd2hlbiBubyBlbXB0eVJlc3BvbnNlQXJlYSBzaXplIGlzIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgamVzdC51c2VGYWtlVGltZXJzKCk7XG4gICAgICAvLyBNb2NrIGdldEJvdW5kaW5nQ2xpZW50UmVjdCB0byBzaW11bGF0ZSBtZWFzdXJlZCBjb250ZW50IHNpemVcbiAgICAgIGNvbnN0IHJlY3RTcHkgPSBqZXN0XG4gICAgICAgIC5zcHlPbihIVE1MRWxlbWVudC5wcm90b3R5cGUsICdnZXRCb3VuZGluZ0NsaWVudFJlY3QnKVxuICAgICAgICAubW9ja1JldHVyblZhbHVlKHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAyMCwgdG9wOiAwLCBsZWZ0OiAwLCByaWdodDogMTAwLCBib3R0b206IDIwIH0pO1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8QmxhbmtcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIC8vIEZvcmNlIG1lYXN1cmVtZW50IHBhdGggdGhhdCB1c2VzIGdldE1lYXN1cmVOb2RlIC8gdXBkYXRlRGltZW5zaW9uc1xuICAgICAgICAgIGVtcHR5UmVzcG9uc2VBcmVhSGVpZ2h0PXswfVxuICAgICAgICAgIGVtcHR5UmVzcG9uc2VBcmVhV2lkdGg9ezB9XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgLy8gTGV0IHRoZSBpbnRlcm5hbCB0aW1lb3V0IGluIGhhbmRsZUVsZW1lbnRzIC8gdXBkYXRlRGltZW5zaW9ucyBydW5cbiAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgIGplc3QucnVuQWxsVGltZXJzKCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd3JhcHBlciA9IGNvbnRhaW5lci5maXJzdENoaWxkOyAvLyBTdHlsZWRDb250ZW50XG4gICAgICBjb25zdCBjaGlwID0gd3JhcHBlciAmJiB3cmFwcGVyLmZpcnN0Q2hpbGQ7IC8vIFN0eWxlZENoaXAgKHJvb3RSZWYpXG5cbiAgICAgIC8vIFdpZHRoIGFuZCBoZWlnaHQgc2hvdWxkIGluY2x1ZGUgcGFkZGluZyAoMjRweCkgYXJvdW5kIG1lYXN1cmVkIGNvbnRlbnRcbiAgICAgIGV4cGVjdChjaGlwLnN0eWxlLndpZHRoKS50b0JlKCcxMjlweCcpO1xuICAgICAgZXhwZWN0KGNoaXAuc3R5bGUuaGVpZ2h0KS50b0JlKCc0OXB4Jyk7XG5cbiAgICAgIHJlY3RTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWF0aCByZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIHJlbmRlck1hdGggb24gbW91bnQgd2hlbiBjaG9pY2UgaGFzIGNvbnRlbnQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPEJsYW5rIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChyZW5kZXJNYXRoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgcmVuZGVyTWF0aCBhZ2FpbiB3aGVuIGNvcnJlY3QgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gY29ycmVjdD17ZmFsc2V9IC8+KTtcbiAgICAgIGNvbnN0IGNhbGxzQWZ0ZXJNb3VudCA9IHJlbmRlck1hdGgubW9jay5jYWxscy5sZW5ndGg7XG4gICAgICBleHBlY3QoY2FsbHNBZnRlck1vdW50KS50b0JlR3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIHJlcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSBjb3JyZWN0PXt0cnVlfSAvPik7XG4gICAgICBleHBlY3QocmVuZGVyTWF0aC5tb2NrLmNhbGxzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKGNhbGxzQWZ0ZXJNb3VudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY2FsbCByZW5kZXJNYXRoIGFnYWluIHdoZW4gY29ycmVjdCBpcyB1bmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPEJsYW5rIHsuLi5kZWZhdWx0UHJvcHN9IGNvcnJlY3Q9e3RydWV9IC8+KTtcbiAgICAgIGNvbnN0IGNhbGxzQWZ0ZXJNb3VudCA9IHJlbmRlck1hdGgubW9jay5jYWxscy5sZW5ndGg7XG5cbiAgICAgIHJlcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSBjb3JyZWN0PXt0cnVlfSAvPik7XG4gICAgICBleHBlY3QocmVuZGVyTWF0aC5tb2NrLmNhbGxzLmxlbmd0aCkudG9CZShjYWxsc0FmdGVyTW91bnQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJhY3Rpb24gbWF0aCBzdHlsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdlbmxhcmdlcyBudW1lcmF0b3IvZGVub21pbmF0b3IgZGlnaXRzIGFkamFjZW50IHRvIGEgZnJhY3Rpb24gdG8gMTIwJScsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Qmxhbmsgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgcnVsZSA9IGNvbGxlY3RFbW90aW9uUnVsZXMoKS5maW5kKChyKSA9PiByLmluY2x1ZGVzKCdtangtbW4nKSAmJiByLmluY2x1ZGVzKCdtangtbWZyYWMnKSk7XG4gICAgICBleHBlY3QocnVsZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9tangtbW46aGFzXFwoflxccyptangtbWZyYWNcXCkvKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9tangtbWZyYWNcXHMqflxccyptangtbW4vKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9mb250LXNpemU6XFxzKjEyMCVcXHMqIWltcG9ydGFudC9pKTtcbiAgICB9KTtcblxuICAgIGl0KCdrZWVwcyB0aGUgZXhpc3RpbmcgbWp4LWZyYWMgMTIwJSBydWxlJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBydWxlID0gY29sbGVjdEVtb3Rpb25SdWxlcygpLmZpbmQoKHIpID0+IC8oXnxbXi1dKW1qeC1mcmFjLy50ZXN0KHIpICYmICFyLmluY2x1ZGVzKCdtangtbWZyYWMnKSk7XG4gICAgICBleHBlY3QocnVsZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9mb250LXNpemU6XFxzKjEyMCVcXHMqIWltcG9ydGFudC9pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RyYWcgYW5kIGRyb3AnLCAoKSA9PiB7XG4gICAgaXQoJ2FjY2VwdHMgZHJhZyBpdGVtIHdoZW4gbm90IGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxCbGFuayB7Li4uZGVmYXVsdFByb3BzfSBpc092ZXI9e3RydWV9IGRyYWdJdGVtPXt7IGNob2ljZTogeyB2YWx1ZTogJ0RvZycgfSB9fSAvPik7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ293JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvd3MgZHJhZyBwcmV2aWV3IHdoZW4gZHJhZ2dpbmcgb3ZlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEJsYW5rIHsuLi5kZWZhdWx0UHJvcHN9IGlzT3Zlcj17dHJ1ZX0gZHJhZ0l0ZW09e3sgY2hvaWNlOiB7IHZhbHVlOiAnRG9nJyB9IH19IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIC8vIFNob3VsZCBzaG93IHZpc3VhbCBmZWVkYmFjayBmb3IgZHJhZyBvdmVyXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFB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LGVBQUN2RSxLQUFBLENBQUF3RSxhQUFBLENBQUNwRSxNQUFBLFdBQUssRUFBS3lELFlBQWUsQ0FBQyxDQUFDO01BQ25DLElBQU1OLElBQUksR0FBR2IsbUJBQW1CLENBQUMsQ0FBQyxDQUFDK0UsSUFBSSxDQUFDLFVBQUNoSCxDQUFDO1FBQUEsT0FBSyxrQkFBa0IsQ0FBQ29ILElBQUksQ0FBQ3BILENBQUMsQ0FBQyxJQUFJLENBQUNBLENBQUMsQ0FBQ2lILFFBQVEsQ0FBQyxXQUFXLENBQUM7TUFBQSxFQUFDO01BQ3RHaEQsTUFBTSxDQUFDbkIsSUFBSSxDQUFDLENBQUNvRSxXQUFXLENBQUMsQ0FBQztNQUMxQmpELE1BQU0sQ0FBQ25CLElBQUksQ0FBQyxDQUFDcUUsT0FBTyxDQUFDLGlDQUFpQyxDQUFDO0lBQ3pELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGbEUsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFNO0lBQzlCVyxFQUFFLENBQUMscUNBQXFDLEVBQUUsWUFBTTtNQUM5QyxJQUFBRSxjQUFNLGVBQUN2RSxLQUFBLENBQUF3RSxhQUFBLENBQUNwRSxNQUFBLFdBQUssTUFBQTJFLFNBQUEsaUJBQUtsQixZQUFZO1FBQUV6QixNQUFNLEVBQUUsSUFBSztRQUFDNkIsUUFBUSxFQUFFO1VBQUVGLE1BQU0sRUFBRTtZQUFFQyxLQUFLLEVBQUU7VUFBTTtRQUFFO01BQUUsRUFBRSxDQUFDLENBQUM7TUFDekZVLE1BQU0sQ0FBQ0csY0FBTSxDQUFDQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQ0YsaUJBQWlCLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUM7SUFFRlAsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLFlBQU07TUFDaEQsSUFBQXlELFFBQUEsR0FBc0IsSUFBQXZELGNBQU0sZUFBQ3ZFLEtBQUEsQ0FBQXdFLGFBQUEsQ0FBQ3BFLE1BQUEsV0FBSyxNQUFBMkUsU0FBQSxpQkFBS2xCLFlBQVk7VUFBRXpCLE1BQU0sRUFBRSxJQUFLO1VBQUM2QixRQUFRLEVBQUU7WUFBRUYsTUFBTSxFQUFFO2NBQUVDLEtBQUssRUFBRTtZQUFNO1VBQUU7UUFBRSxFQUFFLENBQUMsQ0FBQztRQUF2R1MsU0FBUyxHQUFBcUQsUUFBQSxDQUFUckQsU0FBUztNQUNqQkMsTUFBTSxDQUFDRCxTQUFTLENBQUNFLFVBQVUsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO01BQ2hEO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
7
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
8
|
+
var React = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _react2 = require("@testing-library/react");
|
|
10
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
11
|
+
var _correctInput = _interopRequireDefault(require("../correct-input"));
|
|
12
|
+
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); }
|
|
13
|
+
describe('CorrectInput', function () {
|
|
14
|
+
var onChange = jest.fn();
|
|
15
|
+
var defaultProps = {
|
|
16
|
+
disabled: false,
|
|
17
|
+
correct: false,
|
|
18
|
+
variant: 'outlined',
|
|
19
|
+
value: 'Cow',
|
|
20
|
+
onChange: onChange
|
|
21
|
+
};
|
|
22
|
+
beforeEach(function () {
|
|
23
|
+
onChange.mockClear();
|
|
24
|
+
});
|
|
25
|
+
describe('rendering', function () {
|
|
26
|
+
it('renders input with default props', function () {
|
|
27
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], defaultProps));
|
|
28
|
+
var input = _react2.screen.getByRole('textbox');
|
|
29
|
+
expect(input).toBeInTheDocument();
|
|
30
|
+
expect(input).toHaveValue('Cow');
|
|
31
|
+
});
|
|
32
|
+
it('renders as disabled when disabled prop is true', function () {
|
|
33
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
34
|
+
disabled: true
|
|
35
|
+
})));
|
|
36
|
+
var input = _react2.screen.getByRole('textbox');
|
|
37
|
+
expect(input).toBeDisabled();
|
|
38
|
+
});
|
|
39
|
+
it('renders with correct state as false', function () {
|
|
40
|
+
var _render = (0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
41
|
+
correct: false
|
|
42
|
+
}))),
|
|
43
|
+
container = _render.container;
|
|
44
|
+
var input = _react2.screen.getByRole('textbox');
|
|
45
|
+
expect(input).toBeInTheDocument();
|
|
46
|
+
});
|
|
47
|
+
it('renders with correct state as true', function () {
|
|
48
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
49
|
+
correct: true
|
|
50
|
+
}))),
|
|
51
|
+
container = _render2.container;
|
|
52
|
+
var input = _react2.screen.getByRole('textbox');
|
|
53
|
+
expect(input).toBeInTheDocument();
|
|
54
|
+
// Should show visual indication of correctness
|
|
55
|
+
});
|
|
56
|
+
it('renders with outlined variant', function () {
|
|
57
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
58
|
+
variant: "outlined"
|
|
59
|
+
})));
|
|
60
|
+
var input = _react2.screen.getByRole('textbox');
|
|
61
|
+
expect(input).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('user interactions', function () {
|
|
65
|
+
it('calls onChange when user types', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
66
|
+
var user, input;
|
|
67
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
68
|
+
while (1) switch (_context.prev = _context.next) {
|
|
69
|
+
case 0:
|
|
70
|
+
user = _userEvent["default"].setup();
|
|
71
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], defaultProps));
|
|
72
|
+
input = _react2.screen.getByRole('textbox');
|
|
73
|
+
_context.next = 1;
|
|
74
|
+
return user.clear(input);
|
|
75
|
+
case 1:
|
|
76
|
+
_context.next = 2;
|
|
77
|
+
return user.type(input, '1');
|
|
78
|
+
case 2:
|
|
79
|
+
expect(onChange).toHaveBeenCalled();
|
|
80
|
+
case 3:
|
|
81
|
+
case "end":
|
|
82
|
+
return _context.stop();
|
|
83
|
+
}
|
|
84
|
+
}, _callee);
|
|
85
|
+
})));
|
|
86
|
+
it('calls onChange with event object', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
87
|
+
var user, input, lastCall;
|
|
88
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
89
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
90
|
+
case 0:
|
|
91
|
+
user = _userEvent["default"].setup();
|
|
92
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
93
|
+
value: ""
|
|
94
|
+
})));
|
|
95
|
+
input = _react2.screen.getByRole('textbox');
|
|
96
|
+
_context2.next = 1;
|
|
97
|
+
return user.type(input, 'test');
|
|
98
|
+
case 1:
|
|
99
|
+
expect(onChange).toHaveBeenCalled();
|
|
100
|
+
// Check that onChange receives an event-like object
|
|
101
|
+
lastCall = onChange.mock.calls[onChange.mock.calls.length - 1][0];
|
|
102
|
+
expect(lastCall).toHaveProperty('target');
|
|
103
|
+
case 2:
|
|
104
|
+
case "end":
|
|
105
|
+
return _context2.stop();
|
|
106
|
+
}
|
|
107
|
+
}, _callee2);
|
|
108
|
+
})));
|
|
109
|
+
it('updates value when user changes input', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
110
|
+
var user, input;
|
|
111
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
112
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
113
|
+
case 0:
|
|
114
|
+
user = _userEvent["default"].setup();
|
|
115
|
+
(0, _react2.render)(/*#__PURE__*/React.createElement(_correctInput["default"], defaultProps));
|
|
116
|
+
input = _react2.screen.getByRole('textbox');
|
|
117
|
+
_context3.next = 1;
|
|
118
|
+
return user.clear(input);
|
|
119
|
+
case 1:
|
|
120
|
+
_context3.next = 2;
|
|
121
|
+
return user.type(input, 'Dog');
|
|
122
|
+
case 2:
|
|
123
|
+
expect(onChange).toHaveBeenCalled();
|
|
124
|
+
case 3:
|
|
125
|
+
case "end":
|
|
126
|
+
return _context3.stop();
|
|
127
|
+
}
|
|
128
|
+
}, _callee3);
|
|
129
|
+
})));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb3JyZWN0SW5wdXQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlc2NyaWJlIiwib25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJkZWZhdWx0UHJvcHMiLCJkaXNhYmxlZCIsImNvcnJlY3QiLCJ2YXJpYW50IiwidmFsdWUiLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiaXQiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiaW5wdXQiLCJzY3JlZW4iLCJnZXRCeVJvbGUiLCJleHBlY3QiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInRvSGF2ZVZhbHVlIiwiX2V4dGVuZHMyIiwidG9CZURpc2FibGVkIiwiX3JlbmRlciIsImNvbnRhaW5lciIsIl9yZW5kZXIyIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ1c2VyIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJ1c2VyRXZlbnQiLCJzZXR1cCIsImNsZWFyIiwidHlwZSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJzdG9wIiwiX2NhbGxlZTIiLCJsYXN0Q2FsbCIsIl9jb250ZXh0MiIsIm1vY2siLCJjYWxscyIsImxlbmd0aCIsInRvSGF2ZVByb3BlcnR5IiwiX2NhbGxlZTMiLCJfY29udGV4dDMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9fX3Rlc3RzX18vY29ycmVjdC1pbnB1dC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgdXNlckV2ZW50IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvdXNlci1ldmVudCc7XG5pbXBvcnQgQ29ycmVjdElucHV0IGZyb20gJy4uL2NvcnJlY3QtaW5wdXQnO1xuXG5kZXNjcmliZSgnQ29ycmVjdElucHV0JywgKCkgPT4ge1xuICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICB2YXJpYW50OiAnb3V0bGluZWQnLFxuICAgIHZhbHVlOiAnQ293JyxcbiAgICBvbkNoYW5nZSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBvbkNoYW5nZS5tb2NrQ2xlYXIoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBpbnB1dCB3aXRoIGRlZmF1bHQgcHJvcHMnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENvcnJlY3RJbnB1dCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBpbnB1dCA9IHNjcmVlbi5nZXRCeVJvbGUoJ3RleHRib3gnKTtcbiAgICAgIGV4cGVjdChpbnB1dCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChpbnB1dCkudG9IYXZlVmFsdWUoJ0NvdycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgYXMgZGlzYWJsZWQgd2hlbiBkaXNhYmxlZCBwcm9wIGlzIHRydWUnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPENvcnJlY3RJbnB1dCB7Li4uZGVmYXVsdFByb3BzfSBkaXNhYmxlZD17dHJ1ZX0gLz4pO1xuICAgICAgY29uc3QgaW5wdXQgPSBzY3JlZW4uZ2V0QnlSb2xlKCd0ZXh0Ym94Jyk7XG4gICAgICBleHBlY3QoaW5wdXQpLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjb3JyZWN0IHN0YXRlIGFzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Q29ycmVjdElucHV0IHsuLi5kZWZhdWx0UHJvcHN9IGNvcnJlY3Q9e2ZhbHNlfSAvPik7XG4gICAgICBjb25zdCBpbnB1dCA9IHNjcmVlbi5nZXRCeVJvbGUoJ3RleHRib3gnKTtcbiAgICAgIGV4cGVjdChpbnB1dCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdCBzdGF0ZSBhcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Q29ycmVjdElucHV0IHsuLi5kZWZhdWx0UHJvcHN9IGNvcnJlY3Q9e3RydWV9IC8+KTtcbiAgICAgIGNvbnN0IGlucHV0ID0gc2NyZWVuLmdldEJ5Um9sZSgndGV4dGJveCcpO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgLy8gU2hvdWxkIHNob3cgdmlzdWFsIGluZGljYXRpb24gb2YgY29ycmVjdG5lc3NcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggb3V0bGluZWQgdmFyaWFudCcsICgpID0+IHtcbiAgICAgIHJlbmRlcig8Q29ycmVjdElucHV0IHsuLi5kZWZhdWx0UHJvcHN9IHZhcmlhbnQ9XCJvdXRsaW5lZFwiIC8+KTtcbiAgICAgIGNvbnN0IGlucHV0ID0gc2NyZWVuLmdldEJ5Um9sZSgndGV4dGJveCcpO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdoZW4gdXNlciB0eXBlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIHJlbmRlcig8Q29ycmVjdElucHV0IHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgY29uc3QgaW5wdXQgPSBzY3JlZW4uZ2V0QnlSb2xlKCd0ZXh0Ym94Jyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGlucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShpbnB1dCwgJzEnKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCBldmVudCBvYmplY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXIoPENvcnJlY3RJbnB1dCB7Li4uZGVmYXVsdFByb3BzfSB2YWx1ZT1cIlwiIC8+KTtcblxuICAgICAgY29uc3QgaW5wdXQgPSBzY3JlZW4uZ2V0QnlSb2xlKCd0ZXh0Ym94Jyk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaW5wdXQsICd0ZXN0Jyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgLy8gQ2hlY2sgdGhhdCBvbkNoYW5nZSByZWNlaXZlcyBhbiBldmVudC1saWtlIG9iamVjdFxuICAgICAgY29uc3QgbGFzdENhbGwgPSBvbkNoYW5nZS5tb2NrLmNhbGxzW29uQ2hhbmdlLm1vY2suY2FsbHMubGVuZ3RoIC0gMV1bMF07XG4gICAgICBleHBlY3QobGFzdENhbGwpLnRvSGF2ZVByb3BlcnR5KCd0YXJnZXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIHZhbHVlIHdoZW4gdXNlciBjaGFuZ2VzIGlucHV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgcmVuZGVyKDxDb3JyZWN0SW5wdXQgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCBpbnB1dCA9IHNjcmVlbi5nZXRCeVJvbGUoJ3RleHRib3gnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIoaW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKGlucHV0LCAnRG9nJyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksYUFBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQTRDLFNBQUFELHdCQUFBTSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBUix1QkFBQSxZQUFBQSx3QkFBQU0sQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLG1CQUFBVCxDQUFBLGlCQUFBQSxDQUFBLGdCQUFBVSxPQUFBLENBQUFWLENBQUEsMEJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsY0FBQU0sRUFBQSxJQUFB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
|