@pie-element/drag-in-the-blank 8.3.2-tip-tap.3 → 8.3.2-tip-tap.5
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/configure/package.json +2 -2
- package/package.json +2 -2
- package/configure/lib/__tests__/choice.test.js +0 -128
- package/configure/lib/__tests__/choices.test.js +0 -350
- package/configure/lib/__tests__/main.test.js +0 -174
- package/configure/lib/__tests__/markupUtils.test.js +0 -105
- package/controller/lib/__tests__/index.test.js +0 -1135
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/index.test.js +0 -130
- package/lib/__tests__/main.test.js +0 -92
package/configure/package.json
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"@material-ui/core": "^3.9.2",
|
|
9
9
|
"@material-ui/icons": "^3.0.1",
|
|
10
10
|
"@pie-framework/pie-configure-events": "^1.3.0",
|
|
11
|
-
"@pie-lib/config-ui": "11.30.2-beta-
|
|
12
|
-
"@pie-lib/editable-html-tip-tap": "^1.0.
|
|
11
|
+
"@pie-lib/config-ui": "11.30.2-beta-12",
|
|
12
|
+
"@pie-lib/editable-html-tip-tap": "^1.0.18",
|
|
13
13
|
"@pie-lib/drag": "^2.22.1",
|
|
14
14
|
"@pie-lib/math-rendering": "^3.22.1",
|
|
15
15
|
"debug": "^3.1.0",
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"repository": "pie-framework/pie-elements",
|
|
7
|
-
"version": "8.3.2-tip-tap.
|
|
7
|
+
"version": "8.3.2-tip-tap.5",
|
|
8
8
|
"description": "",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"postpublish": "../../scripts/postpublish"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
15
15
|
"@pie-lib/correct-answer-toggle": "^2.25.1",
|
|
16
16
|
"@pie-lib/drag": "^2.22.1",
|
|
17
|
-
"@pie-lib/mask-markup": "1.33.2-beta-
|
|
17
|
+
"@pie-lib/mask-markup": "1.33.2-beta-19",
|
|
18
18
|
"@pie-lib/math-rendering": "^3.22.1",
|
|
19
19
|
"@pie-lib/render-ui": "^4.35.1",
|
|
20
20
|
"classnames": "^2.2.5",
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
-
|
|
9
|
-
var _enzyme = require("enzyme");
|
|
10
|
-
|
|
11
|
-
var _react = _interopRequireDefault(require("react"));
|
|
12
|
-
|
|
13
|
-
var _choice = _interopRequireWildcard(require("../choice"));
|
|
14
|
-
|
|
15
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
-
|
|
17
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
|
-
|
|
19
|
-
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; }
|
|
20
|
-
|
|
21
|
-
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; }
|
|
22
|
-
|
|
23
|
-
describe('Choice', function () {
|
|
24
|
-
var onClick;
|
|
25
|
-
var onRemoveChoice;
|
|
26
|
-
var connectDragSource;
|
|
27
|
-
var connectDragPreview;
|
|
28
|
-
beforeEach(function () {
|
|
29
|
-
onClick = jest.fn();
|
|
30
|
-
onRemoveChoice = jest.fn();
|
|
31
|
-
connectDragSource = jest.fn();
|
|
32
|
-
connectDragPreview = jest.fn();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
var wrapper = function wrapper(extras) {
|
|
36
|
-
var props = _objectSpread({
|
|
37
|
-
classes: {},
|
|
38
|
-
key: '0',
|
|
39
|
-
duplicates: true,
|
|
40
|
-
choice: {
|
|
41
|
-
value: '<div>6</div>',
|
|
42
|
-
id: '0'
|
|
43
|
-
},
|
|
44
|
-
targetId: '0',
|
|
45
|
-
onClick: onClick,
|
|
46
|
-
onRemoveChoice: onRemoveChoice,
|
|
47
|
-
connectDragSource: connectDragSource,
|
|
48
|
-
connectDragPreview: connectDragPreview
|
|
49
|
-
}, extras);
|
|
50
|
-
|
|
51
|
-
return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_choice["default"], props));
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
describe('snapshot', function () {
|
|
55
|
-
it('renders', function () {
|
|
56
|
-
var w = wrapper();
|
|
57
|
-
expect(w).toMatchSnapshot();
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe('spec', function () {
|
|
62
|
-
describe('canDrag', function () {
|
|
63
|
-
it('returns true if category has any value and is enabled', function () {
|
|
64
|
-
var result = _choice.tileSource.canDrag({
|
|
65
|
-
choice: {
|
|
66
|
-
value: '<div>6</div>',
|
|
67
|
-
id: '0'
|
|
68
|
-
},
|
|
69
|
-
disabled: false
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
expect(result).toEqual(true);
|
|
73
|
-
});
|
|
74
|
-
it('returns false if category has any value and is disabled', function () {
|
|
75
|
-
var jsdomAlert = window.alert; // remember the jsdom alert
|
|
76
|
-
|
|
77
|
-
window.alert = function () {};
|
|
78
|
-
|
|
79
|
-
var result = _choice.tileSource.canDrag({
|
|
80
|
-
choice: {
|
|
81
|
-
value: '<div>6</div>',
|
|
82
|
-
id: '0'
|
|
83
|
-
},
|
|
84
|
-
disabled: true
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
expect(result).toEqual(false);
|
|
88
|
-
window.alert = jsdomAlert;
|
|
89
|
-
});
|
|
90
|
-
it('returns false if category value is empty', function () {
|
|
91
|
-
var jsdomAlert = window.alert; // remember the jsdom alert
|
|
92
|
-
|
|
93
|
-
window.alert = function () {};
|
|
94
|
-
|
|
95
|
-
var result = _choice.tileSource.canDrag({
|
|
96
|
-
choice: {
|
|
97
|
-
value: '',
|
|
98
|
-
id: '0'
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
expect(result).toEqual(false);
|
|
103
|
-
window.alert = jsdomAlert;
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
describe('beginDrag', function () {
|
|
107
|
-
it('returns the proper object', function () {
|
|
108
|
-
var result = _choice.tileSource.beginDrag({
|
|
109
|
-
choice: {
|
|
110
|
-
value: '<div>0</div>',
|
|
111
|
-
id: '0'
|
|
112
|
-
},
|
|
113
|
-
instanceId: '1',
|
|
114
|
-
targetId: '0'
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
expect(result).toEqual({
|
|
118
|
-
id: '0',
|
|
119
|
-
instanceId: '1',
|
|
120
|
-
value: {
|
|
121
|
-
value: '<div>0</div>',
|
|
122
|
-
id: '0'
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vY2hvaWNlLnRlc3QuanN4Il0sIm5hbWVzIjpbImRlc2NyaWJlIiwib25DbGljayIsIm9uUmVtb3ZlQ2hvaWNlIiwiY29ubmVjdERyYWdTb3VyY2UiLCJjb25uZWN0RHJhZ1ByZXZpZXciLCJiZWZvcmVFYWNoIiwiamVzdCIsImZuIiwid3JhcHBlciIsImV4dHJhcyIsInByb3BzIiwiY2xhc3NlcyIsImtleSIsImR1cGxpY2F0ZXMiLCJjaG9pY2UiLCJ2YWx1ZSIsImlkIiwidGFyZ2V0SWQiLCJpdCIsInciLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJyZXN1bHQiLCJ0aWxlU291cmNlIiwiY2FuRHJhZyIsImRpc2FibGVkIiwidG9FcXVhbCIsImpzZG9tQWxlcnQiLCJ3aW5kb3ciLCJhbGVydCIsImJlZ2luRHJhZyIsImluc3RhbmNlSWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQUEsUUFBUSxDQUFDLFFBQUQsRUFBVyxZQUFNO0FBQ3ZCLE1BQUlDLE9BQUo7QUFDQSxNQUFJQyxjQUFKO0FBQ0EsTUFBSUMsaUJBQUo7QUFDQSxNQUFJQyxrQkFBSjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBTTtBQUNmSixJQUFBQSxPQUFPLEdBQUdLLElBQUksQ0FBQ0MsRUFBTCxFQUFWO0FBQ0FMLElBQUFBLGNBQWMsR0FBR0ksSUFBSSxDQUFDQyxFQUFMLEVBQWpCO0FBQ0FKLElBQUFBLGlCQUFpQixHQUFHRyxJQUFJLENBQUNDLEVBQUwsRUFBcEI7QUFDQUgsSUFBQUEsa0JBQWtCLEdBQUdFLElBQUksQ0FBQ0MsRUFBTCxFQUFyQjtBQUNELEdBTFMsQ0FBVjs7QUFPQSxNQUFNQyxPQUFPLEdBQUcsU0FBVkEsT0FBVSxDQUFDQyxNQUFELEVBQVk7QUFDMUIsUUFBTUMsS0FBSztBQUNUQyxNQUFBQSxPQUFPLEVBQUUsRUFEQTtBQUVUQyxNQUFBQSxHQUFHLEVBQUUsR0FGSTtBQUdUQyxNQUFBQSxVQUFVLEVBQUUsSUFISDtBQUlUQyxNQUFBQSxNQUFNLEVBQUU7QUFDTkMsUUFBQUEsS0FBSyxFQUFFLGNBREQ7QUFFTkMsUUFBQUEsRUFBRSxFQUFFO0FBRkUsT0FKQztBQVFUQyxNQUFBQSxRQUFRLEVBQUUsR0FSRDtBQVNUaEIsTUFBQUEsT0FBTyxFQUFQQSxPQVRTO0FBVVRDLE1BQUFBLGNBQWMsRUFBZEEsY0FWUztBQVdUQyxNQUFBQSxpQkFBaUIsRUFBakJBLGlCQVhTO0FBWVRDLE1BQUFBLGtCQUFrQixFQUFsQkE7QUFaUyxPQWFOSyxNQWJNLENBQVg7O0FBZ0JBLFdBQU8sbUNBQVEsZ0NBQUMsa0JBQUQsRUFBWUMsS0FBWixDQUFSLENBQVA7QUFDRCxHQWxCRDs7QUFtQkFWLEVBQUFBLFFBQVEsQ0FBQyxVQUFELEVBQWEsWUFBTTtBQUN6QmtCLElBQUFBLEVBQUUsQ0FBQyxTQUFELEVBQVksWUFBTTtBQUNsQixVQUFNQyxDQUFDLEdBQUdYLE9BQU8sRUFBakI7QUFDQVksTUFBQUEsTUFBTSxDQUFDRCxDQUFELENBQU4sQ0FBVUUsZUFBVjtBQUNELEtBSEMsQ0FBRjtBQUlELEdBTE8sQ0FBUjtBQU1ELENBdENPLENBQVI7QUF3Q0FyQixRQUFRLENBQUMsTUFBRCxFQUFTLFlBQU07QUFDckJBLEVBQUFBLFFBQVEsQ0FBQyxTQUFELEVBQVksWUFBTTtBQUN4QmtCLElBQUFBLEVBQUUsQ0FBQyx1REFBRCxFQUEwRCxZQUFNO0FBQ2hFLFVBQU1JLE1BQU0sR0FBR0MsbUJBQVdDLE9BQVgsQ0FBbUI7QUFBRVYsUUFBQUEsTUFBTSxFQUFFO0FBQUVDLFVBQUFBLEtBQUssRUFBRSxjQUFUO0FBQXlCQyxVQUFBQSxFQUFFLEVBQUU7QUFBN0IsU0FBVjtBQUE4Q1MsUUFBQUEsUUFBUSxFQUFFO0FBQXhELE9BQW5CLENBQWY7O0FBQ0FMLE1BQUFBLE1BQU0sQ0FBQ0UsTUFBRCxDQUFOLENBQWVJLE9BQWYsQ0FBdUIsSUFBdkI7QUFDRCxLQUhDLENBQUY7QUFLQVIsSUFBQUEsRUFBRSxDQUFDLHlEQUFELEVBQTRELFlBQU07QUFDbEUsVUFBTVMsVUFBVSxHQUFHQyxNQUFNLENBQUNDLEtBQTFCLENBRGtFLENBQ2pDOztBQUNqQ0QsTUFBQUEsTUFBTSxDQUFDQyxLQUFQLEdBQWUsWUFBTSxDQUFFLENBQXZCOztBQUVBLFVBQU1QLE1BQU0sR0FBR0MsbUJBQVdDLE9BQVgsQ0FBbUI7QUFBRVYsUUFBQUEsTUFBTSxFQUFFO0FBQUVDLFVBQUFBLEtBQUssRUFBRSxjQUFUO0FBQXlCQyxVQUFBQSxFQUFFLEVBQUU7QUFBN0IsU0FBVjtBQUE4Q1MsUUFBQUEsUUFBUSxFQUFFO0FBQXhELE9BQW5CLENBQWY7O0FBQ0FMLE1BQUFBLE1BQU0sQ0FBQ0UsTUFBRCxDQUFOLENBQWVJLE9BQWYsQ0FBdUIsS0FBdkI7QUFFQUUsTUFBQUEsTUFBTSxDQUFDQyxLQUFQLEdBQWVGLFVBQWY7QUFDRCxLQVJDLENBQUY7QUFVQVQsSUFBQUEsRUFBRSxDQUFDLDBDQUFELEVBQTZDLFlBQU07QUFDbkQsVUFBTVMsVUFBVSxHQUFHQyxNQUFNLENBQUNDLEtBQTFCLENBRG1ELENBQ2xCOztBQUNqQ0QsTUFBQUEsTUFBTSxDQUFDQyxLQUFQLEdBQWUsWUFBTSxDQUFFLENBQXZCOztBQUVBLFVBQU1QLE1BQU0sR0FBR0MsbUJBQVdDLE9BQVgsQ0FBbUI7QUFBRVYsUUFBQUEsTUFBTSxFQUFFO0FBQUVDLFVBQUFBLEtBQUssRUFBRSxFQUFUO0FBQWFDLFVBQUFBLEVBQUUsRUFBRTtBQUFqQjtBQUFWLE9BQW5CLENBQWY7O0FBQ0FJLE1BQUFBLE1BQU0sQ0FBQ0UsTUFBRCxDQUFOLENBQWVJLE9BQWYsQ0FBdUIsS0FBdkI7QUFFQUUsTUFBQUEsTUFBTSxDQUFDQyxLQUFQLEdBQWVGLFVBQWY7QUFDRCxLQVJDLENBQUY7QUFTRCxHQXpCTyxDQUFSO0FBMkJBM0IsRUFBQUEsUUFBUSxDQUFDLFdBQUQsRUFBYyxZQUFNO0FBQzFCa0IsSUFBQUEsRUFBRSxDQUFDLDJCQUFELEVBQThCLFlBQU07QUFDcEMsVUFBTUksTUFBTSxHQUFHQyxtQkFBV08sU0FBWCxDQUFxQjtBQUNsQ2hCLFFBQUFBLE1BQU0sRUFBRTtBQUFFQyxVQUFBQSxLQUFLLEVBQUUsY0FBVDtBQUF5QkMsVUFBQUEsRUFBRSxFQUFFO0FBQTdCLFNBRDBCO0FBRWxDZSxRQUFBQSxVQUFVLEVBQUUsR0FGc0I7QUFHbENkLFFBQUFBLFFBQVEsRUFBRTtBQUh3QixPQUFyQixDQUFmOztBQUtBRyxNQUFBQSxNQUFNLENBQUNFLE1BQUQsQ0FBTixDQUFlSSxPQUFmLENBQXVCO0FBQUVWLFFBQUFBLEVBQUUsRUFBRSxHQUFOO0FBQVdlLFFBQUFBLFVBQVUsRUFBRSxHQUF2QjtBQUE0QmhCLFFBQUFBLEtBQUssRUFBRTtBQUFFQSxVQUFBQSxLQUFLLEVBQUUsY0FBVDtBQUF5QkMsVUFBQUEsRUFBRSxFQUFFO0FBQTdCO0FBQW5DLE9BQXZCO0FBQ0QsS0FQQyxDQUFGO0FBUUQsR0FUTyxDQUFSO0FBVUQsQ0F0Q08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaG9pY2UsIHsgdGlsZVNvdXJjZSB9IGZyb20gJy4uL2Nob2ljZSc7XG5cbmRlc2NyaWJlKCdDaG9pY2UnLCAoKSA9PiB7XG4gIGxldCBvbkNsaWNrO1xuICBsZXQgb25SZW1vdmVDaG9pY2U7XG4gIGxldCBjb25uZWN0RHJhZ1NvdXJjZTtcbiAgbGV0IGNvbm5lY3REcmFnUHJldmlldztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIG9uUmVtb3ZlQ2hvaWNlID0gamVzdC5mbigpO1xuICAgIGNvbm5lY3REcmFnU291cmNlID0gamVzdC5mbigpO1xuICAgIGNvbm5lY3REcmFnUHJldmlldyA9IGplc3QuZm4oKTtcbiAgfSk7XG5cbiAgY29uc3Qgd3JhcHBlciA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAga2V5OiAnMCcsXG4gICAgICBkdXBsaWNhdGVzOiB0cnVlLFxuICAgICAgY2hvaWNlOiB7XG4gICAgICAgIHZhbHVlOiAnPGRpdj42PC9kaXY+JyxcbiAgICAgICAgaWQ6ICcwJyxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRJZDogJzAnLFxuICAgICAgb25DbGljayxcbiAgICAgIG9uUmVtb3ZlQ2hvaWNlLFxuICAgICAgY29ubmVjdERyYWdTb3VyY2UsXG4gICAgICBjb25uZWN0RHJhZ1ByZXZpZXcsXG4gICAgICAuLi5leHRyYXMsXG4gICAgfTtcblxuICAgIHJldHVybiBzaGFsbG93KDxDaG9pY2Ugey4uLnByb3BzfSAvPik7XG4gIH07XG4gIGRlc2NyaWJlKCdzbmFwc2hvdCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHcgPSB3cmFwcGVyKCk7XG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdzcGVjJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY2FuRHJhZycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyB0cnVlIGlmIGNhdGVnb3J5IGhhcyBhbnkgdmFsdWUgYW5kIGlzIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aWxlU291cmNlLmNhbkRyYWcoeyBjaG9pY2U6IHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sIGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBmYWxzZSBpZiBjYXRlZ29yeSBoYXMgYW55IHZhbHVlIGFuZCBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGpzZG9tQWxlcnQgPSB3aW5kb3cuYWxlcnQ7IC8vIHJlbWVtYmVyIHRoZSBqc2RvbSBhbGVydFxuICAgICAgd2luZG93LmFsZXJ0ID0gKCkgPT4ge307XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRpbGVTb3VyY2UuY2FuRHJhZyh7IGNob2ljZTogeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSwgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGZhbHNlKTtcblxuICAgICAgd2luZG93LmFsZXJ0ID0ganNkb21BbGVydDtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGZhbHNlIGlmIGNhdGVnb3J5IHZhbHVlIGlzIGVtcHR5JywgKCkgPT4ge1xuICAgICAgY29uc3QganNkb21BbGVydCA9IHdpbmRvdy5hbGVydDsgLy8gcmVtZW1iZXIgdGhlIGpzZG9tIGFsZXJ0XG4gICAgICB3aW5kb3cuYWxlcnQgPSAoKSA9PiB7fTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGlsZVNvdXJjZS5jYW5EcmFnKHsgY2hvaWNlOiB7IHZhbHVlOiAnJywgaWQ6ICcwJyB9IH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChmYWxzZSk7XG5cbiAgICAgIHdpbmRvdy5hbGVydCA9IGpzZG9tQWxlcnQ7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdiZWdpbkRyYWcnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgdGhlIHByb3BlciBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aWxlU291cmNlLmJlZ2luRHJhZyh7XG4gICAgICAgIGNob2ljZTogeyB2YWx1ZTogJzxkaXY+MDwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgaW5zdGFuY2VJZDogJzEnLFxuICAgICAgICB0YXJnZXRJZDogJzAnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgaWQ6ICcwJywgaW5zdGFuY2VJZDogJzEnLCB2YWx1ZTogeyB2YWx1ZTogJzxkaXY+MDwvZGl2PicsIGlkOiAnMCcgfSB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
6
|
-
|
|
7
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
-
|
|
9
|
-
var _enzyme = require("enzyme");
|
|
10
|
-
|
|
11
|
-
var _react = _interopRequireDefault(require("react"));
|
|
12
|
-
|
|
13
|
-
var _choices = require("../choices");
|
|
14
|
-
|
|
15
|
-
var _defaults = _interopRequireDefault(require("../defaults"));
|
|
16
|
-
|
|
17
|
-
var _markupUtils = require("../markupUtils");
|
|
18
|
-
|
|
19
|
-
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; }
|
|
20
|
-
|
|
21
|
-
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; }
|
|
22
|
-
|
|
23
|
-
jest.mock('@pie-lib/config-ui', function () {
|
|
24
|
-
return {
|
|
25
|
-
choiceUtils: {
|
|
26
|
-
firstAvailableIndex: jest.fn()
|
|
27
|
-
},
|
|
28
|
-
settings: {
|
|
29
|
-
Panel: function Panel(props) {
|
|
30
|
-
return /*#__PURE__*/_react["default"].createElement("div", props);
|
|
31
|
-
},
|
|
32
|
-
toggle: jest.fn(),
|
|
33
|
-
radio: jest.fn(),
|
|
34
|
-
dropdown: jest.fn()
|
|
35
|
-
},
|
|
36
|
-
layout: {
|
|
37
|
-
ConfigLayout: function ConfigLayout(props) {
|
|
38
|
-
return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
var model = {
|
|
44
|
-
markup: '{{0}} + {{1}} = 15',
|
|
45
|
-
prompt: '<p>Solve the equation below.</p>',
|
|
46
|
-
choices: [{
|
|
47
|
-
value: '<div>6</div>',
|
|
48
|
-
id: '0'
|
|
49
|
-
}, {
|
|
50
|
-
value: '<div>9</div>',
|
|
51
|
-
id: '1'
|
|
52
|
-
}, {
|
|
53
|
-
value: '<div>12</div>',
|
|
54
|
-
id: '2'
|
|
55
|
-
}],
|
|
56
|
-
choicesPosition: 'below',
|
|
57
|
-
correctResponse: {
|
|
58
|
-
0: '0',
|
|
59
|
-
1: '1'
|
|
60
|
-
},
|
|
61
|
-
duplicates: true,
|
|
62
|
-
alternateResponses: [['1'], ['0']],
|
|
63
|
-
rationale: '<p>A correct response is shown below:</p><ul><li>2/6 = 1/3</li><li>4/8 = 1/2</li><li>6/10 = 3/5</li><li>9/12 = 3/4</li></ul>'
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
var prepareModel = function prepareModel() {
|
|
67
|
-
var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
68
|
-
|
|
69
|
-
var joinedObj = _objectSpread(_objectSpread({}, _defaults["default"].model), model);
|
|
70
|
-
|
|
71
|
-
var slateMarkup = model.slateMarkup || (0, _markupUtils.createSlateMarkup)(joinedObj.markup, joinedObj.choices, joinedObj.correctResponse);
|
|
72
|
-
var processedMarkup = (0, _markupUtils.processMarkup)(slateMarkup);
|
|
73
|
-
return _objectSpread(_objectSpread({}, joinedObj), {}, {
|
|
74
|
-
slateMarkup: slateMarkup,
|
|
75
|
-
markup: processedMarkup.markup,
|
|
76
|
-
correctResponse: processedMarkup.correctResponse
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
describe('Choices', function () {
|
|
81
|
-
var onChange;
|
|
82
|
-
beforeEach(function () {
|
|
83
|
-
onChange = jest.fn();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
var wrapper = function wrapper(extras) {
|
|
87
|
-
var defaults = _objectSpread({
|
|
88
|
-
onChange: onChange,
|
|
89
|
-
classes: {},
|
|
90
|
-
model: prepareModel(model),
|
|
91
|
-
duplicates: true
|
|
92
|
-
}, extras);
|
|
93
|
-
|
|
94
|
-
var props = _objectSpread({}, defaults);
|
|
95
|
-
|
|
96
|
-
return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_choices.Choices, props), {
|
|
97
|
-
disableLifecycleMethods: true
|
|
98
|
-
});
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
describe('snapshot', function () {
|
|
102
|
-
it('renders with duplicates', function () {
|
|
103
|
-
expect(wrapper()).toMatchSnapshot();
|
|
104
|
-
});
|
|
105
|
-
it('renders without duplicates', function () {
|
|
106
|
-
expect(wrapper({
|
|
107
|
-
duplicates: false
|
|
108
|
-
})).toMatchSnapshot();
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
describe('logic', function () {
|
|
112
|
-
var w;
|
|
113
|
-
beforeEach(function () {
|
|
114
|
-
w = wrapper();
|
|
115
|
-
});
|
|
116
|
-
describe('onChoiceChanged', function () {
|
|
117
|
-
it('removes a choice if its new value is empty', function () {
|
|
118
|
-
w.instance().onChoiceChanged('<div>12</div>', '', '2');
|
|
119
|
-
expect(onChange).toBeCalledWith([{
|
|
120
|
-
value: '<div>6</div>',
|
|
121
|
-
id: '0'
|
|
122
|
-
}, {
|
|
123
|
-
value: '<div>9</div>',
|
|
124
|
-
id: '1'
|
|
125
|
-
}]);
|
|
126
|
-
});
|
|
127
|
-
it('does not add new choice if it is identical to another choice', function () {
|
|
128
|
-
w.instance().onChoiceChanged('', '<div>9</div>', '2');
|
|
129
|
-
expect(onChange).toBeCalledWith([{
|
|
130
|
-
value: '<div>6</div>',
|
|
131
|
-
id: '0'
|
|
132
|
-
}, {
|
|
133
|
-
value: '<div>9</div>',
|
|
134
|
-
id: '1'
|
|
135
|
-
}]);
|
|
136
|
-
});
|
|
137
|
-
it('does not change choice if it would be identical to another choice', function () {
|
|
138
|
-
w.instance().onChoiceChanged('<div>6</div>', '<div>9</div>', '0');
|
|
139
|
-
expect(onChange).toHaveBeenCalledTimes(0);
|
|
140
|
-
});
|
|
141
|
-
it('does not remove a choice if its new value is empty, but is used in correct response', function () {
|
|
142
|
-
var jsdomAlert = window.alert; // remember the jsdom alert
|
|
143
|
-
|
|
144
|
-
window.alert = function () {};
|
|
145
|
-
|
|
146
|
-
w.instance().onChoiceChanged('<div>9</div>', '', '1');
|
|
147
|
-
expect(onChange).not.toBeCalled();
|
|
148
|
-
window.alert = jsdomAlert;
|
|
149
|
-
});
|
|
150
|
-
it('does not remove a choice if its new value is empty, but is used in alternate response', function () {
|
|
151
|
-
var jsdomAlert = window.alert; // remember the jsdom alert
|
|
152
|
-
|
|
153
|
-
window.alert = function () {};
|
|
154
|
-
|
|
155
|
-
wrapper({
|
|
156
|
-
markup: '{{0}}'
|
|
157
|
-
}).instance().onChoiceChanged('<div>9</div>', '', '1');
|
|
158
|
-
expect(onChange).not.toBeCalled();
|
|
159
|
-
window.alert = jsdomAlert;
|
|
160
|
-
});
|
|
161
|
-
it('does not remove a choice if its new value is empty, but the old value was empty as well (at focusing a new choice without editing)', function () {
|
|
162
|
-
var jsdomAlert = window.alert; // remember the jsdom alert
|
|
163
|
-
|
|
164
|
-
window.alert = function () {};
|
|
165
|
-
|
|
166
|
-
wrapper({
|
|
167
|
-
markup: '{{0}}'
|
|
168
|
-
}).instance().onChoiceChanged('', '', '1');
|
|
169
|
-
expect(onChange).not.toBeCalled();
|
|
170
|
-
window.alert = jsdomAlert;
|
|
171
|
-
});
|
|
172
|
-
it('updates choices', function () {
|
|
173
|
-
w.instance().onChoiceChanged('<div>9</div>', '<div>3*3</div>', '1');
|
|
174
|
-
expect(onChange).toBeCalledWith([{
|
|
175
|
-
value: '<div>6</div>',
|
|
176
|
-
id: '0'
|
|
177
|
-
}, {
|
|
178
|
-
value: '<div>3*3</div>',
|
|
179
|
-
id: '1'
|
|
180
|
-
}, {
|
|
181
|
-
value: '<div>12</div>',
|
|
182
|
-
id: '2'
|
|
183
|
-
}]);
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
describe('onChoiceFocus', function () {
|
|
187
|
-
it('sets focused element id on state', function () {
|
|
188
|
-
w.instance().onChoiceFocus('1');
|
|
189
|
-
expect(w.instance().state.focusedEl).toEqual('1');
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
describe('onAddChoice', function () {
|
|
193
|
-
it('adds a choice', function () {
|
|
194
|
-
wrapper().instance().onAddChoice();
|
|
195
|
-
expect(onChange).toBeCalledWith([].concat((0, _toConsumableArray2["default"])(model.choices), [{
|
|
196
|
-
id: '3',
|
|
197
|
-
value: ''
|
|
198
|
-
}]));
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
describe('onChoiceRemove', function () {
|
|
202
|
-
it('removes a choice', function () {
|
|
203
|
-
wrapper().instance().onChoiceRemove('1');
|
|
204
|
-
expect(onChange).toBeCalledWith([{
|
|
205
|
-
value: '<div>6</div>',
|
|
206
|
-
id: '0'
|
|
207
|
-
}, {
|
|
208
|
-
value: '<div>12</div>',
|
|
209
|
-
id: '2'
|
|
210
|
-
}]);
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
describe('onChoiceRemove & onAddChoice', function () {
|
|
214
|
-
it('prevents duplicate IDs when adding choices after removing some', function () {
|
|
215
|
-
var initialWrapper = wrapper();
|
|
216
|
-
initialWrapper.instance().onChoiceRemove('1');
|
|
217
|
-
expect(onChange).toHaveBeenCalledWith([{
|
|
218
|
-
value: '<div>6</div>',
|
|
219
|
-
id: '0'
|
|
220
|
-
}, {
|
|
221
|
-
value: '<div>12</div>',
|
|
222
|
-
id: '2'
|
|
223
|
-
}]);
|
|
224
|
-
var updatedChoices = [{
|
|
225
|
-
value: '<div>6</div>',
|
|
226
|
-
id: '0'
|
|
227
|
-
}, {
|
|
228
|
-
value: '<div>12</div>',
|
|
229
|
-
id: '2'
|
|
230
|
-
}];
|
|
231
|
-
var wrapperWithUpdatedState = wrapper({
|
|
232
|
-
model: _objectSpread(_objectSpread({}, model), {}, {
|
|
233
|
-
choices: updatedChoices
|
|
234
|
-
})
|
|
235
|
-
});
|
|
236
|
-
wrapperWithUpdatedState.instance().onAddChoice();
|
|
237
|
-
expect(onChange).toHaveBeenLastCalledWith([{
|
|
238
|
-
value: '<div>6</div>',
|
|
239
|
-
id: '0'
|
|
240
|
-
}, {
|
|
241
|
-
value: '<div>12</div>',
|
|
242
|
-
id: '2'
|
|
243
|
-
}, {
|
|
244
|
-
id: '3',
|
|
245
|
-
value: ''
|
|
246
|
-
}]);
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
describe('getVisibleChoices', function () {
|
|
250
|
-
it('choices are null => returns []', function () {
|
|
251
|
-
var visibleChoices = wrapper({
|
|
252
|
-
model: {
|
|
253
|
-
choices: null
|
|
254
|
-
}
|
|
255
|
-
}).instance().getVisibleChoices();
|
|
256
|
-
expect(visibleChoices).toEqual([]);
|
|
257
|
-
});
|
|
258
|
-
it('duplicates = true', function () {
|
|
259
|
-
var choices = [{
|
|
260
|
-
value: '<div>6</div>',
|
|
261
|
-
id: '0'
|
|
262
|
-
}, {
|
|
263
|
-
value: '<div>9</div>',
|
|
264
|
-
id: '1'
|
|
265
|
-
}, {
|
|
266
|
-
value: '<div>12</div>',
|
|
267
|
-
id: '2'
|
|
268
|
-
}];
|
|
269
|
-
var visibleChoices = wrapper({
|
|
270
|
-
model: {
|
|
271
|
-
duplicates: true,
|
|
272
|
-
choices: choices,
|
|
273
|
-
correctResponse: {
|
|
274
|
-
0: '0',
|
|
275
|
-
1: '1'
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}).instance().getVisibleChoices();
|
|
279
|
-
expect(visibleChoices).toEqual(choices);
|
|
280
|
-
});
|
|
281
|
-
it('duplicates = false', function () {
|
|
282
|
-
var choices = [{
|
|
283
|
-
value: '<div>6</div>',
|
|
284
|
-
id: '0'
|
|
285
|
-
}, {
|
|
286
|
-
value: '<div>9</div>',
|
|
287
|
-
id: '1'
|
|
288
|
-
}, {
|
|
289
|
-
value: '<div>12</div>',
|
|
290
|
-
id: '2'
|
|
291
|
-
}];
|
|
292
|
-
var visibleChoices = wrapper({
|
|
293
|
-
duplicates: false,
|
|
294
|
-
model: {
|
|
295
|
-
choices: choices,
|
|
296
|
-
correctResponse: {
|
|
297
|
-
0: '0',
|
|
298
|
-
1: '1'
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}).instance().getVisibleChoices();
|
|
302
|
-
expect(visibleChoices).toEqual([{
|
|
303
|
-
value: '<div>12</div>',
|
|
304
|
-
id: '2'
|
|
305
|
-
}]);
|
|
306
|
-
});
|
|
307
|
-
it('duplicates = false, empty correctResponse', function () {
|
|
308
|
-
var choices = [{
|
|
309
|
-
value: '<div>6</div>',
|
|
310
|
-
id: '0'
|
|
311
|
-
}, {
|
|
312
|
-
value: '<div>9</div>',
|
|
313
|
-
id: '1'
|
|
314
|
-
}, {
|
|
315
|
-
value: '<div>12</div>',
|
|
316
|
-
id: '2'
|
|
317
|
-
}];
|
|
318
|
-
var visibleChoices = wrapper({
|
|
319
|
-
duplicates: false,
|
|
320
|
-
model: {
|
|
321
|
-
choices: choices,
|
|
322
|
-
correctResponse: {}
|
|
323
|
-
}
|
|
324
|
-
}).instance().getVisibleChoices();
|
|
325
|
-
expect(visibleChoices).toEqual(choices);
|
|
326
|
-
});
|
|
327
|
-
it('duplicates = false, correctResponse = null', function () {
|
|
328
|
-
var choices = [{
|
|
329
|
-
value: '<div>6</div>',
|
|
330
|
-
id: '0'
|
|
331
|
-
}, {
|
|
332
|
-
value: '<div>9</div>',
|
|
333
|
-
id: '1'
|
|
334
|
-
}, {
|
|
335
|
-
value: '<div>12</div>',
|
|
336
|
-
id: '2'
|
|
337
|
-
}];
|
|
338
|
-
var visibleChoices = wrapper({
|
|
339
|
-
duplicates: false,
|
|
340
|
-
model: {
|
|
341
|
-
choices: choices,
|
|
342
|
-
correctResponse: null
|
|
343
|
-
}
|
|
344
|
-
}).instance().getVisibleChoices();
|
|
345
|
-
expect(visibleChoices).toEqual(choices);
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
});
|
|
350
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vY2hvaWNlcy50ZXN0LmpzeCJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImNob2ljZVV0aWxzIiwiZmlyc3RBdmFpbGFibGVJbmRleCIsImZuIiwic2V0dGluZ3MiLCJQYW5lbCIsInByb3BzIiwidG9nZ2xlIiwicmFkaW8iLCJkcm9wZG93biIsImxheW91dCIsIkNvbmZpZ0xheW91dCIsImNoaWxkcmVuIiwibW9kZWwiLCJtYXJrdXAiLCJwcm9tcHQiLCJjaG9pY2VzIiwidmFsdWUiLCJpZCIsImNob2ljZXNQb3NpdGlvbiIsImNvcnJlY3RSZXNwb25zZSIsImR1cGxpY2F0ZXMiLCJhbHRlcm5hdGVSZXNwb25zZXMiLCJyYXRpb25hbGUiLCJwcmVwYXJlTW9kZWwiLCJqb2luZWRPYmoiLCJzZW5zaWJsZURlZmF1bHRzIiwic2xhdGVNYXJrdXAiLCJwcm9jZXNzZWRNYXJrdXAiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiYmVmb3JlRWFjaCIsIndyYXBwZXIiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJkaXNhYmxlTGlmZWN5Y2xlTWV0aG9kcyIsIml0IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwidyIsImluc3RhbmNlIiwib25DaG9pY2VDaGFuZ2VkIiwidG9CZUNhbGxlZFdpdGgiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJqc2RvbUFsZXJ0Iiwid2luZG93IiwiYWxlcnQiLCJub3QiLCJ0b0JlQ2FsbGVkIiwib25DaG9pY2VGb2N1cyIsInN0YXRlIiwiZm9jdXNlZEVsIiwidG9FcXVhbCIsIm9uQWRkQ2hvaWNlIiwib25DaG9pY2VSZW1vdmUiLCJpbml0aWFsV3JhcHBlciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwidXBkYXRlZENob2ljZXMiLCJ3cmFwcGVyV2l0aFVwZGF0ZWRTdGF0ZSIsInRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCIsInZpc2libGVDaG9pY2VzIiwiZ2V0VmlzaWJsZUNo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QUFPLENBQUM7QUFDN0JYLFVBQUFBLFVBQVUsRUFBRSxLQURpQjtBQUU3QlIsVUFBQUEsS0FBSyxFQUFFO0FBQ0xHLFlBQUFBLE9BQU8sRUFBRUEsT0FESjtBQUVMSSxZQUFBQSxlQUFlLEVBQUU7QUFGWjtBQUZzQixTQUFELENBQVAsQ0FPcEJxQixRQVBvQixHQVFwQnFCLGlCQVJvQixFQUF2QjtBQVVBeEIsUUFBQUEsTUFBTSxDQUFDdUIsY0FBRCxDQUFOLENBQXVCUixPQUF2QixDQUErQnJDLE9BQS9CO0FBQ0QsT0FqQkMsQ0FBRjtBQWtCRCxLQTFGTyxDQUFSO0FBMkZELEdBbk9PLENBQVI7QUFvT0QsQ0FsUU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgQ2hvaWNlcyB9IGZyb20gJy4uL2Nob2ljZXMnO1xuaW1wb3J0IHNlbnNpYmxlRGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMnO1xuaW1wb3J0IHsgY3JlYXRlU2xhdGVNYXJrdXAsIHByb2Nlc3NNYXJrdXAgfSBmcm9tICcuLi9tYXJrdXBVdGlscyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgY2hvaWNlVXRpbHM6IHtcbiAgICBmaXJzdEF2YWlsYWJsZUluZGV4OiBqZXN0LmZuKCksXG4gIH0sXG4gIHNldHRpbmdzOiB7XG4gICAgUGFuZWw6IChwcm9wcykgPT4gPGRpdiB7Li4ucHJvcHN9IC8+LFxuICAgIHRvZ2dsZTogamVzdC5mbigpLFxuICAgIHJhZGlvOiBqZXN0LmZuKCksXG4gICAgZHJvcGRvd246IGplc3QuZm4oKSxcbiAgfSxcbiAgbGF5b3V0OiB7XG4gICAgQ29uZmlnTGF5b3V0OiAocHJvcHMpID0+IDxkaXY+e3Byb3BzLmNoaWxkcmVufTwvZGl2PixcbiAgfSxcbn0pKTtcblxuY29uc3QgbW9kZWwgPSB7XG4gIG1hcmt1cDogJ3t7MH19ICsge3sxfX0gPSAxNScsXG4gIHByb21wdDogJzxwPlNvbHZlIHRoZSBlcXVhdGlvbiBiZWxvdy48L3A+JyxcbiAgY2hvaWNlczogW1xuICAgIHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgeyB2YWx1ZTogJzxkaXY+OTwvZGl2PicsIGlkOiAnMScgfSxcbiAgICB7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfSxcbiAgXSxcbiAgY2hvaWNlc1Bvc2l0aW9uOiAnYmVsb3cnLFxuICBjb3JyZWN0UmVzcG9uc2U6IHtcbiAgICAwOiAnMCcsXG4gICAgMTogJzEnLFxuICB9LFxuICBkdXBsaWNhdGVzOiB0cnVlLFxuICBhbHRlcm5hdGVSZXNwb25zZXM6IFtbJzEnXSwgWycwJ11dLFxuICByYXRpb25hbGU6XG4gICAgJzxwPkEgY29ycmVjdCByZXNwb25zZSBpcyBzaG93biBiZWxvdzo8L3A+PHVsPjxsaT4yLzYgPSAxLzM8L2xpPjxsaT40LzggPSAxLzI8L2xpPjxsaT42LzEwID0gMy81PC9saT48bGk+OS8xMiA9IDMvNDwvbGk+PC91bD4nLFxufTtcblxuY29uc3QgcHJlcGFyZU1vZGVsID0gKG1vZGVsID0ge30pID0+IHtcbiAgY29uc3Qgam9pbmVkT2JqID0ge1xuICAgIC4uLnNlbnNpYmxlRGVmYXVsdHMubW9kZWwsXG4gICAgLi4ubW9kZWwsXG4gIH07XG4gIGNvbnN0IHNsYXRlTWFya3VwID1cbiAgICBtb2RlbC5zbGF0ZU1hcmt1cCB8fCBjcmVhdGVTbGF0ZU1hcmt1cChqb2luZWRPYmoubWFya3VwLCBqb2luZWRPYmouY2hvaWNlcywgam9pbmVkT2JqLmNvcnJlY3RSZXNwb25zZSk7XG4gIGNvbnN0IHByb2Nlc3NlZE1hcmt1cCA9IHByb2Nlc3NNYXJrdXAoc2xhdGVNYXJrdXApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uam9pbmVkT2JqLFxuICAgIHNsYXRlTWFya3VwLFxuICAgIG1hcmt1cDogcHJvY2Vzc2VkTWFya3VwLm1hcmt1cCxcbiAgICBjb3JyZWN0UmVzcG9uc2U6IHByb2Nlc3NlZE1hcmt1cC5jb3JyZWN0UmVzcG9uc2UsXG4gIH07XG59O1xuXG5kZXNjcmliZSgnQ2hvaWNlcycsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICB9KTtcblxuICBjb25zdCB3cmFwcGVyID0gKGV4dHJhcykgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgb25DaGFuZ2UsXG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIG1vZGVsOiBwcmVwYXJlTW9kZWwobW9kZWwpLFxuICAgICAgZHVwbGljYXRlczogdHJ1ZSxcbiAgICAgIC4uLmV4dHJhcyxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cyB9O1xuXG4gICAgcmV0dXJuIHNoYWxsb3coPENob2ljZXMgey4uLnByb3BzfSAvPiwgeyBkaXNhYmxlTGlmZWN5Y2xlTWV0aG9kczogdHJ1ZSB9KTtcbiAgfTtcblxuICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkdXBsaWNhdGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdyYXBwZXIoKSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRob3V0IGR1cGxpY2F0ZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qod3JhcHBlcih7IGR1cGxpY2F0ZXM6IGZhbHNlIH0pKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgIGxldCB3O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICB3ID0gd3JhcHBlcigpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hvaWNlQ2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGl0KCdyZW1vdmVzIGEgY2hvaWNlIGlmIGl0cyBuZXcgdmFsdWUgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNob2ljZUNoYW5nZWQoJzxkaXY+MTI8L2Rpdj4nLCAnJywgJzInKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvQmVDYWxsZWRXaXRoKFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2Pjk8L2Rpdj4nLCBpZDogJzEnIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCBhZGQgbmV3IGNob2ljZSBpZiBpdCBpcyBpZGVudGljYWwgdG8gYW5vdGhlciBjaG9pY2UnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNob2ljZUNoYW5nZWQoJycsICc8ZGl2Pjk8L2Rpdj4nLCAnMicpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9CZUNhbGxlZFdpdGgoW1xuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+OTwvZGl2PicsIGlkOiAnMScgfSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IGNoYW5nZSBjaG9pY2UgaWYgaXQgd291bGQgYmUgaWRlbnRpY2FsIHRvIGFub3RoZXIgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaG9pY2VDaGFuZ2VkKCc8ZGl2PjY8L2Rpdj4nLCAnPGRpdj45PC9kaXY+JywgJzAnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygwKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgcmVtb3ZlIGEgY2hvaWNlIGlmIGl0cyBuZXcgdmFsdWUgaXMgZW1wdHksIGJ1dCBpcyB1c2VkIGluIGNvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGpzZG9tQWxlcnQgPSB3aW5kb3cuYWxlcnQ7IC8vIHJlbWVtYmVyIHRoZSBqc2RvbSBhbGVydFxuXG4gICAgICAgIHdpbmRvdy5hbGVydCA9ICgpID0+IHt9O1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNob2ljZUNoYW5nZWQoJzxkaXY+OTwvZGl2PicsICcnLCAnMScpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkubm90LnRvQmVDYWxsZWQoKTtcblxuICAgICAgICB3aW5kb3cuYWxlcnQgPSBqc2RvbUFsZXJ0O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCByZW1vdmUgYSBjaG9pY2UgaWYgaXRzIG5ldyB2YWx1ZSBpcyBlbXB0eSwgYnV0IGlzIHVzZWQgaW4gYWx0ZXJuYXRlIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBqc2RvbUFsZXJ0ID0gd2luZG93LmFsZXJ0OyAvLyByZW1lbWJlciB0aGUganNkb20gYWxlcnRcblxuICAgICAgICB3aW5kb3cuYWxlcnQgPSAoKSA9PiB7fTtcblxuICAgICAgICB3cmFwcGVyKHsgbWFya3VwOiAne3swfX0nIH0pLmluc3RhbmNlKCkub25DaG9pY2VDaGFuZ2VkKCc8ZGl2Pjk8L2Rpdj4nLCAnJywgJzEnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLm5vdC50b0JlQ2FsbGVkKCk7XG5cbiAgICAgICAgd2luZG93LmFsZXJ0ID0ganNkb21BbGVydDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgcmVtb3ZlIGEgY2hvaWNlIGlmIGl0cyBuZXcgdmFsdWUgaXMgZW1wdHksIGJ1dCB0aGUgb2xkIHZhbHVlIHdhcyBlbXB0eSBhcyB3ZWxsIChhdCBmb2N1c2luZyBhIG5ldyBjaG9pY2Ugd2l0aG91dCBlZGl0aW5nKScsICgpID0+IHtcbiAgICAgICAgY29uc3QganNkb21BbGVydCA9IHdpbmRvdy5hbGVydDsgLy8gcmVtZW1iZXIgdGhlIGpzZG9tIGFsZXJ0XG5cbiAgICAgICAgd2luZG93LmFsZXJ0ID0gKCkgPT4ge307XG5cbiAgICAgICAgd3JhcHBlcih7IG1hcmt1cDogJ3t7MH19JyB9KS5pbnN0YW5jZSgpLm9uQ2hvaWNlQ2hhbmdlZCgnJywgJycsICcxJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9CZUNhbGxlZCgpO1xuXG4gICAgICAgIHdpbmRvdy5hbGVydCA9IGpzZG9tQWxlcnQ7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3VwZGF0ZXMgY2hvaWNlcycsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hvaWNlQ2hhbmdlZCgnPGRpdj45PC9kaXY+JywgJzxkaXY+MyozPC9kaXY+JywgJzEnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvQmVDYWxsZWRXaXRoKFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjMqMzwvZGl2PicsIGlkOiAnMScgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkNob2ljZUZvY3VzJywgKCkgPT4ge1xuICAgICAgaXQoJ3NldHMgZm9jdXNlZCBlbGVtZW50IGlkIG9uIHN0YXRlJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaG9pY2VGb2N1cygnMScpO1xuXG4gICAgICAgIGV4cGVjdCh3Lmluc3RhbmNlKCkuc3RhdGUuZm9jdXNlZEVsKS50b0VxdWFsKCcxJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkFkZENob2ljZScsICgpID0+IHtcbiAgICAgIGl0KCdhZGRzIGEgY2hvaWNlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyKCkuaW5zdGFuY2UoKS5vbkFkZENob2ljZSgpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9CZUNhbGxlZFdpdGgoWy4uLm1vZGVsLmNob2ljZXMsIHsgaWQ6ICczJywgdmFsdWU6ICcnIH1dKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hvaWNlUmVtb3ZlJywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbW92ZXMgYSBjaG9pY2UnLCAoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIoKS5pbnN0YW5jZSgpLm9uQ2hvaWNlUmVtb3ZlKCcxJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0JlQ2FsbGVkV2l0aChbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkNob2ljZVJlbW92ZSAmIG9uQWRkQ2hvaWNlJywgKCkgPT4ge1xuICAgICAgaXQoJ3ByZXZlbnRzIGR1cGxpY2F0ZSBJRHMgd2hlbiBhZGRpbmcgY2hvaWNlcyBhZnRlciByZW1vdmluZyBzb21lJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbml0aWFsV3JhcHBlciA9IHdyYXBwZXIoKTtcblxuICAgICAgICBpbml0aWFsV3JhcHBlci5pbnN0YW5jZSgpLm9uQ2hvaWNlUmVtb3ZlKCcxJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZENob2ljZXMgPSBbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfSxcbiAgICAgICAgXTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHdyYXBwZXJXaXRoVXBkYXRlZFN0YXRlID0gd3JhcHBlcih7XG4gICAgICAgICAgbW9kZWw6IHsgLi4ubW9kZWwsIGNob2ljZXM6IHVwZGF0ZWRDaG9pY2VzIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgd3JhcHBlcldpdGhVcGRhdGVkU3RhdGUuaW5zdGFuY2UoKS5vbkFkZENob2ljZSgpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICAgIHsgaWQ6ICczJywgdmFsdWU6ICcnIH1cbiAgICAgICAgXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRWaXNpYmxlQ2hvaWNlcycsICgpID0+IHtcbiAgICAgIGl0KCdjaG9pY2VzIGFyZSBudWxsID0+IHJldHVybnMgW10nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gd3JhcHBlcih7IG1vZGVsOiB7IGNob2ljZXM6IG51bGwgfSB9KVxuICAgICAgICAgIC5pbnN0YW5jZSgpXG4gICAgICAgICAgLmdldFZpc2libGVDaG9pY2VzKCk7XG5cbiAgICAgICAgZXhwZWN0KHZpc2libGVDaG9pY2VzKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZHVwbGljYXRlcyA9IHRydWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj45PC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHdyYXBwZXIoe1xuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICBkdXBsaWNhdGVzOiB0cnVlLFxuICAgICAgICAgICAgY2hvaWNlczogY2hvaWNlcyxcbiAgICAgICAgICAgIGNvcnJlY3RSZXNwb25zZToge1xuICAgICAgICAgICAgICAwOiAnMCcsXG4gICAgICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAuaW5zdGFuY2UoKVxuICAgICAgICAgIC5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuXG4gICAgICAgIGV4cGVjdCh2aXNpYmxlQ2hvaWNlcykudG9FcXVhbChjaG9pY2VzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZHVwbGljYXRlcyA9IGZhbHNlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gW1xuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+OTwvZGl2PicsIGlkOiAnMScgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNob2ljZXMgPSB3cmFwcGVyKHtcbiAgICAgICAgICBkdXBsaWNhdGVzOiBmYWxzZSxcbiAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgY2hvaWNlczogY2hvaWNlcyxcbiAgICAgICAgICAgIGNvcnJlY3RSZXNwb25zZToge1xuICAgICAgICAgICAgICAwOiAnMCcsXG4gICAgICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAuaW5zdGFuY2UoKVxuICAgICAgICAgIC5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuXG4gICAgICAgIGV4cGVjdCh2aXNpYmxlQ2hvaWNlcykudG9FcXVhbChbeyB2YWx1ZTogJzxkaXY+MTI8L2Rpdj4nLCBpZDogJzInIH1dKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZHVwbGljYXRlcyA9IGZhbHNlLCBlbXB0eSBjb3JyZWN0UmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj45PC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHdyYXBwZXIoe1xuICAgICAgICAgIGR1cGxpY2F0ZXM6IGZhbHNlLFxuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgY29ycmVjdFJlc3BvbnNlOiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAgIC5pbnN0YW5jZSgpXG4gICAgICAgICAgLmdldFZpc2libGVDaG9pY2VzKCk7XG5cbiAgICAgICAgZXhwZWN0KHZpc2libGVDaG9pY2VzKS50b0VxdWFsKGNob2ljZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkdXBsaWNhdGVzID0gZmFsc2UsIGNvcnJlY3RSZXNwb25zZSA9IG51bGwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj45PC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHdyYXBwZXIoe1xuICAgICAgICAgIGR1cGxpY2F0ZXM6IGZhbHNlLFxuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgY29ycmVjdFJlc3BvbnNlOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgICAgLmluc3RhbmNlKClcbiAgICAgICAgICAuZ2V0VmlzaWJsZUNob2ljZXMoKTtcblxuICAgICAgICBleHBlY3QodmlzaWJsZUNob2ljZXMpLnRvRXF1YWwoY2hvaWNlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|