@pie-element/inline-dropdown 4.7.1-beta.1 → 4.7.1-beta.3

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.
@@ -0,0 +1,492 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _enzyme = require("enzyme");
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _main = require("../main");
9
+ var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
10
+ var _defaults = _interopRequireDefault(require("../defaults"));
11
+ var _markupUtils = require("../markupUtils");
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
+ jest.mock('@pie-lib/config-ui', function () {
15
+ return {
16
+ choiceUtils: {
17
+ firstAvailableIndex: jest.fn()
18
+ },
19
+ settings: {
20
+ Panel: function Panel(props) {
21
+ return /*#__PURE__*/_react["default"].createElement("div", props);
22
+ },
23
+ toggle: jest.fn(),
24
+ radio: jest.fn(),
25
+ dropdown: jest.fn()
26
+ },
27
+ layout: {
28
+ ConfigLayout: function ConfigLayout(props) {
29
+ return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
30
+ }
31
+ },
32
+ InputContainer: function InputContainer(props) {
33
+ return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
34
+ }
35
+ };
36
+ });
37
+ var model = {
38
+ prompt: 'Use the dropdowns to complete the sentence',
39
+ shuffle: true,
40
+ markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
41
+ choices: {
42
+ 0: [{
43
+ label: 'cow ',
44
+ value: '0',
45
+ correct: true,
46
+ rationale: 'rationale for cow'
47
+ }, {
48
+ label: 'dog ',
49
+ value: '1',
50
+ correct: false
51
+ }, {
52
+ label: 'cat ',
53
+ value: '2',
54
+ correct: false
55
+ }],
56
+ 1: [{
57
+ label: 'over ',
58
+ value: '0',
59
+ correct: true,
60
+ rationale: 'rationale for over'
61
+ }, {
62
+ label: 'under ',
63
+ value: '1',
64
+ correct: false
65
+ }, {
66
+ label: 'across ',
67
+ value: '2',
68
+ correct: false
69
+ }],
70
+ 2: [{
71
+ label: 'moon ',
72
+ value: '0',
73
+ correct: true,
74
+ rationale: 'rationale for moon'
75
+ }, {
76
+ label: 'sun',
77
+ value: '2',
78
+ correct: false
79
+ }, {
80
+ label: 'house ',
81
+ value: '3',
82
+ correct: false
83
+ }]
84
+ },
85
+ alternateResponse: {
86
+ 2: ['2']
87
+ }
88
+ };
89
+ var prepareModel = function prepareModel() {
90
+ var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
91
+ var currModal = _objectSpread(_objectSpread({}, _defaults["default"].model), model);
92
+ var slateMarkup = model.slateMarkup || (0, _markupUtils.createSlateMarkup)(currModal.markup, currModal.choices);
93
+ var markup = (0, _markupUtils.processMarkup)(slateMarkup);
94
+ return _objectSpread(_objectSpread({}, currModal), {}, {
95
+ slateMarkup: slateMarkup,
96
+ markup: markup
97
+ /*...processedMarkup,*/
98
+ });
99
+ };
100
+
101
+ describe('Main', function () {
102
+ var onModelChanged;
103
+ var onConfigurationChanged;
104
+ var wrapper = function wrapper(extras) {
105
+ onModelChanged = jest.fn();
106
+ onConfigurationChanged = jest.fn();
107
+ var defaults = {
108
+ onModelChanged: onModelChanged,
109
+ onConfigurationChanged: onConfigurationChanged,
110
+ classes: {},
111
+ model: prepareModel(_objectSpread(_objectSpread({}, model), extras)),
112
+ configuration: _defaults["default"].configuration
113
+ };
114
+ var props = _objectSpread({}, defaults);
115
+ return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_main.Main, props), {
116
+ disableLifecycleMethods: true
117
+ });
118
+ };
119
+ describe('snapshot', function () {
120
+ it('renders with teacher instructions, prompt and rationale even if not set', function () {
121
+ expect(wrapper()).toMatchSnapshot();
122
+ });
123
+ it('renders without teacher instructions, prompt and rationale', function () {
124
+ expect(wrapper({
125
+ promptEnabled: false,
126
+ teacherInstructionsEnabled: false,
127
+ rationaleEnabled: false
128
+ })).toMatchSnapshot();
129
+ });
130
+ });
131
+ describe('logic', function () {
132
+ var w;
133
+ beforeEach(function () {
134
+ w = wrapper();
135
+ });
136
+ describe('onModelChange', function () {
137
+ it('changes the model', function () {
138
+ w.instance().onModelChange({
139
+ promptEnabled: false
140
+ });
141
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
142
+ promptEnabled: false
143
+ }));
144
+ });
145
+ });
146
+ describe('onPromptChanged', function () {
147
+ it('changes the prompt value', function () {
148
+ w.instance().onPromptChanged('This is the new prompt');
149
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
150
+ prompt: 'This is the new prompt'
151
+ }));
152
+ });
153
+ });
154
+ describe('onRationaleChanged', function () {
155
+ it('changes the rationale value', function () {
156
+ w.instance().onRationaleChanged('New Rationale');
157
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
158
+ rationale: 'New Rationale'
159
+ }));
160
+ });
161
+ });
162
+ describe('onTeacherInstructionsChanged', function () {
163
+ it('changes the teacher instructions value', function () {
164
+ w.instance().onTeacherInstructionsChanged('New Teacher Instructions');
165
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
166
+ teacherInstructions: 'New Teacher Instructions'
167
+ }));
168
+ });
169
+ });
170
+ describe('onMarkupChanged', function () {
171
+ it('changes slate markup value', function () {
172
+ var slateMarkup = '<p>The <span data-type=\\"explicit_constructed_response\\" data-index=\\"0\\" data-value=\\"cow\\"></span> jumped</p>';
173
+ w.instance().onMarkupChanged(slateMarkup);
174
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
175
+ slateMarkup: slateMarkup
176
+ }));
177
+ });
178
+ });
179
+ describe('onChange', function () {
180
+ it('Removing choices (keeping only 1 choice): slateMarkup and choices are updated', function () {
181
+ var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
182
+ 0: model.choices['0'].slice(0, 1)
183
+ });
184
+ var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
185
+ w.instance().setState({
186
+ respAreaChoices: newChoices
187
+ });
188
+ w.instance().onChange(newMarkup);
189
+
190
+ // TODO do we have to test what happens if clicking on OK/Cancel? How?
191
+ expect(onModelChanged).not.toBeCalled();
192
+ });
193
+ it('No correct choice selected: slateMarkup and choices are updated', function () {
194
+ var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
195
+ 0: [{
196
+ label: 'cow ',
197
+ value: '0',
198
+ correct: false
199
+ }, {
200
+ label: 'dog ',
201
+ value: '1',
202
+ correct: false
203
+ }, {
204
+ label: 'cat ',
205
+ value: '2',
206
+ correct: false
207
+ }]
208
+ });
209
+ var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
210
+ w.instance().setState({
211
+ respAreaChoices: newChoices
212
+ });
213
+ w.instance().onChange(newMarkup);
214
+
215
+ // TODO do we have to test what happens if clicking on OK/Cancel? How?
216
+ expect(onModelChanged).not.toBeCalled();
217
+ });
218
+ it('New choice: slateMarkup and choices are updated', function () {
219
+ var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
220
+ 0: [].concat((0, _toConsumableArray2["default"])(model.choices['0']), [{
221
+ label: 'pet ',
222
+ value: '3',
223
+ correct: false
224
+ }])
225
+ });
226
+ var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
227
+ w.instance().setState({
228
+ respAreaChoices: newChoices
229
+ });
230
+ w.instance().onChange(newMarkup);
231
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
232
+ slateMarkup: newMarkup,
233
+ choices: newChoices
234
+ }));
235
+ });
236
+ it('New Response Area: slateMarkup and choices are updated', function () {
237
+ var oldModel = w.instance().props.model;
238
+ var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
239
+ 3: [{
240
+ label: 'A ',
241
+ value: '0',
242
+ correct: true
243
+ }, {
244
+ label: 'B',
245
+ value: '1',
246
+ correct: false
247
+ }, {
248
+ label: 'C ',
249
+ value: '2',
250
+ correct: false
251
+ }]
252
+ });
253
+ var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>, <span data-type=\"inline_dropdown\" data-index=\"3\" data-value=\"A\"></span>.</p></div>";
254
+ w.instance().setState({
255
+ respAreaChoices: newChoices
256
+ });
257
+ w.instance().onChange(newMarkup);
258
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, oldModel), {}, {
259
+ slateMarkup: newMarkup,
260
+ choices: newChoices
261
+ }));
262
+ });
263
+ it('Removing choices (keeping at least 2): slateMarkup and choices are updated', function () {
264
+ var oldModel = w.instance().props.model;
265
+ var newChoices = _objectSpread(_objectSpread({}, model.choices), {}, {
266
+ 0: model.choices['0'].slice(0, 2)
267
+ });
268
+ var newMarkup = "<div><p>The <span data-type=\"inline_dropdown\" data-index=\"0\" data-value=\"cow \"></span> jumped <span data-type=\"inline_dropdown\" data-index=\"1\" data-value=\"over \"></span> the <span data-type=\"inline_dropdown\" data-index=\"2\" data-value=\"moon \"></span>.</p></div>";
269
+ w.instance().setState({
270
+ respAreaChoices: newChoices
271
+ });
272
+ w.instance().onChange(newMarkup);
273
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, oldModel), {}, {
274
+ slateMarkup: newMarkup,
275
+ choices: newChoices
276
+ }));
277
+ });
278
+ });
279
+ describe('onChoiceRationaleChanged', function () {
280
+ it('changes the choice level rationale value', function () {
281
+ w.instance().onChoiceRationaleChanged(0, {
282
+ label: 'cow ',
283
+ value: '0',
284
+ correct: true,
285
+ rationale: 'new rationale for cow'
286
+ });
287
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, prepareModel(model)), {}, {
288
+ choices: {
289
+ 0: [{
290
+ label: 'cow ',
291
+ value: '0',
292
+ correct: true,
293
+ rationale: 'new rationale for cow'
294
+ }, {
295
+ label: 'dog ',
296
+ value: '1',
297
+ correct: false
298
+ }, {
299
+ label: 'cat ',
300
+ value: '2',
301
+ correct: false
302
+ }],
303
+ 1: [{
304
+ label: 'over ',
305
+ value: '0',
306
+ correct: true,
307
+ rationale: 'rationale for over'
308
+ }, {
309
+ label: 'under ',
310
+ value: '1',
311
+ correct: false
312
+ }, {
313
+ label: 'across ',
314
+ value: '2',
315
+ correct: false
316
+ }],
317
+ 2: [{
318
+ label: 'moon ',
319
+ value: '0',
320
+ correct: true,
321
+ rationale: 'rationale for moon'
322
+ }, {
323
+ label: 'sun',
324
+ value: '2',
325
+ correct: false
326
+ }, {
327
+ label: 'house ',
328
+ value: '3',
329
+ correct: false
330
+ }]
331
+ }
332
+ }));
333
+ });
334
+ });
335
+ describe('onAddChoice', function () {
336
+ beforeEach(function () {
337
+ w.instance().setState({
338
+ respAreaChoices: model.choices
339
+ });
340
+ });
341
+ it('Does not add duplicates', function () {
342
+ w.instance().onAddChoice('0', 'cow');
343
+ expect(onModelChanged).not.toBeCalled();
344
+ w.instance().onAddChoice('1', 'over');
345
+ expect(onModelChanged).not.toBeCalled();
346
+ w.instance().onAddChoice('1', 'under');
347
+ expect(onModelChanged).not.toBeCalled();
348
+ });
349
+ it('Adds a new choice', function () {
350
+ var currentModel = (0, _cloneDeep["default"])(w.instance().props.model);
351
+ w.instance().onAddChoice('0', 'bird');
352
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, currentModel), {}, {
353
+ choices: _objectSpread(_objectSpread({}, currentModel.choices), {}, {
354
+ 0: [].concat((0, _toConsumableArray2["default"])(currentModel.choices['0']), [{
355
+ label: 'bird',
356
+ value: '3',
357
+ correct: false
358
+ }])
359
+ })
360
+ }));
361
+ w.instance().onAddChoice('2', 'star');
362
+ expect(onModelChanged).toBeCalledWith(_objectSpread(_objectSpread({}, currentModel), {}, {
363
+ choices: _objectSpread(_objectSpread({}, currentModel.choices), {}, {
364
+ 0: [].concat((0, _toConsumableArray2["default"])(currentModel.choices['0']), [{
365
+ label: 'bird',
366
+ value: '3',
367
+ correct: false
368
+ }]),
369
+ 2: [].concat((0, _toConsumableArray2["default"])(currentModel.choices['2']), [{
370
+ label: 'star',
371
+ value: '4',
372
+ correct: false
373
+ }])
374
+ })
375
+ }));
376
+ });
377
+ });
378
+ describe('onRemoveChoice', function () {
379
+ beforeEach(function () {
380
+ w.instance().setState({
381
+ respAreaChoices: {
382
+ 0: [{
383
+ label: 'cow ',
384
+ value: '0',
385
+ correct: true
386
+ }, {
387
+ label: 'dog ',
388
+ value: '1',
389
+ correct: false
390
+ }, {
391
+ label: 'cat ',
392
+ value: '2',
393
+ correct: false
394
+ }]
395
+ }
396
+ });
397
+ });
398
+ it('Removes choices', function () {
399
+ w.instance().onRemoveChoice(0, '0');
400
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
401
+ choices: {
402
+ 0: [{
403
+ label: 'dog ',
404
+ value: '1',
405
+ correct: false
406
+ }, {
407
+ label: 'cat ',
408
+ value: '2',
409
+ correct: false
410
+ }]
411
+ }
412
+ }));
413
+ w.instance().onRemoveChoice(0, '0');
414
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
415
+ choices: {
416
+ 0: [{
417
+ label: 'cat ',
418
+ value: '2',
419
+ correct: false
420
+ }]
421
+ }
422
+ }));
423
+ w.instance().onRemoveChoice(0, '0');
424
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
425
+ choices: {
426
+ 0: []
427
+ }
428
+ }));
429
+ });
430
+ });
431
+ describe('onSelectChoice', function () {
432
+ beforeEach(function () {
433
+ w.instance().setState({
434
+ respAreaChoices: {
435
+ 0: [{
436
+ label: 'cow ',
437
+ value: '0',
438
+ correct: true
439
+ }, {
440
+ label: 'dog ',
441
+ value: '1',
442
+ correct: false
443
+ }, {
444
+ label: 'cat ',
445
+ value: '2',
446
+ correct: false
447
+ }]
448
+ }
449
+ });
450
+ });
451
+ it('Updates correct choice', function () {
452
+ w.instance().onSelectChoice(0, 1);
453
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
454
+ choices: {
455
+ 0: [{
456
+ label: 'cow ',
457
+ value: '0',
458
+ correct: false
459
+ }, {
460
+ label: 'dog ',
461
+ value: '1',
462
+ correct: true
463
+ }, {
464
+ label: 'cat ',
465
+ value: '2',
466
+ correct: false
467
+ }]
468
+ }
469
+ }));
470
+ w.instance().onSelectChoice(0, 0);
471
+ expect(onModelChanged).toBeCalledWith(expect.objectContaining({
472
+ choices: {
473
+ 0: [{
474
+ label: 'cow ',
475
+ value: '0',
476
+ correct: true
477
+ }, {
478
+ label: 'dog ',
479
+ value: '1',
480
+ correct: false
481
+ }, {
482
+ label: 'cat ',
483
+ value: '2',
484
+ correct: false
485
+ }]
486
+ }
487
+ }));
488
+ });
489
+ });
490
+ });
491
+ });
492
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZW56eW1lIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFpbiIsIl9jbG9uZURlZXAiLCJfZGVmYXVsdHMiLCJfbWFya3VwVXRpbHMiLCJvd25LZXlzIiwib2JqZWN0IiwiZW51bWVyYWJsZU9ubHkiLCJrZXlzIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltYm9scyIsImZpbHRlciIsInN5bSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0IiwiaSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImZvckVhY2giLCJrZXkiLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImplc3QiLCJtb2NrIiwiY2hvaWNlVXRpbHMiLCJmaXJzdEF2YWlsYWJsZUluZGV4IiwiZm4iLCJzZXR0aW5ncyIsIlBhbmVsIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwidG9nZ2xlIiwicmFkaW8iLCJkcm9wZG93biIsImxheW91dCIsIkNvbmZpZ0xheW91dCIsImNoaWxkcmVuIiwiSW5wdXRDb250YWluZXIiLCJtb2RlbCIsInByb21wdCIsInNodWZmbGUiLCJtYXJrdXAiLCJjaG9pY2VzIiwibGFiZWwiLCJ2YWx1ZSIsImNvcnJlY3QiLCJyYXRpb25hbGUiLCJhbHRlcm5hdGVSZXNwb25zZSIsInByZXBhcmVNb2RlbCIsInVuZGVmaW5lZCIsImN1cnJNb2RhbCIsInNlbnNpYmxlRGVmYXVsdHMiLCJzbGF0ZU1hcmt1cCIsImNyZWF0ZVNsYXRlTWFya3VwIiwicHJvY2Vzc01hcmt1cCIsImRlc2NyaWJlIiwib25Nb2RlbENoYW5nZWQiLCJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIiwid3JhcHBlciIsImV4dHJhcyIsImRlZmF1bHRzIiwiY2xhc3NlcyIsImNvbmZpZ3VyYXRpb24iLCJzaGFsbG93IiwiTWFpbiIsImRpc2FibGVMaWZlY3ljbGVNZXRob2RzIiwiaXQiLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJwcm9tcHRFbmFibGVkIiwidGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQiLCJyYXRpb25hbGVFbmFibGVkIiwidyIsImJlZm9yZUVhY2giLCJpbnN0YW5jZSIsIm9uTW9kZWxDaGFuZ2UiLCJ0b0JlQ2FsbGVkV2l0aCIsIm9uUHJvbXB0Q2hhbmdlZCIsIm9uUmF0aW9uYWxlQ2hhbmdlZCIsIm9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwib25NYXJrdXBDaGFuZ2VkIiwibmV3Q2hvaWNlcyIsInNsaWNlIiwibmV3TWFya3VwIiwic2V0U3RhdGUiLCJyZXNwQXJlYUNob2ljZXMiLCJvbkNoYW5nZSIsIm5vdCIsInRvQmVDYWxsZWQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwib2xkTW9kZWwiLCJvbkNob2ljZVJhdGlvbmFsZUNoYW5nZWQiLCJvbkFkZENob2ljZSIsImN1cnJlbnRNb2RlbCIsImNsb25lRGVlcCIsIm9uUmVtb3ZlQ2hvaWNlIiwib2JqZWN0Q29udGFpbmluZyIsIm9uU2VsZWN0Q2hvaWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYWluLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgTWFpbiB9IGZyb20gJy4uL21haW4nO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBzZW5zaWJsZURlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcbmltcG9ydCB7IGNyZWF0ZVNsYXRlTWFya3VwLCBwcm9jZXNzTWFya3VwIH0gZnJvbSAnLi4vbWFya3VwVXRpbHMnO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL2NvbmZpZy11aScsICgpID0+ICh7XG4gIGNob2ljZVV0aWxzOiB7XG4gICAgZmlyc3RBdmFpbGFibGVJbmRleDogamVzdC5mbigpLFxuICB9LFxuICBzZXR0aW5nczoge1xuICAgIFBhbmVsOiAocHJvcHMpID0+IDxkaXYgey4uLnByb3BzfSAvPixcbiAgICB0b2dnbGU6IGplc3QuZm4oKSxcbiAgICByYWRpbzogamVzdC5mbigpLFxuICAgIGRyb3Bkb3duOiBqZXN0LmZuKCksXG4gIH0sXG4gIGxheW91dDoge1xuICAgIENvbmZpZ0xheW91dDogKHByb3BzKSA9PiA8ZGl2Pntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIH0sXG4gIElucHV0Q29udGFpbmVyOiAocHJvcHMpID0+IDxkaXY+e3Byb3BzLmNoaWxkcmVufTwvZGl2Pixcbn0pKTtcblxuY29uc3QgbW9kZWwgPSB7XG4gIHByb21wdDogJ1VzZSB0aGUgZHJvcGRvd25zIHRvIGNvbXBsZXRlIHRoZSBzZW50ZW5jZScsXG4gIHNodWZmbGU6IHRydWUsXG4gIG1hcmt1cDogJzxkaXY+PHA+VGhlIHt7MH19IGp1bXBlZCB7ezF9fSB0aGUge3syfX08L3A+PC9kaXY+JyxcbiAgY2hvaWNlczoge1xuICAgIDA6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjb3cgJyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBjb3cnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdkb2cgJyxcbiAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAxOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnb3ZlciAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZm9yIG92ZXInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICd1bmRlciAnLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICAgIDI6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdtb29uICcsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3IgbW9vbicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N1bicsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdob3VzZSAnLFxuICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgYWx0ZXJuYXRlUmVzcG9uc2U6IHtcbiAgICAyOiBbJzInXSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZXBhcmVNb2RlbCA9IChtb2RlbCA9IHt9KSA9PiB7XG4gIGNvbnN0IGN1cnJNb2RhbCA9IHtcbiAgICAuLi5zZW5zaWJsZURlZmF1bHRzLm1vZGVsLFxuICAgIC4uLm1vZGVsLFxuICB9O1xuICBjb25zdCBzbGF0ZU1hcmt1cCA9IG1vZGVsLnNsYXRlTWFya3VwIHx8IGNyZWF0ZVNsYXRlTWFya3VwKGN1cnJNb2RhbC5tYXJrdXAsIGN1cnJNb2RhbC5jaG9pY2VzKTtcbiAgY29uc3QgbWFya3VwID0gcHJvY2Vzc01hcmt1cChzbGF0ZU1hcmt1cCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jdXJyTW9kYWwsXG4gICAgc2xhdGVNYXJrdXAsXG4gICAgbWFya3VwLFxuICAgIC8qLi4ucHJvY2Vzc2VkTWFya3VwLCovXG4gIH07XG59O1xuXG5kZXNjcmliZSgnTWFpbicsICgpID0+IHtcbiAgbGV0IG9uTW9kZWxDaGFuZ2VkO1xuICBsZXQgb25Db25maWd1cmF0aW9uQ2hhbmdlZDtcblxuICBjb25zdCB3cmFwcGVyID0gKGV4dHJhcykgPT4ge1xuICAgIG9uTW9kZWxDaGFuZ2VkID0gamVzdC5mbigpO1xuICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQgPSBqZXN0LmZuKCk7XG5cbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIG9uTW9kZWxDaGFuZ2VkLFxuICAgICAgb25Db25maWd1cmF0aW9uQ2hhbmdlZCxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAuLi5leHRyYXMsXG4gICAgICB9KSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHNlbnNpYmxlRGVmYXVsdHMuY29uZmlndXJhdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cyB9O1xuXG4gICAgcmV0dXJuIHNoYWxsb3coPE1haW4gey4uLnByb3BzfSAvPiwgeyBkaXNhYmxlTGlmZWN5Y2xlTWV0aG9kczogdHJ1ZSB9KTtcbiAgfTtcblxuICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCB0ZWFjaGVyIGluc3RydWN0aW9ucywgcHJvbXB0IGFuZCByYXRpb25hbGUgZXZlbiBpZiBub3Qgc2V0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdyYXBwZXIoKSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRob3V0IHRlYWNoZXIgaW5zdHJ1Y3Rpb25zLCBwcm9tcHQgYW5kIHJhdGlvbmFsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgd3JhcHBlcih7XG4gICAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBsZXQgdztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgdyA9IHdyYXBwZXIoKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbk1vZGVsQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIG1vZGVsJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25Nb2RlbENoYW5nZSh7IHByb21wdEVuYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Qcm9tcHRDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIHByb21wdCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uUHJvbXB0Q2hhbmdlZCgnVGhpcyBpcyB0aGUgbmV3IHByb21wdCcpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgcHJvbXB0OiAnVGhpcyBpcyB0aGUgbmV3IHByb21wdCcsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25SYXRpb25hbGVDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgdGhlIHJhdGlvbmFsZSB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uUmF0aW9uYWxlQ2hhbmdlZCgnTmV3IFJhdGlvbmFsZScpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgcmF0aW9uYWxlOiAnTmV3IFJhdGlvbmFsZScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSB0ZWFjaGVyIGluc3RydWN0aW9ucyB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWQoJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLnByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ05ldyBUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25NYXJrdXBDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ2NoYW5nZXMgc2xhdGUgbWFya3VwIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzbGF0ZU1hcmt1cCA9XG4gICAgICAgICAgJzxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XFxcXFwiZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2VcXFxcXCIgZGF0YS1pbmRleD1cXFxcXCIwXFxcXFwiIGRhdGEtdmFsdWU9XFxcXFwiY293XFxcXFwiPjwvc3Bhbj4ganVtcGVkPC9wPic7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uTWFya3VwQ2hhbmdlZChzbGF0ZU1hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ucHJlcGFyZU1vZGVsKG1vZGVsKSxcbiAgICAgICAgICBzbGF0ZU1hcmt1cCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkNoYW5nZScsICgpID0+IHtcbiAgICAgIGl0KCdSZW1vdmluZyBjaG9pY2VzIChrZWVwaW5nIG9ubHkgMSBjaG9pY2UpOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3Q2hvaWNlcyA9IHtcbiAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzLFxuICAgICAgICAgIDA6IG1vZGVsLmNob2ljZXNbJzAnXS5zbGljZSgwLCAxKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxkaXY+PHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvdyBcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyIFwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb24gXCI+PC9zcGFuPi48L3A+PC9kaXY+YDtcblxuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIC8vIFRPRE8gZG8gd2UgaGF2ZSB0byB0ZXN0IHdoYXQgaGFwcGVucyBpZiBjbGlja2luZyBvbiBPSy9DYW5jZWw/IEhvdz9cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdObyBjb3JyZWN0IGNob2ljZSBzZWxlY3RlZDogc2xhdGVNYXJrdXAgYW5kIGNob2ljZXMgYXJlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAwOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnY293ICcsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdkb2cgJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TWFya3VwID0gYDxkaXY+PHA+VGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIwXCIgZGF0YS12YWx1ZT1cImNvdyBcIj48L3NwYW4+IGp1bXBlZCA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMVwiIGRhdGEtdmFsdWU9XCJvdmVyIFwiPjwvc3Bhbj4gdGhlIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIyXCIgZGF0YS12YWx1ZT1cIm1vb24gXCI+PC9zcGFuPi48L3A+PC9kaXY+YDtcblxuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoeyByZXNwQXJlYUNob2ljZXM6IG5ld0Nob2ljZXMgfSk7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNoYW5nZShuZXdNYXJrdXApO1xuXG4gICAgICAgIC8vIFRPRE8gZG8gd2UgaGF2ZSB0byB0ZXN0IHdoYXQgaGFwcGVucyBpZiBjbGlja2luZyBvbiBPSy9DYW5jZWw/IEhvdz9cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdOZXcgY2hvaWNlOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3Q2hvaWNlcyA9IHtcbiAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzLFxuICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXNbJzAnXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdwZXQgJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4uPC9wPjwvZGl2PmA7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBuZXdDaG9pY2VzIH0pO1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaGFuZ2UobmV3TWFya3VwKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIHNsYXRlTWFya3VwOiBuZXdNYXJrdXAsXG4gICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ05ldyBSZXNwb25zZSBBcmVhOiBzbGF0ZU1hcmt1cCBhbmQgY2hvaWNlcyBhcmUgdXBkYXRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSB3Lmluc3RhbmNlKCkucHJvcHMubW9kZWw7XG4gICAgICAgIGNvbnN0IG5ld0Nob2ljZXMgPSB7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnQSAnLFxuICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdCJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0MgJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld01hcmt1cCA9IGA8ZGl2PjxwPlRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMFwiIGRhdGEtdmFsdWU9XCJjb3cgXCI+PC9zcGFuPiBqdW1wZWQgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjFcIiBkYXRhLXZhbHVlPVwib3ZlciBcIj48L3NwYW4+IHRoZSA8c3BhbiBkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIiBkYXRhLWluZGV4PVwiMlwiIGRhdGEtdmFsdWU9XCJtb29uIFwiPjwvc3Bhbj4sIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIzXCIgZGF0YS12YWx1ZT1cIkFcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hhbmdlKG5ld01hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ub2xkTW9kZWwsXG4gICAgICAgICAgc2xhdGVNYXJrdXA6IG5ld01hcmt1cCxcbiAgICAgICAgICBjaG9pY2VzOiBuZXdDaG9pY2VzLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnUmVtb3ZpbmcgY2hvaWNlcyAoa2VlcGluZyBhdCBsZWFzdCAyKTogc2xhdGVNYXJrdXAgYW5kIGNob2ljZXMgYXJlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZE1vZGVsID0gdy5pbnN0YW5jZSgpLnByb3BzLm1vZGVsO1xuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIC4uLm1vZGVsLmNob2ljZXMsXG4gICAgICAgICAgMDogbW9kZWwuY2hvaWNlc1snMCddLnNsaWNlKDAsIDIpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdNYXJrdXAgPSBgPGRpdj48cD5UaGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjBcIiBkYXRhLXZhbHVlPVwiY293IFwiPjwvc3Bhbj4ganVtcGVkIDxzcGFuIGRhdGEtdHlwZT1cImlubGluZV9kcm9wZG93blwiIGRhdGEtaW5kZXg9XCIxXCIgZGF0YS12YWx1ZT1cIm92ZXIgXCI+PC9zcGFuPiB0aGUgPHNwYW4gZGF0YS10eXBlPVwiaW5saW5lX2Ryb3Bkb3duXCIgZGF0YS1pbmRleD1cIjJcIiBkYXRhLXZhbHVlPVwibW9vbiBcIj48L3NwYW4+LjwvcD48L2Rpdj5gO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5zZXRTdGF0ZSh7IHJlc3BBcmVhQ2hvaWNlczogbmV3Q2hvaWNlcyB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hhbmdlKG5ld01hcmt1cCk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ub2xkTW9kZWwsXG4gICAgICAgICAgc2xhdGVNYXJrdXA6IG5ld01hcmt1cCxcbiAgICAgICAgICBjaG9pY2VzOiBuZXdDaG9pY2VzLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hvaWNlUmF0aW9uYWxlQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdjaGFuZ2VzIHRoZSBjaG9pY2UgbGV2ZWwgcmF0aW9uYWxlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaG9pY2VSYXRpb25hbGVDaGFuZ2VkKDAsIHtcbiAgICAgICAgICBsYWJlbDogJ2NvdyAnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6ICduZXcgcmF0aW9uYWxlIGZvciBjb3cnLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5wcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnY293ICcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogJ25ldyByYXRpb25hbGUgZm9yIGNvdycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2RvZyAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdvdmVyICcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3Igb3ZlcicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ3VuZGVyICcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAyOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ21vb24gJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGZvciBtb29uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdob3VzZSAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMycsXG4gICAgICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25BZGRDaG9pY2UnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHsgcmVzcEFyZWFDaG9pY2VzOiBtb2RlbC5jaG9pY2VzIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdEb2VzIG5vdCBhZGQgZHVwbGljYXRlcycsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCcwJywgJ2NvdycpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkubm90LnRvQmVDYWxsZWQoKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzEnLCAnb3ZlcicpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkubm90LnRvQmVDYWxsZWQoKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzEnLCAndW5kZXInKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLm5vdC50b0JlQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ0FkZHMgYSBuZXcgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBjbG9uZURlZXAody5pbnN0YW5jZSgpLnByb3BzLm1vZGVsKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25BZGRDaG9pY2UoJzAnLCAnYmlyZCcpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLmN1cnJlbnRNb2RlbCxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAgIDA6IFsuLi5jdXJyZW50TW9kZWwuY2hvaWNlc1snMCddLCB7IGxhYmVsOiAnYmlyZCcsIHZhbHVlOiAnMycsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkFkZENob2ljZSgnMicsICdzdGFyJyk7XG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIC4uLmN1cnJlbnRNb2RlbCxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50TW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAgIDA6IFsuLi5jdXJyZW50TW9kZWwuY2hvaWNlc1snMCddLCB7IGxhYmVsOiAnYmlyZCcsIHZhbHVlOiAnMycsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgICAgMjogWy4uLmN1cnJlbnRNb2RlbC5jaG9pY2VzWycyJ10sIHsgbGFiZWw6ICdzdGFyJywgdmFsdWU6ICc0JywgY29ycmVjdDogZmFsc2UgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvblJlbW92ZUNob2ljZScsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkuc2V0U3RhdGUoe1xuICAgICAgICAgIHJlc3BBcmVhQ2hvaWNlczoge1xuICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnY293ICcsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZyAnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY2F0ICcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdSZW1vdmVzIGNob2ljZXMnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vblJlbW92ZUNob2ljZSgwLCAnMCcpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZyAnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQgJywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uUmVtb3ZlQ2hvaWNlKDAsICcwJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uTW9kZWxDaGFuZ2VkKS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAgIDA6IFt7IGxhYmVsOiAnY2F0ICcsIHZhbHVlOiAnMicsIGNvcnJlY3Q6IGZhbHNlIH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB3Lmluc3RhbmNlKCkub25SZW1vdmVDaG9pY2UoMCwgJzAnKTtcblxuICAgICAgICBleHBlY3Qob25Nb2RlbENoYW5nZWQpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25TZWxlY3RDaG9pY2UnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLnNldFN0YXRlKHtcbiAgICAgICAgICByZXNwQXJlYUNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdyAnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cgJywgdmFsdWU6ICcxJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdCAnLCB2YWx1ZTogJzInLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnVXBkYXRlcyBjb3JyZWN0IGNob2ljZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uU2VsZWN0Q2hvaWNlKDAsIDEpO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdyAnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdkb2cgJywgdmFsdWU6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQgJywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uU2VsZWN0Q2hvaWNlKDAsIDApO1xuXG4gICAgICAgIGV4cGVjdChvbk1vZGVsQ2hhbmdlZCkudG9CZUNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdyAnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2RvZyAnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXQgJywgdmFsdWU6ICcyJywgY29ycmVjdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxLQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFBa0UsU0FBQU8sUUFBQUMsTUFBQSxFQUFBQyxjQUFBLFFBQUFDLElBQUEsR0FBQUMsTUFBQSxDQUFBRCxJQUFBLENBQUFGLE1BQUEsT0FBQUcsTUFBQSxDQUFBQyxxQkFBQSxRQUFBQyxPQUFBLEdBQUFGLE1BQUEsQ0FBQUMscUJBQUEsQ0FBQUosTUFBQSxHQUFBQyxjQUFBLEtBQUFJLE9BQUEsR0FBQUEsT0FBQSxDQUFBQyxNQUFBLFdBQUFDLEdBQUEsV0FBQUosTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixNQUFBLEVBQUFPLEdBQUEsRUFBQUUsVUFBQSxPQUFBUCxJQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxJQUFBLEVBQUFH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