@pie-lib/editable-html-tip-tap 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.serialization = exports.reactAttributes = exports.parseStyleString = exports.moveFocusToBeginningOfTable = exports["default"] = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _slate = require("slate");
17
+
18
+ var _debug = _interopRequireDefault(require("debug"));
19
+
20
+ var _GridOn = _interopRequireDefault(require("@material-ui/icons/GridOn"));
21
+
22
+ var _tableToolbar = _interopRequireDefault(require("./table-toolbar"));
23
+
24
+ var _propTypes = _interopRequireDefault(require("prop-types"));
25
+
26
+ var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
27
+
28
+ var _styles = require("@material-ui/core/styles");
29
+
30
+ var _reactAttrConverter = _interopRequireDefault(require("react-attr-converter"));
31
+
32
+ var _toStyle = require("to-style");
33
+
34
+ var _CustomTablePlugin = _interopRequireDefault(require("./CustomTablePlugin"));
35
+
36
+ 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; }
37
+
38
+ 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; }
39
+
40
+ var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:table');
41
+ var Table = (0, _styles.withStyles)(function () {
42
+ return {
43
+ table: {}
44
+ };
45
+ })(function (props) {
46
+ var nodeAttributes = dataToAttributes(props.node.data);
47
+ return /*#__PURE__*/_react["default"].createElement("table", (0, _extends2["default"])({
48
+ className: props.classes.table
49
+ }, props.attributes, nodeAttributes, {
50
+ onFocus: props.onFocus,
51
+ onBlur: props.onBlur
52
+ }), /*#__PURE__*/_react["default"].createElement("tbody", null, props.children));
53
+ });
54
+ Table.propTypes = {
55
+ attributes: _propTypes["default"].object,
56
+ onFocus: _propTypes["default"].func,
57
+ onBlur: _propTypes["default"].func,
58
+ node: _slatePropTypes["default"].node,
59
+ children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
60
+ };
61
+
62
+ var TableRow = function TableRow(props) {
63
+ return /*#__PURE__*/_react["default"].createElement("tr", props.attributes, props.children);
64
+ };
65
+
66
+ TableRow.propTypes = {
67
+ attributes: _propTypes["default"].object,
68
+ onFocus: _propTypes["default"].func,
69
+ onBlur: _propTypes["default"].func,
70
+ children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
71
+ };
72
+ var TableCell = (0, _styles.withStyles)(function () {
73
+ return {
74
+ td: {
75
+ minWidth: '25px'
76
+ }
77
+ };
78
+ })(function (props) {
79
+ var Tag = props.node.data.get('header') ? 'th' : 'td';
80
+ var nodeAttributes = dataToAttributes(props.node.data);
81
+ delete nodeAttributes.header;
82
+ return /*#__PURE__*/_react["default"].createElement(Tag, (0, _extends2["default"])({}, props.attributes, nodeAttributes, {
83
+ colSpan: props.node.data.get('colspan'),
84
+ className: props.classes[Tag],
85
+ onFocus: props.onFocus,
86
+ onBlur: props.onBlur
87
+ }), props.children);
88
+ });
89
+ TableCell.propTypes = {
90
+ attributes: _propTypes["default"].object,
91
+ onFocus: _propTypes["default"].func,
92
+ onBlur: _propTypes["default"].func,
93
+ children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
94
+ };
95
+
96
+ var moveFocusToBeginningOfTable = function moveFocusToBeginningOfTable(change) {
97
+ var addedTable = change.value.document.findDescendant(function (d) {
98
+ return !!d.data && !!d.data.get('newTable');
99
+ });
100
+
101
+ if (!addedTable) {
102
+ return;
103
+ }
104
+
105
+ change.collapseToStartOf(addedTable);
106
+ var update = addedTable.data.remove('newTable');
107
+ change.setNodeByKey(addedTable.key, {
108
+ data: update
109
+ });
110
+ };
111
+
112
+ exports.moveFocusToBeginningOfTable = moveFocusToBeginningOfTable;
113
+
114
+ var _default = function _default(opts, toolbarPlugins
115
+ /* : {toolbar: {}}[] */
116
+ ) {
117
+ var core = (0, _CustomTablePlugin["default"])(opts); // fix outdated schema
118
+
119
+ if (core.schema && core.schema.blocks) {
120
+ Object.keys(core.schema.blocks).forEach(function (key) {
121
+ var block = core.schema.blocks[key];
122
+
123
+ if (block.parent) {
124
+ if (block.nodes[0].types) {
125
+ block.nodes[0] = {
126
+ type: block.nodes[0].types[0]
127
+ };
128
+ }
129
+
130
+ if (block.nodes[0].objects) {
131
+ block.nodes[0] = {
132
+ object: block.nodes[0].objects[0]
133
+ };
134
+ }
135
+
136
+ block.parent = {
137
+ type: block.parent.types[0]
138
+ };
139
+ } else {
140
+ block.nodes[0] = {
141
+ type: block.nodes[0].types[0]
142
+ };
143
+ }
144
+ });
145
+ }
146
+
147
+ core.utils.getTableBlock = function (containerNode, key) {
148
+ var node = containerNode.getDescendant(key);
149
+ var ancestors = containerNode.getAncestors(key).push(node);
150
+ return ancestors.findLast(function (p) {
151
+ return p.type === 'table';
152
+ });
153
+ };
154
+
155
+ core.utils.createTableWithOptions = function (row, columns, extra) {
156
+ var createdTable = core.utils.createTable(row, columns);
157
+
158
+ var newTable = _slate.Block.create(_objectSpread(_objectSpread({}, createdTable.toJSON()), extra));
159
+
160
+ return newTable;
161
+ };
162
+
163
+ core.toolbar = {
164
+ type: 'table',
165
+ icon: /*#__PURE__*/_react["default"].createElement(_GridOn["default"], null),
166
+ ariaLabel: 'Insert Table',
167
+ onClick: function onClick(value, onChange) {
168
+ log('insert table');
169
+ var change = value.change();
170
+ var newTable = core.utils.createTableWithOptions(2, 2, {
171
+ data: {
172
+ border: '1',
173
+ newTable: true
174
+ }
175
+ });
176
+ change.insertBlock(newTable);
177
+ moveFocusToBeginningOfTable(change);
178
+ onChange(change);
179
+ },
180
+ supports: function supports(node, value) {
181
+ return node && node.object === 'block' && core.utils.isSelectionInTable(value);
182
+ },
183
+
184
+ /**
185
+ * Note - the node may not be a table node - it may be a node inside a table.
186
+ */
187
+ customToolbar: function customToolbar(node, value, onToolbarDone, getFocusedValue) {
188
+ log('[customToolbar] node.data: ', node.data);
189
+ var tableBlock = core.utils.getTableBlock(value.document, node === null || node === void 0 ? void 0 : node.key);
190
+ log('[customToolbar] tableBlock: ', tableBlock);
191
+
192
+ var hasBorder = function hasBorder() {
193
+ return tableBlock.data.get('border') && tableBlock.data.get('border') !== '0';
194
+ };
195
+
196
+ var addRow = function addRow() {
197
+ var change = core.changes.insertRow(value.change());
198
+ onToolbarDone(change, false);
199
+ };
200
+
201
+ var addColumn = function addColumn() {
202
+ var change = core.changes.insertColumn(value.change());
203
+ onToolbarDone(change, false);
204
+ };
205
+
206
+ var removeRow = function removeRow() {
207
+ var change = core.changes.removeRow(value.change());
208
+ onToolbarDone(change, false);
209
+ };
210
+
211
+ var removeColumn = function removeColumn() {
212
+ var change = core.changes.removeColumn(value.change());
213
+ onToolbarDone(change, false);
214
+ };
215
+
216
+ var removeTable = function removeTable() {
217
+ var change = core.changes.removeTable(value.change());
218
+ onToolbarDone(change, false);
219
+ };
220
+
221
+ var toggleBorder = function toggleBorder() {
222
+ var data = tableBlock.data;
223
+ var update = data.set('border', hasBorder() ? '0' : '1');
224
+ log('[toggleBorder] update: ', update);
225
+ var change = value.change().setNodeByKey(tableBlock.key, {
226
+ data: update
227
+ });
228
+ onToolbarDone(change, false);
229
+ };
230
+
231
+ var onDone = function onDone() {
232
+ log('[onDone] call onToolbarDone...');
233
+ onToolbarDone(null, true);
234
+ };
235
+
236
+ var Tb = function Tb() {
237
+ return /*#__PURE__*/_react["default"].createElement(_tableToolbar["default"], {
238
+ getFocusedValue: getFocusedValue,
239
+ plugins: toolbarPlugins,
240
+ onChange: function onChange(c) {
241
+ return onToolbarDone(c, false);
242
+ },
243
+ value: value,
244
+ onAddRow: addRow,
245
+ onRemoveRow: removeRow,
246
+ onAddColumn: addColumn,
247
+ onRemoveColumn: removeColumn,
248
+ onRemoveTable: removeTable,
249
+ hasBorder: hasBorder(),
250
+ onToggleBorder: toggleBorder,
251
+ onDone: onDone
252
+ });
253
+ };
254
+
255
+ return Tb;
256
+ }
257
+ };
258
+
259
+ var Node = function Node(props) {
260
+ switch (props.node.type) {
261
+ case 'table':
262
+ return /*#__PURE__*/_react["default"].createElement(Table, (0, _extends2["default"])({}, props, {
263
+ onFocus: opts.onFocus,
264
+ onBlur: opts.onBlur
265
+ }));
266
+
267
+ case 'table_row':
268
+ return /*#__PURE__*/_react["default"].createElement(TableRow, props);
269
+
270
+ case 'table_cell':
271
+ return /*#__PURE__*/_react["default"].createElement(TableCell, (0, _extends2["default"])({}, props, {
272
+ onFocus: opts.onFocus,
273
+ onBlur: opts.onBlur
274
+ }));
275
+
276
+ default:
277
+ return null;
278
+ }
279
+ };
280
+
281
+ Node.propTypes = {
282
+ node: _propTypes["default"].object
283
+ };
284
+
285
+ core.normalizeNode = function (node) {
286
+ var addNodeBeforeArray = [];
287
+ if (node.object !== 'document') return;
288
+ node.findDescendant(function (d) {
289
+ if (d.type === 'table') {
290
+ var tablePath = node.getPath(d.key);
291
+ var prevNode = node.getPreviousNode(tablePath);
292
+ var nextNode = node.getNextNode(tablePath);
293
+
294
+ if (!prevNode || !nextNode) {
295
+ addNodeBeforeArray.push({
296
+ node: d,
297
+ prevNode: prevNode,
298
+ nextNode: nextNode
299
+ });
300
+ }
301
+ }
302
+ });
303
+
304
+ if (!addNodeBeforeArray.length) {
305
+ return;
306
+ }
307
+
308
+ return function (change) {
309
+ var newBlock = {
310
+ object: 'block',
311
+ type: 'div'
312
+ };
313
+ addNodeBeforeArray.forEach(function (n) {
314
+ var tablePath = change.value.document.getPath(n.node.key).toJSON(); // removing tableIndex
315
+
316
+ var indexToAdd = tablePath.splice(-1)[0];
317
+
318
+ if (!n.prevNode) {
319
+ // inserting block key before table
320
+ change.insertNodeByPath(tablePath, indexToAdd, newBlock); // this will trigger another normalization, which will figure out if there's not
321
+ // a block after the table and add it, so we exit for now
322
+
323
+ return;
324
+ }
325
+
326
+ if (!n.nextNode) {
327
+ // inserting block key after table
328
+ change.insertNodeByPath(tablePath, indexToAdd + 1, newBlock);
329
+ }
330
+ });
331
+ };
332
+ };
333
+
334
+ core.renderNode = Node;
335
+ core.name = 'table';
336
+ return core;
337
+ };
338
+
339
+ exports["default"] = _default;
340
+
341
+ var parseStyleString = function parseStyleString(s) {
342
+ var regex = /([\w-]*)\s*:\s*([^;]*)/g;
343
+ var match;
344
+ var result = {};
345
+
346
+ while (match = regex.exec(s)) {
347
+ result[match[1]] = match[2].trim();
348
+ }
349
+
350
+ return result;
351
+ };
352
+
353
+ exports.parseStyleString = parseStyleString;
354
+
355
+ var reactAttributes = function reactAttributes(o) {
356
+ return (0, _toStyle.object)(o, {
357
+ camelize: true,
358
+ addUnits: false
359
+ });
360
+ };
361
+
362
+ exports.reactAttributes = reactAttributes;
363
+
364
+ var attributesToMap = function attributesToMap(el) {
365
+ return function (acc, attribute) {
366
+ var value = el.getAttribute(attribute);
367
+
368
+ if (value) {
369
+ if (attribute === 'style') {
370
+ var styleString = el.getAttribute(attribute);
371
+ var reactStyleObject = reactAttributes(parseStyleString(styleString));
372
+ acc['style'] = reactStyleObject;
373
+ } else {
374
+ acc[attribute] = el.getAttribute(attribute);
375
+ }
376
+ }
377
+
378
+ return acc;
379
+ };
380
+ };
381
+
382
+ var dataToAttributes = function dataToAttributes(data) {
383
+ if (!data || !data.get) {
384
+ return {};
385
+ }
386
+
387
+ return data.reduce(function (acc, v, name) {
388
+ if (v) {
389
+ acc[(0, _reactAttrConverter["default"])(name)] = v;
390
+ }
391
+
392
+ return acc;
393
+ }, {});
394
+ };
395
+
396
+ var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style'];
397
+ var cellAttributes = ['colspan', 'rowspan', 'class', 'style'];
398
+ var serialization = {
399
+ deserialize: function deserialize(el, next) {
400
+ var tag = el.tagName.toLowerCase();
401
+
402
+ switch (tag) {
403
+ case 'table':
404
+ {
405
+ var children = el.children.length === 1 && el.children[0].tagName.toLowerCase() === 'tbody' ? el.children[0].children : el.children;
406
+ var c = Array.from(children);
407
+ return {
408
+ object: 'block',
409
+ type: 'table',
410
+ nodes: next(c),
411
+ data: attributes.reduce(attributesToMap(el), {})
412
+ };
413
+ }
414
+
415
+ case 'th':
416
+ {
417
+ return {
418
+ object: 'block',
419
+ type: 'table_cell',
420
+ nodes: next(el.childNodes),
421
+ data: cellAttributes.reduce(attributesToMap(el), {
422
+ header: true
423
+ })
424
+ };
425
+ }
426
+
427
+ case 'tr':
428
+ {
429
+ return {
430
+ object: 'block',
431
+ type: 'table_row',
432
+ nodes: next(Array.from(el.children))
433
+ };
434
+ }
435
+
436
+ case 'td':
437
+ {
438
+ return {
439
+ object: 'block',
440
+ type: 'table_cell',
441
+ nodes: next(Array.from(el.childNodes)),
442
+ data: cellAttributes.reduce(attributesToMap(el), {
443
+ header: false
444
+ })
445
+ };
446
+ }
447
+ }
448
+ },
449
+ serialize: function serialize(object, children) {
450
+ if (object.object !== 'block') {
451
+ return;
452
+ }
453
+
454
+ switch (object.type) {
455
+ case 'table':
456
+ {
457
+ var _attributes = dataToAttributes(object.data);
458
+
459
+ return /*#__PURE__*/_react["default"].createElement("table", _attributes, /*#__PURE__*/_react["default"].createElement("tbody", null, children));
460
+ }
461
+
462
+ case 'table_row':
463
+ {
464
+ return /*#__PURE__*/_react["default"].createElement("tr", null, children);
465
+ }
466
+
467
+ case 'table_cell':
468
+ {
469
+ var _attributes2 = dataToAttributes(object.data);
470
+
471
+ delete _attributes2.header;
472
+
473
+ if (object.data.get('header')) {
474
+ return /*#__PURE__*/_react["default"].createElement("th", _attributes2, children);
475
+ } else {
476
+ return /*#__PURE__*/_react["default"].createElement("td", _attributes2, children);
477
+ }
478
+ }
479
+ }
480
+ }
481
+ };
482
+ exports.serialization = serialization;
483
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL3RhYmxlL2luZGV4LmpzeCJdLCJuYW1lcyI6WyJsb2ciLCJUYWJsZSIsInRhYmxlIiwicHJvcHMiLCJub2RlQXR0cmlidXRlcyIsImRhdGFUb0F0dHJpYnV0ZXMiLCJub2RlIiwiZGF0YSIsImNsYXNzZXMiLCJhdHRyaWJ1dGVzIiwib25Gb2N1cyIsIm9uQmx1ciIsImNoaWxkcmVuIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiZnVuYyIsIlNsYXRlUHJvcFR5cGVzIiwib25lT2ZUeXBlIiwiYXJyYXlPZiIsImlzUmVxdWlyZWQiLCJUYWJsZVJvdyIsIlRhYmxlQ2VsbCIsInRkIiwibWluV2lkdGgiLCJUYWciLCJnZXQiLCJoZWFkZXIiLCJtb3ZlRm9jdXNUb0JlZ2lubmluZ09mVGFibGUiLCJjaGFuZ2UiLCJhZGRlZFRhYmxlIiwidmFsdWUiLCJkb2N1bWVudCIsImZpbmREZXNjZW5kYW50IiwiZCIsImNvbGxhcHNlVG9TdGFydE9mIiwidXBkYXRlIiwicmVtb3ZlIiwic2V0Tm9kZUJ5S2V5Iiwia2V5Iiwib3B0cyIsInRvb2xiYXJQbHVnaW5zIiwiY29yZSIsInNjaGVtYSIsImJsb2NrcyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiYmxvY2siLCJwYXJlbnQiLCJub2RlcyIsInR5cGVzIiwidHlwZSIsIm9iamVjdHMiLCJ1dGlscyIsImdldFRhYmxlQmxvY2siLCJjb250YWluZXJOb2RlIiwiZ2V0RGVzY2VuZGFudCIsImFuY2VzdG9ycyIsImdldEFuY2VzdG9ycyIsInB1c2giLCJmaW5kTGFzdCIsInAiLCJjcmVhdGVUYWJsZVdpdGhPcHRpb25zIiwicm93IiwiY29sdW1ucyIsImV4dHJhIiwiY3JlYXRlZFRhYmxlIiwiY3JlYXRlVGFibGUiLCJuZXdUYWJsZSIsIkJsb2NrIiwiY3JlYXRlIiwidG9KU09OIiwidG9vbGJhciIsImljb24iLCJhcmlhTGFiZWwiLCJvbkNsaWNrIiwib25DaGFuZ2UiLCJib3JkZXIiLCJpbnNlcnRCbG9jayIsInN1cHBvcnRzIiwiaXNTZWxlY3Rpb25JblRhYmxlIiwiY3VzdG9tVG9vbGJhciIsIm9uVG9vbGJhckRvbmUiLCJnZXRGb2N1c2VkVmFsdWUiLCJ0YWJsZUJsb2NrIiwiaGFzQm9yZGVyIiwiYWRkUm93IiwiY2hhbmdlcyIsImluc2VydFJvdyIsImFkZENvbHVtbiIsImluc2VydENvbHVtbiIsInJlbW92ZVJvdyIsInJlbW92ZUNvbHVtbiIsInJlbW92ZVRhYmxlIiwidG9nZ2xlQm9yZGVyIiwic2V0Iiwib25Eb25lIiwiVGIiLCJjIiwiTm9kZSIsIm5vcm1hbGl6ZU5vZGUiLCJhZGROb2RlQmVmb3JlQXJyYXkiLCJ0YWJsZVBhdGgiLCJnZXRQYXRoIiwicHJldk5vZGUiLCJnZXRQcmV2aW91c05vZGUiLCJuZXh0Tm9kZSIsImdldE5leHROb2RlIiwibGVuZ3RoIiwibmV3QmxvY2siLCJuIiwiaW5kZXhUb0FkZCIsInNwbGljZSIsImluc2VydE5vZGVCeVBhdGgiLCJyZW5kZXJOb2RlIiwibmFtZSIsInBhcnNlU3R5bGVTdHJpbmciLCJzIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwicmVhY3RBdHRyaWJ1dGVzIiwibyIsImNhbWVsaXplIiwiYWRkVW5pdHMiLCJhdHRyaWJ1dGVzVG9NYXAiLCJlbCIsImFjYyIsImF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInN0eWxlU3RyaW5nIiwicmVhY3RTdHlsZU9iamVjdCIsInJlZHVjZSIsInYiLCJjZWxsQXR0cmlidXRlcyIsInNlcmlhbGl6YXRpb24iLCJkZXNlcmlhbGl6ZSIsIm5leHQiLCJ0YWciLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwic2VyaWFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7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QUFDUixJQUFSLENBQW5DOztBQUNBLGlCQUFPRSxZQUFVLENBQUNrQixNQUFsQjs7QUFFQSxjQUFJWixNQUFNLENBQUNSLElBQVAsQ0FBWW1CLEdBQVosQ0FBZ0IsUUFBaEIsQ0FBSixFQUErQjtBQUM3QixnQ0FBTyxzQ0FBUWpCLFlBQVIsRUFBcUJHLFFBQXJCLENBQVA7QUFDRCxXQUZELE1BRU87QUFDTCxnQ0FBTyxzQ0FBUUgsWUFBUixFQUFxQkcsUUFBckIsQ0FBUDtBQUNEO0FBQ0Y7QUF4Qkg7QUEwQkQ7QUE5RTBCLENBQXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBHcmlkT24gZnJvbSAnQG1hdGVyaWFsLXVpL2ljb25zL0dyaWRPbic7XG5pbXBvcnQgVGFibGVUb29sYmFyIGZyb20gJy4vdGFibGUtdG9vbGJhcic7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFNsYXRlUHJvcFR5cGVzIGZyb20gJ3NsYXRlLXByb3AtdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgY29udmVydCBmcm9tICdyZWFjdC1hdHRyLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBvYmplY3QgYXMgdG9TdHlsZU9iamVjdCB9IGZyb20gJ3RvLXN0eWxlJztcbmltcG9ydCBDdXN0b21UYWJsZVBsdWdpbiBmcm9tICcuL0N1c3RvbVRhYmxlUGx1Z2luJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6cGx1Z2luczp0YWJsZScpO1xuXG5jb25zdCBUYWJsZSA9IHdpdGhTdHlsZXMoKCkgPT4gKHtcbiAgdGFibGU6IHt9LFxufSkpKChwcm9wcykgPT4ge1xuICBjb25zdCBub2RlQXR0cmlidXRlcyA9IGRhdGFUb0F0dHJpYnV0ZXMocHJvcHMubm9kZS5kYXRhKTtcblxuICByZXR1cm4gKFxuICAgIDx0YWJsZVxuICAgICAgY2xhc3NOYW1lPXtwcm9wcy5jbGFzc2VzLnRhYmxlfVxuICAgICAgey4uLnByb3BzLmF0dHJpYnV0ZXN9XG4gICAgICB7Li4ubm9kZUF0dHJpYnV0ZXN9XG4gICAgICBvbkZvY3VzPXtwcm9wcy5vbkZvY3VzfVxuICAgICAgb25CbHVyPXtwcm9wcy5vbkJsdXJ9XG4gICAgPlxuICAgICAgPHRib2R5Pntwcm9wcy5jaGlsZHJlbn08L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gICk7XG59KTtcblxuVGFibGUucHJvcFR5cGVzID0ge1xuICBhdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgbm9kZTogU2xhdGVQcm9wVHlwZXMubm9kZSxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKS5pc1JlcXVpcmVkLFxufTtcblxuY29uc3QgVGFibGVSb3cgPSAocHJvcHMpID0+IDx0ciB7Li4ucHJvcHMuYXR0cmlidXRlc30+e3Byb3BzLmNoaWxkcmVufTwvdHI+O1xuXG5UYWJsZVJvdy5wcm9wVHlwZXMgPSB7XG4gIGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLmlzUmVxdWlyZWQsXG59O1xuXG5jb25zdCBUYWJsZUNlbGwgPSB3aXRoU3R5bGVzKCgpID0+ICh7XG4gIHRkOiB7XG4gICAgbWluV2lkdGg6ICcyNXB4JyxcbiAgfSxcbn0pKSgocHJvcHMpID0+IHtcbiAgY29uc3QgVGFnID0gcHJvcHMubm9kZS5kYXRhLmdldCgnaGVhZGVyJykgPyAndGgnIDogJ3RkJztcblxuICBjb25zdCBub2RlQXR0cmlidXRlcyA9IGRhdGFUb0F0dHJpYnV0ZXMocHJvcHMubm9kZS5kYXRhKTtcbiAgZGVsZXRlIG5vZGVBdHRyaWJ1dGVzLmhlYWRlcjtcblxuICByZXR1cm4gKFxuICAgIDxUYWdcbiAgICAgIHsuLi5wcm9wcy5hdHRyaWJ1dGVzfVxuICAgICAgey4uLm5vZGVBdHRyaWJ1dGVzfVxuICAgICAgY29sU3Bhbj17cHJvcHMubm9kZS5kYXRhLmdldCgnY29sc3BhbicpfVxuICAgICAgY2xhc3NOYW1lPXtwcm9wcy5jbGFzc2VzW1RhZ119XG4gICAgICBvbkZvY3VzPXtwcm9wcy5vbkZvY3VzfVxuICAgICAgb25CbHVyPXtwcm9wcy5vbkJsdXJ9XG4gICAgPlxuICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgIDwvVGFnPlxuICApO1xufSk7XG5cblRhYmxlQ2VsbC5wcm9wVHlwZXMgPSB7XG4gIGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgY29uc3QgbW92ZUZvY3VzVG9CZWdpbm5pbmdPZlRhYmxlID0gKGNoYW5nZSkgPT4ge1xuICBjb25zdCBhZGRlZFRhYmxlID0gY2hhbmdlLnZhbHVlLmRvY3VtZW50LmZpbmREZXNjZW5kYW50KChkKSA9PiAhIWQuZGF0YSAmJiAhIWQuZGF0YS5nZXQoJ25ld1RhYmxlJykpO1xuXG4gIGlmICghYWRkZWRUYWJsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYW5nZS5jb2xsYXBzZVRvU3RhcnRPZihhZGRlZFRhYmxlKTtcblxuICBjb25zdCB1cGRhdGUgPSBhZGRlZFRhYmxlLmRhdGEucmVtb3ZlKCduZXdUYWJsZScpO1xuXG4gIGNoYW5nZS5zZXROb2RlQnlLZXkoYWRkZWRUYWJsZS5rZXksIHsgZGF0YTogdXBkYXRlIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKG9wdHMsIHRvb2xiYXJQbHVnaW5zIC8qIDogIHt0b29sYmFyOiB7fX1bXSAqLykgPT4ge1xuICBjb25zdCBjb3JlID0gQ3VzdG9tVGFibGVQbHVnaW4ob3B0cyk7XG5cbiAgLy8gZml4IG91dGRhdGVkIHNjaGVtYVxuXG4gIGlmIChjb3JlLnNjaGVtYSAmJiBjb3JlLnNjaGVtYS5ibG9ja3MpIHtcbiAgICBPYmplY3Qua2V5cyhjb3JlLnNjaGVtYS5ibG9ja3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgYmxvY2sgPSBjb3JlLnNjaGVtYS5ibG9ja3Nba2V5XTtcblxuICAgICAgaWYgKGJsb2NrLnBhcmVudCkge1xuICAgICAgICBpZiAoYmxvY2subm9kZXNbMF0udHlwZXMpIHtcbiAgICAgICAgICBibG9jay5ub2Rlc1swXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IGJsb2NrLm5vZGVzWzBdLnR5cGVzWzBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmxvY2subm9kZXNbMF0ub2JqZWN0cykge1xuICAgICAgICAgIGJsb2NrLm5vZGVzWzBdID0ge1xuICAgICAgICAgICAgb2JqZWN0OiBibG9jay5ub2Rlc1swXS5vYmplY3RzWzBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBibG9jay5wYXJlbnQgPSB7XG4gICAgICAgICAgdHlwZTogYmxvY2sucGFyZW50LnR5cGVzWzBdLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmxvY2subm9kZXNbMF0gPSB7IHR5cGU6IGJsb2NrLm5vZGVzWzBdLnR5cGVzWzBdIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb3JlLnV0aWxzLmdldFRhYmxlQmxvY2sgPSAoY29udGFpbmVyTm9kZSwga2V5KSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnRhaW5lck5vZGUuZ2V0RGVzY2VuZGFudChrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGNvbnRhaW5lck5vZGUuZ2V0QW5jZXN0b3JzKGtleSkucHVzaChub2RlKTtcbiAgICByZXR1cm4gYW5jZXN0b3JzLmZpbmRMYXN0KChwKSA9PiBwLnR5cGUgPT09ICd0YWJsZScpO1xuICB9O1xuXG4gIGNvcmUudXRpbHMuY3JlYXRlVGFibGVXaXRoT3B0aW9ucyA9IChyb3csIGNvbHVtbnMsIGV4dHJhKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZFRhYmxlID0gY29yZS51dGlscy5jcmVhdGVUYWJsZShyb3csIGNvbHVtbnMpO1xuICAgIGNvbnN0IG5ld1RhYmxlID0gQmxvY2suY3JlYXRlKHtcbiAgICAgIC4uLmNyZWF0ZWRUYWJsZS50b0pTT04oKSxcbiAgICAgIC4uLmV4dHJhLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld1RhYmxlO1xuICB9O1xuXG4gIGNvcmUudG9vbGJhciA9IHtcbiAgICB0eXBlOiAndGFibGUnLFxuICAgIGljb246IDxHcmlkT24gLz4sXG4gICAgYXJpYUxhYmVsOiAnSW5zZXJ0IFRhYmxlJyxcbiAgICBvbkNsaWNrOiAodmFsdWUsIG9uQ2hhbmdlKSA9PiB7XG4gICAgICBsb2coJ2luc2VydCB0YWJsZScpO1xuICAgICAgY29uc3QgY2hhbmdlID0gdmFsdWUuY2hhbmdlKCk7XG4gICAgICBjb25zdCBuZXdUYWJsZSA9IGNvcmUudXRpbHMuY3JlYXRlVGFibGVXaXRoT3B0aW9ucygyLCAyLCB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBib3JkZXI6ICcxJyxcbiAgICAgICAgICBuZXdUYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2UuaW5zZXJ0QmxvY2sobmV3VGFibGUpO1xuXG4gICAgICBtb3ZlRm9jdXNUb0JlZ2lubmluZ09mVGFibGUoY2hhbmdlKTtcbiAgICAgIG9uQ2hhbmdlKGNoYW5nZSk7XG4gICAgfSxcbiAgICBzdXBwb3J0czogKG5vZGUsIHZhbHVlKSA9PiBub2RlICYmIG5vZGUub2JqZWN0ID09PSAnYmxvY2snICYmIGNvcmUudXRpbHMuaXNTZWxlY3Rpb25JblRhYmxlKHZhbHVlKSxcbiAgICAvKipcbiAgICAgKiBOb3RlIC0gdGhlIG5vZGUgbWF5IG5vdCBiZSBhIHRhYmxlIG5vZGUgLSBpdCBtYXkgYmUgYSBub2RlIGluc2lkZSBhIHRhYmxlLlxuICAgICAqL1xuICAgIGN1c3RvbVRvb2xiYXI6IChub2RlLCB2YWx1ZSwgb25Ub29sYmFyRG9uZSwgZ2V0Rm9jdXNlZFZhbHVlKSA9PiB7XG4gICAgICBsb2coJ1tjdXN0b21Ub29sYmFyXSBub2RlLmRhdGE6ICcsIG5vZGUuZGF0YSk7XG5cbiAgICAgIGNvbnN0IHRhYmxlQmxvY2sgPSBjb3JlLnV0aWxzLmdldFRhYmxlQmxvY2sodmFsdWUuZG9jdW1lbnQsIG5vZGU/LmtleSk7XG4gICAgICBsb2coJ1tjdXN0b21Ub29sYmFyXSB0YWJsZUJsb2NrOiAnLCB0YWJsZUJsb2NrKTtcblxuICAgICAgY29uc3QgaGFzQm9yZGVyID0gKCkgPT4gdGFibGVCbG9jay5kYXRhLmdldCgnYm9yZGVyJykgJiYgdGFibGVCbG9jay5kYXRhLmdldCgnYm9yZGVyJykgIT09ICcwJztcbiAgICAgIGNvbnN0IGFkZFJvdyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY29yZS5jaGFuZ2VzLmluc2VydFJvdyh2YWx1ZS5jaGFuZ2UoKSk7XG4gICAgICAgIG9uVG9vbGJhckRvbmUoY2hhbmdlLCBmYWxzZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhZGRDb2x1bW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IGNvcmUuY2hhbmdlcy5pbnNlcnRDb2x1bW4odmFsdWUuY2hhbmdlKCkpO1xuICAgICAgICBvblRvb2xiYXJEb25lKGNoYW5nZSwgZmFsc2UpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVtb3ZlUm93ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFuZ2UgPSBjb3JlLmNoYW5nZXMucmVtb3ZlUm93KHZhbHVlLmNoYW5nZSgpKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlbW92ZUNvbHVtbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY29yZS5jaGFuZ2VzLnJlbW92ZUNvbHVtbih2YWx1ZS5jaGFuZ2UoKSk7XG4gICAgICAgIG9uVG9vbGJhckRvbmUoY2hhbmdlLCBmYWxzZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW1vdmVUYWJsZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY29yZS5jaGFuZ2VzLnJlbW92ZVRhYmxlKHZhbHVlLmNoYW5nZSgpKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRvZ2dsZUJvcmRlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSB0YWJsZUJsb2NrO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBkYXRhLnNldCgnYm9yZGVyJywgaGFzQm9yZGVyKCkgPyAnMCcgOiAnMScpO1xuICAgICAgICBsb2coJ1t0b2dnbGVCb3JkZXJdIHVwZGF0ZTogJywgdXBkYXRlKTtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gdmFsdWUuY2hhbmdlKCkuc2V0Tm9kZUJ5S2V5KHRhYmxlQmxvY2sua2V5LCB7IGRhdGE6IHVwZGF0ZSB9KTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+IHtcbiAgICAgICAgbG9nKCdbb25Eb25lXSBjYWxsIG9uVG9vbGJhckRvbmUuLi4nKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShudWxsLCB0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IFRiID0gKCkgPT4gKFxuICAgICAgICA8VGFibGVUb29sYmFyXG4gICAgICAgICAgZ2V0Rm9jdXNlZFZhbHVlPXtnZXRGb2N1c2VkVmFsdWV9XG4gICAgICAgICAgcGx1Z2lucz17dG9vbGJhclBsdWdpbnN9XG4gICAgICAgICAgb25DaGFuZ2U9eyhjKSA9PiBvblRvb2xiYXJEb25lKGMsIGZhbHNlKX1cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgb25BZGRSb3c9e2FkZFJvd31cbiAgICAgICAgICBvblJlbW92ZVJvdz17cmVtb3ZlUm93fVxuICAgICAgICAgIG9uQWRkQ29sdW1uPXthZGRDb2x1bW59XG4gICAgICAgICAgb25SZW1vdmVDb2x1bW49e3JlbW92ZUNvbHVtbn1cbiAgICAgICAgICBvblJlbW92ZVRhYmxlPXtyZW1vdmVUYWJsZX1cbiAgICAgICAgICBoYXNCb3JkZXI9e2hhc0JvcmRlcigpfVxuICAgICAgICAgIG9uVG9nZ2xlQm9yZGVyPXt0b2dnbGVCb3JkZXJ9XG4gICAgICAgICAgb25Eb25lPXtvbkRvbmV9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gVGI7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBOb2RlID0gKHByb3BzKSA9PiB7XG4gICAgc3dpdGNoIChwcm9wcy5ub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIDxUYWJsZSB7Li4ucHJvcHN9IG9uRm9jdXM9e29wdHMub25Gb2N1c30gb25CbHVyPXtvcHRzLm9uQmx1cn0gLz47XG4gICAgICBjYXNlICd0YWJsZV9yb3cnOlxuICAgICAgICByZXR1cm4gPFRhYmxlUm93IHsuLi5wcm9wc30gLz47XG4gICAgICBjYXNlICd0YWJsZV9jZWxsJzpcbiAgICAgICAgcmV0dXJuIDxUYWJsZUNlbGwgey4uLnByb3BzfSBvbkZvY3VzPXtvcHRzLm9uRm9jdXN9IG9uQmx1cj17b3B0cy5vbkJsdXJ9IC8+O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICBOb2RlLnByb3BUeXBlcyA9IHtcbiAgICBub2RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9O1xuXG4gIGNvcmUubm9ybWFsaXplTm9kZSA9IChub2RlKSA9PiB7XG4gICAgY29uc3QgYWRkTm9kZUJlZm9yZUFycmF5ID0gW107XG5cbiAgICBpZiAobm9kZS5vYmplY3QgIT09ICdkb2N1bWVudCcpIHJldHVybjtcblxuICAgIG5vZGUuZmluZERlc2NlbmRhbnQoKGQpID0+IHtcbiAgICAgIGlmIChkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgY29uc3QgdGFibGVQYXRoID0gbm9kZS5nZXRQYXRoKGQua2V5KTtcbiAgICAgICAgY29uc3QgcHJldk5vZGUgPSBub2RlLmdldFByZXZpb3VzTm9kZSh0YWJsZVBhdGgpO1xuICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dE5vZGUodGFibGVQYXRoKTtcblxuICAgICAgICBpZiAoIXByZXZOb2RlIHx8ICFuZXh0Tm9kZSkge1xuICAgICAgICAgIGFkZE5vZGVCZWZvcmVBcnJheS5wdXNoKHtcbiAgICAgICAgICAgIG5vZGU6IGQsXG4gICAgICAgICAgICBwcmV2Tm9kZSxcbiAgICAgICAgICAgIG5leHROb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZE5vZGVCZWZvcmVBcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNoYW5nZSkgPT4ge1xuICAgICAgY29uc3QgbmV3QmxvY2sgPSB7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ2RpdicsXG4gICAgICB9O1xuXG4gICAgICBhZGROb2RlQmVmb3JlQXJyYXkuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICBjb25zdCB0YWJsZVBhdGggPSBjaGFuZ2UudmFsdWUuZG9jdW1lbnQuZ2V0UGF0aChuLm5vZGUua2V5KS50b0pTT04oKTtcbiAgICAgICAgLy8gcmVtb3ZpbmcgdGFibGVJbmRleFxuICAgICAgICBsZXQgaW5kZXhUb0FkZCA9IHRhYmxlUGF0aC5zcGxpY2UoLTEpWzBdO1xuXG4gICAgICAgIGlmICghbi5wcmV2Tm9kZSkge1xuICAgICAgICAgIC8vIGluc2VydGluZyBibG9jayBrZXkgYmVmb3JlIHRhYmxlXG4gICAgICAgICAgY2hhbmdlLmluc2VydE5vZGVCeVBhdGgodGFibGVQYXRoLCBpbmRleFRvQWRkLCBuZXdCbG9jayk7XG4gICAgICAgICAgLy8gdGhpcyB3aWxsIHRyaWdnZXIgYW5vdGhlciBub3JtYWxpemF0aW9uLCB3aGljaCB3aWxsIGZpZ3VyZSBvdXQgaWYgdGhlcmUncyBub3RcbiAgICAgICAgICAvLyBhIGJsb2NrIGFmdGVyIHRoZSB0YWJsZSBhbmQgYWRkIGl0LCBzbyB3ZSBleGl0IGZvciBub3dcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW4ubmV4dE5vZGUpIHtcbiAgICAgICAgICAvLyBpbnNlcnRpbmcgYmxvY2sga2V5IGFmdGVyIHRhYmxlXG4gICAgICAgICAgY2hhbmdlLmluc2VydE5vZGVCeVBhdGgodGFibGVQYXRoLCBpbmRleFRvQWRkICsgMSwgbmV3QmxvY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGNvcmUucmVuZGVyTm9kZSA9IE5vZGU7XG4gIGNvcmUubmFtZSA9ICd0YWJsZSc7XG5cbiAgcmV0dXJuIGNvcmU7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VTdHlsZVN0cmluZyA9IChzKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gLyhbXFx3LV0qKVxccyo6XFxzKihbXjtdKikvZztcbiAgbGV0IG1hdGNoO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpKSB7XG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IChvKSA9PiB0b1N0eWxlT2JqZWN0KG8sIHsgY2FtZWxpemU6IHRydWUsIGFkZFVuaXRzOiBmYWxzZSB9KTtcblxuY29uc3QgYXR0cmlidXRlc1RvTWFwID0gKGVsKSA9PiAoYWNjLCBhdHRyaWJ1dGUpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N0eWxlJykge1xuICAgICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IHJlYWN0U3R5bGVPYmplY3QgPSByZWFjdEF0dHJpYnV0ZXMocGFyc2VTdHlsZVN0cmluZyhzdHlsZVN0cmluZykpO1xuICAgICAgYWNjWydzdHlsZSddID0gcmVhY3RTdHlsZU9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2F0dHJpYnV0ZV0gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbmNvbnN0IGRhdGFUb0F0dHJpYnV0ZXMgPSAoZGF0YSkgPT4ge1xuICBpZiAoIWRhdGEgfHwgIWRhdGEuZ2V0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIGRhdGEucmVkdWNlKChhY2MsIHYsIG5hbWUpID0+IHtcbiAgICBpZiAodikge1xuICAgICAgYWNjW2NvbnZlcnQobmFtZSldID0gdjtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufTtcblxuY29uc3QgYXR0cmlidXRlcyA9IFsnYm9yZGVyJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJywgJ2NsYXNzJywgJ3N0eWxlJ107XG5cbmNvbnN0IGNlbGxBdHRyaWJ1dGVzID0gWydjb2xzcGFuJywgJ3Jvd3NwYW4nLCAnY2xhc3MnLCAnc3R5bGUnXTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6YXRpb24gPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzoge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9XG4gICAgICAgICAgZWwuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGVsLmNoaWxkcmVuWzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Rib2R5J1xuICAgICAgICAgICAgPyBlbC5jaGlsZHJlblswXS5jaGlsZHJlblxuICAgICAgICAgICAgOiBlbC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgYyA9IEFycmF5LmZyb20oY2hpbGRyZW4pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICAgICAgbm9kZXM6IG5leHQoYyksXG4gICAgICAgICAgZGF0YTogYXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwge30pLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICd0aCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgICAgdHlwZTogJ3RhYmxlX2NlbGwnLFxuICAgICAgICAgIG5vZGVzOiBuZXh0KGVsLmNoaWxkTm9kZXMpLFxuICAgICAgICAgIGRhdGE6IGNlbGxBdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7IGhlYWRlcjogdHJ1ZSB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndHInOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZV9yb3cnLFxuICAgICAgICAgIG5vZGVzOiBuZXh0KEFycmF5LmZyb20oZWwuY2hpbGRyZW4pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndGQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZV9jZWxsJyxcbiAgICAgICAgICBub2RlczogbmV4dChBcnJheS5mcm9tKGVsLmNoaWxkTm9kZXMpKSxcbiAgICAgICAgICBkYXRhOiBjZWxsQXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwgeyBoZWFkZXI6IGZhbHNlIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2VyaWFsaXplKG9iamVjdCwgY2hpbGRyZW4pIHtcbiAgICBpZiAob2JqZWN0Lm9iamVjdCAhPT0gJ2Jsb2NrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAob2JqZWN0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzoge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YVRvQXR0cmlidXRlcyhvYmplY3QuZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8dGFibGUgey4uLmF0dHJpYnV0ZXN9PlxuICAgICAgICAgICAgPHRib2R5PntjaGlsZHJlbn08L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3RhYmxlX3Jvdyc6IHtcbiAgICAgICAgcmV0dXJuIDx0cj57Y2hpbGRyZW59PC90cj47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3RhYmxlX2NlbGwnOiB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkYXRhVG9BdHRyaWJ1dGVzKG9iamVjdC5kYXRhKTtcbiAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuaGVhZGVyO1xuXG4gICAgICAgIGlmIChvYmplY3QuZGF0YS5nZXQoJ2hlYWRlcicpKSB7XG4gICAgICAgICAgcmV0dXJuIDx0aCB7Li4uYXR0cmlidXRlc30+e2NoaWxkcmVufTwvdGg+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiA8dGQgey4uLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L3RkPjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iXX0=