occam-languages 2.2.17 → 2.2.19

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.
@@ -60,16 +60,19 @@ _export(exports, {
60
60
  });
61
61
  const _necessary = require("necessary");
62
62
  const { filter: arrayFilter } = _necessary.arrayUtilities, { forEach: asynchronousForEach, forwardsForEach: asynchronousForwardsForEach, backwardsForEach: asynchronousBackwardsForEach } = _necessary.asynchronousUtilities;
63
- function one(array, callback, ...remainingArguments) {
64
- let found = false;
65
- const continuation = remainingArguments.pop();
63
+ function one(array, callback, ...initialArguments) {
64
+ let success = false;
65
+ const continuation = initialArguments.pop();
66
+ let intermediateArguments = initialArguments; ///
66
67
  return asynchronousForEach(array, (element, next, done)=>{
67
- return callback(element, ...remainingArguments, (passed)=>{
68
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
69
+ const passed = callbackArguments.shift();
70
+ intermediateArguments = callbackArguments; ///
68
71
  if (passed) {
69
- if (!found) {
70
- found = true;
72
+ if (!success) {
73
+ success = true;
71
74
  } else {
72
- found = false;
75
+ success = false;
73
76
  done();
74
77
  return;
75
78
  }
@@ -77,14 +80,18 @@ function one(array, callback, ...remainingArguments) {
77
80
  next();
78
81
  });
79
82
  }, ()=>{
80
- return continuation(found, ...remainingArguments);
83
+ const finalArguments = intermediateArguments; ///
84
+ return continuation(success, ...finalArguments);
81
85
  });
82
86
  }
83
- function some(array, callback, ...remainingArguments) {
87
+ function some(array, callback, ...initialArguments) {
84
88
  let success = false;
85
- const continuation = remainingArguments.pop();
89
+ const continuation = initialArguments.pop();
90
+ let intermediateArguments = initialArguments; ///
86
91
  return asynchronousForEach(array, (element, next, done)=>{
87
- return callback(element, ...remainingArguments, (passed)=>{
92
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
93
+ const passed = callbackArguments.shift();
94
+ intermediateArguments = callbackArguments; ///
88
95
  if (passed) {
89
96
  success = true;
90
97
  done();
@@ -93,32 +100,40 @@ function some(array, callback, ...remainingArguments) {
93
100
  next();
94
101
  });
95
102
  }, ()=>{
96
- return continuation(success, ...remainingArguments);
103
+ const finalArguments = intermediateArguments; ///
104
+ return continuation(success, ...finalArguments);
97
105
  });
98
106
  }
99
- function each(array, callback, ...remainingArguments) {
100
- let found = false;
101
- const continuation = remainingArguments.pop();
107
+ function each(array, callback, ...initialArguments) {
108
+ let success = false;
109
+ const continuation = initialArguments.pop();
110
+ let intermediateArguments = initialArguments; ///
102
111
  return asynchronousForEach(array, (element, next, done)=>{
103
- return callback(element, ...remainingArguments, (passed)=>{
112
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
113
+ const passed = callbackArguments.shift();
114
+ intermediateArguments = callbackArguments; ///
104
115
  if (passed) {
105
- found = true;
116
+ success = true;
106
117
  } else {
107
- found = false;
118
+ success = false;
108
119
  done();
109
120
  return;
110
121
  }
111
122
  next();
112
123
  });
113
124
  }, ()=>{
114
- return continuation(found, ...remainingArguments);
125
+ const finalArguments = intermediateArguments; ///
126
+ return continuation(success, ...finalArguments);
115
127
  });
116
128
  }
117
- function every(array, callback, ...remainingArguments) {
129
+ function every(array, callback, ...initialArguments) {
118
130
  let success = true;
119
- const continuation = remainingArguments.pop();
131
+ const continuation = initialArguments.pop();
132
+ let intermediateArguments = initialArguments; ///
120
133
  return asynchronousForEach(array, (element, next, done)=>{
121
- return callback(element, ...remainingArguments, (passed)=>{
134
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
135
+ const passed = callbackArguments.shift();
136
+ intermediateArguments = callbackArguments; ///
122
137
  if (!passed) {
123
138
  success = false;
124
139
  done();
@@ -127,36 +142,47 @@ function every(array, callback, ...remainingArguments) {
127
142
  next();
128
143
  });
129
144
  }, ()=>{
130
- return continuation(success, ...remainingArguments);
145
+ const finalArguments = intermediateArguments; ///
146
+ return continuation(success, ...finalArguments);
131
147
  });
132
148
  }
133
- function reduce(array, initialValue, callback, ...remainingArguments) {
149
+ function reduce(array, initialValue, callback, ...initialArguments) {
134
150
  let value = initialValue; ///
135
- const continuation = remainingArguments.pop();
151
+ const continuation = initialArguments.pop();
152
+ let intermediateArguments = initialArguments; ///
136
153
  return asynchronousForEach(array, (element, next, done)=>{
137
- return callback(value, element, ...remainingArguments, (currentValue)=>{
154
+ return callback(value, element, ...intermediateArguments, (...callbackArguments)=>{
155
+ const currentValue = callbackArguments.shift();
156
+ intermediateArguments = callbackArguments; ///
138
157
  value = currentValue; ///
139
158
  next();
140
159
  });
141
160
  }, ()=>{
142
- return continuation(value, ...remainingArguments);
161
+ const finalArguments = intermediateArguments; ///
162
+ return continuation(value, ...finalArguments);
143
163
  });
144
164
  }
145
- function forEach(array, callback, ...remainingArguments) {
146
- const continuation = remainingArguments.pop();
165
+ function forEach(array, callback, ...initialArguments) {
166
+ const continuation = initialArguments.pop();
167
+ let intermediateArguments = initialArguments; ///
147
168
  return asynchronousForEach(array, (element, next, done)=>{
148
- return callback(element, ...remainingArguments, ()=>{
169
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
170
+ intermediateArguments = callbackArguments; ///
149
171
  next();
150
172
  });
151
173
  }, ()=>{
152
- return continuation(...remainingArguments);
174
+ const finalArguments = intermediateArguments; ///
175
+ return continuation(...finalArguments);
153
176
  });
154
177
  }
155
- function forwardsEvery(array, callback, ...remainingArguments) {
178
+ function forwardsEvery(array, callback, ...initialArguments) {
156
179
  let success = true;
157
- const continuation = remainingArguments.pop();
180
+ const continuation = initialArguments.pop();
181
+ let intermediateArguments = initialArguments; ///
158
182
  return asynchronousForwardsForEach(array, (element, next, done)=>{
159
- return callback(element, ...remainingArguments, (passed)=>{
183
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
184
+ const passed = callbackArguments.shift();
185
+ intermediateArguments = callbackArguments; ///
160
186
  if (!passed) {
161
187
  success = false;
162
188
  done();
@@ -165,14 +191,18 @@ function forwardsEvery(array, callback, ...remainingArguments) {
165
191
  next();
166
192
  });
167
193
  }, ()=>{
168
- return continuation(success, ...remainingArguments);
194
+ const finalArguments = intermediateArguments; ///
195
+ return continuation(success, ...finalArguments);
169
196
  });
170
197
  }
171
- function backwardsEvery(array, callback, ...remainingArguments) {
198
+ function backwardsEvery(array, callback, ...initialArguments) {
172
199
  let success = true;
173
- const continuation = remainingArguments.pop();
200
+ const continuation = initialArguments.pop();
201
+ let intermediateArguments = initialArguments; ///
174
202
  return asynchronousBackwardsForEach(array, (element, next, done)=>{
175
- return callback(element, ...remainingArguments, (passed)=>{
203
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
204
+ const passed = callbackArguments.shift();
205
+ intermediateArguments = callbackArguments; ///
176
206
  if (!passed) {
177
207
  success = false;
178
208
  done();
@@ -181,116 +211,154 @@ function backwardsEvery(array, callback, ...remainingArguments) {
181
211
  next();
182
212
  });
183
213
  }, ()=>{
184
- return continuation(success, ...remainingArguments);
214
+ const finalArguments = intermediateArguments; ///
215
+ return continuation(success, ...finalArguments);
185
216
  });
186
217
  }
187
- function forwardsForEach(array, callback, ...remainingArguments) {
188
- const continuation = remainingArguments.pop();
218
+ function forwardsForEach(array, callback, ...initialArguments) {
219
+ const continuation = initialArguments.pop();
220
+ let intermediateArguments = initialArguments; ///
189
221
  return asynchronousForwardsForEach(array, (element, next, done)=>{
190
- return callback(element, ...remainingArguments, ()=>{
222
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
223
+ intermediateArguments = callbackArguments; ///
191
224
  next();
192
225
  });
193
226
  }, ()=>{
194
- return continuation(...remainingArguments);
227
+ const finalArguments = intermediateArguments; ///
228
+ return continuation(...finalArguments);
195
229
  });
196
230
  }
197
- function backwardsForEach(array, callback, ...remainingArguments) {
198
- const continuation = remainingArguments.pop();
231
+ function backwardsForEach(array, callback, ...initialArguments) {
232
+ const continuation = initialArguments.pop();
233
+ let intermediateArguments = initialArguments; ///
199
234
  return asynchronousBackwardsForEach(array, (element, next, done)=>{
200
- return callback(element, ...remainingArguments, ()=>{
235
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
236
+ intermediateArguments = callbackArguments; ///
201
237
  next();
202
238
  });
203
239
  }, ()=>{
204
- return continuation(...remainingArguments);
240
+ const finalArguments = intermediateArguments; ///
241
+ return continuation(...finalArguments);
205
242
  });
206
243
  }
207
- function filter(array, callback, ...remainingArguments) {
244
+ function filter(array, callback, ...initialArguments) {
208
245
  const deletedElements = [];
209
- const continuation = remainingArguments.pop();
246
+ const continuation = initialArguments.pop();
247
+ let intermediateArguments = initialArguments; ///
210
248
  let index = array.length;
211
- return backwardsForEach(array, (element, continuation)=>{
249
+ return asynchronousBackwardsForEach(array, (element, next, done)=>{
212
250
  index--;
213
- return callback(element, ...remainingArguments, (passed)=>{
251
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
252
+ const passed = callbackArguments.shift();
253
+ intermediateArguments = callbackArguments; ///
214
254
  if (!passed) {
215
255
  const start = index, deleteCount = 1, deletedElement = array.splice(start, deleteCount).pop(); ///
216
256
  deletedElements.unshift(deletedElement); ///
217
257
  }
218
- return continuation();
258
+ next();
219
259
  });
220
260
  }, ()=>{
221
- return continuation(deletedElements, ...remainingArguments);
261
+ const finalArguments = intermediateArguments; ///
262
+ return continuation(deletedElements, ...finalArguments);
222
263
  });
223
264
  }
224
- function prune(array, callback, ...remainingArguments) {
265
+ function prune(array, callback, ...initialArguments) {
225
266
  let deletedElement = undefined; ///
226
- const continuation = remainingArguments.pop();
267
+ const continuation = initialArguments.pop();
268
+ let intermediateArguments = initialArguments; ///
227
269
  let index = -1;
228
- return some(array, (element, continuation)=>{
270
+ return asynchronousForEach(array, (element, next, done)=>{
229
271
  index++;
230
- return callback(element, ...remainingArguments, (passed)=>{
272
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
273
+ const passed = callbackArguments.shift();
274
+ intermediateArguments = callbackArguments; ///
231
275
  if (!passed) {
232
276
  const start = index, deleteCount = 1;
233
277
  deletedElement = array.splice(start, deleteCount).pop(); ///
278
+ done();
279
+ return;
234
280
  }
235
- return continuation(passed);
281
+ next();
236
282
  });
237
283
  }, ()=>{
238
- return continuation(deletedElement, ...remainingArguments);
284
+ const finalArguments = intermediateArguments; ///
285
+ return continuation(deletedElement, ...finalArguments);
239
286
  });
240
287
  }
241
- function extract(array, callback, ...remainingArguments) {
288
+ function extract(array, callback, ...initialArguments) {
242
289
  let deletedElement = undefined; ///
243
- const continuation = remainingArguments.pop();
290
+ const continuation = initialArguments.pop();
291
+ let intermediateArguments = initialArguments; ///
244
292
  let index = -1;
245
- return some(array, (element, continuation)=>{
293
+ return asynchronousForEach(array, (element, next, done)=>{
246
294
  index++;
247
- return callback(element, ...remainingArguments, (passed)=>{
295
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
296
+ const passed = callbackArguments.shift();
297
+ intermediateArguments = callbackArguments; ///
248
298
  if (passed) {
249
299
  const start = index, deleteCount = 1;
250
300
  deletedElement = array.splice(start, deleteCount).pop(); ///
301
+ done();
302
+ return;
251
303
  }
252
- return continuation(passed);
304
+ next();
253
305
  });
254
306
  }, ()=>{
255
- return continuation(deletedElement, ...remainingArguments);
307
+ const finalArguments = intermediateArguments; ///
308
+ return continuation(deletedElement, ...finalArguments);
256
309
  });
257
310
  }
258
- function match(arrayA, arrayB, callback, ...remainingArguments) {
259
- const continuation = remainingArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
311
+ function match(arrayA, arrayB, callback, ...initialArguments) {
312
+ let success = true;
313
+ const continuation = initialArguments.pop();
314
+ const arrayALength = arrayA.length, arrayBLength = arrayB.length;
260
315
  if (arrayALength !== arrayBLength) {
261
- const matches = false;
262
- return continuation(matches, ...remainingArguments);
316
+ success = false;
317
+ return continuation(success, ...initialArguments);
263
318
  }
264
319
  let index = -1;
265
- return every(arrayA, (elementA, continuation)=>{
320
+ let intermediateArguments = initialArguments; ///
321
+ return asynchronousForEach(arrayA, (elementA, next, done)=>{
266
322
  index++;
267
323
  const elementB = arrayB[index];
268
- return callback(elementA, elementB, ...remainingArguments, continuation);
269
- }, (success)=>{
270
- const matches = success; ///
271
- return continuation(matches, ...remainingArguments);
324
+ return callback(elementA, elementB, ...intermediateArguments, (...callbackArguments)=>{
325
+ const passed = callbackArguments.shift();
326
+ intermediateArguments = callbackArguments; ///
327
+ if (!passed) {
328
+ success = false;
329
+ done();
330
+ return;
331
+ }
332
+ next();
333
+ });
334
+ }, ()=>{
335
+ const finalArguments = intermediateArguments; ///
336
+ return continuation(success, ...finalArguments);
272
337
  });
273
338
  }
274
- function resolve(arrayA, arrayB, callback, ...remainingArguments) {
339
+ function resolve(arrayA, arrayB, callback, ...initialArguments) {
275
340
  arrayA = [
276
341
  ...arrayA
277
342
  ];
278
- const continuation = remainingArguments.pop();
343
+ const continuation = initialArguments.pop();
344
+ let intermediateArguments = initialArguments; ///
279
345
  function nextPass() {
346
+ let success = false;
280
347
  const arrayALength = arrayA.length;
281
348
  if (arrayALength === 0) {
282
- const success = true; ///
283
- return continuation(success, ...remainingArguments);
349
+ success = true;
350
+ const finalArguments = intermediateArguments; ///
351
+ return continuation(success, ...finalArguments);
284
352
  }
285
- let success = false;
286
- let count = -1;
353
+ let index = -1;
287
354
  function nextElement() {
288
- count++;
289
- const terminate = count === arrayALength;
355
+ index++;
356
+ const terminate = index === arrayALength;
290
357
  if (terminate) {
291
358
  if (!success) {
292
- const success = false; ///
293
- return continuation(success, ...remainingArguments);
359
+ success = false;
360
+ const finalArguments = intermediateArguments; ///
361
+ return continuation(success, ...finalArguments);
294
362
  }
295
363
  arrayFilter(arrayA, (elementA)=>{
296
364
  const arrayBIncludesElementA = arrayB.includes(elementA);
@@ -300,8 +368,10 @@ function resolve(arrayA, arrayB, callback, ...remainingArguments) {
300
368
  });
301
369
  nextPass();
302
370
  } else {
303
- const index = count, elementA = arrayA[index];
304
- return callback(elementA, ...remainingArguments, (passed)=>{
371
+ const elementA = arrayA[index];
372
+ return callback(elementA, ...intermediateArguments, (...callbackArguments)=>{
373
+ const passed = callbackArguments.shift();
374
+ intermediateArguments = callbackArguments; ///
305
375
  if (passed) {
306
376
  const elementB = elementA; ///
307
377
  arrayB.push(elementB);
@@ -333,4 +403,4 @@ const _default = {
333
403
  resolve
334
404
  };
335
405
 
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcywgYXN5bmNocm9ub3VzVXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5jb25zdCB7IGZpbHRlcjogYXJyYXlGaWx0ZXIgfSA9IGFycmF5VXRpbGl0aWVzLFxuICAgICAgeyBmb3JFYWNoOiBhc3luY2hyb25vdXNGb3JFYWNoLFxuICAgICAgICBmb3J3YXJkc0ZvckVhY2g6IGFzeW5jaHJvbm91c0ZvcndhcmRzRm9yRWFjaCxcbiAgICAgICAgYmFja3dhcmRzRm9yRWFjaDogYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCB9ID0gYXN5bmNocm9ub3VzVXRpbGl0aWVzO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lKGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKGZvdW5kLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFjaChhcnJheSwgY2FsbGJhY2ssIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oZm91bmQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlcnkoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShhcnJheSwgaW5pdGlhbFZhbHVlLCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsgLy8vXG5cbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayh2YWx1ZSwgZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAoY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICB2YWx1ZSA9IGN1cnJlbnRWYWx1ZTsgIC8vL1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHZhbHVlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMsICgpID0+IHtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvcndhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0JhY2t3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKCkgPT4ge1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbiguLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNCYWNrd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMsICgpID0+IHtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgY29uc3QgZGVsZXRlZEVsZW1lbnRzID0gW107XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbmRleCA9IGFycmF5Lmxlbmd0aDtcblxuICByZXR1cm4gYmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgIGluZGV4LS07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KS5wb3AoKTsgIC8vL1xuXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTsgIC8vL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKGRlbGV0ZWRFbGVtZW50cywgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShhcnJheSwgY2FsbGJhY2ssIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBsZXQgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7IC8vL1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW5kZXggPSAtMTtcblxuICByZXR1cm4gc29tZShhcnJheSwgKGVsZW1lbnQsIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgIGluZGV4Kys7XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcblxuICAgICAgICBkZWxldGVkRWxlbWVudCA9IGFycmF5LnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpLnBvcCgpIC8vL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHBhc3NlZCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKGRlbGV0ZWRFbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3QoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgbGV0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkOyAvLy9cblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGluZGV4ID0gLTE7XG5cbiAgcmV0dXJuIHNvbWUoYXJyYXksIChlbGVtZW50LCBjb250aW51YXRpb24pID0+IHtcbiAgICBpbmRleCsrO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcblxuICAgICAgICBkZWxldGVkRWxlbWVudCA9IGFycmF5LnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpLnBvcCgpIC8vL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHBhc3NlZCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKGRlbGV0ZWRFbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aDtcblxuICBpZiAoYXJyYXlBTGVuZ3RoICE9PSBhcnJheUJMZW5ndGgpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gZmFsc2U7XG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKG1hdGNoZXMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH1cblxuICBsZXQgaW5kZXggPSAtMTtcblxuICByZXR1cm4gZXZlcnkoYXJyYXlBLCAoZWxlbWVudEEsIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgIGluZGV4Kys7XG5cbiAgICBjb25zdCBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIGVsZW1lbnRCLCAuLi5yZW1haW5pbmdBcmd1bWVudHMsIGNvbnRpbnVhdGlvbik7XG4gIH0sIChzdWNjZXNzKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHN1Y2Nlc3M7ICAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24obWF0Y2hlcywgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGFycmF5QSA9IFsgIC8vL1xuICAgIC4uLmFycmF5QVxuICBdO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICBmdW5jdGlvbiBuZXh0UGFzcygpIHtcbiAgICBjb25zdCBhcnJheUFMZW5ndGggPSBhcnJheUEubGVuZ3RoO1xuXG4gICAgaWYgKGFycmF5QUxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRydWU7ICAvLy9cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICBsZXQgY291bnQgPSAtMTtcblxuICAgIGZ1bmN0aW9uIG5leHRFbGVtZW50KCkge1xuICAgICAgY291bnQrKztcblxuICAgICAgY29uc3QgdGVybWluYXRlID0gKGNvdW50ID09PSBhcnJheUFMZW5ndGgpO1xuXG4gICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBmYWxzZTsgLy8vXG5cbiAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5leHRQYXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvdW50LCAgLy8vXG4gICAgICAgICAgICAgIGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRCID0gZWxlbWVudEE7ICAvLy9cblxuICAgICAgICAgICAgYXJyYXlCLnB1c2goZWxlbWVudEIpO1xuXG4gICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0RWxlbWVudCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0RWxlbWVudCgpO1xuICB9XG5cbiAgbmV4dFBhc3MoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBvbmUsXG4gIHNvbWUsXG4gIGVhY2gsXG4gIGV2ZXJ5LFxuICByZWR1Y2UsXG4gIGZvckVhY2gsXG4gIGZvcndhcmRzRXZlcnksXG4gIGJhY2t3YXJkc0V2ZXJ5LFxuICBmb3J3YXJkc0ZvckVhY2gsXG4gIGJhY2t3YXJkc0ZvckVhY2gsXG4gIGZpbHRlcixcbiAgcHJ1bmUsXG4gIGV4dHJhY3QsXG4gIG1hdGNoLFxuICByZXNvbHZlXG59O1xuIl0sIm5hbWVzIjpbImJhY2t3YXJkc0V2ZXJ5IiwiYmFja3dhcmRzRm9yRWFjaCIsImVhY2giLCJldmVyeSIsImV4dHJhY3QiLCJmaWx0ZXIiLCJmb3JFYWNoIiwiZm9yd2FyZHNFdmVyeSIsImZvcndhcmRzRm9yRWFjaCIsIm1hdGNoIiwib25lIiwicHJ1bmUiLCJyZWR1Y2UiLCJyZXNvbHZlIiwic29tZSIsImFycmF5RmlsdGVyIiwiYXJyYXlVdGlsaXRpZXMiLCJhc3luY2hyb25vdXNGb3JFYWNoIiwiYXN5bmNocm9ub3VzRm9yd2FyZHNGb3JFYWNoIiwiYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCIsImFzeW5jaHJvbm91c1V0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJyZW1haW5pbmdBcmd1bWVudHMiLCJmb3VuZCIsImNvbnRpbnVhdGlvbiIsInBvcCIsImVsZW1lbnQiLCJuZXh0IiwiZG9uZSIsInBhc3NlZCIsInN1Y2Nlc3MiLCJpbml0aWFsVmFsdWUiLCJ2YWx1ZSIsImN1cnJlbnRWYWx1ZSIsImRlbGV0ZWRFbGVtZW50cyIsImluZGV4IiwibGVuZ3RoIiwic3RhcnQiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsImFycmF5QSIsImFycmF5QiIsImFycmF5QUxlbmd0aCIsImFycmF5Qkxlbmd0aCIsIm1hdGNoZXMiLCJlbGVtZW50QSIsImVsZW1lbnRCIiwibmV4dFBhc3MiLCJjb3VudCIsIm5leHRFbGVtZW50IiwidGVybWluYXRlIiwiYXJyYXlCSW5jbHVkZXNFbGVtZW50QSIsImluY2x1ZGVzIiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBeUpnQkE7ZUFBQUE7O1FBa0NBQztlQUFBQTs7UUFtTGhCO2VBQUE7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
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcywgYXN5bmNocm9ub3VzVXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5jb25zdCB7IGZpbHRlcjogYXJyYXlGaWx0ZXIgfSA9IGFycmF5VXRpbGl0aWVzLFxuICAgICAgeyBmb3JFYWNoOiBhc3luY2hyb25vdXNGb3JFYWNoLFxuICAgICAgICBmb3J3YXJkc0ZvckVhY2g6IGFzeW5jaHJvbm91c0ZvcndhcmRzRm9yRWFjaCxcbiAgICAgICAgYmFja3dhcmRzRm9yRWFjaDogYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCB9ID0gYXN5bmNocm9ub3VzVXRpbGl0aWVzO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7ICAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uaW50ZXJtZWRpYXRlQXJndW1lbnRzLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NlZCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgLy8vXG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBwYXNzZWQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgIC8vL1xuXG4gICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgLy8vXG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBwYXNzZWQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgIC8vL1xuXG4gICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgLy8vXG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBwYXNzZWQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgIC8vL1xuXG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbnRlcm1lZGlhdGVBcmd1bWVudHM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBpbml0aWFsVmFsdWUsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsgLy8vXG5cbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgLy8vXG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKHZhbHVlLCBlbGVtZW50LCAuLi5pbnRlcm1lZGlhdGVBcmd1bWVudHMsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gY2FsbGJhY2tBcmd1bWVudHM7ICAvLy9cblxuICAgICAgdmFsdWUgPSBjdXJyZW50VmFsdWU7ICAvLy9cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbnRlcm1lZGlhdGVBcmd1bWVudHM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWx1ZSwgLi4uZmluYWxBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5pbnRlcm1lZGlhdGVBcmd1bWVudHMsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gY2FsbGJhY2tBcmd1bWVudHM7ICAvLy9cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbnRlcm1lZGlhdGVBcmd1bWVudHM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbiguLi5maW5hbEFyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBwYXNzZWQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgIC8vL1xuXG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbnRlcm1lZGlhdGVBcmd1bWVudHM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFja3dhcmRzRXZlcnkoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uaW50ZXJtZWRpYXRlQXJndW1lbnRzLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NlZCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICBjb25zdCBmaW5hbEFyZ3VtZW50cyA9IGludGVybWVkaWF0ZUFyZ3VtZW50czsgLy8vXG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgIC8vL1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICBjb25zdCBmaW5hbEFyZ3VtZW50cyA9IGludGVybWVkaWF0ZUFyZ3VtZW50czsgLy8vXG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBjb250aW51YXRpb24gPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uaW50ZXJtZWRpYXRlQXJndW1lbnRzLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24oLi4uZmluYWxBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcihhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgZGVsZXRlZEVsZW1lbnRzID0gW107XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gaW5pdGlhbEFyZ3VtZW50czsgLy8vXG5cbiAgbGV0IGluZGV4ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNCYWNrd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIGluZGV4LS07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uaW50ZXJtZWRpYXRlQXJndW1lbnRzLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NlZCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAvLy9cblxuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDEsXG4gICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gYXJyYXkuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCkucG9wKCk7ICAvLy9cblxuICAgICAgICBkZWxldGVkRWxlbWVudHMudW5zaGlmdChkZWxldGVkRWxlbWVudCk7ICAvLy9cbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxBcmd1bWVudHMgPSBpbnRlcm1lZGlhdGVBcmd1bWVudHM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudHMsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgbGV0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkOyAvLy9cblxuICBjb25zdCBjb250aW51YXRpb24gPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAvLy9cblxuICBsZXQgaW5kZXggPSAtMTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICBpbmRleCsrO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBwYXNzZWQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBjYWxsYmFja0FyZ3VtZW50czsgLy8vXG5cbiAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gaW5kZXgsICAvLy9cbiAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxO1xuXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gYXJyYXkuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCkucG9wKCk7IC8vL1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24oZGVsZXRlZEVsZW1lbnQsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBsZXQgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7IC8vL1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gIGxldCBpbmRleCA9IC0xO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIGluZGV4Kys7XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uaW50ZXJtZWRpYXRlQXJndW1lbnRzLCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NlZCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAvLy9cblxuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcblxuICAgICAgICBkZWxldGVkRWxlbWVudCA9IGFycmF5LnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpLnBvcCgpOyAvLy9cblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICBjb25zdCBmaW5hbEFyZ3VtZW50cyA9IGludGVybWVkaWF0ZUFyZ3VtZW50czsgLy8vXG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKGRlbGV0ZWRFbGVtZW50LCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpO1xuXG4gIGNvbnN0IGFycmF5QUxlbmd0aCA9IGFycmF5QS5sZW5ndGgsXG4gICAgICAgIGFycmF5Qkxlbmd0aCA9IGFycmF5Qi5sZW5ndGg7XG5cbiAgaWYgKGFycmF5QUxlbmd0aCAhPT0gYXJyYXlCTGVuZ3RoKSB7XG4gICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbiAgfVxuXG4gIGxldCBpbmRleCA9IC0xO1xuXG4gIGxldCBpbnRlcm1lZGlhdGVBcmd1bWVudHMgPSBpbml0aWFsQXJndW1lbnRzOyAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheUEsIChlbGVtZW50QSwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIGluZGV4Kys7XG5cbiAgICBjb25zdCBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIGVsZW1lbnRCLCAuLi5pbnRlcm1lZGlhdGVBcmd1bWVudHMsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgY29uc3QgcGFzc2VkID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgaW50ZXJtZWRpYXRlQXJndW1lbnRzID0gY2FsbGJhY2tBcmd1bWVudHM7ICAvLy9cblxuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4uZmluYWxBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGFycmF5QSA9IFsgIC8vL1xuICAgIC4uLmFycmF5QVxuICBdO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGluaXRpYWxBcmd1bWVudHM7IC8vL1xuXG4gIGZ1bmN0aW9uIG5leHRQYXNzKCkge1xuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICBjb25zdCBhcnJheUFMZW5ndGggPSBhcnJheUEubGVuZ3RoO1xuXG4gICAgaWYgKGFycmF5QUxlbmd0aCA9PT0gMCkge1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IGZpbmFsQXJndW1lbnRzID0gaW50ZXJtZWRpYXRlQXJndW1lbnRzOyAvLy9cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5maW5hbEFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICBmdW5jdGlvbiBuZXh0RWxlbWVudCgpIHtcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGNvbnN0IHRlcm1pbmF0ZSA9IChpbmRleCA9PT0gYXJyYXlBTGVuZ3RoKTtcblxuICAgICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBmaW5hbEFyZ3VtZW50cyA9IGludGVybWVkaWF0ZUFyZ3VtZW50czsgLy8vXG5cbiAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLmZpbmFsQXJndW1lbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5RmlsdGVyKGFycmF5QSwgKGVsZW1lbnRBKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCSW5jbHVkZXNFbGVtZW50QSA9IGFycmF5Qi5pbmNsdWRlcyhlbGVtZW50QSk7XG5cbiAgICAgICAgICBpZiAoIWFycmF5QkluY2x1ZGVzRWxlbWVudEEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV4dFBhc3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIC4uLmludGVybWVkaWF0ZUFyZ3VtZW50cywgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFzc2VkID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgICAgIGludGVybWVkaWF0ZUFyZ3VtZW50cyA9IGNhbGxiYWNrQXJndW1lbnRzOyAgLy8vXG5cbiAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50QiA9IGVsZW1lbnRBOyAgLy8vXG5cbiAgICAgICAgICAgIGFycmF5Qi5wdXNoKGVsZW1lbnRCKTtcblxuICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dEVsZW1lbnQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dEVsZW1lbnQoKTtcbiAgfVxuXG4gIG5leHRQYXNzKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb25lLFxuICBzb21lLFxuICBlYWNoLFxuICBldmVyeSxcbiAgcmVkdWNlLFxuICBmb3JFYWNoLFxuICBmb3J3YXJkc0V2ZXJ5LFxuICBiYWNrd2FyZHNFdmVyeSxcbiAgZm9yd2FyZHNGb3JFYWNoLFxuICBiYWNrd2FyZHNGb3JFYWNoLFxuICBmaWx0ZXIsXG4gIHBydW5lLFxuICBleHRyYWN0LFxuICBtYXRjaCxcbiAgcmVzb2x2ZVxufTtcbiJdLCJuYW1lcyI6WyJiYWNrd2FyZHNFdmVyeSIsImJhY2t3YXJkc0ZvckVhY2giLCJlYWNoIiwiZXZlcnkiLCJleHRyYWN0IiwiZmlsdGVyIiwiZm9yRWFjaCIsImZvcndhcmRzRXZlcnkiLCJmb3J3YXJkc0ZvckVhY2giLCJtYXRjaCIsIm9uZSIsInBydW5lIiwicmVkdWNlIiwicmVzb2x2ZSIsInNvbWUiLCJhcnJheUZpbHRlciIsImFycmF5VXRpbGl0aWVzIiwiYXN5bmNocm9ub3VzRm9yRWFjaCIsImFzeW5jaHJvbm91c0ZvcndhcmRzRm9yRWFjaCIsImFzeW5jaHJvbm91c0JhY2t3YXJkc0ZvckVhY2giLCJhc3luY2hyb25vdXNVdGlsaXRpZXMiLCJhcnJheSIsImNhbGxiYWNrIiwiaW5pdGlhbEFyZ3VtZW50cyIsInN1Y2Nlc3MiLCJjb250aW51YXRpb24iLCJwb3AiLCJpbnRlcm1lZGlhdGVBcmd1bWVudHMiLCJlbGVtZW50IiwibmV4dCIsImRvbmUiLCJjYWxsYmFja0FyZ3VtZW50cyIsInBhc3NlZCIsInNoaWZ0IiwiZmluYWxBcmd1bWVudHMiLCJpbml0aWFsVmFsdWUiLCJ2YWx1ZSIsImN1cnJlbnRWYWx1ZSIsImRlbGV0ZWRFbGVtZW50cyIsImluZGV4IiwibGVuZ3RoIiwic3RhcnQiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsImFycmF5QSIsImFycmF5QiIsImFycmF5QUxlbmd0aCIsImFycmF5Qkxlbmd0aCIsImVsZW1lbnRBIiwiZWxlbWVudEIiLCJuZXh0UGFzcyIsIm5leHRFbGVtZW50IiwidGVybWluYXRlIiwiYXJyYXlCSW5jbHVkZXNFbGVtZW50QSIsImluY2x1ZGVzIiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBK01nQkE7ZUFBQUE7O1FBZ0RBQztlQUFBQTs7UUFxUGhCO2VBQUE7O1FBM2FnQkM7ZUFBQUE7O1FBZ0NBQztlQUFBQTs7UUErT0FDO2VBQUFBOztRQXZFQUM7ZUFBQUE7O1FBbEhBQztl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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-languages",
3
3
  "author": "James Smith",
4
- "version": "2.2.17",
4
+ "version": "2.2.19",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-languages",
7
7
  "description": "Occam's common language functionality.",
package/src/index.js CHANGED
@@ -7,7 +7,6 @@ export { default as BreakPoint } from "./breakPoint";
7
7
  export { default as FileContext } from "./context/file";
8
8
  export { default as ReleaseContext } from "./context/release";
9
9
 
10
- export { default as EquivalencePass } from "./pass/equivalence";
11
10
  export { default as ContinuationPass } from "./pass/continuation";
12
11
  export { default as ContinuationZipPass } from "./pass/continuationZip";
13
12
 
@@ -13,13 +13,12 @@ export default class ContinuationPass {
13
13
  descend(childNodes, ...remainingArguments) {
14
14
  const continuation = remainingArguments.pop();
15
15
 
16
- return every(childNodes, (childNode, continuation) => {
17
- const node = childNode; ///
16
+ return every(childNodes, (childNode, ...remainingArguments) => {
17
+ const continuation = remainingArguments.pop(),
18
+ node = childNode; ///
18
19
 
19
20
  return this.visitNode(node, ...remainingArguments, continuation);
20
- }, (descended) => {
21
- return continuation(descended, ...remainingArguments);
22
- });
21
+ }, ...remainingArguments, continuation);
23
22
  }
24
23
 
25
24
  visitNode(node, ...remainingArguments) {
@@ -22,17 +22,16 @@ export default class ContinuationZipPass {
22
22
 
23
23
  let index = -1;
24
24
 
25
- return every(generalChildNodes, (generalChildNode, continuation) => {
25
+ return every(generalChildNodes, (generalChildNode, ...remainingArguments) => {
26
26
  index++;
27
27
 
28
- const specificChildNode = specificChildNodes[index],
29
- specificNode = specificChildNode, ///
30
- generalNode = generalChildNode; ///
28
+ const continuation = remainingArguments.pop(),
29
+ specificChildNode = specificChildNodes[index],
30
+ generalNode = generalChildNode, ///
31
+ specificNode = specificChildNode; ///
31
32
 
32
33
  return this.visitNode(generalNode, specificNode, ...remainingArguments, continuation);
33
- }, (descended) => {
34
- return continuation(descended, ...remainingArguments);
35
- });
34
+ }, ...remainingArguments, continuation);
36
35
  }
37
36
 
38
37
  visitNode(generalNode, specificNode, ...remainingArguments) {