@pie-lib/editable-html 12.1.0-next.0 → 12.1.0-next.2

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 (121) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/package.json +7 -7
  3. package/lib/__tests__/editor-utils.test.js +0 -164
  4. package/lib/__tests__/serialization.test.js +0 -242
  5. package/lib/__tests__/utils.js +0 -79
  6. package/lib/block-tags.js +0 -24
  7. package/lib/block-tags.js.map +0 -1
  8. package/lib/constants.js +0 -11
  9. package/lib/constants.js.map +0 -1
  10. package/lib/editor.js +0 -1224
  11. package/lib/editor.js.map +0 -1
  12. package/lib/index.js +0 -208
  13. package/lib/index.js.map +0 -1
  14. package/lib/parse-html.js +0 -16
  15. package/lib/parse-html.js.map +0 -1
  16. package/lib/plugins/characters/custom-popper.js +0 -57
  17. package/lib/plugins/characters/custom-popper.js.map +0 -1
  18. package/lib/plugins/characters/index.js +0 -265
  19. package/lib/plugins/characters/index.js.map +0 -1
  20. package/lib/plugins/characters/utils.js +0 -378
  21. package/lib/plugins/characters/utils.js.map +0 -1
  22. package/lib/plugins/css/icons/index.js +0 -25
  23. package/lib/plugins/css/icons/index.js.map +0 -1
  24. package/lib/plugins/css/index.js +0 -338
  25. package/lib/plugins/css/index.js.map +0 -1
  26. package/lib/plugins/customPlugin/index.js +0 -98
  27. package/lib/plugins/customPlugin/index.js.map +0 -1
  28. package/lib/plugins/html/icons/index.js +0 -30
  29. package/lib/plugins/html/icons/index.js.map +0 -1
  30. package/lib/plugins/html/index.js +0 -71
  31. package/lib/plugins/html/index.js.map +0 -1
  32. package/lib/plugins/image/__tests__/component.test.js +0 -96
  33. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -131
  34. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -22
  35. package/lib/plugins/image/__tests__/index.test.js +0 -90
  36. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -112
  37. package/lib/plugins/image/__tests__/mock-change.js +0 -22
  38. package/lib/plugins/image/alt-dialog.js +0 -100
  39. package/lib/plugins/image/alt-dialog.js.map +0 -1
  40. package/lib/plugins/image/component.js +0 -343
  41. package/lib/plugins/image/component.js.map +0 -1
  42. package/lib/plugins/image/image-toolbar.js +0 -137
  43. package/lib/plugins/image/image-toolbar.js.map +0 -1
  44. package/lib/plugins/image/index.js +0 -223
  45. package/lib/plugins/image/index.js.map +0 -1
  46. package/lib/plugins/image/insert-image-handler.js +0 -140
  47. package/lib/plugins/image/insert-image-handler.js.map +0 -1
  48. package/lib/plugins/index.js +0 -342
  49. package/lib/plugins/index.js.map +0 -1
  50. package/lib/plugins/list/__tests__/index.test.js +0 -64
  51. package/lib/plugins/list/index.js +0 -288
  52. package/lib/plugins/list/index.js.map +0 -1
  53. package/lib/plugins/math/__tests__/index.test.js +0 -284
  54. package/lib/plugins/math/index.js +0 -402
  55. package/lib/plugins/math/index.js.map +0 -1
  56. package/lib/plugins/media/__tests__/index.test.js +0 -69
  57. package/lib/plugins/media/index.js +0 -330
  58. package/lib/plugins/media/index.js.map +0 -1
  59. package/lib/plugins/media/media-dialog.js +0 -594
  60. package/lib/plugins/media/media-dialog.js.map +0 -1
  61. package/lib/plugins/media/media-toolbar.js +0 -76
  62. package/lib/plugins/media/media-toolbar.js.map +0 -1
  63. package/lib/plugins/media/media-wrapper.js +0 -64
  64. package/lib/plugins/media/media-wrapper.js.map +0 -1
  65. package/lib/plugins/rendering/index.js +0 -36
  66. package/lib/plugins/rendering/index.js.map +0 -1
  67. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -271
  68. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +0 -1
  69. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -55
  70. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +0 -1
  71. package/lib/plugins/respArea/drag-in-the-blank/utils.js +0 -38
  72. package/lib/plugins/respArea/drag-in-the-blank/utils.js.map +0 -1
  73. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -50
  74. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +0 -1
  75. package/lib/plugins/respArea/icons/index.js +0 -72
  76. package/lib/plugins/respArea/icons/index.js.map +0 -1
  77. package/lib/plugins/respArea/index.js +0 -287
  78. package/lib/plugins/respArea/index.js.map +0 -1
  79. package/lib/plugins/respArea/inline-dropdown/index.js +0 -67
  80. package/lib/plugins/respArea/inline-dropdown/index.js.map +0 -1
  81. package/lib/plugins/respArea/math-templated/index.js +0 -112
  82. package/lib/plugins/respArea/math-templated/index.js.map +0 -1
  83. package/lib/plugins/respArea/utils.js +0 -95
  84. package/lib/plugins/respArea/utils.js.map +0 -1
  85. package/lib/plugins/table/CustomTablePlugin.js +0 -116
  86. package/lib/plugins/table/CustomTablePlugin.js.map +0 -1
  87. package/lib/plugins/table/__tests__/index.test.js +0 -416
  88. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -81
  89. package/lib/plugins/table/icons/index.js +0 -55
  90. package/lib/plugins/table/icons/index.js.map +0 -1
  91. package/lib/plugins/table/index.js +0 -413
  92. package/lib/plugins/table/index.js.map +0 -1
  93. package/lib/plugins/table/table-toolbar.js +0 -138
  94. package/lib/plugins/table/table-toolbar.js.map +0 -1
  95. package/lib/plugins/textAlign/icons/index.js +0 -187
  96. package/lib/plugins/textAlign/icons/index.js.map +0 -1
  97. package/lib/plugins/textAlign/index.js +0 -26
  98. package/lib/plugins/textAlign/index.js.map +0 -1
  99. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -154
  100. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -47
  101. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -112
  102. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -118
  103. package/lib/plugins/toolbar/default-toolbar.js +0 -180
  104. package/lib/plugins/toolbar/default-toolbar.js.map +0 -1
  105. package/lib/plugins/toolbar/done-button.js +0 -35
  106. package/lib/plugins/toolbar/done-button.js.map +0 -1
  107. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -258
  108. package/lib/plugins/toolbar/editor-and-toolbar.js.map +0 -1
  109. package/lib/plugins/toolbar/index.js +0 -29
  110. package/lib/plugins/toolbar/index.js.map +0 -1
  111. package/lib/plugins/toolbar/toolbar-buttons.js +0 -145
  112. package/lib/plugins/toolbar/toolbar-buttons.js.map +0 -1
  113. package/lib/plugins/toolbar/toolbar.js +0 -307
  114. package/lib/plugins/toolbar/toolbar.js.map +0 -1
  115. package/lib/plugins/utils.js +0 -42
  116. package/lib/plugins/utils.js.map +0 -1
  117. package/lib/serialization.js +0 -571
  118. package/lib/serialization.js.map +0 -1
  119. package/lib/shared/alert-dialog.js +0 -68
  120. package/lib/theme.js +0 -8
  121. package/lib/theme.js.map +0 -1
