occam-dom 5.0.0 → 5.0.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 (64) hide show
  1. package/example.js +1495 -1305
  2. package/lib/example/constants.js +22 -0
  3. package/lib/example/utilities/query.js +23 -0
  4. package/lib/example/view/div/sizeable.js +2 -2
  5. package/lib/example/view/textarea/expressions.js +143 -0
  6. package/lib/example/view/textarea/outerNodes.js +147 -0
  7. package/lib/example/view/{input/expressionString.js → textarea/parseTree/inner.js} +43 -28
  8. package/lib/{expression/parser.js → example/view/textarea/parseTree/outer.js} +20 -28
  9. package/lib/example/view/textarea/parseTree.js +1 -19
  10. package/lib/example/view.js +26 -20
  11. package/lib/index.js +7 -19
  12. package/lib/node.js +302 -0
  13. package/lib/parseTree/childNodes.js +164 -0
  14. package/lib/parseTree/horizontalBranch.js +120 -0
  15. package/lib/parseTree/node.js +145 -0
  16. package/lib/parseTree/string.js +109 -0
  17. package/lib/parseTree/verticalBranch.js +184 -0
  18. package/lib/parseTree.js +191 -0
  19. package/lib/utilities/node.js +56 -309
  20. package/package.json +3 -2
  21. package/src/example/constants.js +4 -0
  22. package/src/example/utilities/query.js +21 -0
  23. package/src/example/view/div/sizeable.js +1 -1
  24. package/src/example/view/textarea/expressions.js +39 -0
  25. package/src/example/view/textarea/outerNodes.js +48 -0
  26. package/src/example/view/textarea/parseTree/inner.js +24 -0
  27. package/src/example/view/textarea/parseTree/outer.js +17 -0
  28. package/src/example/view/textarea/parseTree.js +0 -18
  29. package/src/example/view.js +44 -32
  30. package/src/index.js +2 -5
  31. package/src/node.js +221 -0
  32. package/src/parseTree/childNodes.js +108 -0
  33. package/src/parseTree/horizontalBranch.js +32 -0
  34. package/src/parseTree/node.js +77 -0
  35. package/src/parseTree/string.js +18 -0
  36. package/src/parseTree/verticalBranch.js +77 -0
  37. package/src/parseTree.js +141 -0
  38. package/src/utilities/node.js +66 -416
  39. package/lib/example/view/textarea/nodes.js +0 -155
  40. package/lib/expression/bnf.js +0 -14
  41. package/lib/expression/entries.js +0 -27
  42. package/lib/expression/lexer.js +0 -145
  43. package/lib/expression.js +0 -113
  44. package/lib/path.js +0 -69
  45. package/lib/query.js +0 -216
  46. package/lib/ruleNames.js +0 -54
  47. package/lib/spread.js +0 -113
  48. package/lib/subExpression.js +0 -101
  49. package/lib/utilities/array.js +0 -67
  50. package/lib/utilities/query.js +0 -39
  51. package/src/example/view/input/expressionString.js +0 -33
  52. package/src/example/view/textarea/nodes.js +0 -55
  53. package/src/expression/bnf.js +0 -63
  54. package/src/expression/entries.js +0 -18
  55. package/src/expression/lexer.js +0 -35
  56. package/src/expression/parser.js +0 -15
  57. package/src/expression.js +0 -82
  58. package/src/path.js +0 -32
  59. package/src/query.js +0 -207
  60. package/src/ruleNames.js +0 -12
  61. package/src/spread.js +0 -104
  62. package/src/subExpression.js +0 -52
  63. package/src/utilities/array.js +0 -30
  64. package/src/utilities/query.js +0 -22
@@ -9,326 +9,73 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- endIndexFromSpreadNode: function() {
13
- return endIndexFromSpreadNode;
12
+ default: function() {
13
+ return _default;
14
14
  },
15
- errorNodesFromExpressionNode: function() {
16
- return errorNodesFromExpressionNode;
17
- },
18
- indexFromIndexNode: function() {
19
- return indexFromIndexNode;
20
- },
21
- indexFromSpreadNode: function() {
22
- return indexFromSpreadNode;
23
- },
24
- infiniteDescentFromPathNode: function() {
25
- return infiniteDescentFromPathNode;
26
- },
27
- pathNodeFromExpressionNode: function() {
28
- return pathNodeFromExpressionNode;
29
- },
30
- pathNodeFromSubExpressionNode: function() {
31
- return pathNodeFromSubExpressionNode;
32
- },
33
- ruleNamesFromPathNode: function() {
34
- return ruleNamesFromPathNode;
35
- },
36
- selectorNodesFromPathNode: function() {
37
- return selectorNodesFromPathNode;
38
- },
39
- spreadNodeFromExpressionNode: function() {
40
- return spreadNodeFromExpressionNode;
41
- },
42
- spreadNodeFromSubExpressionNode: function() {
43
- return spreadNodeFromSubExpressionNode;
44
- },
45
- startIndexFromSpreadNode: function() {
46
- return startIndexFromSpreadNode;
47
- },
48
- subExpressionNodeFromExpressionNode: function() {
49
- return subExpressionNodeFromExpressionNode;
50
- },
51
- subExpressionNodeFromSubExpressionNode: function() {
52
- return subExpressionNodeFromSubExpressionNode;
53
- },
54
- tokenTypesFromPathNode: function() {
55
- return tokenTypesFromPathNode;
56
- },
57
- uniqueFromSpreadNode: function() {
58
- return uniqueFromSpreadNode;
15
+ topmostNodeFromOuterNodes: function() {
16
+ return topmostNodeFromOuterNodes;
59
17
  }
60
18
  });
