@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
@@ -7,184 +7,453 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = void 0;
8
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
11
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
12
10
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
11
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
13
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
14
  var _react = _interopRequireDefault(require("react"));
16
15
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
- var _Select = _interopRequireDefault(require("@material-ui/core/Select"));
18
- var _MenuItem = _interopRequireDefault(require("@material-ui/core/MenuItem"));
19
- var _correctInput = _interopRequireDefault(require("./correct-input"));
20
- var _styles = require("@material-ui/core/styles");
16
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
17
+ var _InputLabel = _interopRequireDefault(require("@mui/material/InputLabel"));
18
+ var _Menu = _interopRequireDefault(require("@mui/material/Menu"));
19
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
20
+ var _ArrowDropDown = _interopRequireDefault(require("@mui/icons-material/ArrowDropDown"));
21
+ var _ArrowDropUp = _interopRequireDefault(require("@mui/icons-material/ArrowDropUp"));
22
+ var _Close = _interopRequireDefault(require("@mui/icons-material/Close"));
23
+ var _Check = _interopRequireDefault(require("@mui/icons-material/Check"));
24
+ var _styles = require("@mui/material/styles");
21
25
  var _renderUi = require("@pie-lib/render-ui");
22
- 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); }; }
23
- 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; } }
26
+ var _mathRendering = require("@pie-lib/math-rendering");
27
+ 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; }
28
+ 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; }
29
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
30
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
31
+ var StyledButton = (0, _styles.styled)(_Button["default"])(function () {
32
+ return {
33
+ color: _renderUi.color.text(),
34
+ border: "1px solid ".concat(_renderUi.color.borderGray()),
35
+ borderRadius: '4px',
36
+ justifyContent: 'space-between',
37
+ backgroundColor: _renderUi.color.background(),
38
+ position: 'relative',
39
+ height: '45px',
40
+ width: 'fit-content',
41
+ margin: '2px',
42
+ textTransform: 'none',
43
+ '& span': {
44
+ paddingRight: '5px'
45
+ },
46
+ '& svg': {
47
+ position: 'absolute',
48
+ right: 0,
49
+ top: 'calc(50% - 12px)',
50
+ pointerEvents: 'none',
51
+ color: _renderUi.color.text(),
52
+ marginLeft: '5px'
53
+ },
54
+ '&.Mui-focused': {
55
+ outline: "3px solid ".concat(_renderUi.color.tertiary()),
56
+ outlineOffset: '2px',
57
+ borderWidth: '3px'
58
+ },
59
+ '&.disabledCorrect': {
60
+ borderWidth: '2px',
61
+ borderColor: _renderUi.color.correct(),
62
+ color: "".concat(_renderUi.color.text(), " !important")
63
+ },
64
+ '&.disabledIncorrect': {
65
+ borderWidth: '2px',
66
+ borderColor: _renderUi.color.incorrectWithIcon(),
67
+ color: "".concat(_renderUi.color.text(), " !important")
68
+ }
69
+ };
70
+ });
71
+ var StyledMenu = (0, _styles.styled)(_Menu["default"])(function () {
72
+ return {
73
+ backgroundColor: _renderUi.color.background(),
74
+ border: "1px solid ".concat(_renderUi.color.correct(), " !important"),
75
+ '&:hover': {
76
+ border: "1px solid ".concat(_renderUi.color.text(), " "),
77
+ borderColor: 'initial'
78
+ },
79
+ '&:focus': {
80
+ border: "1px solid ".concat(_renderUi.color.text()),
81
+ borderColor: 'initial'
82
+ },
83
+ // remove default padding on the inner list
84
+ '& .MuiList-root': {
85
+ padding: 0
86
+ }
87
+ };
88
+ });
89
+ var StyledMenuItem = (0, _styles.styled)(_MenuItem["default"])(function () {
90
+ return {
91
+ color: _renderUi.color.text(),
92
+ backgroundColor: _renderUi.color.background(),
93
+ '&.Mui-focused': {
94
+ outline: "3px solid ".concat(_renderUi.color.tertiary()),
95
+ outlineOffset: '-1px',
96
+ // keeps it inside the item
97
+ color: _renderUi.color.text(),
98
+ backgroundColor: _renderUi.color.background()
99
+ },
100
+ '&:hover': {
101
+ color: _renderUi.color.text(),
102
+ backgroundColor: _renderUi.color.dropdownBackground()
103
+ },
104
+ boxSizing: 'border-box',
105
+ padding: '25px',
106
+ borderRadius: '4px',
107
+ '&.selected': {
108
+ color: "".concat(_renderUi.color.text(), " !important"),
109
+ backgroundColor: "".concat(_renderUi.color.background(), " !important"),
110
+ '&:hover': {
111
+ color: _renderUi.color.text(),
112
+ backgroundColor: "".concat(_renderUi.color.dropdownBackground(), " !important")
113
+ }
114
+ }
115
+ };
116
+ });
117
+ var StyledLabel = (0, _styles.styled)('span')(function () {
118
+ return {
119
+ fontSize: 'max(1rem, 14px)'
120
+ };
121
+ });
122
+ var StyledSelectedIndicator = (0, _styles.styled)('span')(function () {
123
+ return {
124
+ fontSize: 'max(1rem, 14px)',
125
+ position: 'absolute',
126
+ right: '10px'
127
+ };
128
+ });
129
+ var StyledInputLabel = (0, _styles.styled)(_InputLabel["default"])(function () {
130
+ return {
131
+ position: 'absolute',
132
+ left: '-10000px',
133
+ top: 'auto',
134
+ width: '1px',
135
+ height: '1px',
136
+ overflow: 'hidden'
137
+ };
138
+ });
139
+ var StyledCorrectnessIcon = (0, _styles.styled)(_Check["default"])(function () {
140
+ return {
141
+ color: "".concat(_renderUi.color.white(), " !important"),
142
+ position: 'absolute',
143
+ top: '-8px !important',
144
+ left: '-8px',
145
+ marginLeft: '0 !important',
146
+ borderRadius: '50%',
147
+ fontSize: '16px',
148
+ padding: '2px',
149
+ '&.correct': {
150
+ backgroundColor: _renderUi.color.correct()
151
+ },
152
+ '&.incorrect': {
153
+ backgroundColor: _renderUi.color.incorrectWithIcon()
154
+ }
155
+ };
156
+ });
157
+ var StyledIncorrectnessIcon = (0, _styles.styled)(_Close["default"])(function () {
158
+ return {
159
+ color: "".concat(_renderUi.color.white(), " !important"),
160
+ position: 'absolute',
161
+ top: '-8px !important',
162
+ left: '-8px',
163
+ marginLeft: '0 !important',
164
+ borderRadius: '50%',
165
+ fontSize: '16px',
166
+ padding: '2px',
167
+ '&.correct': {
168
+ backgroundColor: _renderUi.color.correct()
169
+ },
170
+ '&.incorrect': {
171
+ backgroundColor: _renderUi.color.incorrectWithIcon()
172
+ }
173
+ };
174
+ });
24
175
  var Dropdown = /*#__PURE__*/function (_React$Component) {
25
- (0, _inherits2["default"])(Dropdown, _React$Component);
26
- var _super = _createSuper(Dropdown);
27
176
  function Dropdown(props) {
28
177
  var _this;
29
178
  (0, _classCallCheck2["default"])(this, Dropdown);
30
- _this = _super.call(this, props);
31
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "showCheckmarkAndOpen", function () {
179
+ _this = _callSuper(this, Dropdown, [props]);
180
+ (0, _defineProperty2["default"])(_this, "handleClick", function (event) {
181
+ return _this.setState({
182
+ anchorEl: event.currentTarget
183
+ });
184
+ });
185
+ (0, _defineProperty2["default"])(_this, "handleClose", function () {
186
+ var value = _this.props.value;
32
187
  _this.setState({
33
- showCheckmark: true,
34
- open: true
188
+ anchorEl: null,
189
+ previewValue: null,
190
+ highlightedOptionId: null
35
191
  });
192
+ // clear displayed preview if no selection
193
+ if (!value && _this.previewRef.current) {
194
+ _this.previewRef.current.innerHTML = '';
195
+ }
196
+ });
197
+ (0, _defineProperty2["default"])(_this, "handleHighlight", function (index) {
198
+ var highlightedOptionId = "dropdown-option-".concat(_this.props.id, "-").concat(index);
199
+
200
+ // preview on hover if nothing selected
201
+ var stateUpdate = {
202
+ highlightedOptionId: highlightedOptionId
203
+ };
204
+ if (!_this.props.value) {
205
+ stateUpdate.previewValue = _this.props.choices[index].value;
206
+ }
207
+ _this.setState(stateUpdate);
208
+ });
209
+ (0, _defineProperty2["default"])(_this, "handleSelect", function (value, index) {
210
+ _this.props.onChange(_this.props.id, value);
211
+ _this.handleHighlight(index);
212
+ _this.handleClose();
36
213
  });
37
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "hideCheckmarkAndClose", function () {
214
+ (0, _defineProperty2["default"])(_this, "handleHover", function (index) {
215
+ var selectedValue = _this.props.value;
216
+ if (selectedValue) return;
217
+ var highlightedOptionId = "dropdown-option-".concat(_this.props.id, "-").concat(index);
218
+ var previewValue = _this.state.previewValue;
38
219
  _this.setState({
39
- showCheckmark: false,
40
- open: false
220
+ highlightedOptionId: highlightedOptionId,
221
+ previewValue: previewValue
222
+ }, function () {
223
+ // On hover, preview the math-rendered content inside the button if no value is selected.
224
+ var ref = _this.elementRefs[index];
225
+ var preview = _this.previewRef.current;
226
+ if (ref && preview) {
227
+ preview.innerHTML = ref.innerHTML;
228
+ }
41
229
  });
42
230
  });
43
231
  _this.state = {
44
- showCheckmark: false,
45
- open: false
232
+ anchorEl: null,
233
+ highlightedOptionId: null,
234
+ menuWidth: null,
235
+ previewValue: null
46
236
  };
237
+ _this.hiddenRef = /*#__PURE__*/_react["default"].createRef();
238
+ _this.buttonRef = /*#__PURE__*/_react["default"].createRef();
239
+ _this.previewRef = /*#__PURE__*/_react["default"].createRef();
240
+ _this.elementRefs = [];
47
241
  return _this;
48
242
  }
49
- (0, _createClass2["default"])(Dropdown, [{
243
+ (0, _inherits2["default"])(Dropdown, _React$Component);
244
+ return (0, _createClass2["default"])(Dropdown, [{
245
+ key: "componentDidMount",
246
+ value: function componentDidMount() {
247
+ // measure hidden menu width once
248
+ if (this.hiddenRef.current && this.state.menuWidth === null) {
249
+ this.setState({
250
+ menuWidth: this.hiddenRef.current.clientWidth
251
+ });
252
+ }
253
+ }
254
+ }, {
255
+ key: "componentDidUpdate",
256
+ value: function componentDidUpdate(prevProps, prevState) {
257
+ var hiddenEl = this.hiddenRef.current;
258
+ var dropdownJustOpened = !prevState.anchorEl && this.state.anchorEl;
259
+ if (dropdownJustOpened) {
260
+ this.elementRefs.forEach(function (ref) {
261
+ if (!ref) return;
262
+ var containsLatex = ref.querySelector('[data-latex], [data-raw]');
263
+ var hasMathJax = ref.querySelector('mjx-container');
264
+ var mathHandled = ref.querySelector('[data-math-handled="true"]');
265
+ if (containsLatex && (!mathHandled || !hasMathJax)) {
266
+ (0, _mathRendering.renderMath)(ref);
267
+ }
268
+ });
269
+ }
270
+ if (hiddenEl) {
271
+ var newWidth = hiddenEl.clientWidth;
272
+ if (newWidth !== this.state.menuWidth) {
273
+ this.elementRefs.forEach(function (ref) {
274
+ if (ref) (0, _mathRendering.renderMath)(ref);
275
+ });
276
+ (0, _mathRendering.renderMath)(hiddenEl);
277
+ this.setState({
278
+ menuWidth: newWidth
279
+ });
280
+ }
281
+ }
282
+ }
283
+ }, {
284
+ key: "getLabel",
285
+ value: function getLabel(choices, value) {
286
+ var found = (choices || []).find(function (choice) {
287
+ return choice.value === value;
288
+ });
289
+ return found ? found.label.trim() : undefined;
290
+ }
291
+ }, {
50
292
  key: "render",
51
293
  value: function render() {
294
+ var _this2 = this;
52
295
  var _this$props = this.props,
53
- classes = _this$props.classes,
54
296
  id = _this$props.id,
55
297
  correct = _this$props.correct,
56
298
  disabled = _this$props.disabled,
57
299
  value = _this$props.value,
58
- _onChange = _this$props.onChange,
59
300
  choices = _this$props.choices,
60
- showCorrectAnswer = _this$props.showCorrectAnswer;
61
- var _this$state = this.state,
62
- showCheckmark = _this$state.showCheckmark,
63
- open = _this$state.open;
64
- return /*#__PURE__*/_react["default"].createElement(_Select["default"], {
65
- classes: {
66
- root: classes.root,
67
- icon: classes.icon,
68
- selectMenu: classes.selectMenu,
69
- select: classes.select
301
+ showCorrectAnswer = _this$props.showCorrectAnswer,
302
+ singleQuery = _this$props.singleQuery,
303
+ correctValue = _this$props.correctValue;
304
+ var anchorEl = this.state.anchorEl;
305
+ var open = Boolean(anchorEl);
306
+ var buttonId = "dropdown-button-".concat(id);
307
+ var menuId = "dropdown-menu-".concat(id);
308
+ var valueDisplayId = "dropdown-value-".concat(id);
309
+
310
+ // Determine the class for disabled state, view mode and evaluate mode
311
+ var disabledClass;
312
+ // Reset elementRefs before each render to avoid stale references
313
+ this.elementRefs = [];
314
+ if (disabled && correct !== undefined) {
315
+ disabledClass = correct || showCorrectAnswer ? 'disabledCorrect' : 'disabledIncorrect';
316
+ }
317
+
318
+ // Create distinct, visually hidden labels for each dropdown
319
+ var incrementedId = parseInt(id, 10) + 1;
320
+ var labelId = singleQuery ? 'Query-label' : "Query-label-".concat(incrementedId);
321
+ var labelText = singleQuery ? 'Query' : "Query ".concat(incrementedId);
322
+
323
+ // Changed from Select to Button for dropdown to enhance accessibility. This modification offers explicit control over aria attributes and focuses management, ensuring the dropdown is compliant with accessibility standards. The use of Button and Menu components allows for better handling of keyboard interactions and provides accessible labels and menus, aligning with WCAG guidelines and improving usability for assistive technology users.
324
+ var correctnessIcon = null;
325
+ if (disabled && correct !== undefined) {
326
+ correctnessIcon = correct || showCorrectAnswer ? /*#__PURE__*/_react["default"].createElement(StyledCorrectnessIcon, {
327
+ className: "correct"
328
+ }) : /*#__PURE__*/_react["default"].createElement(StyledIncorrectnessIcon, {
329
+ className: "incorrect"
330
+ });
331
+ }
332
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
333
+ ref: this.hiddenRef,
334
+ style: {
335
+ position: 'absolute',
336
+ visibility: 'hidden',
337
+ top: 0,
338
+ left: 0
70
339
  },
340
+ tabIndex: -1,
341
+ "aria-hidden": "true"
342
+ }, (choices || []).map(function (c, index) {
343
+ return /*#__PURE__*/_react["default"].createElement(StyledMenuItem, {
344
+ key: index,
345
+ tabIndex: -1,
346
+ "aria-hidden": "true"
347
+ }, /*#__PURE__*/_react["default"].createElement(StyledLabel, {
348
+ dangerouslySetInnerHTML: {
349
+ __html: c.label
350
+ }
351
+ }));
352
+ })), /*#__PURE__*/_react["default"].createElement(StyledInputLabel, {
353
+ id: labelId,
354
+ tabIndex: -1,
355
+ "aria-hidden": "true"
356
+ }, labelText), /*#__PURE__*/_react["default"].createElement(StyledButton, {
357
+ ref: this.buttonRef,
358
+ style: _objectSpread(_objectSpread({}, this.state.menuWidth && {
359
+ minWidth: "calc(".concat(this.state.menuWidth, "px + 8px)")
360
+ }), {}, {
361
+ borderWidth: open ? '2px' : '1px',
362
+ transition: 'border-width 0.2s ease-in-out'
363
+ }),
364
+ "aria-controls": open ? menuId : undefined,
365
+ "aria-haspopup": "listbox",
366
+ "aria-expanded": open ? 'true' : undefined,
367
+ "aria-activedescendant": this.state.highlightedOptionId,
368
+ onClick: this.handleClick,
369
+ className: disabledClass,
71
370
  disabled: disabled,
72
- value: value || '',
73
- onOpen: this.showCheckmarkAndOpen,
74
- onClose: this.hideCheckmarkAndClose,
371
+ id: buttonId,
372
+ role: "combobox",
373
+ "aria-label": "Select an option for ".concat(labelText),
374
+ "aria-labelledby": valueDisplayId
375
+ }, correctnessIcon, /*#__PURE__*/_react["default"].createElement(StyledLabel, {
376
+ id: valueDisplayId,
377
+ ref: this.previewRef,
378
+ dangerouslySetInnerHTML: {
379
+ __html: correctValue ? correctValue : open && this.state.previewValue ? this.getLabel(choices, this.state.previewValue) : this.getLabel(choices, value) || ''
380
+ }
381
+ }), open ? /*#__PURE__*/_react["default"].createElement(_ArrowDropUp["default"], null) : /*#__PURE__*/_react["default"].createElement(_ArrowDropDown["default"], null)), /*#__PURE__*/_react["default"].createElement(StyledMenu, {
382
+ id: menuId,
383
+ anchorEl: anchorEl,
384
+ keepMounted: true,
75
385
  open: open,
76
- input: /*#__PURE__*/_react["default"].createElement(_correctInput["default"], {
77
- correct: showCorrectAnswer || correct
78
- }),
79
- MenuProps: {
80
- keepMounted: true,
81
- disablePortal: true
386
+ onClose: this.handleClose,
387
+ getContentAnchorEl: null,
388
+ anchorOrigin: {
389
+ vertical: 'bottom',
390
+ horizontal: 'left'
391
+ },
392
+ transformOrigin: {
393
+ vertical: 'top',
394
+ horizontal: 'left'
82
395
  },
83
- onChange: function onChange(e) {
84
- _onChange(id, e.target.value);
396
+ transitionDuration: {
397
+ enter: 225,
398
+ exit: 195
399
+ },
400
+ slotProps: {
401
+ paper: this.state.menuWidth ? {
402
+ style: {
403
+ minWidth: this.state.menuWidth,
404
+ padding: '4px'
405
+ }
406
+ } : undefined,
407
+ list: {
408
+ 'aria-labelledby': buttonId,
409
+ role: 'listbox',
410
+ disablePadding: true
411
+ }
85
412
  }
86
413
  }, (choices || []).map(function (c, index) {
87
- return /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], {
88
- classes: {
89
- root: classes.menuRoot,
90
- selected: classes.selected
91
- },
414
+ var optionId = "dropdown-option-".concat(id, "-").concat(index);
415
+ return /*#__PURE__*/_react["default"].createElement(StyledMenuItem, {
416
+ id: optionId,
417
+ className: c.value === value ? 'selected' : '',
92
418
  key: "".concat(c.label, "-").concat(index),
93
- value: c.value
94
- }, /*#__PURE__*/_react["default"].createElement("span", {
95
- className: classes.label,
419
+ value: c.value,
420
+ onClick: function onClick() {
421
+ return _this2.handleSelect(c.value, index);
422
+ },
423
+ role: "option",
424
+ "aria-selected": _this2.state.highlightedOptionId === optionId ? 'true' : undefined,
425
+ onMouseOver: function onMouseOver() {
426
+ return _this2.handleHover(index);
427
+ }
428
+ }, /*#__PURE__*/_react["default"].createElement(StyledLabel, {
429
+ ref: function ref(_ref) {
430
+ return _this2.elementRefs[index] = _ref;
431
+ },
96
432
  dangerouslySetInnerHTML: {
97
433
  __html: c.label
98
434
  }
99
- }), showCheckmark && /*#__PURE__*/_react["default"].createElement("span", {
100
- className: classes.label,
435
+ }), /*#__PURE__*/_react["default"].createElement(StyledSelectedIndicator, {
101
436
  dangerouslySetInnerHTML: {
102
437
  __html: c.value === value ? ' &check;' : ''
103
438
  }
104
439
  }));
105
- }));
440
+ })));
106
441
  }
107
442
  }]);
108
- return Dropdown;
109
443
  }(_react["default"].Component);
110
444
  (0, _defineProperty2["default"])(Dropdown, "propTypes", {
111
445
  id: _propTypes["default"].string,
112
446
  value: _propTypes["default"].string,
113
447
  disabled: _propTypes["default"].bool,
114
448
  onChange: _propTypes["default"].func,
115
- classes: _propTypes["default"].object,
116
449
  correct: _propTypes["default"].bool,
117
450
  choices: _propTypes["default"].arrayOf(_propTypes["default"].shape({
118
451
  value: _propTypes["default"].string,
119
452
  label: _propTypes["default"].string
120
453
  })),
121
- showCorrectAnswer: _propTypes["default"].bool
454
+ showCorrectAnswer: _propTypes["default"].bool,
455
+ singleQuery: _propTypes["default"].bool,
456
+ correctValue: _propTypes["default"].string
122
457
  });
123
- var styles = function styles() {
124
- return {
125
- root: {
126
- color: _renderUi.color.text(),
127
- backgroundColor: _renderUi.color.background(),
128
- borderColor: _renderUi.color.secondaryLight(),
129
- '& ul': {
130
- paddingTop: 0,
131
- paddingBottom: 0,
132
- border: "1px solid ".concat(_renderUi.color.text()),
133
- borderRadius: '5px',
134
- color: _renderUi.color.text(),
135
- backgroundColor: _renderUi.color.background()
136
- }
137
- },
138
- select: {
139
- '&:focus': {
140
- borderRadius: '4px'
141
- }
142
- },
143
- selectMenu: {
144
- backgroundColor: _renderUi.color.background(),
145
- '&:hover': {
146
- borderColor: 'initial'
147
- },
148
- '&:focus': {
149
- borderColor: 'initial'
150
- }
151
- },
152
- icon: {
153
- color: _renderUi.color.text()
154
- },
155
- selected: {
156
- color: "".concat(_renderUi.color.text(), " !important"),
157
- backgroundColor: "".concat(_renderUi.color.background(), " !important"),
158
- '&:hover': {
159
- color: _renderUi.color.text(),
160
- backgroundColor: "".concat(_renderUi.color.secondaryLight(), " !important")
161
- }
162
- },
163
- menuRoot: {
164
- color: _renderUi.color.text(),
165
- backgroundColor: _renderUi.color.background(),
166
- '&:focus': {
167
- color: _renderUi.color.text(),
168
- backgroundColor: _renderUi.color.background()
169
- },
170
- '&:hover': {
171
- color: _renderUi.color.text(),
172
- backgroundColor: _renderUi.color.secondaryLight()
173
- },
174
- boxSizing: 'border-box',
175
- padding: '25px',
176
- '&:first-of-type': {
177
- borderRadius: '3px 3px 0 0'
178
- },
179
- '&:last-of-type': {
180
- borderRadius: '0 0 3px 3px'
181
- }
182
- },
183
- label: {
184
- fontSize: 'max(1rem, 14px)'
185
- }
186
- };
187
- };
188
- var _default = (0, _styles.withStyles)(styles)(Dropdown);
189
- exports["default"] = _default;
190
- //# sourceMappingURL=dropdown.js.map
458
+ var _default = exports["default"] = Dropdown;
459
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfQnV0dG9uIiwiX0lucHV0TGFiZWwiLCJfTWVudSIsIl9NZW51SXRlbSIsIl9BcnJvd0Ryb3BEb3duIiwiX0Fycm93RHJvcFVwIiwiX0Nsb3NlIiwiX0NoZWNrIiwiX3N0eWxlcyIsIl9yZW5kZXJVaSIsIl9tYXRoUmVuZGVyaW5nIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJTdHlsZWRCdXR0b24iLCJzdHlsZWQiLCJCdXR0b24iLCJjb2xvciIsInRleHQiLCJib3JkZXIiLCJjb25jYXQiLCJib3JkZXJHcmF5IiwiYm9yZGVyUmFkaXVzIiwianVzdGlmeUNvbnRlbnQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kIiwicG9zaXRpb24iLCJoZWlnaHQiLCJ3aWR0aCIsIm1hcmdpbiIsInRleHRUcmFuc2Zvcm0iLCJwYWRkaW5nUmlnaHQiLCJyaWdodCIsInRvcCIsInBvaW50ZXJFdmVudHMiLCJtYXJnaW5MZWZ0Iiwib3V0bGluZSIsInRlcnRpYXJ5Iiwib3V0bGluZU9mZnNldCIsImJvcmRlcldpZHRoIiwiYm9yZGVyQ29sb3IiLCJjb3JyZWN0IiwiaW5jb3JyZWN0V2l0aEljb24iLCJTdHlsZWRNZW51IiwiTWVudSIsInBhZGRpbmciLCJTdHlsZWRNZW51SXRlbSIsIk1lbnVJdGVtIiwiZHJvcGRvd25CYWNrZ3JvdW5kIiwiYm94U2l6aW5nIiwiU3R5bGVkTGFiZWwiLCJmb250U2l6ZSIsIlN0eWxlZFNlbGVjdGVkSW5kaWNhdG9yIiwiU3R5bGVkSW5wdXRMYWJlbCIsIklucHV0TGFiZWwiLCJsZWZ0Iiwib3ZlcmZsb3ciLCJTdHlsZWRDb3JyZWN0bmVzc0ljb24iLCJDaGVjayIsIndoaXRlIiwiU3R5bGVkSW5jb3JyZWN0bmVzc0ljb24iLCJDbG9zZSIsIkRyb3Bkb3duIiwiX1JlYWN0JENvbXBvbmVudCIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiZXZlbnQiLCJzZXRTdGF0ZSIsImFuY2hvckVsIiwiY3VycmVudFRhcmdldCIsInZhbHVlIiwicHJldmlld1ZhbHVlIiwiaGlnaGxpZ2h0ZWRPcHRpb25JZCIsInByZXZpZXdSZWYiLCJjdXJyZW50IiwiaW5uZXJIVE1MIiwiaW5kZXgiLCJpZCIsInN0YXRlVXBkYXRlIiwiY2hvaWNlcyIsIm9uQ2hhbmdlIiwiaGFuZGxlSGlnaGxpZ2h0IiwiaGFuZGxlQ2xvc2UiLCJzZWxlY3RlZFZhbHVlIiwic3RhdGUiLCJyZWYiLCJlbGVtZW50UmVmcyIsInByZXZpZXciLCJtZW51V2lkdGgiLCJoaWRkZW5SZWYiLCJSZWFjdCIsImNyZWF0ZVJlZiIsImJ1dHRvblJlZiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiY29tcG9uZW50RGlkTW91bnQiLCJjbGllbnRXaWR0aCIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImhpZGRlbkVsIiwiZHJvcGRvd25KdXN0T3BlbmVkIiwiY29udGFpbnNMYXRleCIsInF1ZXJ5U2VsZWN0b3IiLCJoYXNNYXRoSmF4IiwibWF0aEhhbmRsZWQiLCJyZW5kZXJNYXRoIiwibmV3V2lkdGgiLCJnZXRMYWJlbCIsImZvdW5kIiwiZmluZCIsImNob2ljZSIsImxhYmVsIiwidHJpbSIsInVuZGVmaW5lZCIsInJlbmRlciIsIl90aGlzMiIsIl90aGlzJHByb3BzIiwiZGlzYWJsZWQiLCJzaG93Q29ycmVjdEFuc3dlciIsInNpbmdsZVF1ZXJ5IiwiY29ycmVjdFZhbHVlIiwib3BlbiIsImJ1dHRvbklkIiwibWVudUlkIiwidmFsdWVEaXNwbGF5SWQiLCJkaXNhYmxlZENsYXNzIiwiaW5jcmVtZW50ZWRJZCIsInBhcnNlSW50IiwibGFiZWxJZCIsImxhYmVsVGV4dCIsImNvcnJlY3RuZXNzSWNvbiIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJGcmFnbWVudCIsInN0eWxlIiwidmlzaWJpbGl0eSIsInRhYkluZGV4IiwibWFwIiwiYyIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwibWluV2lkdGgiLCJ0cmFuc2l0aW9uIiwib25DbGljayIsImhhbmRsZUNsaWNrIiwicm9sZSIsImtlZXBNb3VudGVkIiwib25DbG9zZSIsImdldENvbnRlbnRBbmNob3JFbCIsImFuY2hvck9yaWdpbiIsInZlcnRpY2FsIiwiaG9yaXpvbnRhbCIsInRyYW5zZm9ybU9yaWdpbiIsInRyYW5zaXRpb25EdXJhdGlvbiIsImVudGVyIiwiZXhpdCIsInNsb3RQcm9wcyIsInBhcGVyIiwibGlzdCIsImRpc2FibGVQYWRkaW5nIiwib3B0aW9uSWQiLCJoYW5kbGVTZWxlY3QiLCJvbk1vdXNlT3ZlciIsImhhbmRsZUhvdmVyIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiYm9vbCIsImZ1bmMiLCJhcnJheU9mIiwic2hhcGUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9kcm9wZG93bi5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BtdWkvbWF0ZXJpYWwvQnV0dG9uJztcbmltcG9ydCBJbnB1dExhYmVsIGZyb20gJ0BtdWkvbWF0ZXJpYWwvSW5wdXRMYWJlbCc7XG5pbXBvcnQgTWVudSBmcm9tICdAbXVpL21hdGVyaWFsL01lbnUnO1xuaW1wb3J0IE1lbnVJdGVtIGZyb20gJ0BtdWkvbWF0ZXJpYWwvTWVudUl0ZW0nO1xuaW1wb3J0IEFycm93RHJvcERvd25JY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQXJyb3dEcm9wRG93bic7XG5pbXBvcnQgQXJyb3dEcm9wVXBJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQXJyb3dEcm9wVXAnO1xuaW1wb3J0IENsb3NlIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2xvc2UnO1xuaW1wb3J0IENoZWNrIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2snO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgeyByZW5kZXJNYXRoIH0gZnJvbSAnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnO1xuXG5jb25zdCBTdHlsZWRCdXR0b24gPSBzdHlsZWQoQnV0dG9uKSgoKSA9PiAoe1xuICBjb2xvcjogY29sb3IudGV4dCgpLFxuICBib3JkZXI6IGAxcHggc29saWQgJHtjb2xvci5ib3JkZXJHcmF5KCl9YCxcbiAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKCksXG4gIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICBoZWlnaHQ6ICc0NXB4JyxcbiAgd2lkdGg6ICdmaXQtY29udGVudCcsXG4gIG1hcmdpbjogJzJweCcsXG4gIHRleHRUcmFuc2Zvcm06ICdub25lJyxcbiAgJyYgc3Bhbic6IHtcbiAgICBwYWRkaW5nUmlnaHQ6ICc1cHgnLFxuICB9LFxuICAnJiBzdmcnOiB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgcmlnaHQ6IDAsXG4gICAgdG9wOiAnY2FsYyg1MCUgLSAxMnB4KScsXG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gICAgbWFyZ2luTGVmdDogJzVweCcsXG4gIH0sXG4gICcmLk11aS1mb2N1c2VkJzoge1xuICAgIG91dGxpbmU6IGAzcHggc29saWQgJHtjb2xvci50ZXJ0aWFyeSgpfWAsXG4gICAgb3V0bGluZU9mZnNldDogJzJweCcsXG4gICAgYm9yZGVyV2lkdGg6ICczcHgnLFxuICB9LFxuICAnJi5kaXNhYmxlZENvcnJlY3QnOiB7XG4gICAgYm9yZGVyV2lkdGg6ICcycHgnLFxuICAgIGJvcmRlckNvbG9yOiBjb2xvci5jb3JyZWN0KCksXG4gICAgY29sb3I6IGAke2NvbG9yLnRleHQoKX0gIWltcG9ydGFudGAsXG4gIH0sXG4gICcmLmRpc2FibGVkSW5jb3JyZWN0Jzoge1xuICAgIGJvcmRlcldpZHRoOiAnMnB4JyxcbiAgICBib3JkZXJDb2xvcjogY29sb3IuaW5jb3JyZWN0V2l0aEljb24oKSxcbiAgICBjb2xvcjogYCR7Y29sb3IudGV4dCgpfSAhaW1wb3J0YW50YCxcbiAgfSxcbn0pKTtcblxuY29uc3QgU3R5bGVkTWVudSA9IHN0eWxlZChNZW51KSgoKSA9PiAoe1xuICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLmJhY2tncm91bmQoKSxcbiAgYm9yZGVyOiBgMXB4IHNvbGlkICR7Y29sb3IuY29ycmVjdCgpfSAhaW1wb3J0YW50YCxcbiAgJyY6aG92ZXInOiB7XG4gICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7Y29sb3IudGV4dCgpfSBgLFxuICAgIGJvcmRlckNvbG9yOiAnaW5pdGlhbCcsXG4gIH0sXG4gICcmOmZvY3VzJzoge1xuICAgIGJvcmRlcjogYDFweCBzb2xpZCAke2NvbG9yLnRleHQoKX1gLFxuICAgIGJvcmRlckNvbG9yOiAnaW5pdGlhbCcsXG4gIH0sXG4gIC8vIHJlbW92ZSBkZWZhdWx0IHBhZGRpbmcgb24gdGhlIGlubmVyIGxpc3RcbiAgJyYgLk11aUxpc3Qtcm9vdCc6IHtcbiAgICBwYWRkaW5nOiAwLFxuICB9LFxufSkpO1xuXG5jb25zdCBTdHlsZWRNZW51SXRlbSA9IHN0eWxlZChNZW51SXRlbSkoKCkgPT4gKHtcbiAgY29sb3I6IGNvbG9yLnRleHQoKSxcbiAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKCksXG4gICcmLk11aS1mb2N1c2VkJzoge1xuICAgIG91dGxpbmU6IGAzcHggc29saWQgJHtjb2xvci50ZXJ0aWFyeSgpfWAsXG4gICAgb3V0bGluZU9mZnNldDogJy0xcHgnLCAvLyBrZWVwcyBpdCBpbnNpZGUgdGhlIGl0ZW1cbiAgICBjb2xvcjogY29sb3IudGV4dCgpLFxuICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IuYmFja2dyb3VuZCgpLFxuICB9LFxuICAnJjpob3Zlcic6IHtcbiAgICBjb2xvcjogY29sb3IudGV4dCgpLFxuICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IuZHJvcGRvd25CYWNrZ3JvdW5kKCksXG4gIH0sXG4gIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICBwYWRkaW5nOiAnMjVweCcsXG4gIGJvcmRlclJhZGl1czogJzRweCcsXG4gICcmLnNlbGVjdGVkJzoge1xuICAgIGNvbG9yOiBgJHtjb2xvci50ZXh0KCl9ICFpbXBvcnRhbnRgLFxuICAgIGJhY2tncm91bmRDb2xvcjogYCR7Y29sb3IuYmFja2dyb3VuZCgpfSAhaW1wb3J0YW50YCxcbiAgICAnJjpob3Zlcic6IHtcbiAgICAgIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGAke2NvbG9yLmRyb3Bkb3duQmFja2dyb3VuZCgpfSAhaW1wb3J0YW50YCxcbiAgICB9LFxuICB9LFxufSkpO1xuXG5jb25zdCBTdHlsZWRMYWJlbCA9IHN0eWxlZCgnc3BhbicpKCgpID0+ICh7XG4gIGZvbnRTaXplOiAnbWF4KDFyZW0sIDE0cHgpJyxcbn0pKTtcblxuY29uc3QgU3R5bGVkU2VsZWN0ZWRJbmRpY2F0b3IgPSBzdHlsZWQoJ3NwYW4nKSgoKSA9PiAoe1xuICBmb250U2l6ZTogJ21heCgxcmVtLCAxNHB4KScsXG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICByaWdodDogJzEwcHgnLFxufSkpO1xuXG5jb25zdCBTdHlsZWRJbnB1dExhYmVsID0gc3R5bGVkKElucHV0TGFiZWwpKCgpID0+ICh7XG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICBsZWZ0OiAnLTEwMDAwcHgnLFxuICB0b3A6ICdhdXRvJyxcbiAgd2lkdGg6ICcxcHgnLFxuICBoZWlnaHQ6ICcxcHgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG59KSk7XG5cbmNvbnN0IFN0eWxlZENvcnJlY3RuZXNzSWNvbiA9IHN0eWxlZChDaGVjaykoKCkgPT4gKHtcbiAgY29sb3I6IGAke2NvbG9yLndoaXRlKCl9ICFpbXBvcnRhbnRgLFxuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdG9wOiAnLThweCAhaW1wb3J0YW50JyxcbiAgbGVmdDogJy04cHgnLFxuICBtYXJnaW5MZWZ0OiAnMCAhaW1wb3J0YW50JyxcbiAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgZm9udFNpemU6ICcxNnB4JyxcbiAgcGFkZGluZzogJzJweCcsXG4gICcmLmNvcnJlY3QnOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5jb3JyZWN0KCksXG4gIH0sXG4gICcmLmluY29ycmVjdCc6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLmluY29ycmVjdFdpdGhJY29uKCksXG4gIH0sXG59KSk7XG5cbmNvbnN0IFN0eWxlZEluY29ycmVjdG5lc3NJY29uID0gc3R5bGVkKENsb3NlKSgoKSA9PiAoe1xuICBjb2xvcjogYCR7Y29sb3Iud2hpdGUoKX0gIWltcG9ydGFudGAsXG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICB0b3A6ICctOHB4ICFpbXBvcnRhbnQnLFxuICBsZWZ0OiAnLThweCcsXG4gIG1hcmdpbkxlZnQ6ICcwICFpbXBvcnRhbnQnLFxuICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICBmb250U2l6ZTogJzE2cHgnLFxuICBwYWRkaW5nOiAnMnB4JyxcbiAgJyYuY29ycmVjdCc6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLmNvcnJlY3QoKSxcbiAgfSxcbiAgJyYuaW5jb3JyZWN0Jzoge1xuICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IuaW5jb3JyZWN0V2l0aEljb24oKSxcbiAgfSxcbn0pKTtcblxuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY29ycmVjdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgY2hvaWNlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHsgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nIH0pKSxcbiAgICBzaG93Q29ycmVjdEFuc3dlcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgc2luZ2xlUXVlcnk6IFByb3BUeXBlcy5ib29sLFxuICAgIGNvcnJlY3RWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhbmNob3JFbDogbnVsbCxcbiAgICAgIGhpZ2hsaWdodGVkT3B0aW9uSWQ6IG51bGwsXG4gICAgICBtZW51V2lkdGg6IG51bGwsXG4gICAgICBwcmV2aWV3VmFsdWU6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmhpZGRlblJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMuYnV0dG9uUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgdGhpcy5wcmV2aWV3UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmcyA9IFtdO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgLy8gbWVhc3VyZSBoaWRkZW4gbWVudSB3aWR0aCBvbmNlXG4gICAgaWYgKHRoaXMuaGlkZGVuUmVmLmN1cnJlbnQgJiYgdGhpcy5zdGF0ZS5tZW51V2lkdGggPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBtZW51V2lkdGg6IHRoaXMuaGlkZGVuUmVmLmN1cnJlbnQuY2xpZW50V2lkdGggfSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgY29uc3QgaGlkZGVuRWwgPSB0aGlzLmhpZGRlblJlZi5jdXJyZW50O1xuXG4gICAgY29uc3QgZHJvcGRvd25KdXN0T3BlbmVkID0gIXByZXZTdGF0ZS5hbmNob3JFbCAmJiB0aGlzLnN0YXRlLmFuY2hvckVsO1xuICAgIGlmIChkcm9wZG93bkp1c3RPcGVuZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZnMuZm9yRWFjaCgocmVmKSA9PiB7XG4gICAgICAgIGlmICghcmVmKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY29udGFpbnNMYXRleCA9IHJlZi5xdWVyeVNlbGVjdG9yKCdbZGF0YS1sYXRleF0sIFtkYXRhLXJhd10nKTtcbiAgICAgICAgY29uc3QgaGFzTWF0aEpheCA9IHJlZi5xdWVyeVNlbGVjdG9yKCdtangtY29udGFpbmVyJyk7XG4gICAgICAgIGNvbnN0IG1hdGhIYW5kbGVkID0gcmVmLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1hdGgtaGFuZGxlZD1cInRydWVcIl0nKTtcblxuICAgICAgICBpZiAoY29udGFpbnNMYXRleCAmJiAoIW1hdGhIYW5kbGVkIHx8ICFoYXNNYXRoSmF4KSkge1xuICAgICAgICAgIHJlbmRlck1hdGgocmVmKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhpZGRlbkVsKSB7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IGhpZGRlbkVsLmNsaWVudFdpZHRoO1xuICAgICAgaWYgKG5ld1dpZHRoICE9PSB0aGlzLnN0YXRlLm1lbnVXaWR0aCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWZzLmZvckVhY2goKHJlZikgPT4ge1xuICAgICAgICAgIGlmIChyZWYpIHJlbmRlck1hdGgocmVmKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVuZGVyTWF0aChoaWRkZW5FbCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBtZW51V2lkdGg6IG5ld1dpZHRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB0aGlzLnNldFN0YXRlKHsgYW5jaG9yRWw6IGV2ZW50LmN1cnJlbnRUYXJnZXQgfSk7XG5cbiAgaGFuZGxlQ2xvc2UgPSAoKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLnNldFN0YXRlKHsgYW5jaG9yRWw6IG51bGwsIHByZXZpZXdWYWx1ZTogbnVsbCwgaGlnaGxpZ2h0ZWRPcHRpb25JZDogbnVsbCB9KTtcbiAgICAvLyBjbGVhciBkaXNwbGF5ZWQgcHJldmlldyBpZiBubyBzZWxlY3Rpb25cbiAgICBpZiAoIXZhbHVlICYmIHRoaXMucHJldmlld1JlZi5jdXJyZW50KSB7XG4gICAgICB0aGlzLnByZXZpZXdSZWYuY3VycmVudC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG4gIH07XG5cbiAgaGFuZGxlSGlnaGxpZ2h0ID0gKGluZGV4KSA9PiB7XG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRPcHRpb25JZCA9IGBkcm9wZG93bi1vcHRpb24tJHt0aGlzLnByb3BzLmlkfS0ke2luZGV4fWA7XG5cbiAgICAvLyBwcmV2aWV3IG9uIGhvdmVyIGlmIG5vdGhpbmcgc2VsZWN0ZWRcbiAgICBjb25zdCBzdGF0ZVVwZGF0ZSA9IHsgaGlnaGxpZ2h0ZWRPcHRpb25JZCB9O1xuICAgIGlmICghdGhpcy5wcm9wcy52YWx1ZSkge1xuICAgICAgc3RhdGVVcGRhdGUucHJldmlld1ZhbHVlID0gdGhpcy5wcm9wcy5jaG9pY2VzW2luZGV4XS52YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZShzdGF0ZVVwZGF0ZSk7XG4gIH07XG5cbiAgaGFuZGxlU2VsZWN0ID0gKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgdmFsdWUpO1xuICAgIHRoaXMuaGFuZGxlSGlnaGxpZ2h0KGluZGV4KTtcbiAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gIH07XG5cbiAgaGFuZGxlSG92ZXIgPSAoaW5kZXgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdGhpcy5wcm9wcy52YWx1ZTtcblxuICAgIGlmIChzZWxlY3RlZFZhbHVlKSByZXR1cm47XG5cbiAgICBjb25zdCBoaWdobGlnaHRlZE9wdGlvbklkID0gYGRyb3Bkb3duLW9wdGlvbi0ke3RoaXMucHJvcHMuaWR9LSR7aW5kZXh9YDtcbiAgICBjb25zdCBwcmV2aWV3VmFsdWUgPSB0aGlzLnN0YXRlLnByZXZpZXdWYWx1ZTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBoaWdobGlnaHRlZE9wdGlvbklkLCBwcmV2aWV3VmFsdWUgfSwgKCkgPT4ge1xuICAgICAgLy8gT24gaG92ZXIsIHByZXZpZXcgdGhlIG1hdGgtcmVuZGVyZWQgY29udGVudCBpbnNpZGUgdGhlIGJ1dHRvbiBpZiBubyB2YWx1ZSBpcyBzZWxlY3RlZC5cbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZWxlbWVudFJlZnNbaW5kZXhdO1xuICAgICAgY29uc3QgcHJldmlldyA9IHRoaXMucHJldmlld1JlZi5jdXJyZW50O1xuXG4gICAgICBpZiAocmVmICYmIHByZXZpZXcpIHtcbiAgICAgICAgcHJldmlldy5pbm5lckhUTUwgPSByZWYuaW5uZXJIVE1MO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGdldExhYmVsKGNob2ljZXMsIHZhbHVlKSB7XG4gICAgY29uc3QgZm91bmQgPSAoY2hvaWNlcyB8fCBbXSkuZmluZCgoY2hvaWNlKSA9PiBjaG9pY2UudmFsdWUgPT09IHZhbHVlKTtcblxuICAgIHJldHVybiBmb3VuZCA/IGZvdW5kLmxhYmVsLnRyaW0oKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGlkLCBjb3JyZWN0LCBkaXNhYmxlZCwgdmFsdWUsIGNob2ljZXMsIHNob3dDb3JyZWN0QW5zd2VyLCBzaW5nbGVRdWVyeSwgY29ycmVjdFZhbHVlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgYW5jaG9yRWwgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qgb3BlbiA9IEJvb2xlYW4oYW5jaG9yRWwpO1xuICAgIGNvbnN0IGJ1dHRvbklkID0gYGRyb3Bkb3duLWJ1dHRvbi0ke2lkfWA7XG4gICAgY29uc3QgbWVudUlkID0gYGRyb3Bkb3duLW1lbnUtJHtpZH1gO1xuICAgIGNvbnN0IHZhbHVlRGlzcGxheUlkID0gYGRyb3Bkb3duLXZhbHVlLSR7aWR9YDtcblxuICAgIC8vIERldGVybWluZSB0aGUgY2xhc3MgZm9yIGRpc2FibGVkIHN0YXRlLCB2aWV3IG1vZGUgYW5kIGV2YWx1YXRlIG1vZGVcbiAgICBsZXQgZGlzYWJsZWRDbGFzcztcbiAgICAvLyBSZXNldCBlbGVtZW50UmVmcyBiZWZvcmUgZWFjaCByZW5kZXIgdG8gYXZvaWQgc3RhbGUgcmVmZXJlbmNlc1xuICAgIHRoaXMuZWxlbWVudFJlZnMgPSBbXTtcblxuICAgIGlmIChkaXNhYmxlZCAmJiBjb3JyZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRpc2FibGVkQ2xhc3MgPSBjb3JyZWN0IHx8IHNob3dDb3JyZWN0QW5zd2VyID8gJ2Rpc2FibGVkQ29ycmVjdCcgOiAnZGlzYWJsZWRJbmNvcnJlY3QnO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBkaXN0aW5jdCwgdmlzdWFsbHkgaGlkZGVuIGxhYmVscyBmb3IgZWFjaCBkcm9wZG93blxuICAgIGNvbnN0IGluY3JlbWVudGVkSWQgPSBwYXJzZUludChpZCwgMTApICsgMTtcbiAgICBjb25zdCBsYWJlbElkID0gc2luZ2xlUXVlcnkgPyAnUXVlcnktbGFiZWwnIDogYFF1ZXJ5LWxhYmVsLSR7aW5jcmVtZW50ZWRJZH1gO1xuICAgIGNvbnN0IGxhYmVsVGV4dCA9IHNpbmdsZVF1ZXJ5ID8gJ1F1ZXJ5JyA6IGBRdWVyeSAke2luY3JlbWVudGVkSWR9YDtcblxuICAgIC8vIENoYW5nZWQgZnJvbSBTZWxlY3QgdG8gQnV0dG9uIGZvciBkcm9wZG93biB0byBlbmhhbmNlIGFjY2Vzc2liaWxpdHkuIFRoaXMgbW9kaWZpY2F0aW9uIG9mZmVycyBleHBsaWNpdCBjb250cm9sIG92ZXIgYXJpYSBhdHRyaWJ1dGVzIGFuZCBmb2N1c2VzIG1hbmFnZW1lbnQsIGVuc3VyaW5nIHRoZSBkcm9wZG93biBpcyBjb21wbGlhbnQgd2l0aCBhY2Nlc3NpYmlsaXR5IHN0YW5kYXJkcy4gVGhlIHVzZSBvZiBCdXR0b24gYW5kIE1lbnUgY29tcG9uZW50cyBhbGxvd3MgZm9yIGJldHRlciBoYW5kbGluZyBvZiBrZXlib2FyZCBpbnRlcmFjdGlvbnMgYW5kIHByb3ZpZGVzIGFjY2Vzc2libGUgbGFiZWxzIGFuZCBtZW51cywgYWxpZ25pbmcgd2l0aCBXQ0FHIGd1aWRlbGluZXMgYW5kIGltcHJvdmluZyB1c2FiaWxpdHkgZm9yIGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVzZXJzLlxuICAgIGxldCBjb3JyZWN0bmVzc0ljb24gPSBudWxsO1xuICAgIGlmIChkaXNhYmxlZCAmJiBjb3JyZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvcnJlY3RuZXNzSWNvbiA9XG4gICAgICAgIGNvcnJlY3QgfHwgc2hvd0NvcnJlY3RBbnN3ZXIgPyAoXG4gICAgICAgICAgPFN0eWxlZENvcnJlY3RuZXNzSWNvbiBjbGFzc05hbWU9XCJjb3JyZWN0XCIgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8U3R5bGVkSW5jb3JyZWN0bmVzc0ljb24gY2xhc3NOYW1lPVwiaW5jb3JyZWN0XCIgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIHJlZj17dGhpcy5oaWRkZW5SZWZ9XG4gICAgICAgICAgc3R5bGU9e3sgcG9zaXRpb246ICdhYnNvbHV0ZScsIHZpc2liaWxpdHk6ICdoaWRkZW4nLCB0b3A6IDAsIGxlZnQ6IDAgfX1cbiAgICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHsoY2hvaWNlcyB8fCBbXSkubWFwKChjLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPFN0eWxlZE1lbnVJdGVtXG4gICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFN0eWxlZExhYmVsIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogYy5sYWJlbCB9fSAvPlxuICAgICAgICAgICAgPC9TdHlsZWRNZW51SXRlbT5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxTdHlsZWRJbnB1dExhYmVsIGlkPXtsYWJlbElkfSB0YWJJbmRleD17LTF9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIHtsYWJlbFRleHR9XG4gICAgICAgIDwvU3R5bGVkSW5wdXRMYWJlbD5cbiAgICAgICAgPFN0eWxlZEJ1dHRvblxuICAgICAgICAgIHJlZj17dGhpcy5idXR0b25SZWZ9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIC4uLih0aGlzLnN0YXRlLm1lbnVXaWR0aCAmJiB7IG1pbldpZHRoOiBgY2FsYygke3RoaXMuc3RhdGUubWVudVdpZHRofXB4ICsgOHB4KWAgfSksXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogb3BlbiA/ICcycHgnIDogJzFweCcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAnYm9yZGVyLXdpZHRoIDAuMnMgZWFzZS1pbi1vdXQnLFxuICAgICAgICAgIH19XG4gICAgICAgICAgYXJpYS1jb250cm9scz17b3BlbiA/IG1lbnVJZCA6IHVuZGVmaW5lZH1cbiAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD17b3BlbiA/ICd0cnVlJyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9e3RoaXMuc3RhdGUuaGlnaGxpZ2h0ZWRPcHRpb25JZH1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfVxuICAgICAgICAgIGNsYXNzTmFtZT17ZGlzYWJsZWRDbGFzc31cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgaWQ9e2J1dHRvbklkfVxuICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD17YFNlbGVjdCBhbiBvcHRpb24gZm9yICR7bGFiZWxUZXh0fWB9XG4gICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXt2YWx1ZURpc3BsYXlJZH1cbiAgICAgICAgPlxuICAgICAgICAgIHtjb3JyZWN0bmVzc0ljb259XG4gICAgICAgICAgPFN0eWxlZExhYmVsXG4gICAgICAgICAgICBpZD17dmFsdWVEaXNwbGF5SWR9XG4gICAgICAgICAgICByZWY9e3RoaXMucHJldmlld1JlZn1cbiAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICAgIF9faHRtbDogY29ycmVjdFZhbHVlXG4gICAgICAgICAgICAgICAgPyBjb3JyZWN0VmFsdWVcbiAgICAgICAgICAgICAgICA6IG9wZW4gJiYgdGhpcy5zdGF0ZS5wcmV2aWV3VmFsdWVcbiAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0TGFiZWwoY2hvaWNlcywgdGhpcy5zdGF0ZS5wcmV2aWV3VmFsdWUpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmdldExhYmVsKGNob2ljZXMsIHZhbHVlKSB8fCAnJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7b3BlbiA/IDxBcnJvd0Ryb3BVcEljb24gLz4gOiA8QXJyb3dEcm9wRG93bkljb24gLz59XG4gICAgICAgIDwvU3R5bGVkQnV0dG9uPlxuICAgICAgICA8U3R5bGVkTWVudVxuICAgICAgICAgIGlkPXttZW51SWR9XG4gICAgICAgICAgYW5jaG9yRWw9e2FuY2hvckVsfVxuICAgICAgICAgIGtlZXBNb3VudGVkXG4gICAgICAgICAgb3Blbj17b3Blbn1cbiAgICAgICAgICBvbkNsb3NlPXt0aGlzLmhhbmRsZUNsb3NlfVxuICAgICAgICAgIGdldENvbnRlbnRBbmNob3JFbD17bnVsbH1cbiAgICAgICAgICBhbmNob3JPcmlnaW49e3sgdmVydGljYWw6ICdib3R0b20nLCBob3Jpem9udGFsOiAnbGVmdCcgfX1cbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW49e3sgdmVydGljYWw6ICd0b3AnLCBob3Jpem9udGFsOiAnbGVmdCcgfX1cbiAgICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb249e3sgZW50ZXI6IDIyNSwgZXhpdDogMTk1IH19XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBwYXBlcjogdGhpcy5zdGF0ZS5tZW51V2lkdGggPyB7IHN0eWxlOiB7IG1pbldpZHRoOiB0aGlzLnN0YXRlLm1lbnVXaWR0aCwgcGFkZGluZzogJzRweCcgfSB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbGlzdDoge1xuICAgICAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JzogYnV0dG9uSWQsXG4gICAgICAgICAgICAgIHJvbGU6ICdsaXN0Ym94JyxcbiAgICAgICAgICAgICAgZGlzYWJsZVBhZGRpbmc6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7KGNob2ljZXMgfHwgW10pLm1hcCgoYywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbklkID0gYGRyb3Bkb3duLW9wdGlvbi0ke2lkfS0ke2luZGV4fWA7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxTdHlsZWRNZW51SXRlbVxuICAgICAgICAgICAgICAgIGlkPXtvcHRpb25JZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2MudmFsdWUgPT09IHZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnfVxuICAgICAgICAgICAgICAgIGtleT17YCR7Yy5sYWJlbH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtjLnZhbHVlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuaGFuZGxlU2VsZWN0KGMudmFsdWUsIGluZGV4KX1cbiAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPXt0aGlzLnN0YXRlLmhpZ2hsaWdodGVkT3B0aW9uSWQgPT09IG9wdGlvbklkID8gJ3RydWUnIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIG9uTW91c2VPdmVyPXsoKSA9PiB0aGlzLmhhbmRsZUhvdmVyKGluZGV4KX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxTdHlsZWRMYWJlbFxuICAgICAgICAgICAgICAgICAgcmVmPXsocmVmKSA9PiAodGhpcy5lbGVtZW50UmVmc1tpbmRleF0gPSByZWYpfVxuICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBjLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8U3R5bGVkU2VsZWN0ZWRJbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogYy52YWx1ZSA9PT0gdmFsdWUgPyAnICZjaGVjazsnIDogJycgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L1N0eWxlZE1lbnVJdGVtPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9TdHlsZWRNZW51PlxuICAgICAgPC8+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLE1BQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLE9BQUEsR0FBQVYsT0FB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