occam-languages 2.2.16 → 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,52 +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 match(arrayA, arrayB, callback, ...remainingArguments) {
134
- const continuation = remainingArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
135
- if (arrayALength !== arrayBLength) {
136
- const matches = false;
137
- return continuation(matches, ...remainingArguments);
138
- }
139
- let index = -1;
140
- return every(arrayA, (elementA, continuation)=>{
141
- index++;
142
- const elementB = arrayB[index];
143
- return callback(elementA, elementB, ...remainingArguments, continuation);
144
- }, (success)=>{
145
- const matches = success; ///
146
- return continuation(matches, ...remainingArguments);
147
- });
148
- }
149
- function reduce(array, initialValue, callback, ...remainingArguments) {
149
+ function reduce(array, initialValue, callback, ...initialArguments) {
150
150
  let value = initialValue; ///
151
- const continuation = remainingArguments.pop();
151
+ const continuation = initialArguments.pop();
152
+ let intermediateArguments = initialArguments; ///
152
153
  return asynchronousForEach(array, (element, next, done)=>{
153
- return callback(value, element, ...remainingArguments, (currentValue)=>{
154
+ return callback(value, element, ...intermediateArguments, (...callbackArguments)=>{
155
+ const currentValue = callbackArguments.shift();
156
+ intermediateArguments = callbackArguments; ///
154
157
  value = currentValue; ///
155
158
  next();
156
159
  });
157
160
  }, ()=>{
158
- return continuation(value, ...remainingArguments);
161
+ const finalArguments = intermediateArguments; ///
162
+ return continuation(value, ...finalArguments);
159
163
  });
160
164
  }
161
- function forEach(array, callback, ...remainingArguments) {
162
- const continuation = remainingArguments.pop();
165
+ function forEach(array, callback, ...initialArguments) {
166
+ const continuation = initialArguments.pop();
167
+ let intermediateArguments = initialArguments; ///
163
168
  return asynchronousForEach(array, (element, next, done)=>{
164
- return callback(element, ...remainingArguments, ()=>{
169
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
170
+ intermediateArguments = callbackArguments; ///
165
171
  next();
166
172
  });
167
173
  }, ()=>{
168
- return continuation(...remainingArguments);
174
+ const finalArguments = intermediateArguments; ///
175
+ return continuation(...finalArguments);
169
176
  });
170
177
  }
171
- function forwardsEvery(array, callback, ...remainingArguments) {
178
+ function forwardsEvery(array, callback, ...initialArguments) {
172
179
  let success = true;
173
- const continuation = remainingArguments.pop();
180
+ const continuation = initialArguments.pop();
181
+ let intermediateArguments = initialArguments; ///
174
182
  return asynchronousForwardsForEach(array, (element, next, done)=>{
175
- return callback(element, ...remainingArguments, (passed)=>{
183
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
184
+ const passed = callbackArguments.shift();
185
+ intermediateArguments = callbackArguments; ///
176
186
  if (!passed) {
177
187
  success = false;
178
188
  done();
@@ -181,14 +191,18 @@ function forwardsEvery(array, callback, ...remainingArguments) {
181
191
  next();
182
192
  });
183
193
  }, ()=>{
184
- return continuation(success, ...remainingArguments);
194
+ const finalArguments = intermediateArguments; ///
195
+ return continuation(success, ...finalArguments);
185
196
  });
186
197
  }
187
- function backwardsEvery(array, callback, ...remainingArguments) {
198
+ function backwardsEvery(array, callback, ...initialArguments) {
188
199
  let success = true;
189
- const continuation = remainingArguments.pop();
200
+ const continuation = initialArguments.pop();
201
+ let intermediateArguments = initialArguments; ///
190
202
  return asynchronousBackwardsForEach(array, (element, next, done)=>{
191
- return callback(element, ...remainingArguments, (passed)=>{
203
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
204
+ const passed = callbackArguments.shift();
205
+ intermediateArguments = callbackArguments; ///
192
206
  if (!passed) {
193
207
  success = false;
194
208
  done();
@@ -197,100 +211,154 @@ function backwardsEvery(array, callback, ...remainingArguments) {
197
211
  next();
198
212
  });
199
213
  }, ()=>{
200
- return continuation(success, ...remainingArguments);
214
+ const finalArguments = intermediateArguments; ///
215
+ return continuation(success, ...finalArguments);
201
216
  });
202
217
  }
203
- function forwardsForEach(array, callback, ...remainingArguments) {
204
- const continuation = remainingArguments.pop();
218
+ function forwardsForEach(array, callback, ...initialArguments) {
219
+ const continuation = initialArguments.pop();
220
+ let intermediateArguments = initialArguments; ///
205
221
  return asynchronousForwardsForEach(array, (element, next, done)=>{
206
- return callback(element, ...remainingArguments, ()=>{
222
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
223
+ intermediateArguments = callbackArguments; ///
207
224
  next();
208
225
  });
209
226
  }, ()=>{
210
- return continuation(...remainingArguments);
227
+ const finalArguments = intermediateArguments; ///
228
+ return continuation(...finalArguments);
211
229
  });
212
230
  }
213
- function backwardsForEach(array, callback, ...remainingArguments) {
214
- const continuation = remainingArguments.pop();
231
+ function backwardsForEach(array, callback, ...initialArguments) {
232
+ const continuation = initialArguments.pop();
233
+ let intermediateArguments = initialArguments; ///
215
234
  return asynchronousBackwardsForEach(array, (element, next, done)=>{
216
- return callback(element, ...remainingArguments, ()=>{
235
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
236
+ intermediateArguments = callbackArguments; ///
217
237
  next();
218
238
  });
219
239
  }, ()=>{
220
- return continuation(...remainingArguments);
240
+ const finalArguments = intermediateArguments; ///
241
+ return continuation(...finalArguments);
221
242
  });
222
243
  }
223
- function filter(array, callback, ...remainingArguments) {
244
+ function filter(array, callback, ...initialArguments) {
224
245
  const deletedElements = [];
225
- const continuation = remainingArguments.pop();
246
+ const continuation = initialArguments.pop();
247
+ let intermediateArguments = initialArguments; ///
226
248
  let index = array.length;
227
- return backwardsForEach(array, (element, continuation)=>{
249
+ return asynchronousBackwardsForEach(array, (element, next, done)=>{
228
250
  index--;
229
- return callback(element, ...remainingArguments, (passed)=>{
251
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
252
+ const passed = callbackArguments.shift();
253
+ intermediateArguments = callbackArguments; ///
230
254
  if (!passed) {
231
255
  const start = index, deleteCount = 1, deletedElement = array.splice(start, deleteCount).pop(); ///
232
256
  deletedElements.unshift(deletedElement); ///
233
257
  }
234
- return continuation();
258
+ next();
235
259
  });
236
260
  }, ()=>{
237
- return continuation(deletedElements, ...remainingArguments);
261
+ const finalArguments = intermediateArguments; ///
262
+ return continuation(deletedElements, ...finalArguments);
238
263
  });
239
264
  }
240
- function prune(array, callback, ...remainingArguments) {
265
+ function prune(array, callback, ...initialArguments) {
241
266
  let deletedElement = undefined; ///
242
- const continuation = remainingArguments.pop();
267
+ const continuation = initialArguments.pop();
268
+ let intermediateArguments = initialArguments; ///
243
269
  let index = -1;
244
- return some(array, (element, continuation)=>{
270
+ return asynchronousForEach(array, (element, next, done)=>{
245
271
  index++;
246
- return callback(element, ...remainingArguments, (passed)=>{
272
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
273
+ const passed = callbackArguments.shift();
274
+ intermediateArguments = callbackArguments; ///
247
275
  if (!passed) {
248
276
  const start = index, deleteCount = 1;
249
277
  deletedElement = array.splice(start, deleteCount).pop(); ///
278
+ done();
279
+ return;
250
280
  }
251
- return continuation(passed);
281
+ next();
252
282
  });
253
283
  }, ()=>{
254
- return continuation(deletedElement, ...remainingArguments);
284
+ const finalArguments = intermediateArguments; ///
285
+ return continuation(deletedElement, ...finalArguments);
255
286
  });
256
287
  }
257
- function extract(array, callback, ...remainingArguments) {
288
+ function extract(array, callback, ...initialArguments) {
258
289
  let deletedElement = undefined; ///
259
- const continuation = remainingArguments.pop();
290
+ const continuation = initialArguments.pop();
291
+ let intermediateArguments = initialArguments; ///
260
292
  let index = -1;
261
- return some(array, (element, continuation)=>{
293
+ return asynchronousForEach(array, (element, next, done)=>{
262
294
  index++;
263
- return callback(element, ...remainingArguments, (passed)=>{
295
+ return callback(element, ...intermediateArguments, (...callbackArguments)=>{
296
+ const passed = callbackArguments.shift();
297
+ intermediateArguments = callbackArguments; ///
264
298
  if (passed) {
265
299
  const start = index, deleteCount = 1;
266
300
  deletedElement = array.splice(start, deleteCount).pop(); ///
301
+ done();
302
+ return;
267
303
  }
268
- return continuation(passed);
304
+ next();
269
305
  });
270
306
  }, ()=>{
271
- return continuation(deletedElement, ...remainingArguments);
307
+ const finalArguments = intermediateArguments; ///
308
+ return continuation(deletedElement, ...finalArguments);
272
309
  });
273
310
  }
274
- function resolve(arrayA, arrayB, callback, ...remainingArguments) {
311
+ function match(arrayA, arrayB, callback, ...initialArguments) {
312
+ let success = true;
313
+ const continuation = initialArguments.pop();
314
+ const arrayALength = arrayA.length, arrayBLength = arrayB.length;
315
+ if (arrayALength !== arrayBLength) {
316
+ success = false;
317
+ return continuation(success, ...initialArguments);
318
+ }
319
+ let index = -1;
320
+ let intermediateArguments = initialArguments; ///
321
+ return asynchronousForEach(arrayA, (elementA, next, done)=>{
322
+ index++;
323
+ const elementB = arrayB[index];
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);
337
+ });
338
+ }
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);
@@ -320,7 +390,6 @@ const _default = {
320
390
  some,
321
391
  each,
322
392
  every,
323
- match,
324
393
  reduce,
325
394
  forEach,
326
395
  forwardsEvery,
@@ -330,7 +399,8 @@ const _default = {
330
399
  filter,
331
400
  prune,
332
401
  extract,
402
+ match,
333
403
  resolve
334
404
  };
335
405
 
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcywgYXN5bmNocm9ub3VzVXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5jb25zdCB7IGZpbHRlcjogYXJyYXlGaWx0ZXIgfSA9IGFycmF5VXRpbGl0aWVzLFxuICAgICAgeyBmb3JFYWNoOiBhc3luY2hyb25vdXNGb3JFYWNoLFxuICAgICAgICBmb3J3YXJkc0ZvckVhY2g6IGFzeW5jaHJvbm91c0ZvcndhcmRzRm9yRWFjaCxcbiAgICAgICAgYmFja3dhcmRzRm9yRWFjaDogYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCB9ID0gYXN5bmNocm9ub3VzVXRpbGl0aWVzO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lKGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKGZvdW5kLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFjaChhcnJheSwgY2FsbGJhY2ssIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oZm91bmQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlcnkoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAocGFzc2VkKSA9PiB7XG4gICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aDtcblxuICBpZiAoYXJyYXlBTGVuZ3RoICE9PSBhcnJheUJMZW5ndGgpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gZmFsc2U7XG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKG1hdGNoZXMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH1cblxuICBsZXQgaW5kZXggPSAtMTtcblxuICByZXR1cm4gZXZlcnkoYXJyYXlBLCAoZWxlbWVudEEsIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgIGluZGV4Kys7XG5cbiAgICBjb25zdCBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIGVsZW1lbnRCLCAuLi5yZW1haW5pbmdBcmd1bWVudHMsIGNvbnRpbnVhdGlvbik7XG4gIH0sIChzdWNjZXNzKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHN1Y2Nlc3M7ICAvLy9cblxuICAgIHJldHVybiBjb250aW51YXRpb24obWF0Y2hlcywgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2UoYXJyYXksIGluaXRpYWxWYWx1ZSwgY2FsbGJhY2ssIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7IC8vL1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2sodmFsdWUsIGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgdmFsdWUgPSBjdXJyZW50VmFsdWU7ICAvLy9cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWx1ZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAoKSA9PiB7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNCYWNrd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMsIChwYXNzZWQpID0+IHtcbiAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMsICgpID0+IHtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCAoKSA9PiB7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyKGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGRlbGV0ZWRFbGVtZW50cyA9IFtdO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgaW5kZXggPSBhcnJheS5sZW5ndGg7XG5cbiAgcmV0dXJuIGJhY2t3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBjb250aW51YXRpb24pID0+IHtcbiAgICBpbmRleC0tO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDEsXG4gICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gYXJyYXkuc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCkucG9wKCk7ICAvLy9cblxuICAgICAgICBkZWxldGVkRWxlbWVudHMudW5zaGlmdChkZWxldGVkRWxlbWVudCk7ICAvLy9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbigpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudHMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmUoYXJyYXksIGNhbGxiYWNrLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgbGV0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkOyAvLy9cblxuICBjb25zdCBjb250aW51YXRpb24gPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGluZGV4ID0gLTE7XG5cbiAgcmV0dXJuIHNvbWUoYXJyYXksIChlbGVtZW50LCBjb250aW51YXRpb24pID0+IHtcbiAgICBpbmRleCsrO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KS5wb3AoKSAvLy9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihwYXNzZWQpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0KGFycmF5LCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGxldCBkZWxldGVkRWxlbWVudCA9IHVuZGVmaW5lZDsgLy8vXG5cbiAgY29uc3QgY29udGludWF0aW9uID0gcmVtYWluaW5nQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbmRleCA9IC0xO1xuXG4gIHJldHVybiBzb21lKGFycmF5LCAoZWxlbWVudCwgY29udGludWF0aW9uKSA9PiB7XG4gICAgaW5kZXgrKztcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5yZW1haW5pbmdBcmd1bWVudHMsIChwYXNzZWQpID0+IHtcbiAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KS5wb3AoKSAvLy9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihwYXNzZWQpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGFycmF5QSA9IFsgIC8vL1xuICAgIC4uLmFycmF5QVxuICBdO1xuXG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKTtcblxuICBmdW5jdGlvbiBuZXh0UGFzcygpIHtcbiAgICBjb25zdCBhcnJheUFMZW5ndGggPSBhcnJheUEubGVuZ3RoO1xuXG4gICAgaWYgKGFycmF5QUxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRydWU7ICAvLy9cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICBsZXQgY291bnQgPSAtMTtcblxuICAgIGZ1bmN0aW9uIG5leHRFbGVtZW50KCkge1xuICAgICAgY291bnQrKztcblxuICAgICAgY29uc3QgdGVybWluYXRlID0gKGNvdW50ID09PSBhcnJheUFMZW5ndGgpO1xuXG4gICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBmYWxzZTsgLy8vXG5cbiAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5leHRQYXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvdW50LCAgLy8vXG4gICAgICAgICAgICAgIGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cywgKHBhc3NlZCkgPT4ge1xuICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRCID0gZWxlbWVudEE7ICAvLy9cblxuICAgICAgICAgICAgYXJyYXlCLnB1c2goZWxlbWVudEIpO1xuXG4gICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0RWxlbWVudCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0RWxlbWVudCgpO1xuICB9XG5cbiAgbmV4dFBhc3MoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBvbmUsXG4gIHNvbWUsXG4gIGVhY2gsXG4gIGV2ZXJ5LFxuICBtYXRjaCxcbiAgcmVkdWNlLFxuICBmb3JFYWNoLFxuICBmb3J3YXJkc0V2ZXJ5LFxuICBiYWNrd2FyZHNFdmVyeSxcbiAgZm9yd2FyZHNGb3JFYWNoLFxuICBiYWNrd2FyZHNGb3JFYWNoLFxuICBmaWx0ZXIsXG4gIHBydW5lLFxuICBleHRyYWN0LFxuICByZXNvbHZlXG59O1xuIl0sIm5hbWVzIjpbImJhY2t3YXJkc0V2ZXJ5IiwiYmFja3dhcmRzRm9yRWFjaCIsImVhY2giLCJldmVyeSIsImV4dHJhY3QiLCJmaWx0ZXIiLCJmb3JFYWNoIiwiZm9yd2FyZHNFdmVyeSIsImZvcndhcmRzRm9yRWFjaCIsIm1hdGNoIiwib25lIiwicHJ1bmUiLCJyZWR1Y2UiLCJyZXNvbHZlIiwic29tZSIsImFycmF5RmlsdGVyIiwiYXJyYXlVdGlsaXRpZXMiLCJhc3luY2hyb25vdXNGb3JFYWNoIiwiYXN5bmNocm9ub3VzRm9yd2FyZHNGb3JFYWNoIiwiYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCIsImFzeW5jaHJvbm91c1V0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJyZW1haW5pbmdBcmd1bWVudHMiLCJmb3VuZCIsImNvbnRpbnVhdGlvbiIsInBvcCIsImVsZW1lbnQiLCJuZXh0IiwiZG9uZSIsInBhc3NlZCIsInN1Y2Nlc3MiLCJhcnJheUEiLCJhcnJheUIiLCJhcnJheUFMZW5ndGgiLCJsZW5ndGgiLCJhcnJheUJMZW5ndGgiLCJtYXRjaGVzIiwiaW5kZXgiLCJlbGVtZW50QSIsImVsZW1lbnRCIiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJjdXJyZW50VmFsdWUiLCJkZWxldGVkRWxlbWVudHMiLCJzdGFydCIsImRlbGV0ZUNvdW50IiwiZGVsZXRlZEVsZW1lbnQiLCJzcGxpY2UiLCJ1bnNoaWZ0IiwidW5kZWZpbmVkIiwibmV4dFBhc3MiLCJjb3VudCIsIm5leHRFbGVtZW50IiwidGVybWluYXRlIiwiYXJyYXlCSW5jbHVkZXNFbGVtZW50QSIsImluY2x1ZGVzIiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBbUxnQkE7ZUFBQUE7O1FBa0NBQztlQUFBQTs7UUF5SmhCO2VBQUE7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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.16",
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) {