61
- var _ruleNames = require("../ruleNames");
62
- function indexFromIndexNode(indexNode) {
63
- var nonTerminalNode = indexNode, index = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
64
- var terminalNode = firstChildNode, content = terminalNode.getContent(), index = Number(content);
65
- return index;
66
- });
67
- return index;
68
- }
69
- function ruleNamesFromPathNode(pathNode) {
70
- var selectorNodes = selectorNodesFromPathNode(pathNode), ruleNameNodes = selectorNodes.reduce(function(ruleNameNodes, selectorNode) {
71
- var nonTerminalNode = selectorNode, ruleNameNode = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
72
- var ruleNameNode = null;
73
- var nonTerminalNode = firstChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameRuleNameRuleName = ruleName === _ruleNames.RULE_NAME_RULE_NAME;
74
- if (ruleNameRuleNameRuleName) {
75
- ruleNameNode = nonTerminalNode; ///
76
- }
77
- return ruleNameNode;
78
- });
79
- if (ruleNameNode !== null) {
80
- ruleNameNodes.push(ruleNameNode);
81
- }
82
- return ruleNameNodes;
83
- }, []), ruleNames = ruleNameNodes.map(function(ruleNameNode) {
84
- var nonTerminalNode = ruleNameNode, ruleName = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
85
- var terminalNode = firstChildNode, content = terminalNode.getContent(), ruleName = content; ///
86
- return ruleName;
87
- });
88
- return ruleName;
89
- });
90
- return ruleNames;
91
- }
92
- function tokenTypesFromPathNode(pathNode) {
93
- var selectorNodes = selectorNodesFromPathNode(pathNode), tokenTypeNodes = selectorNodes.reduce(function(tokenTypeNodes, selectorNode) {
94
- var nonTerminalNode = selectorNode, tokenTypeNode = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
95
- var tokenTypeNode = null;
96
- var nonTerminalNode = firstChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameTokenTypeRuleName = ruleName === _ruleNames.TOKEN_TYPE_RULE_NAME;
97
- if (ruleNameTokenTypeRuleName) {
98
- tokenTypeNode = nonTerminalNode; ///
99
- }
100
- return tokenTypeNode;
101
- });
102
- if (tokenTypeNode !== null) {
103
- tokenTypeNodes.push(tokenTypeNode);
104
- }
105
- return tokenTypeNodes;
106
- }, []), tokenTypes = tokenTypeNodes.map(function(tokenTypeNode) {
107
- var nonTerminalNode = tokenTypeNode, tokenType = fromThirdChildNode(nonTerminalNode, function(thirdChildNode) {
108
- var terminalNode = thirdChildNode, content = terminalNode.getContent(), tokenType = content; ///
109
- return tokenType;
110
- });
111
- return tokenType;
112
- });
113
- return tokenTypes;
114
- }
115
- function selectorNodesFromPathNode(pathNode) {
116
- var nonTerminalNode;
117
- nonTerminalNode = pathNode; ///
118
- var selectorsNode = fromLastChildNode(nonTerminalNode, function(lastChildNode) {
119
- var selectorsNode = lastChildNode; ///
120
- return selectorsNode;
121
- });
122
- nonTerminalNode = selectorsNode; ///
123
- var selectorNodes = nonTerminalNode.filterChildNode(function(childNode) {
124
- var childNodeNonTerminalNode = childNode.isNonTerminalNode();
125
- if (childNodeNonTerminalNode) {
126
- return true;
127
- }
128
- });
129
- return selectorNodes;
130
- }
131
- function infiniteDescentFromPathNode(pathNode) {
132
- var nonTerminalNode = pathNode, infiniteDescent = fromSecondChildNode(nonTerminalNode, function(secondChildNode) {
133
- var nonTerminalNode = secondChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameInfiniteDescentRuleName = ruleName === _ruleNames.INFINITE_DESCENT_RULE_NAME, infiniteDescent = ruleNameInfiniteDescentRuleName; ///
134
- return infiniteDescent;
135
- }) || false;
136
- return infiniteDescent;
137
- }
138
- function uniqueFromSpreadNode(spreadNode) {
139
- var nonTerminalNode = spreadNode, unique = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
140
- var unique = false;
141
- var firstChildNodeNonTerminalNode = firstChildNode.isNonTerminalNode();
142
- if (firstChildNodeNonTerminalNode) {
143
- var nonTerminalNode = firstChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameUniqueRuleName = ruleName === _ruleNames.UNIQUE_RULE_NAME;
144
- if (ruleNameUniqueRuleName) {
145
- unique = true;
146
- }
147
- }
148
- return unique;
149
- });
150
- return unique;
151
- }
152
- function indexFromSpreadNode(spreadNode) {
153
- var index = null;
154
- var nonTerminalNode = spreadNode, indexNode = nonTerminalNode.findChildNode(function(childNode) {
155
- var childNodeNonTerminalNode = childNode.isNonTerminalNode();
156
- if (childNodeNonTerminalNode) {
157
- var nonTerminalNode = childNode, ruleName = nonTerminalNode.getRuleName(), ruleNameIndexRuleName = ruleName === _ruleNames.INDEX_RULE_NAME;
158
- if (ruleNameIndexRuleName) {
159
- return true;
160
- }
161
- }
162
- }) || null;
163
- if (indexNode !== null) {
164
- index = indexFromIndexNode(indexNode);
165
- }
166
- return index;
167
- }
168
- function endIndexFromSpreadNode(spreadNode) {
169
- var endIndex = Infinity;
170
- var nonTerminalNode = spreadNode, endIndexNode = nonTerminalNode.findChildNode(function(childNode) {
171
- var childNodeNonTerminalNode = childNode.isNonTerminalNode();
172
- if (childNodeNonTerminalNode) {
173
- var nonTerminalNode = childNode, ruleName = nonTerminalNode.getRuleName(), ruleNameEndIndexRuleName = ruleName === _ruleNames.END_INDEX_RULE_NAME;
174
- if (ruleNameEndIndexRuleName) {
175
- return true;
176
- }
177
- }
178
- }) || null;
179
- if (endIndexNode !== null) {
180
- endIndex = indexFromIndexNode(endIndexNode);
19
+ var _node = /*#__PURE__*/ _interop_require_default(require("../node"));
20
+ function _interop_require_default(obj) {
21
+ return obj && obj.__esModule ? obj : {
22
+ default: obj
23
+ };
24
+ }
25
+ function topmostNodeFromOuterNodes(Class, outerNodes) {
26
+ if (outerNodes === undefined) {
27
+ outerNodes = Class; ///
28
+ Class = _node.default; ///
181
29
  }
182
- return endIndex;
183
- }
184
- function startIndexFromSpreadNode(spreadNode) {
185
- var startIndex = 0;
186
- var nonTerminalNode = spreadNode, startIndexNode = nonTerminalNode.findChildNode(function(childNode) {
187
- var childNodeNonTerminalNode = childNode.isNonTerminalNode();
188
- if (childNodeNonTerminalNode) {
189
- var nonTerminalNode = childNode, ruleName = nonTerminalNode.getRuleName(), ruleNameStartIndexRuleName = ruleName === _ruleNames.START_INDEX_RULE_NAME;
190
- if (ruleNameStartIndexRuleName) {
30
+ var nodes = outerNodes; ///
31
+ orderNodes(nodes);
32
+ var topmostNode = _node.default.fromNothing(), outerNodeToNodeMap = new WeakMap();
33
+ outerNodes.forEach(function(outerNode) {
34
+ var ancestorNodes = outerNode.getAncestorNodes();
35
+ var parentNode = topmostNode; ///
36
+ ancestorNodes.some(function(ancestorNode) {
37
+ var _$outerNode = ancestorNode, node = outerNodeToNodeMap.get(_$outerNode) || null;
38
+ if (node !== null) {
39
+ parentNode = node; ///
191
40
  return true;
192
41
  }
193
- }
194
- }) || null;
195
- if (startIndexNode !== null) {
196
- startIndex = indexFromIndexNode(startIndexNode);
197
- }
198
- return startIndex;
199
- }
200
- function pathNodeFromExpressionNode(expressionNode) {
201
- var nonTerminalNode = expressionNode, pathNode = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
202
- var pathNode = firstChildNode; ///
203
- return pathNode;
204
- });
205
- return pathNode;
206
- }
207
- function spreadNodeFromExpressionNode(expressionNode) {
208
- var nonTerminalNode = expressionNode, spreadNode = fromSecondChildNode(nonTerminalNode, function(secondChildNode) {
209
- var spreadNode = null;
210
- var nonTerminalNode = secondChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameSpreadRuleName = ruleName === _ruleNames.SPREAD_RULE_NAME;
211
- if (ruleNameSpreadRuleName) {
212
- spreadNode = secondChildNode; ///
213
- }
214
- return spreadNode;
215
- }) || null;
216
- return spreadNode;
217
- }
218
- function errorNodesFromExpressionNode(expressionNode) {
219
- var nonTerminalNode = expressionNode, errorNodes = nonTerminalNode.reduceChildNode(function(errorNodes, childNode) {
220
- var childNodeNonTerminalNode = childNode.isNonTerminalNode();
221
- if (childNodeNonTerminalNode) {
222
- var nonTerminalNode = childNode, ruleName = nonTerminalNode.getRuleName(), ruleNameErrorRuleName = ruleName === _ruleNames.ERROR_RULE_NAME;
223
- if (ruleNameErrorRuleName) {
224
- var errorNode = nonTerminalNode; ///
225
- errorNodes.push(errorNode);
226
- }
227
- }
228
- return errorNodes;
229
- }, []);
230
- return errorNodes;
231
- }
232
- function subExpressionNodeFromExpressionNode(expressionNode) {
233
- var subExpressionNode = null;
234
- var nonTerminalNode = expressionNode, multiplicity = nonTerminalNode.getMultiplicity();
235
- if (multiplicity > 1) {
236
- subExpressionNode = fromLastChildNode(nonTerminalNode, function(lastChildNode) {
237
- var subExpressionNode = null;
238
- var nonTerminalNode = lastChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameSubExpressionRuleName = ruleName === _ruleNames.SUB_EXPRESSION_RULE_NAME;
239
- if (ruleNameSubExpressionRuleName) {
240
- subExpressionNode = lastChildNode; ///
241
- }
242
- return subExpressionNode;
243
42
  });
244
- }
245
- return subExpressionNode;
246
- }
247
- function pathNodeFromSubExpressionNode(subExpressionNode) {
248
- var nonTerminalNode = subExpressionNode, pathNode = fromFirstChildNode(nonTerminalNode, function(firstChildNode) {
249
- var pathNode = firstChildNode; ///
250
- return pathNode;
43
+ var node = Class.fromOuterNode(outerNode), childNode = node; ///
44
+ parentNode.addChildNode(childNode);
45
+ outerNodeToNodeMap.set(outerNode, node);
251
46
  });
252
- return pathNode;
253
- }
254
- function spreadNodeFromSubExpressionNode(subExpressionNode) {
255
- var spreadNode = null;
256
- var nonTerminalNode = subExpressionNode, multiplicity = nonTerminalNode.getMultiplicity();
257
- if (multiplicity > 1) {
258
- spreadNode = fromSecondChildNode(nonTerminalNode, function(secondChildNode) {
259
- var spreadNode = null;
260
- var nonTerminalNode = secondChildNode, ruleName = nonTerminalNode.getRuleName(), ruleNameSpreadRuleName = ruleName === _ruleNames.SPREAD_RULE_NAME;
261
- if (ruleNameSpreadRuleName) {
262
- spreadNode = secondChildNode; ///
263
- }
264
- return spreadNode;
265
- }) || null;
266
- }
267
- return spreadNode;
268
- }
269
- function subExpressionNodeFromSubExpressionNode(subExpressionNode) {
270
- var nonTerminalNode = subExpressionNode; ///
271
- subExpressionNode = null;
272
- var multiplicity = nonTerminalNode.getMultiplicity();
273
- if (multiplicity > 1) {
274
- subExpressionNode = fromLastChildNode(nonTerminalNode, function(lastChildNode) {
275
- var _$subExpressionNode = null;
276
- var nonTerminalNoe = lastChildNode, ruleName = nonTerminalNoe.getRuleName(), ruleNameSubExpressionRuleName = ruleName === _ruleNames.SUB_EXPRESSION_RULE_NAME;
277
- if (ruleNameSubExpressionRuleName) {
278
- _$subExpressionNode = lastChildNode; ///
279
- }
280
- return _$subExpressionNode;
281
- });
282
- }
283
- return subExpressionNode;
284
- }
285
- function fromFirstChildNode(nonTerminalNode, callback) {
286
- var result;
287
- var firstIndex = 0;
288
- nonTerminalNode.forwardsSomeChildNode(function(childNode, index) {
289
- if (index === firstIndex) {
290
- var firstChildNode = childNode; ///
291
- result = callback(firstChildNode);
292
- return true;
293
- }
47
+ return topmostNode;
48
+ }
49
+ var _default = {
50
+ topmostNodeFromOuterNodes: topmostNodeFromOuterNodes
51
+ };
52
+ function orderNodes(nodes) {
53
+ nodes.sort(function(nodeA, nodeB) {
54
+ var nodeALessThanNodeB = isLessThan(nodeA, nodeB), result = nodeALessThanNodeB ? -1 : +1;
55
+ return result;
294
56
  });
295
- return result;
296
57
  }
297
- function fromSecondChildNode(nonTerminalNode, callback) {
298
- var result;
299
- var secondIndex = 1;
300
- nonTerminalNode.forwardsSomeChildNode(function(childNode, index) {
301
- if (index === secondIndex) {
302
- var firstChildNode = childNode; ///
303
- result = callback(firstChildNode);
304
- return true;
58
+ function isLessThan(nodeA, nodeB) {
59
+ var lessThan = null;
60
+ var ancestorNodesA = ancestorNodesFromNode(nodeA), ancestorNodesB = ancestorNodesFromNode(nodeB), ancestorNodesALength = ancestorNodesA.length, ancestorNodesBLength = ancestorNodesB.length, minimumAncestorNodesLength = Math.min(ancestorNodesALength, ancestorNodesBLength);
61
+ for(var index = 0; index < minimumAncestorNodesLength; index++){
62
+ var ancestorNodeA = ancestorNodesA[index], ancestorNodeB = ancestorNodesB[index];
63
+ if (ancestorNodeA !== ancestorNodeB) {
64
+ var parentIndex = index - 1, ancestorNodeAParentNode = ancestorNodesA[parentIndex], parentNode = ancestorNodeAParentNode, childNodeA = ancestorNodeA, childNodeB = ancestorNodeB, indexA = parentNode.indexOfChildNode(childNodeA), indexB = parentNode.indexOfChildNode(childNodeB);
65
+ lessThan = indexA < indexB;
66
+ break;
305
67
  }
306
- });
307
- return result;
308
- }
309
- function fromThirdChildNode(nonTerminalNode, callback) {
310
- var result;
311
- var thirdIndex = 2;
312
- nonTerminalNode.forwardsSomeChildNode(function(childNode, index) {
313
- if (index === thirdIndex) {
314
- var thirdChildNode = childNode; ///
315
- result = callback(thirdChildNode);
316
- return true;
317
- }
318
- });
319
- return result;
68
+ }
69
+ if (lessThan === null) {
70
+ lessThan = ancestorNodesALength < ancestorNodesBLength;
71
+ }
72
+ return lessThan;
320
73
  }
321
- function fromLastChildNode(nonTerminalNode, callback) {
322
- var result;
323
- var multiplicity = nonTerminalNode.getMultiplicity(), lastIndex = multiplicity - 1;
324
- nonTerminalNode.backwardsSomeChildNode(function(childNode, index) {
325
- if (index === lastIndex) {
326
- var thirdChildNode = childNode; ///
327
- result = callback(thirdChildNode);
328
- return true;
329
- }
330
- });
331
- return result;
74
+ function ancestorNodesFromNode(node) {
75
+ var ancestorNodes = node.getAncestorNodes();
76
+ ancestorNodes.unshift(node);
77
+ ancestorNodes.reverse();
78
+ return ancestorNodes;
332
79
  }
333
80
 
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvbm9kZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRVJST1JfUlVMRV9OQU1FLFxuICAgICAgICAgSU5ERVhfUlVMRV9OQU1FLFxuICAgICAgICAgVU5JUVVFX1JVTEVfTkFNRSxcbiAgICAgICAgIFNQUkVBRF9SVUxFX05BTUUsXG4gICAgICAgICBFTkRfSU5ERVhfUlVMRV9OQU1FLFxuICAgICAgICAgUlVMRV9OQU1FX1JVTEVfTkFNRSxcbiAgICAgICAgIFRPS0VOX1RZUEVfUlVMRV9OQU1FLFxuICAgICAgICAgU1RBUlRfSU5ERVhfUlVMRV9OQU1FLFxuICAgICAgICAgU1VCX0VYUFJFU1NJT05fUlVMRV9OQU1FLFxuICAgICAgICAgSU5GSU5JVEVfREVTQ0VOVF9SVUxFX05BTUUgfSBmcm9tIFwiLi4vcnVsZU5hbWVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleEZyb21JbmRleE5vZGUoaW5kZXhOb2RlKSB7XG4gIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGluZGV4Tm9kZSwgLy8vXG4gICAgICAgIGluZGV4ID0gZnJvbUZpcnN0Q2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgKGZpcnN0Q2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGVybWluYWxOb2RlID0gZmlyc3RDaGlsZE5vZGUsICAvLy9cbiAgICAgICAgICAgICAgICBjb250ZW50ID0gdGVybWluYWxOb2RlLmdldENvbnRlbnQoKSxcbiAgICAgICAgICAgICAgICBpbmRleCA9IE51bWJlcihjb250ZW50KTtcblxuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfSk7XG5cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVsZU5hbWVzRnJvbVBhdGhOb2RlKHBhdGhOb2RlKSB7XG4gIGNvbnN0IHNlbGVjdG9yTm9kZXMgPSBzZWxlY3Rvck5vZGVzRnJvbVBhdGhOb2RlKHBhdGhOb2RlKSxcbiAgICAgICAgcnVsZU5hbWVOb2RlcyA9IHNlbGVjdG9yTm9kZXMucmVkdWNlKChydWxlTmFtZU5vZGVzLCBzZWxlY3Rvck5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzZWxlY3Rvck5vZGUsIC8vL1xuICAgICAgICAgICAgICAgIHJ1bGVOYW1lTm9kZSA9IGZyb21GaXJzdENoaWxkTm9kZShub25UZXJtaW5hbE5vZGUsIChmaXJzdENoaWxkTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVOYW1lTm9kZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGZpcnN0Q2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlTmFtZVJ1bGVOYW1lUnVsZU5hbWUgPSAocnVsZU5hbWUgPT09IFJVTEVfTkFNRV9SVUxFX05BTUUpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAocnVsZU5hbWVSdWxlTmFtZVJ1bGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lTm9kZSA9IG5vblRlcm1pbmFsTm9kZTsgLy8vXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBydWxlTmFtZU5vZGU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAocnVsZU5hbWVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBydWxlTmFtZU5vZGVzLnB1c2gocnVsZU5hbWVOb2RlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcnVsZU5hbWVOb2RlcztcbiAgICAgICAgfSwgW10pLFxuICAgICAgICBydWxlTmFtZXMgPSBydWxlTmFtZU5vZGVzLm1hcCgocnVsZU5hbWVOb2RlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gcnVsZU5hbWVOb2RlLCAvLy9cbiAgICAgICAgICAgICAgICBydWxlTmFtZSA9IGZyb21GaXJzdENoaWxkTm9kZShub25UZXJtaW5hbE5vZGUsIChmaXJzdENoaWxkTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWxOb2RlID0gZmlyc3RDaGlsZE5vZGUsICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB0ZXJtaW5hbE5vZGUuZ2V0Q29udGVudCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWUgPSBjb250ZW50OyAvLy9cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVOYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHJ1bGVOYW1lO1xuICAgICAgICB9KTtcblxuICByZXR1cm4gcnVsZU5hbWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5UeXBlc0Zyb21QYXRoTm9kZShwYXRoTm9kZSkge1xuICBjb25zdCBzZWxlY3Rvck5vZGVzID0gc2VsZWN0b3JOb2Rlc0Zyb21QYXRoTm9kZShwYXRoTm9kZSksXG4gICAgICAgIHRva2VuVHlwZU5vZGVzID0gc2VsZWN0b3JOb2Rlcy5yZWR1Y2UoKHRva2VuVHlwZU5vZGVzLCBzZWxlY3Rvck5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzZWxlY3Rvck5vZGUsIC8vL1xuICAgICAgICAgICAgICAgIHRva2VuVHlwZU5vZGUgPSBmcm9tRmlyc3RDaGlsZE5vZGUobm9uVGVybWluYWxOb2RlLCAoZmlyc3RDaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCB0b2tlblR5cGVOb2RlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gZmlyc3RDaGlsZE5vZGUsIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWUgPSBub25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lVG9rZW5UeXBlUnVsZU5hbWUgPSAocnVsZU5hbWUgPT09IFRPS0VOX1RZUEVfUlVMRV9OQU1FKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVOYW1lVG9rZW5UeXBlUnVsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlTm9kZSA9IG5vblRlcm1pbmFsTm9kZTsgLy8vXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblR5cGVOb2RlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRva2VuVHlwZU5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRva2VuVHlwZU5vZGVzLnB1c2godG9rZW5UeXBlTm9kZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRva2VuVHlwZU5vZGVzO1xuICAgICAgICB9LCBbXSksXG4gICAgICAgIHRva2VuVHlwZXMgPSB0b2tlblR5cGVOb2Rlcy5tYXAoKHRva2VuVHlwZU5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSB0b2tlblR5cGVOb2RlLCAgLy8vXG4gICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gZnJvbVRoaXJkQ2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgKHRoaXJkQ2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbE5vZGUgPSB0aGlyZENoaWxkTm9kZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRlcm1pbmFsTm9kZS5nZXRDb250ZW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSBjb250ZW50OyAgLy8vXG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblR5cGU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdG9rZW5UeXBlO1xuICAgICAgICB9KTtcblxuICByZXR1cm4gdG9rZW5UeXBlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdG9yTm9kZXNGcm9tUGF0aE5vZGUocGF0aE5vZGUpIHtcbiAgbGV0IG5vblRlcm1pbmFsTm9kZTtcblxuICBub25UZXJtaW5hbE5vZGUgPSBwYXRoTm9kZTsgLy8vXG5cbiAgY29uc3Qgc2VsZWN0b3JzTm9kZSA9IGZyb21MYXN0Q2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgKGxhc3RDaGlsZE5vZGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RvcnNOb2RlID0gbGFzdENoaWxkTm9kZTsgIC8vL1xuXG4gICAgcmV0dXJuIHNlbGVjdG9yc05vZGU7XG4gIH0pO1xuXG4gIG5vblRlcm1pbmFsTm9kZSA9IHNlbGVjdG9yc05vZGU7ICAvLy9cblxuICBjb25zdCBzZWxlY3Rvck5vZGVzID0gbm9uVGVybWluYWxOb2RlLmZpbHRlckNoaWxkTm9kZSgoY2hpbGROb2RlKSA9PiB7XG4gICAgY29uc3QgY2hpbGROb2RlTm9uVGVybWluYWxOb2RlID0gY2hpbGROb2RlLmlzTm9uVGVybWluYWxOb2RlKCk7XG5cbiAgICBpZiAoY2hpbGROb2RlTm9uVGVybWluYWxOb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBzZWxlY3Rvck5vZGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5maW5pdGVEZXNjZW50RnJvbVBhdGhOb2RlKHBhdGhOb2RlKSB7XG4gIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IHBhdGhOb2RlLCAvLy9cbiAgICAgICAgaW5maW5pdGVEZXNjZW50ID0gZnJvbVNlY29uZENoaWxkTm9kZShub25UZXJtaW5hbE5vZGUsIChzZWNvbmRDaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzZWNvbmRDaGlsZE5vZGUsICAvLy9cbiAgICAgICAgICAgICAgICBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLFxuICAgICAgICAgICAgICAgIHJ1bGVOYW1lSW5maW5pdGVEZXNjZW50UnVsZU5hbWUgPSAocnVsZU5hbWUgPT09IElORklOSVRFX0RFU0NFTlRfUlVMRV9OQU1FKSxcbiAgICAgICAgICAgICAgICBpbmZpbml0ZURlc2NlbnQgPSBydWxlTmFtZUluZmluaXRlRGVzY2VudFJ1bGVOYW1lOyAgLy8vXG5cbiAgICAgICAgICByZXR1cm4gaW5maW5pdGVEZXNjZW50O1xuICAgICAgICB9KSB8fCBmYWxzZTtcblxuICByZXR1cm4gaW5maW5pdGVEZXNjZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlRnJvbVNwcmVhZE5vZGUoc3ByZWFkTm9kZSkge1xuICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzcHJlYWROb2RlLFxuICAgICAgICB1bmlxdWUgPSBmcm9tRmlyc3RDaGlsZE5vZGUobm9uVGVybWluYWxOb2RlLCAoZmlyc3RDaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICBsZXQgdW5pcXVlID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBmaXJzdENoaWxkTm9kZU5vblRlcm1pbmFsTm9kZSA9IGZpcnN0Q2hpbGROb2RlLmlzTm9uVGVybWluYWxOb2RlKCk7XG5cbiAgICAgICAgICBpZiAoZmlyc3RDaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGZpcnN0Q2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCksXG4gICAgICAgICAgICAgICAgICBydWxlTmFtZVVuaXF1ZVJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBVTklRVUVfUlVMRV9OQU1FKTtcblxuICAgICAgICAgICAgaWYgKHJ1bGVOYW1lVW5pcXVlUnVsZU5hbWUpIHtcbiAgICAgICAgICAgICAgdW5pcXVlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5pcXVlO1xuICAgICAgICB9KTtcblxuICByZXR1cm4gdW5pcXVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhGcm9tU3ByZWFkTm9kZShzcHJlYWROb2RlKSB7XG4gIGxldCBpbmRleCA9IG51bGw7XG5cbiAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gc3ByZWFkTm9kZSwgLy8vXG4gICAgICAgIGluZGV4Tm9kZSA9IG5vblRlcm1pbmFsTm9kZS5maW5kQ2hpbGROb2RlKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUgPSBjaGlsZE5vZGUuaXNOb25UZXJtaW5hbE5vZGUoKTtcblxuICAgICAgICAgIGlmIChjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGNoaWxkTm9kZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgcnVsZU5hbWUgPSBub25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lSW5kZXhSdWxlTmFtZSA9IChydWxlTmFtZSA9PT0gSU5ERVhfUlVMRV9OQU1FKTtcblxuICAgICAgICAgICAgaWYgKHJ1bGVOYW1lSW5kZXhSdWxlTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pIHx8IG51bGw7XG5cbiAgaWYgKGluZGV4Tm9kZSAhPT0gbnVsbCkge1xuICAgIGluZGV4ID0gaW5kZXhGcm9tSW5kZXhOb2RlKGluZGV4Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmRJbmRleEZyb21TcHJlYWROb2RlKHNwcmVhZE5vZGUpIHtcbiAgbGV0IGVuZEluZGV4ID0gSW5maW5pdHk7XG5cbiAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gc3ByZWFkTm9kZSwgLy8vXG4gICAgICAgIGVuZEluZGV4Tm9kZSA9IG5vblRlcm1pbmFsTm9kZS5maW5kQ2hpbGROb2RlKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUgPSBjaGlsZE5vZGUuaXNOb25UZXJtaW5hbE5vZGUoKTtcblxuICAgICAgICAgIGlmIChjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGNoaWxkTm9kZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgcnVsZU5hbWUgPSBub25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lRW5kSW5kZXhSdWxlTmFtZSA9IChydWxlTmFtZSA9PT0gRU5EX0lOREVYX1JVTEVfTkFNRSk7XG5cbiAgICAgICAgICAgIGlmIChydWxlTmFtZUVuZEluZGV4UnVsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSB8fCBudWxsO1xuXG4gIGlmIChlbmRJbmRleE5vZGUgIT09IG51bGwpIHtcbiAgICBlbmRJbmRleCA9IGluZGV4RnJvbUluZGV4Tm9kZShlbmRJbmRleE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIGVuZEluZGV4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRJbmRleEZyb21TcHJlYWROb2RlKHNwcmVhZE5vZGUpIHtcbiAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuXG4gIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IHNwcmVhZE5vZGUsIC8vL1xuICAgICAgICBzdGFydEluZGV4Tm9kZSA9IG5vblRlcm1pbmFsTm9kZS5maW5kQ2hpbGROb2RlKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUgPSBjaGlsZE5vZGUuaXNOb25UZXJtaW5hbE5vZGUoKTtcblxuICAgICAgICAgIGlmIChjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGNoaWxkTm9kZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgcnVsZU5hbWUgPSBub25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lU3RhcnRJbmRleFJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBTVEFSVF9JTkRFWF9SVUxFX05BTUUpO1xuXG4gICAgICAgICAgICBpZiAocnVsZU5hbWVTdGFydEluZGV4UnVsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSB8fCBudWxsO1xuXG4gIGlmIChzdGFydEluZGV4Tm9kZSAhPT0gbnVsbCkge1xuICAgIHN0YXJ0SW5kZXggPSBpbmRleEZyb21JbmRleE5vZGUoc3RhcnRJbmRleE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXJ0SW5kZXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoTm9kZUZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSkge1xuICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBleHByZXNzaW9uTm9kZSwgLy8vXG4gICAgICAgIHBhdGhOb2RlID0gZnJvbUZpcnN0Q2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgKGZpcnN0Q2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aE5vZGUgPSBmaXJzdENoaWxkTm9kZTsgIC8vL1xuXG4gICAgICAgICAgcmV0dXJuIHBhdGhOb2RlO1xuICAgICAgICB9KTtcblxuICByZXR1cm4gcGF0aE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcHJlYWROb2RlRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlKSB7XG4gIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGV4cHJlc3Npb25Ob2RlLCAvLy9cbiAgICAgICAgc3ByZWFkTm9kZSA9IGZyb21TZWNvbmRDaGlsZE5vZGUobm9uVGVybWluYWxOb2RlLCAoc2Vjb25kQ2hpbGROb2RlKSA9PiB7XG4gICAgICAgICAgbGV0IHNwcmVhZE5vZGUgPSBudWxsO1xuXG4gICAgICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gc2Vjb25kQ2hpbGROb2RlLCAgLy8vXG4gICAgICAgICAgICAgICAgcnVsZU5hbWUgPSBub25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgICAgICAgICBydWxlTmFtZVNwcmVhZFJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBTUFJFQURfUlVMRV9OQU1FKTtcblxuICAgICAgICAgIGlmIChydWxlTmFtZVNwcmVhZFJ1bGVOYW1lKSB7XG4gICAgICAgICAgICBzcHJlYWROb2RlID0gc2Vjb25kQ2hpbGROb2RlOyAgLy8vXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHNwcmVhZE5vZGU7XG4gICAgICAgIH0pIHx8IG51bGw7XG5cbiAgcmV0dXJuIHNwcmVhZE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck5vZGVzRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlKSB7XG4gIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGV4cHJlc3Npb25Ob2RlLCAvLy9cbiAgICAgICAgZXJyb3JOb2RlcyA9IG5vblRlcm1pbmFsTm9kZS5yZWR1Y2VDaGlsZE5vZGUoKGVycm9yTm9kZXMsIGNoaWxkTm9kZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZU5vblRlcm1pbmFsTm9kZSA9IGNoaWxkTm9kZS5pc05vblRlcm1pbmFsTm9kZSgpO1xuXG4gICAgICAgICAgaWYgKGNoaWxkTm9kZU5vblRlcm1pbmFsTm9kZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gY2hpbGROb2RlLCAgLy8vXG4gICAgICAgICAgICAgICAgICBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLFxuICAgICAgICAgICAgICAgICAgcnVsZU5hbWVFcnJvclJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBFUlJPUl9SVUxFX05BTUUpO1xuXG4gICAgICAgICAgICBpZiAocnVsZU5hbWVFcnJvclJ1bGVOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTm9kZSA9IG5vblRlcm1pbmFsTm9kZTsgIC8vL1xuXG4gICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaChlcnJvck5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlcnJvck5vZGVzO1xuICAgICAgICB9LCBbXSk7XG5cbiAgcmV0dXJuIGVycm9yTm9kZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJFeHByZXNzaW9uTm9kZUZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSkge1xuICBsZXQgc3ViRXhwcmVzc2lvbk5vZGUgPSBudWxsO1xuXG4gIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IGV4cHJlc3Npb25Ob2RlLCAvLy9cbiAgICAgICAgbXVsdGlwbGljaXR5ID0gbm9uVGVybWluYWxOb2RlLmdldE11bHRpcGxpY2l0eSgpO1xuXG4gIGlmIChtdWx0aXBsaWNpdHkgPiAxKSB7XG4gICAgc3ViRXhwcmVzc2lvbk5vZGUgPSBmcm9tTGFzdENoaWxkTm9kZShub25UZXJtaW5hbE5vZGUsIChsYXN0Q2hpbGROb2RlKSA9PiB7XG4gICAgICBsZXQgc3ViRXhwcmVzc2lvbk5vZGUgPSBudWxsO1xuXG4gICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBsYXN0Q2hpbGROb2RlLCAgLy8vXG4gICAgICAgICAgICBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLFxuICAgICAgICAgICAgcnVsZU5hbWVTdWJFeHByZXNzaW9uUnVsZU5hbWUgPSAocnVsZU5hbWUgPT09IFNVQl9FWFBSRVNTSU9OX1JVTEVfTkFNRSk7XG5cbiAgICAgIGlmIChydWxlTmFtZVN1YkV4cHJlc3Npb25SdWxlTmFtZSkge1xuICAgICAgICBzdWJFeHByZXNzaW9uTm9kZSA9IGxhc3RDaGlsZE5vZGU7ICAvLy9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1YkV4cHJlc3Npb25Ob2RlO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN1YkV4cHJlc3Npb25Ob2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aE5vZGVGcm9tU3ViRXhwcmVzc2lvbk5vZGUoc3ViRXhwcmVzc2lvbk5vZGUpIHtcbiAgY29uc3Qgbm9uVGVybWluYWxOb2RlID0gc3ViRXhwcmVzc2lvbk5vZGUsIC8vL1xuICAgICAgICBwYXRoTm9kZSA9IGZyb21GaXJzdENoaWxkTm9kZShub25UZXJtaW5hbE5vZGUsIChmaXJzdENoaWxkTm9kZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGhOb2RlID0gZmlyc3RDaGlsZE5vZGU7ICAvLy9cblxuICAgICAgICAgIHJldHVybiBwYXRoTm9kZTtcbiAgICAgICAgfSlcblxuICByZXR1cm4gcGF0aE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcHJlYWROb2RlRnJvbVN1YkV4cHJlc3Npb25Ob2RlKHN1YkV4cHJlc3Npb25Ob2RlKSB7XG4gIGxldCBzcHJlYWROb2RlID0gbnVsbDtcblxuICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzdWJFeHByZXNzaW9uTm9kZSwgLy8vXG4gICAgICAgIG11bHRpcGxpY2l0eSA9IG5vblRlcm1pbmFsTm9kZS5nZXRNdWx0aXBsaWNpdHkoKTtcblxuICBpZiAobXVsdGlwbGljaXR5ID4gMSkge1xuICAgIHNwcmVhZE5vZGUgPSBmcm9tU2Vjb25kQ2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgKHNlY29uZENoaWxkTm9kZSkgPT4ge1xuICAgICAgbGV0IHNwcmVhZE5vZGUgPSBudWxsO1xuXG4gICAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzZWNvbmRDaGlsZE5vZGUsICAvLy9cbiAgICAgICAgICAgIHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCksXG4gICAgICAgICAgICBydWxlTmFtZVNwcmVhZFJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBTUFJFQURfUlVMRV9OQU1FKTtcblxuICAgICAgaWYgKHJ1bGVOYW1lU3ByZWFkUnVsZU5hbWUpIHtcbiAgICAgICAgc3ByZWFkTm9kZSA9IHNlY29uZENoaWxkTm9kZTsgIC8vL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ByZWFkTm9kZTtcbiAgICB9KSB8fCBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNwcmVhZE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJFeHByZXNzaW9uTm9kZUZyb21TdWJFeHByZXNzaW9uTm9kZShzdWJFeHByZXNzaW9uTm9kZSkge1xuICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBzdWJFeHByZXNzaW9uTm9kZTsgLy8vXG5cbiAgc3ViRXhwcmVzc2lvbk5vZGUgPSBudWxsO1xuXG4gIGNvbnN0IG11bHRpcGxpY2l0eSA9IG5vblRlcm1pbmFsTm9kZS5nZXRNdWx0aXBsaWNpdHkoKTtcblxuICBpZiAobXVsdGlwbGljaXR5ID4gMSkge1xuICAgIHN1YkV4cHJlc3Npb25Ob2RlID0gZnJvbUxhc3RDaGlsZE5vZGUobm9uVGVybWluYWxOb2RlLCAobGFzdENoaWxkTm9kZSkgPT4ge1xuICAgICAgbGV0IHN1YkV4cHJlc3Npb25Ob2RlID0gbnVsbDtcblxuICAgICAgY29uc3Qgbm9uVGVybWluYWxOb2UgPSBsYXN0Q2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgIHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2UuZ2V0UnVsZU5hbWUoKSxcbiAgICAgICAgICAgIHJ1bGVOYW1lU3ViRXhwcmVzc2lvblJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBTVUJfRVhQUkVTU0lPTl9SVUxFX05BTUUpO1xuXG4gICAgICBpZiAocnVsZU5hbWVTdWJFeHByZXNzaW9uUnVsZU5hbWUpIHtcbiAgICAgICAgc3ViRXhwcmVzc2lvbk5vZGUgPSBsYXN0Q2hpbGROb2RlOyAgLy8vXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJFeHByZXNzaW9uTm9kZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdWJFeHByZXNzaW9uTm9kZTtcbn1cblxuZnVuY3Rpb24gZnJvbUZpcnN0Q2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgY2FsbGJhY2spIHtcbiAgbGV0IHJlc3VsdDtcblxuICBjb25zdCBmaXJzdEluZGV4ID0gMDtcblxuICBub25UZXJtaW5hbE5vZGUuZm9yd2FyZHNTb21lQ2hpbGROb2RlKChjaGlsZE5vZGUsIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4ID09PSBmaXJzdEluZGV4KSB7XG4gICAgICBjb25zdCBmaXJzdENoaWxkTm9kZSA9IGNoaWxkTm9kZTsgLy8vXG5cbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKGZpcnN0Q2hpbGROb2RlKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmcm9tU2Vjb25kQ2hpbGROb2RlKG5vblRlcm1pbmFsTm9kZSwgY2FsbGJhY2spIHtcbiAgbGV0IHJlc3VsdDtcblxuICBjb25zdCBzZWNvbmRJbmRleCA9IDE7XG5cbiAgbm9uVGVybWluYWxOb2RlLmZvcndhcmRzU29tZUNoaWxkTm9kZSgoY2hpbGROb2RlLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gc2Vjb25kSW5kZXgpIHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hpbGROb2RlID0gY2hpbGROb2RlOyAvLy9cblxuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soZmlyc3RDaGlsZE5vZGUpO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZyb21UaGlyZENoaWxkTm9kZShub25UZXJtaW5hbE5vZGUsIGNhbGxiYWNrKSB7XG4gIGxldCByZXN1bHQ7XG5cbiAgY29uc3QgdGhpcmRJbmRleCA9IDI7XG5cbiAgbm9uVGVybWluYWxOb2RlLmZvcndhcmRzU29tZUNoaWxkTm9kZSgoY2hpbGROb2RlLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gdGhpcmRJbmRleCkge1xuICAgICAgY29uc3QgdGhpcmRDaGlsZE5vZGUgPSBjaGlsZE5vZGU7IC8vL1xuXG4gICAgICByZXN1bHQgPSBjYWxsYmFjayh0aGlyZENoaWxkTm9kZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZnJvbUxhc3RDaGlsZE5vZGUobm9uVGVybWluYWxOb2RlLCBjYWxsYmFjaykge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IG11bHRpcGxpY2l0eSA9IG5vblRlcm1pbmFsTm9kZS5nZXRNdWx0aXBsaWNpdHkoKSxcbiAgICAgICAgbGFzdEluZGV4ID0gbXVsdGlwbGljaXR5IC0gMTtcblxuICBub25UZXJtaW5hbE5vZGUuYmFja3dhcmRzU29tZUNoaWxkTm9kZSgoY2hpbGROb2RlLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gbGFzdEluZGV4KSB7XG4gICAgICBjb25zdCB0aGlyZENoaWxkTm9kZSA9IGNoaWxkTm9kZTsgLy8vXG5cbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKHRoaXJkQ2hpbGROb2RlKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm5hbWVzIjpbImVuZEluZGV4RnJvbVNwcmVhZE5vZGUiLCJlcnJvck5vZGVzRnJvbUV4cHJlc3Npb25Ob2RlIiwiaW5kZXhGcm9tSW5kZXhOb2RlIiwiaW5kZXhGcm9tU3ByZWFkTm9kZSIsImluZmluaXRlRGVzY2VudEZyb21QYXRoTm9kZSIsInBhdGhOb2RlRnJvbUV4cHJlc3Npb25Ob2RlIiwicGF0aE5vZGVGcm9tU3ViRXhwcmVzc2lvbk5vZGUiLCJydWxlTmFtZXNGcm9tUGF0aE5vZGUiLCJzZWxlY3Rvck5vZGVzRnJvbVBhdGhOb2RlIiwic3ByZWFkTm9kZUZyb21FeHByZXNzaW9uTm9kZSIsInNwcmVhZE5vZGVGcm9tU3ViRXhwcmVzc2lvbk5vZGUiLCJzdGFydEluZGV4RnJvbVNwcmVhZE5vZGUiLCJzdWJFeHByZXNzaW9uTm9kZUZyb21FeHByZXNzaW9uTm9kZSIsInN1YkV4cHJlc3Npb25Ob2RlRnJvbVN1YkV4cHJlc3Npb25Ob2RlIiwidG9rZW5UeXBlc0Zyb21QYXRoTm9kZSIsInVuaXF1ZUZyb21TcHJlYWROb2RlIiwiaW5kZXhOb2RlIiwibm9uVGVybWluYWxOb2RlIiwiaW5kZXgiLCJmcm9tRmlyc3RDaGlsZE5vZGUiLCJmaXJzdENoaWxkTm9kZSIsInRlcm1pbmFsTm9kZSIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiTnVtYmVyIiwicGF0aE5vZGUiLCJzZWxlY3Rvck5vZGVzIiwicnVsZU5hbWVOb2RlcyIsInJlZHVjZSIsInNlbGVjdG9yTm9kZSIsInJ1bGVOYW1lTm9kZSIsInJ1bGVOYW1lIiwiZ2V0UnVsZU5hbWUiLCJydWxlTmFtZVJ1bGVOYW1lUnVsZU5hbWUiLCJSVUxFX05BTUVfUlVMRV9OQU1FIiwicHVzaCIsInJ1bGVOYW1lcyIsIm1hcCIsInRva2VuVHlwZU5vZGVzIiwidG9rZW5UeXBlTm9kZSIsInJ1bGVOYW1lVG9rZW5UeXBlUnVsZU5hbWUiLCJUT0tFTl9UWVBFX1JVTEVfTkFNRSIsInRva2VuVHlwZXMiLCJ0b2tlblR5cGUiLCJmcm9tVGhpcmRDaGlsZE5vZGUiLCJ0aGlyZENoaWxkTm9kZSIsInNlbGVjdG9yc05vZGUiLCJmcm9tTGFzdENoaWxkTm9kZSIsImxhc3RDaGlsZE5vZGUiLCJmaWx0ZXJDaGlsZE5vZGUiLCJjaGlsZE5vZGUiLCJjaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUiLCJpc05vblRlcm1pbmFsTm9kZSIsImluZmluaXRlRGVzY2VudCIsImZyb21TZWNvbmRDaGlsZE5vZGUiLCJzZWNvbmRDaGlsZE5vZGUiLCJydWxlTmFtZUluZmluaXRlRGVzY2VudFJ1bGVOYW1lIiwiSU5GSU5JVEVfREVTQ0VOVF9SVUxFX05BTUUiLCJzcHJlYWROb2RlIiwidW5pcXVlIiwiZmlyc3RDaGlsZE5vZGVOb25UZXJtaW5hbE5vZGUiLCJydWxlTmFtZVVuaXF1ZVJ1bGVOYW1lIiwiVU5JUVVFX1JVTEVfTkFNRSIsImZpbmRDaGlsZE5vZGUiLCJydWxlTmFtZUluZGV4UnVsZU5hbWUiLCJJTkRFWF9SVUxFX05BTUUiLCJlbmRJbmRleCIsIkluZmluaXR5IiwiZW5kSW5kZXhOb2RlIiwicnVsZU5hbWVFbmRJbmRleFJ1bGVOYW1lIiwiRU5EX0lOREVYX1JVTEVfTkFNRSIsInN0YXJ0SW5kZXgiLCJzdGFydEluZGV4Tm9kZSIsInJ1bGVOYW1lU3RhcnRJbmRleFJ1bGVOYW1lIiwiU1RBUlRfSU5ERVhfUlVMRV9OQU1FIiwiZXhwcmVzc2lvbk5vZGUiLCJydWxlTmFtZVNwcmVhZFJ1bGVOYW1lIiwiU1BSRUFEX1JVTEVfTkFNRSIsImVycm9yTm9kZXMiLCJyZWR1Y2VDaGlsZE5vZGUiLCJydWxlTmFtZUVycm9yUnVsZU5hbWUiLCJFUlJPUl9SVUxFX05BTUUiLCJlcnJvck5vZGUiLCJzdWJFeHByZXNzaW9uTm9kZSIsIm11bHRpcGxpY2l0eSIsImdldE11bHRpcGxpY2l0eSIsInJ1bGVOYW1lU3ViRXhwcmVzc2lvblJ1bGVOYW1lIiwiU1VCX0VYUFJFU1NJT05fUlVMRV9OQU1FIiwibm9uVGVybWluYWxOb2UiLCJjYWxsYmFjayIsInJlc3VsdCIsImZpcnN0SW5kZXgiLCJmb3J3YXJkc1NvbWVDaGlsZE5vZGUiLCJzZWNvbmRJbmRleCIsInRoaXJkSW5kZXgi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
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvbm9kZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IE5vZGUgZnJvbSBcIi4uL25vZGVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvcG1vc3ROb2RlRnJvbU91dGVyTm9kZXMoQ2xhc3MsIG91dGVyTm9kZXMpIHtcbiAgaWYgKG91dGVyTm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIG91dGVyTm9kZXMgPSBDbGFzczsgLy8vXG5cbiAgICBDbGFzcyA9IE5vZGU7ICAvLy9cbiAgfVxuXG4gIGNvbnN0IG5vZGVzID0gb3V0ZXJOb2RlczsgLy8vXG5cbiAgb3JkZXJOb2Rlcyhub2Rlcyk7XG5cbiAgY29uc3QgdG9wbW9zdE5vZGUgPSBOb2RlLmZyb21Ob3RoaW5nKCksXG4gICAgICAgIG91dGVyTm9kZVRvTm9kZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgb3V0ZXJOb2Rlcy5mb3JFYWNoKChvdXRlck5vZGUpID0+IHtcbiAgICBjb25zdCBhbmNlc3Rvck5vZGVzID0gb3V0ZXJOb2RlLmdldEFuY2VzdG9yTm9kZXMoKTtcblxuICAgIGxldCBwYXJlbnROb2RlID0gdG9wbW9zdE5vZGU7IC8vL1xuXG4gICAgYW5jZXN0b3JOb2Rlcy5zb21lKChhbmNlc3Rvck5vZGUpID0+IHtcbiAgICAgIGNvbnN0IG91dGVyTm9kZSA9IGFuY2VzdG9yTm9kZSwgLy8vXG4gICAgICAgICAgICBub2RlID0gb3V0ZXJOb2RlVG9Ob2RlTWFwLmdldChvdXRlck5vZGUpIHx8IG51bGw7XG5cbiAgICAgIGlmIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgIHBhcmVudE5vZGUgPSBub2RlOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBub2RlID0gQ2xhc3MuZnJvbU91dGVyTm9kZShvdXRlck5vZGUpLFxuICAgICAgICAgIGNoaWxkTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHBhcmVudE5vZGUuYWRkQ2hpbGROb2RlKGNoaWxkTm9kZSk7XG5cbiAgICBvdXRlck5vZGVUb05vZGVNYXAuc2V0KG91dGVyTm9kZSwgbm9kZSk7XG4gIH0pO1xuXG4gIHJldHVybiB0b3Btb3N0Tm9kZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB0b3Btb3N0Tm9kZUZyb21PdXRlck5vZGVzXG59O1xuXG5mdW5jdGlvbiBvcmRlck5vZGVzKG5vZGVzKSB7XG4gIG5vZGVzLnNvcnQoKG5vZGVBLCBub2RlQikgPT4ge1xuICAgIGNvbnN0IG5vZGVBTGVzc1RoYW5Ob2RlQiA9IGlzTGVzc1RoYW4obm9kZUEsIG5vZGVCKSxcbiAgICAgICAgICByZXN1bHQgPSBub2RlQUxlc3NUaGFuTm9kZUIgP1xuICAgICAgICAgICAgICAgICAgICAgLTEgOlxuICAgICAgICAgICAgICAgICAgICAgICArMTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0xlc3NUaGFuKG5vZGVBLCBub2RlQikge1xuICBsZXQgbGVzc1RoYW4gPSBudWxsO1xuXG4gIGNvbnN0IGFuY2VzdG9yTm9kZXNBID0gYW5jZXN0b3JOb2Rlc0Zyb21Ob2RlKG5vZGVBKSxcbiAgICAgICAgYW5jZXN0b3JOb2Rlc0IgPSBhbmNlc3Rvck5vZGVzRnJvbU5vZGUobm9kZUIpLFxuICAgICAgICBhbmNlc3Rvck5vZGVzQUxlbmd0aCA9IGFuY2VzdG9yTm9kZXNBLmxlbmd0aCxcbiAgICAgICAgYW5jZXN0b3JOb2Rlc0JMZW5ndGggPSBhbmNlc3Rvck5vZGVzQi5sZW5ndGgsXG4gICAgICAgIG1pbmltdW1BbmNlc3Rvck5vZGVzTGVuZ3RoID0gTWF0aC5taW4oYW5jZXN0b3JOb2Rlc0FMZW5ndGgsIGFuY2VzdG9yTm9kZXNCTGVuZ3RoKTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWluaW11bUFuY2VzdG9yTm9kZXNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhbmNlc3Rvck5vZGVBID0gYW5jZXN0b3JOb2Rlc0FbaW5kZXhdLFxuICAgICAgICAgIGFuY2VzdG9yTm9kZUIgPSBhbmNlc3Rvck5vZGVzQltpbmRleF07XG5cbiAgICBpZiAoYW5jZXN0b3JOb2RlQSAhPT0gYW5jZXN0b3JOb2RlQikge1xuICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBpbmRleCAtIDEsXG4gICAgICAgICAgICBhbmNlc3Rvck5vZGVBUGFyZW50Tm9kZSA9IGFuY2VzdG9yTm9kZXNBW3BhcmVudEluZGV4XSxcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBhbmNlc3Rvck5vZGVBUGFyZW50Tm9kZSwgLy8vXG4gICAgICAgICAgICBjaGlsZE5vZGVBID0gYW5jZXN0b3JOb2RlQSwgLy8vXG4gICAgICAgICAgICBjaGlsZE5vZGVCID0gYW5jZXN0b3JOb2RlQiwgLy8vXG4gICAgICAgICAgICBpbmRleEEgPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZE5vZGUoY2hpbGROb2RlQSksXG4gICAgICAgICAgICBpbmRleEIgPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZE5vZGUoY2hpbGROb2RlQik7XG5cbiAgICAgIGxlc3NUaGFuID0gKGluZGV4QSA8IGluZGV4Qik7XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsZXNzVGhhbiA9PT0gbnVsbCkge1xuICAgIGxlc3NUaGFuID0gKGFuY2VzdG9yTm9kZXNBTGVuZ3RoIDwgYW5jZXN0b3JOb2Rlc0JMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIGxlc3NUaGFuO1xufVxuXG5mdW5jdGlvbiBhbmNlc3Rvck5vZGVzRnJvbU5vZGUobm9kZSkge1xuICBjb25zdCBhbmNlc3Rvck5vZGVzID0gbm9kZS5nZXRBbmNlc3Rvck5vZGVzKCk7XG5cbiAgYW5jZXN0b3JOb2Rlcy51bnNoaWZ0KG5vZGUpO1xuXG4gIGFuY2VzdG9yTm9kZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBhbmNlc3Rvck5vZGVzO1xufSJdLCJuYW1lcyI6WyJ0b3Btb3N0Tm9kZUZyb21PdXRlck5vZGVzIiwiQ2xhc3MiLCJvdXRlck5vZGVzIiwidW5kZWZpbmVkIiwiTm9kZSIsIm5vZGVzIiwib3JkZXJOb2RlcyIsInRvcG1vc3ROb2RlIiwiZnJvbU5vdGhpbmciLCJvdXRlck5vZGVUb05vZGVNYXAiLCJXZWFrTWFwIiwiZm9yRWFjaCIsIm91dGVyTm9kZSIsImFuY2VzdG9yTm9kZXMiLCJnZXRBbmNlc3Rvck5vZGVzIiwicGFyZW50Tm9kZSIsInNvbWUiLCJhbmNlc3Rvck5vZGUiLCJub2RlIiwiZ2V0IiwiZnJvbU91dGVyTm9kZSIsImNoaWxkTm9kZSIsImFkZENoaWxkTm9kZSIsInNldCIsInNvcnQiLCJub2RlQSIsIm5vZGVCIiwibm9kZUFMZXNzVGhhbk5vZGVCIiwiaXNMZXNzVGhhbiIsInJlc3VsdCIsImxlc3NUaGFuIiwiYW5jZXN0b3JOb2Rlc0EiLCJhbmNlc3Rvck5vZGVzRnJvbU5vZGUiLCJhbmNlc3Rvck5vZGVzQiIsImFuY2VzdG9yTm9kZXNBTGVuZ3RoIiwibGVuZ3RoIiwiYW5jZXN0b3JOb2Rlc0JMZW5ndGgiLCJtaW5pbXVtQW5jZXN0b3JOb2Rlc0xlbmd0aCIsIk1hdGgiLCJtaW4iLCJpbmRleCIsImFuY2VzdG9yTm9kZUEiLCJhbmNlc3Rvck5vZGVCIiwicGFyZW50SW5kZXgiLCJhbmNlc3Rvck5vZGVBUGFyZW50Tm9kZSIsImNoaWxkTm9kZUEiLCJjaGlsZE5vZGVCIiwiaW5kZXhBIiwiaW5kZXhPZkNoaWxkTm9kZSIsImluZGV4QiIsInVuc2hpZnQiLCJyZXZlcnNlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUE2Q0EsT0FFRTtlQUZGOztJQXpDZ0JBLHlCQUF5QjtlQUF6QkE7OzsyREFGQzs7Ozs7O0FBRVYsU0FBU0EsMEJBQTBCQyxLQUFLLEVBQUVDLFVBQVU7SUFDekQsSUFBSUEsZUFBZUMsV0FBVztRQUM1QkQsYUFBYUQsT0FBTyxHQUFHO1FBRXZCQSxRQUFRRyxhQUFJLEVBQUcsR0FBRztJQUNwQjtJQUVBLElBQU1DLFFBQVFILFlBQVksR0FBRztJQUU3QkksV0FBV0Q7SUFFWCxJQUFNRSxjQUFjSCxhQUFJLENBQUNJLFdBQVcsSUFDOUJDLHFCQUFxQixJQUFJQztJQUUvQlIsV0FBV1MsT0FBTyxDQUFDLFNBQUNDO1FBQ2xCLElBQU1DLGdCQUFnQkQsVUFBVUUsZ0JBQWdCO1FBRWhELElBQUlDLGFBQWFSLGFBQWEsR0FBRztRQUVqQ00sY0FBY0csSUFBSSxDQUFDLFNBQUNDO1lBQ2xCLElBQU1MLGNBQVlLLGNBQ1pDLE9BQU9ULG1CQUFtQlUsR0FBRyxDQUFDUCxnQkFBYztZQUVsRCxJQUFJTSxTQUFTLE1BQU07Z0JBQ2pCSCxhQUFhRyxNQUFPLEdBQUc7Z0JBRXZCLE9BQU87WUFDVDtRQUNGO1FBRUEsSUFBTUEsT0FBT2pCLE1BQU1tQixhQUFhLENBQUNSLFlBQzNCUyxZQUFZSCxNQUFPLEdBQUc7UUFFNUJILFdBQVdPLFlBQVksQ0FBQ0Q7UUFFeEJaLG1CQUFtQmMsR0FBRyxDQUFDWCxXQUFXTTtJQUNwQztJQUVBLE9BQU9YO0FBQ1Q7SUFFQSxXQUFlO0lBQ2JQLDJCQUFBQTtBQUNGO0FBRUEsU0FBU00sV0FBV0QsS0FBSztJQUN2QkEsTUFBTW1CLElBQUksQ0FBQyxTQUFDQyxPQUFPQztRQUNqQixJQUFNQyxxQkFBcUJDLFdBQVdILE9BQU9DLFFBQ3ZDRyxTQUFTRixxQkFDRSxDQUFDLElBQ0MsQ0FBQztRQUVwQixPQUFPRTtJQUNUO0FBQ0Y7QUFFQSxTQUFTRCxXQUFXSCxLQUFLLEVBQUVDLEtBQUs7SUFDOUIsSUFBSUksV0FBVztJQUVmLElBQU1DLGlCQUFpQkMsc0JBQXNCUCxRQUN2Q1EsaUJBQWlCRCxzQkFBc0JOLFFBQ3ZDUSx1QkFBdUJILGVBQWVJLE1BQU0sRUFDNUNDLHVCQUF1QkgsZUFBZUUsTUFBTSxFQUM1Q0UsNkJBQTZCQyxLQUFLQyxHQUFHLENBQUNMLHNCQUFzQkU7SUFFbEUsSUFBSyxJQUFJSSxRQUFRLEdBQUdBLFFBQVFILDRCQUE0QkcsUUFBUztRQUMvRCxJQUFNQyxnQkFBZ0JWLGNBQWMsQ0FBQ1MsTUFBTSxFQUNyQ0UsZ0JBQWdCVCxjQUFjLENBQUNPLE1BQU07UUFFM0MsSUFBSUMsa0JBQWtCQyxlQUFlO1lBQ25DLElBQU1DLGNBQWNILFFBQVEsR0FDdEJJLDBCQUEwQmIsY0FBYyxDQUFDWSxZQUFZLEVBQ3JENUIsYUFBYTZCLHlCQUNiQyxhQUFhSixlQUNiSyxhQUFhSixlQUNiSyxTQUFTaEMsV0FBV2lDLGdCQUFnQixDQUFDSCxhQUNyQ0ksU0FBU2xDLFdBQVdpQyxnQkFBZ0IsQ0FBQ0Y7WUFFM0NoQixXQUFZaUIsU0FBU0U7WUFFckI7UUFDRjtJQUNGO0lBRUEsSUFBSW5CLGFBQWEsTUFBTTtRQUNyQkEsV0FBWUksdUJBQXVCRTtJQUNyQztJQUVBLE9BQU9OO0FBQ1Q7QUFFQSxTQUFTRSxzQkFBc0JkLElBQUk7SUFDakMsSUFBTUwsZ0JBQWdCSyxLQUFLSixnQkFBZ0I7SUFFM0NELGNBQWNxQyxPQUFPLENBQUNoQztJQUV0QkwsY0FBY3NDLE9BQU87SUFFckIsT0FBT3RDO0FBQ1QifQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-dom",
3
3
  "author": "James Smith",
4
- "version": "5.0.0",
4
+ "version": "5.0.2",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-dom",
7
7
  "description": "Occam's DOM related functionality.",
@@ -10,7 +10,8 @@
10
10
  "url": "https://github.com/djalbat/occam-dom"
11
11
  },
12
12
  "dependencies": {
13
- "occam-parsers": "^23.0.111"
13
+ "occam-parsers": "^23.0.114",
14
+ "occam-query": "^4.1.73"
14
15
  },
15
16
  "devDependencies": {
16
17
  "@swc/core": "^1.5.6",
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export const SPACE = 2;
4
+ export const EMPTY_STRING = "";
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ import { arrayUtilities } from "necessary";
4
+ import { queryUtilities } from "occam-query";
5
+
6
+ const { push } = arrayUtilities,
7
+ { queryByExpressionString } = queryUtilities;
8
+
9
+ export function queryByExpressions(node, expressions, maximumDepth) {
10
+ const nodes = expressions.reduce((nodes, expression) => {
11
+ const expressionString = expression, ///
12
+ expressionNodes = queryByExpressionString(node, expressionString, maximumDepth);
13
+
14
+ push(nodes, expressionNodes);
15
+
16
+ return nodes;
17
+ }, []);
18
+
19
+ return nodes;
20
+ }
21
+
@@ -6,7 +6,7 @@ import { SizeableDiv } from "easy-layout";
6
6
 
7
7
  export default withStyle(SizeableDiv)`
8
8
 
9
- width: 64rem;
9
+ width: 48rem;
10
10
  min-width: 24rem;
11
11
 
12
12
  `;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import Textarea from "../textarea";
4
+
5
+ import { SPACE } from "../../constants";
6
+
7
+ export default class ExpressionsTextarea extends Textarea {
8
+ getExpressions() {
9
+ const value = this.getValue(),
10
+ expressionString = value, ///
11
+ expressions = JSON.parse(expressionString); ///
12
+
13
+ return expressions;
14
+ }
15
+
16
+ setExpressions(expressions) {
17
+ const space = SPACE,
18
+ replacer = null,
19
+ expressionsString = JSON.stringify(expressions, replacer, space),
20
+ value = expressionsString; ///
21
+
22
+ this.setValue(value);
23
+ }
24
+
25
+ parentContext() {
26
+ const getExpressions = this.getExpressions.bind(this),
27
+ setExpressions = this.setExpressions.bind(this); ///;
28
+
29
+ return ({
30
+ getExpressions,
31
+ setExpressions
32
+ });
33
+ }
34
+
35
+ static defaultProperties = {
36
+ className: "expressions",
37
+ spellCheck: "false"
38
+ };
39
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ import Textarea from "../textarea";
4
+
5
+ import { EMPTY_STRING } from "../../constants";
6
+ import { tokenIndexFromTerminalNodeAndTokens, tokenIndexesFromNonTerminalNodeAndTokens } from "../../utilities/token"
7
+
8
+ export default class OuterNodesTextarea extends Textarea {
9
+ setOuterNodes(outerNodes, tokens) {
10
+ const nodes = outerNodes, ///
11
+ value = nodes.reduce((value, node) => {
12
+ const nodeTerminalNode = node.isTerminalNode();
13
+
14
+ if (nodeTerminalNode) {
15
+ const terminalNode = node, ///
16
+ significantToken = terminalNode.getSignificantToken(),
17
+ significantTokenType = significantToken.getType(),
18
+ tokenIndex = tokenIndexFromTerminalNodeAndTokens(terminalNode, tokens);
19
+
20
+ value = `${value}[${significantTokenType}]${tokenIndex}\n`;
21
+ } else {
22
+ const nonTerminalNode = node, ///
23
+ ruleName = nonTerminalNode.getRuleName(),
24
+ tokenIndexes = tokenIndexesFromNonTerminalNodeAndTokens(nonTerminalNode, tokens);
25
+
26
+ value = `${value}${ruleName}${tokenIndexes}\n`;
27
+ }
28
+
29
+ return value;
30
+ }, EMPTY_STRING);
31
+
32
+ this.setValue(value);
33
+ }
34
+
35
+ parentContext() {
36
+ const setOuterNodes = this.setOuterNodes.bind(this);
37
+
38
+ return ({
39
+ setOuterNodes
40
+ });
41
+ }
42
+
43
+ static defaultProperties = {
44
+ className: "outer-nodes",
45
+ spellCheck: "false",
46
+ readOnly: true
47
+ };
48
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ import ParseTreeTextarea from "../../textarea/parseTree";
4
+
5
+ export default class InnerParseTreeTextarea extends ParseTreeTextarea {
6
+ setParseTree(parseTree) {
7
+ parseTree.shiftLine(); //
8
+ parseTree.shiftLine(); //
9
+
10
+ super.setParseTree(parseTree);
11
+ }
12
+
13
+ parentContext() {
14
+ const setInnerParseTree = this.setParseTree.bind(this); ///
15
+
16
+ return ({
17
+ setInnerParseTree
18
+ });
19
+ }
20
+
21
+ static defaultProperties = {
22
+ className: "inner"
23
+ };
24
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ import ParseTreeTextarea from "../../textarea/parseTree";
4
+
5
+ export default class OuterParseTreeTextarea extends ParseTreeTextarea {
6
+ parentContext() {
7
+ const setOuterParseTree = this.setParseTree.bind(this); ///
8
+
9
+ return ({
10
+ setOuterParseTree
11
+ });
12
+ }
13
+
14
+ static defaultProperties = {
15
+ className: "outer"
16
+ };
17
+ }