@@ -1,284 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
- var _react = _interopRequireDefault(require("react"));
7
- var _debug = _interopRequireDefault(require("debug"));
8
- var _mockChange = _interopRequireDefault(require("../../image/__tests__/mock-change"));
9
- var _slate = require("slate");
10
- var _index = _interopRequireWildcard(require("../index"));
11
- var _react2 = require("@testing-library/react");
12
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
13
- 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; }
14
- 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; }
15
- jest.mock('@pie-framework/mathquill', function () {
16
- return {
17
- StaticMath: jest.fn(),
18
- getInterface: jest.fn().mockReturnThis(),
19
- registerEmbed: jest.fn()
20
- };
21
- });
22
- var mockMathToolbarOnChange;
23
- var mockMathToolbarOnDone;
24
- jest.mock('@pie-lib/math-toolbar', function () {
25
- return {
26
- MathPreview: function MathPreview() {
27
- return /*#__PURE__*/_react["default"].createElement("div", {
28
- "data-testid": "math-preview"
29
- });
30
- },
31
- MathToolbar: function MathToolbar(props) {
32
- // Store callbacks for testing
33
- mockMathToolbarOnChange = props.onChange;
34
- mockMathToolbarOnDone = props.onDone;
35
- return /*#__PURE__*/_react["default"].createElement("div", {
36
- "data-testid": "math-toolbar",
37
- role: "toolbar"
38
- }, /*#__PURE__*/_react["default"].createElement("button", {
39
- "data-testid": "toolbar-change",
40
- onClick: function onClick() {
41
- return props.onChange && props.onChange('test-latex');
42
- }
43
- }, "Change"), /*#__PURE__*/_react["default"].createElement("button", {
44
- "data-testid": "toolbar-done",
45
- onClick: function onClick() {
46
- return props.onDone && props.onDone('test-latex');
47
- }
48
- }, "Done"));
49
- }
50
- };
51
- });
52
- jest.mock('@pie-lib/math-rendering', function () {
53
- return _objectSpread(_objectSpread({}, jest.requireActual('@pie-lib/math-rendering')), {}, {
54
- mmlToLatex: jest.fn(function () {
55
- return '/foobar/latex';
56
- })
57
- });
58
- });
59
- var log = (0, _debug["default"])('@pie-lib:editable-html:test:math');
60
-
61
- // I believe @andrei is moving this stuff out.
62
- describe('MathPlugin', function () {
63
- describe('toolbar', function () {
64
- describe('onClick', function () {
65
- var plugin, mockChange, value, onChange;
66
- beforeEach(function () {
67
- plugin = (0, _index["default"])({});
68
- mockChange = new _mockChange["default"]();
69
- value = {
70
- change: jest.fn(function () {
71
- return mockChange;
72
- })
73
- };
74
- onChange = jest.fn();
75
- plugin.toolbar.onClick(value, onChange);
76
- });
77
- test('calls insertInline', function () {
78
- expect(mockChange.insertInline).toBeCalledWith(expect.objectContaining({
79
- data: (0, _index.inlineMath)().data
80
- }));
81
- });
82
- test('it calls onChange', function () {
83
- expect(onChange).toHaveBeenCalledWith(mockChange);
84
- });
85
- });
86
- });
87
- describe('renderNode', function () {
88
- test('the component has props', function () {
89
- var plugin = (0, _index["default"])({});
90
- var _plugin$renderNode = plugin.renderNode({
91
- node: {
92
- type: 'math'
93
- }
94
- }),
95
- props = _plugin$renderNode.props;
96
- expect(props.node).toEqual({
97
- type: 'math'
98
- });
99
- });
100
- });
101
- describe('serialization', function () {
102
- describe('deserialize', function () {
103
- var assertDeserialize = function assertDeserialize(html, expected, wrapType) {
104
- it("innerHTML: ".concat(html, " is deserialized to: ").concat(expected, " with wrapType: ").concat(wrapType), function () {
105
- var el = {
106
- tagName: 'span',
107
- childNodes: [],
108
- getAttribute: jest.fn(function () {
109
- return '';
110
- }),
111
- hasAttribute: jest.fn(function () {
112
- return true;
113
- }),
114
- innerHTML: html
115
- };
116
- var next = jest.fn();
117
- var out = _index.serialization.deserialize(el, next);
118
- expect(out).toEqual({
119
- object: 'inline',
120
- type: 'math',
121
- isVoid: true,
122
- nodes: [],
123
- data: {
124
- latex: expected,
125
- wrapper: wrapType
126
- }
127
- });
128
- });
129
- };
130
- assertDeserialize('$$&lt;$$', '<', _index["default"].DOLLAR);
131
- assertDeserialize('$&lt;$', '<', _index["default"].DOLLAR);
132
- assertDeserialize('\\(&lt;\\)', '<', _index["default"].ROUND_BRACKETS);
133
- assertDeserialize('\\[&lt;\\]', '<', _index["default"].ROUND_BRACKETS);
134
- assertDeserialize('latex', 'latex', _index["default"].ROUND_BRACKETS);
135
- assertDeserialize('\\displaystyle foo', 'foo', _index["default"].ROUND_BRACKETS);
136
- it('should make mathml editable if MathPlugin.mathMlOptions.mmlEditing is true', function () {
137
- _index["default"].mathMlOptions.mmlEditing = true;
138
- var el = {
139
- tagName: 'math',
140
- outerHTML: '<math xmlns="http://www.w3.org/1998/Math/MathML"> <mn>2</mn> <mi>x</mi> <mtext>&#xA0;</mtext> <mo>&#x2264;</mo> <mn>4</mn> <mi>y</mi> <mtext>&#xA0;</mtext> <mo>+</mo> <mtext>&#xA0;</mtext> <mn>8</mn> <msqrt> <mi>h</mi> </msqrt></math>'
141
- };
142
- var next = jest.fn();
143
- var out = _index.serialization.deserialize(el, next);
144
- expect(out).toEqual({
145
- object: 'inline',
146
- type: 'math',
147
- isVoid: true,
148
- nodes: [],
149
- data: {
150
- latex: '/foobar/latex',
151
- wrapper: 'round_brackets'
152
- }
153
- });
154
- });
155
- it('should make mathml readOnly if MathPlugin.mathMlOptions.mmlEditing is false', function () {
156
- _index["default"].mathMlOptions.mmlEditing = false;
157
- var el = {
158
- tagName: 'math',
159
- outerHTML: '<math xmlns="http://www.w3.org/1998/Math/MathML"> <mn>2</mn> <mi>x</mi> <mtext>&#xA0;</mtext> <mo>&#x2264;</mo> <mn>4</mn> <mi>y</mi> <mtext>&#xA0;</mtext> <mo>+</mo> <mtext>&#xA0;</mtext> <mn>8</mn> <msqrt> <mi>h</mi> </msqrt></math>'
160
- };
161
- var next = jest.fn();
162
- var out = _index.serialization.deserialize(el, next);
163
- expect(out).toEqual({
164
- object: 'inline',
165
- isVoid: true,
166
- type: 'mathml',
167
- data: {
168
- html: el.outerHTML
169
- }
170
- });
171
- });
172
- });
173
- describe('serialize', function () {
174
- var assertSerialize = function assertSerialize(latex, expectedHtml, wrapper) {
175
- wrapper = wrapper || _index["default"].ROUND_BRACKETS;
176
- it("".concat(latex, " is serialized to: ").concat(expectedHtml), function () {
177
- var object = {
178
- kind: 'inline',
179
- type: 'math',
180
- isVoid: true,
181
- nodes: [],
182
- data: _slate.Data.create({
183
- latex: latex,
184
- wrapper: wrapper
185
- })
186
- };
187
- var children = [];
188
- var out = _index.serialization.serialize(object, children);
189
- log('out: ', out);
190
- expect(out).toEqual(/*#__PURE__*/_react["default"].createElement("span", {
191
- "data-latex": "",
192
- "data-raw": latex
193
- }, expectedHtml));
194
- });
195
- };
196
- assertSerialize('latex', '\\(latex\\)', _index["default"].ROUND_BRACKETS);
197
- assertSerialize('latex', '\\(latex\\)', _index["default"].SQUARE_BRACKETS);
198
- assertSerialize('latex', '$latex$', _index["default"].DOLLAR);
199
- assertSerialize('latex', '$latex$', _index["default"].DOUBLE_DOLLAR);
200
-
201
- /**
202
- * Note that when this is converted to html it get's escaped - but that's an issue with the slate html-serializer.
203
- */
204
- assertSerialize('<', '\\(<\\)');
205
- assertSerialize('x<y', '\\(x<y\\)');
206
- });
207
- });
208
- });
209
- describe('CustomToolbarComp', function () {
210
- var onDataChange;
211
- var onToolbarDone;
212
- var renderComponent = function renderComponent() {
213
- var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
214
- var mockChange = new _mockChange["default"]();
215
- var defaults = {
216
- node: {
217
- key: '1',
218
- data: _slate.Data.create({
219
- latex: 'foo'
220
- }),
221
- equals: function equals() {
222
- return true;
223
- }
224
- },
225
- value: {
226
- document: {
227
- getNextText: jest.fn().mockReturnValue({
228
- key: 'nt'
229
- })
230
- },
231
- change: jest.fn().mockReturnValue(mockChange)
232
- },
233
- onDataChange: onDataChange,
234
- onToolbarDone: onToolbarDone
235
- };
236
- var props = _objectSpread(_objectSpread({}, defaults), extras);
237
- return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.CustomToolbarComp, props));
238
- };
239
- describe('render', function () {
240
- it('renders toolbar without default keypadMode', function () {
241
- renderComponent();
242
-
243
- // Verify the toolbar is rendered
244
- expect(_react2.screen.getByTestId('math-toolbar')).toBeInTheDocument();
245
- expect(_react2.screen.getByRole('toolbar')).toBeInTheDocument();
246
- });
247
- it('renders toolbar with default keypadMode', function () {
248
- renderComponent({
249
- pluginProps: {
250
- math: {
251
- keypadMode: 'geometry'
252
- }
253
- }
254
- });
255
-
256
- // Verify the toolbar is rendered with keypadMode prop
257
- expect(_react2.screen.getByTestId('math-toolbar')).toBeInTheDocument();
258
- expect(_react2.screen.getByRole('toolbar')).toBeInTheDocument();
259
- });
260
- });
261
- describe('onDone', function () {
262
- it('calls onToolbarDone when done callback is triggered', function () {
263
- onToolbarDone = jest.fn();
264
- renderComponent();
265
-
266
- // Trigger the onDone callback that was passed to MathToolbar
267
- mockMathToolbarOnDone('oo');
268
- expect(onToolbarDone).toHaveBeenCalledWith(expect.anything(), false);
269
- });
270
- });
271
- describe('onChange', function () {
272
- it('calls onDataChange when change callback is triggered', function () {
273
- onDataChange = jest.fn();
274
- renderComponent();
275
-
276
- // Trigger the onChange callback that was passed to MathToolbar
277
- mockMathToolbarOnChange('oo');
278
- expect(onDataChange).toHaveBeenCalledWith('1', {
279
- latex: 'oo'
280
- });
281
- });
282
- });
283
- });
284
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9kZWJ1ZyIsIl9tb2NrQ2hhbmdlIiwiX3NsYXRlIiwiX2luZGV4IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfcmVhY3QyIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImplc3QiLCJtb2NrIiwiU3RhdGljTWF0aCIsImZuIiwiZ2V0SW50ZXJmYWNlIiwibW9ja1JldHVyblRoaXMiLCJyZWdpc3RlckVtYmVkIiwibW9ja01hdGhUb29sYmFyT25DaGFuZ2UiLCJtb2NrTWF0aFRvb2xiYXJPbkRvbmUiLCJNYXRoUHJldmlldyIsImNyZWF0ZUVsZW1lbnQiLCJNYXRoVG9vbGJhciIsInByb3BzIiwib25DaGFuZ2UiLCJvbkRvbmUiLCJyb2xlIiwib25DbGljayIsInJlcXVpcmVBY3R1YWwiLCJtbWxUb0xhdGV4IiwibG9nIiwiZGVidWciLCJkZXNjcmliZSIsInBsdWdpbiIsIm1vY2tDaGFuZ2UiLCJ2YWx1ZSIsImJlZm9yZUVhY2giLCJNYXRoUGx1Z2luIiwiTW9ja0NoYW5nZSIsImNoYW5nZSIsInRvb2xiYXIiLCJ0ZXN0IiwiZXhwZWN0IiwiaW5zZXJ0SW5saW5lIiwidG9CZUNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwiZGF0YSIsImlubGluZU1hdGgiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIl9wbHVnaW4kcmVuZGVyTm9kZSIsInJlbmRlck5vZGUiLCJub2RlIiwidHlwZSIsInRvRXF1YWwiLCJhc3NlcnREZXNlcmlhbGl6ZSIsImh0bWwiLCJleHBlY3RlZCIsIndyYXBUeXBlIiwiaXQiLCJjb25jYXQiLCJlbCIsInRhZ05hbWUiLCJjaGlsZE5vZGVzIiwiZ2V0QXR0cmlidXRlIiwiaGFzQXR0cmlidXRlIiwiaW5uZXJIVE1MIiwibmV4dCIsIm91dCIsInNlcmlhbGl6YXRpb24iLCJkZXNlcmlhbGl6ZSIsIm9iamVjdCIsImlzVm9pZCIsIm5vZGVzIiwibGF0ZXgiLCJ3cmFwcGVyIiwiRE9MTEFSIiwiUk9VTkRfQlJBQ0tFVFMiLCJtYXRoTWxPcHRpb25zIiwibW1sRWRpdGluZyIsIm91dGVySFRNTCIsImFzc2VydFNlcmlhbGl6ZSIsImV4cGVjdGVkSHRtbCIsImtpbmQiLCJEYXRhIiwiY3JlYXRlIiwiY2hpbGRyZW4iLCJzZXJpYWxpemUiLCJTUVVBUkVfQlJBQ0tFVFMiLCJET1VCTEVfRE9MTEFSIiwib25EYXRhQ2hhbmdlIiwib25Ub29sYmFyRG9uZSIsInJlbmRlckNvbXBvbmVudCIsImV4dHJhcyIsInVuZGVmaW5lZCIsImRlZmF1bHRzIiwia2V5IiwiZXF1YWxzIiwiZG9jdW1lbnQiLCJnZXROZXh0VGV4dCIsIm1vY2tSZXR1cm5WYWx1ZSIsInJlbmRlciIsIkN1c3RvbVRvb2xiYXJDb21wIiwic2NyZWVuIiwiZ2V0QnlUZXN0SWQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsImdldEJ5Um9sZSIsInBsdWdpblByb3BzIiwibWF0aCIsImtleXBhZE1vZGUiLCJhbnl0aGluZyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW5zL21hdGgvX190ZXN0c19fL2luZGV4LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IE1vY2tDaGFuZ2UgZnJvbSAnLi4vLi4vaW1hZ2UvX190ZXN0c19fL21vY2stY2hhbmdlJztcbmltcG9ydCB7IERhdGEgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgTWF0aFBsdWdpbiwgeyBzZXJpYWxpemF0aW9uLCBpbmxpbmVNYXRoLCBDdXN0b21Ub29sYmFyQ29tcCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5cbmplc3QubW9jaygnQHBpZS1mcmFtZXdvcmsvbWF0aHF1aWxsJywgKCkgPT4gKHtcbiAgU3RhdGljTWF0aDogamVzdC5mbigpLFxuICBnZXRJbnRlcmZhY2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICByZWdpc3RlckVtYmVkOiBqZXN0LmZuKCksXG59KSk7XG5cbmxldCBtb2NrTWF0aFRvb2xiYXJPbkNoYW5nZTtcbmxldCBtb2NrTWF0aFRvb2xiYXJPbkRvbmU7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC10b29sYmFyJywgKCkgPT4gKHtcbiAgTWF0aFByZXZpZXc6ICgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtYXRoLXByZXZpZXdcIiAvPixcbiAgTWF0aFRvb2xiYXI6IChwcm9wcykgPT4ge1xuICAgIC8vIFN0b3JlIGNhbGxiYWNrcyBmb3IgdGVzdGluZ1xuICAgIG1vY2tNYXRoVG9vbGJhck9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2U7XG4gICAgbW9ja01hdGhUb29sYmFyT25Eb25lID0gcHJvcHMub25Eb25lO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwibWF0aC10b29sYmFyXCIgcm9sZT1cInRvb2xiYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cInRvb2xiYXItY2hhbmdlXCIgb25DbGljaz17KCkgPT4gcHJvcHMub25DaGFuZ2UgJiYgcHJvcHMub25DaGFuZ2UoJ3Rlc3QtbGF0ZXgnKX0+XG4gICAgICAgICAgQ2hhbmdlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdGlkPVwidG9vbGJhci1kb25lXCIgb25DbGljaz17KCkgPT4gcHJvcHMub25Eb25lICYmIHByb3BzLm9uRG9uZSgndGVzdC1sYXRleCcpfT5cbiAgICAgICAgICBEb25lXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLXJlbmRlcmluZycsICgpID0+ICh7XG4gIC4uLmplc3QucmVxdWlyZUFjdHVhbCgnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnKSxcbiAgbW1sVG9MYXRleDogamVzdC5mbigoKSA9PiB7XG4gICAgcmV0dXJuICcvZm9vYmFyL2xhdGV4JztcbiAgfSksXG59KSk7XG5jb25zdCBsb2cgPSBkZWJ1ZygnQHBpZS1saWI6ZWRpdGFibGUtaHRtbDp0ZXN0Om1hdGgnKTtcblxuLy8gSSBiZWxpZXZlIEBhbmRyZWkgaXMgbW92aW5nIHRoaXMgc3R1ZmYgb3V0LlxuZGVzY3JpYmUoJ01hdGhQbHVnaW4nLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd0b29sYmFyJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdvbkNsaWNrJywgKCkgPT4ge1xuICAgICAgbGV0IHBsdWdpbiwgbW9ja0NoYW5nZSwgdmFsdWUsIG9uQ2hhbmdlO1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHBsdWdpbiA9IE1hdGhQbHVnaW4oe30pO1xuICAgICAgICBtb2NrQ2hhbmdlID0gbmV3IE1vY2tDaGFuZ2UoKTtcbiAgICAgICAgdmFsdWUgPSB7XG4gICAgICAgICAgY2hhbmdlOiBqZXN0LmZuKCgpID0+IG1vY2tDaGFuZ2UpLFxuICAgICAgICB9O1xuICAgICAgICBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgICAgcGx1Z2luLnRvb2xiYXIub25DbGljayh2YWx1ZSwgb25DaGFuZ2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHRlc3QoJ2NhbGxzIGluc2VydElubGluZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KG1vY2tDaGFuZ2UuaW5zZXJ0SW5saW5lKS50b0JlQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGRhdGE6IGlubGluZU1hdGgoKS5kYXRhIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdpdCBjYWxscyBvbkNoYW5nZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtb2NrQ2hhbmdlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyTm9kZScsICgpID0+IHtcbiAgICB0ZXN0KCd0aGUgY29tcG9uZW50IGhhcyBwcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IE1hdGhQbHVnaW4oe30pO1xuICAgICAgY29uc3QgeyBwcm9wcyB9ID0gcGx1Z2luLnJlbmRlck5vZGUoeyBub2RlOiB7IHR5cGU6ICdtYXRoJyB9IH0pO1xuICAgICAgZXhwZWN0KHByb3BzLm5vZGUpLnRvRXF1YWwoeyB0eXBlOiAnbWF0aCcgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzZXJpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdkZXNlcmlhbGl6ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydERlc2VyaWFsaXplID0gKGh0bWwsIGV4cGVjdGVkLCB3cmFwVHlwZSkgPT4ge1xuICAgICAgICBpdChgaW5uZXJIVE1MOiAke2h0bWx9IGlzIGRlc2VyaWFsaXplZCB0bzogJHtleHBlY3RlZH0gd2l0aCB3cmFwVHlwZTogJHt3cmFwVHlwZX1gLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWwgPSB7XG4gICAgICAgICAgICB0YWdOYW1lOiAnc3BhbicsXG4gICAgICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgICAgIGdldEF0dHJpYnV0ZTogamVzdC5mbigoKSA9PiAnJyksXG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGU6IGplc3QuZm4oKCkgPT4gdHJ1ZSksXG4gICAgICAgICAgICBpbm5lckhUTUw6IGh0bWwsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gamVzdC5mbigpO1xuXG4gICAgICAgICAgY29uc3Qgb3V0ID0gc2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShlbCwgbmV4dCk7XG4gICAgICAgICAgZXhwZWN0KG91dCkudG9FcXVhbCh7XG4gICAgICAgICAgICBvYmplY3Q6ICdpbmxpbmUnLFxuICAgICAgICAgICAgdHlwZTogJ21hdGgnLFxuICAgICAgICAgICAgaXNWb2lkOiB0cnVlLFxuICAgICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBsYXRleDogZXhwZWN0ZWQsXG4gICAgICAgICAgICAgIHdyYXBwZXI6IHdyYXBUeXBlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhc3NlcnREZXNlcmlhbGl6ZSgnJCQmbHQ7JCQnLCAnPCcsIE1hdGhQbHVnaW4uRE9MTEFSKTtcbiAgICAgIGFzc2VydERlc2VyaWFsaXplKCckJmx0OyQnLCAnPCcsIE1hdGhQbHVnaW4uRE9MTEFSKTtcbiAgICAgIGFzc2VydERlc2VyaWFsaXplKCdcXFxcKCZsdDtcXFxcKScsICc8JywgTWF0aFBsdWdpbi5ST1VORF9CUkFDS0VUUyk7XG4gICAgICBhc3NlcnREZXNlcmlhbGl6ZSgnXFxcXFsmbHQ7XFxcXF0nLCAnPCcsIE1hdGhQbHVnaW4uUk9VTkRfQlJBQ0tFVFMpO1xuICAgICAgYXNzZXJ0RGVzZXJpYWxpemUoJ2xhdGV4JywgJ2xhdGV4JywgTWF0aFBsdWdpbi5ST1VORF9CUkFDS0VUUyk7XG4gICAgICBhc3NlcnREZXNlcmlhbGl6ZSgnXFxcXGRpc3BsYXlzdHlsZSBmb28nLCAnZm9vJywgTWF0aFBsdWdpbi5ST1VORF9CUkFDS0VUUyk7XG5cbiAgICAgIGl0KCdzaG91bGQgbWFrZSBtYXRobWwgZWRpdGFibGUgaWYgTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zLm1tbEVkaXRpbmcgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgICAgTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zLm1tbEVkaXRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBlbCA9IHtcbiAgICAgICAgICB0YWdOYW1lOiAnbWF0aCcsXG4gICAgICAgICAgb3V0ZXJIVE1MOlxuICAgICAgICAgICAgJzxtYXRoIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiPiAgPG1uPjI8L21uPiAgPG1pPng8L21pPiAgPG10ZXh0PiYjeEEwOzwvbXRleHQ+ICA8bW8+JiN4MjI2NDs8L21vPiAgPG1uPjQ8L21uPiAgPG1pPnk8L21pPiAgPG10ZXh0PiYjeEEwOzwvbXRleHQ+ICA8bW8+KzwvbW8+ICA8bXRleHQ+JiN4QTA7PC9tdGV4dD4gIDxtbj44PC9tbj4gPG1zcXJ0PiAgICA8bWk+aDwvbWk+ICA8L21zcXJ0PjwvbWF0aD4nLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXh0ID0gamVzdC5mbigpO1xuXG4gICAgICAgIGNvbnN0IG91dCA9IHNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoZWwsIG5leHQpO1xuXG4gICAgICAgIGV4cGVjdChvdXQpLnRvRXF1YWwoe1xuICAgICAgICAgIG9iamVjdDogJ2lubGluZScsXG4gICAgICAgICAgdHlwZTogJ21hdGgnLFxuICAgICAgICAgIGlzVm9pZDogdHJ1ZSxcbiAgICAgICAgICBub2RlczogW10sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgbGF0ZXg6ICcvZm9vYmFyL2xhdGV4JyxcbiAgICAgICAgICAgIHdyYXBwZXI6ICdyb3VuZF9icmFja2V0cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBtYWtlIG1hdGhtbCByZWFkT25seSBpZiBNYXRoUGx1Z2luLm1hdGhNbE9wdGlvbnMubW1sRWRpdGluZyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgICAgTWF0aFBsdWdpbi5tYXRoTWxPcHRpb25zLm1tbEVkaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZWwgPSB7XG4gICAgICAgICAgdGFnTmFtZTogJ21hdGgnLFxuICAgICAgICAgIG91dGVySFRNTDpcbiAgICAgICAgICAgICc8bWF0aCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIj4gIDxtbj4yPC9tbj4gIDxtaT54PC9taT4gIDxtdGV4dD4mI3hBMDs8L210ZXh0PiAgPG1vPiYjeDIyNjQ7PC9tbz4gIDxtbj40PC9tbj4gIDxtaT55PC9taT4gIDxtdGV4dD4mI3hBMDs8L210ZXh0PiAgPG1vPis8L21vPiAgPG10ZXh0PiYjeEEwOzwvbXRleHQ+ICA8bW4+ODwvbW4+IDxtc3FydD4gICAgPG1pPmg8L21pPiAgPC9tc3FydD48L21hdGg+JyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGplc3QuZm4oKTtcblxuICAgICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLmRlc2VyaWFsaXplKGVsLCBuZXh0KTtcblxuICAgICAgICBleHBlY3Qob3V0KS50b0VxdWFsKHtcbiAgICAgICAgICBvYmplY3Q6ICdpbmxpbmUnLFxuICAgICAgICAgIGlzVm9pZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiAnbWF0aG1sJyxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBodG1sOiBlbC5vdXRlckhUTUwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXJpYWxpemUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhc3NlcnRTZXJpYWxpemUgPSAobGF0ZXgsIGV4cGVjdGVkSHRtbCwgd3JhcHBlcikgPT4ge1xuICAgICAgICB3cmFwcGVyID0gd3JhcHBlciB8fCBNYXRoUGx1Z2luLlJPVU5EX0JSQUNLRVRTO1xuICAgICAgICBpdChgJHtsYXRleH0gaXMgc2VyaWFsaXplZCB0bzogJHtleHBlY3RlZEh0bWx9YCwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdpbmxpbmUnLFxuICAgICAgICAgICAgdHlwZTogJ21hdGgnLFxuICAgICAgICAgICAgaXNWb2lkOiB0cnVlLFxuICAgICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICAgICAgZGF0YTogRGF0YS5jcmVhdGUoeyBsYXRleCwgd3JhcHBlciB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gW107XG5cbiAgICAgICAgICBjb25zdCBvdXQgPSBzZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShvYmplY3QsIGNoaWxkcmVuKTtcbiAgICAgICAgICBsb2coJ291dDogJywgb3V0KTtcbiAgICAgICAgICBleHBlY3Qob3V0KS50b0VxdWFsKFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1sYXRleD1cIlwiIGRhdGEtcmF3PXtsYXRleH0+XG4gICAgICAgICAgICAgIHtleHBlY3RlZEh0bWx9XG4gICAgICAgICAgICA8L3NwYW4+LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgYXNzZXJ0U2VyaWFsaXplKCdsYXRleCcsICdcXFxcKGxhdGV4XFxcXCknLCBNYXRoUGx1Z2luLlJPVU5EX0JSQUNLRVRTKTtcbiAgICAgIGFzc2VydFNlcmlhbGl6ZSgnbGF0ZXgnLCAnXFxcXChsYXRleFxcXFwpJywgTWF0aFBsdWdpbi5TUVVBUkVfQlJBQ0tFVFMpO1xuICAgICAgYXNzZXJ0U2VyaWFsaXplKCdsYXRleCcsICckbGF0ZXgkJywgTWF0aFBsdWdpbi5ET0xMQVIpO1xuICAgICAgYXNzZXJ0U2VyaWFsaXplKCdsYXRleCcsICckbGF0ZXgkJywgTWF0aFBsdWdpbi5ET1VCTEVfRE9MTEFSKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzIGNvbnZlcnRlZCB0byBodG1sIGl0IGdldCdzIGVzY2FwZWQgLSBidXQgdGhhdCdzIGFuIGlzc3VlIHdpdGggdGhlIHNsYXRlIGh0bWwtc2VyaWFsaXplci5cbiAgICAgICAqL1xuICAgICAgYXNzZXJ0U2VyaWFsaXplKCc8JywgJ1xcXFwoPFxcXFwpJyk7XG4gICAgICBhc3NlcnRTZXJpYWxpemUoJ3g8eScsICdcXFxcKHg8eVxcXFwpJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdDdXN0b21Ub29sYmFyQ29tcCcsICgpID0+IHtcbiAgbGV0IG9uRGF0YUNoYW5nZTtcbiAgbGV0IG9uVG9vbGJhckRvbmU7XG5cbiAgY29uc3QgcmVuZGVyQ29tcG9uZW50ID0gKGV4dHJhcyA9IHt9KSA9PiB7XG4gICAgbGV0IG1vY2tDaGFuZ2UgPSBuZXcgTW9ja0NoYW5nZSgpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgbm9kZToge1xuICAgICAgICBrZXk6ICcxJyxcbiAgICAgICAgZGF0YTogRGF0YS5jcmVhdGUoeyBsYXRleDogJ2ZvbycgfSksXG4gICAgICAgIGVxdWFsczogKCkgPT4gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB2YWx1ZToge1xuICAgICAgICBkb2N1bWVudDoge1xuICAgICAgICAgIGdldE5leHRUZXh0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsga2V5OiAnbnQnIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUobW9ja0NoYW5nZSksXG4gICAgICB9LFxuICAgICAgb25EYXRhQ2hhbmdlLFxuICAgICAgb25Ub29sYmFyRG9uZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0cyxcbiAgICAgIC4uLmV4dHJhcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlbmRlcig8Q3VzdG9tVG9vbGJhckNvbXAgey4uLnByb3BzfSAvPik7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB0b29sYmFyIHdpdGhvdXQgZGVmYXVsdCBrZXlwYWRNb2RlJywgKCkgPT4ge1xuICAgICAgcmVuZGVyQ29tcG9uZW50KCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdG9vbGJhciBpcyByZW5kZXJlZFxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgndG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgdG9vbGJhciB3aXRoIGRlZmF1bHQga2V5cGFkTW9kZScsICgpID0+IHtcbiAgICAgIHJlbmRlckNvbXBvbmVudCh7IHBsdWdpblByb3BzOiB7IG1hdGg6IHsga2V5cGFkTW9kZTogJ2dlb21ldHJ5JyB9IH0gfSk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdG9vbGJhciBpcyByZW5kZXJlZCB3aXRoIGtleXBhZE1vZGUgcHJvcFxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgndG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25Eb25lJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvblRvb2xiYXJEb25lIHdoZW4gZG9uZSBjYWxsYmFjayBpcyB0cmlnZ2VyZWQnLCAoKSA9PiB7XG4gICAgICBvblRvb2xiYXJEb25lID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyQ29tcG9uZW50KCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgdGhlIG9uRG9uZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8gTWF0aFRvb2xiYXJcbiAgICAgIG1vY2tNYXRoVG9vbGJhck9uRG9uZSgnb28nKTtcblxuICAgICAgZXhwZWN0KG9uVG9vbGJhckRvbmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5hbnl0aGluZygpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbkNoYW5nZScsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgb25EYXRhQ2hhbmdlIHdoZW4gY2hhbmdlIGNhbGxiYWNrIGlzIHRyaWdnZXJlZCcsICgpID0+IHtcbiAgICAgIG9uRGF0YUNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlckNvbXBvbmVudCgpO1xuXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBvbkNoYW5nZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8gTWF0aFRvb2xiYXJcbiAgICAgIG1vY2tNYXRoVG9vbGJhck9uQ2hhbmdlKCdvbycpO1xuXG4gICAgICBleHBlY3Qob25EYXRhQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnMScsIHsgbGF0ZXg6ICdvbycgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBQyx1QkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQXdELFNBQUFLLHdCQUFBRSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMs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