@secrecy/lib 1.0.0-dev.62 → 1.0.0-dev.64

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.
@@ -1,5 +1,4 @@
1
1
  // lz4-ts @license BSD-3-Clause / Copyright (c) 2015, Pierre Curto / 2016, oov. All rights reserved.
2
-
3
2
  /**
4
3
  * Copyright (c) 2015, Pierre Curto
5
4
  * Copyright (c) 2016, oov
@@ -30,229 +29,187 @@
30
29
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
30
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
31
  */
32
+
33
33
  const errInvalidSource = new Error("invalid source");
34
- const errShortBuffer = new Error("short buffer"); // The following constants are used to setup the compression algorithm.
34
+ const errShortBuffer = new Error("short buffer");
35
35
 
36
+ // The following constants are used to setup the compression algorithm.
36
37
  const minMatch = 4; // the minimum size of the match sequence size (4 bytes)
37
-
38
38
  const winSizeLog = 16; // LZ4 64Kb window size limit
39
-
40
39
  const winSize = 1 << winSizeLog;
41
40
  const winMask = winSize - 1; // 64Kb window of previous data for dependent blocks
41
+
42
42
  // hashSizeLog determines the size of the hash table used to quickly find a previous match position.
43
43
  // Its value influences the compression speed and memory usage, the lower the faster,
44
44
  // but at the expense of the compression ratio.
45
45
  // 16 seems to be the best compromise.
46
-
47
46
  const hashSizeLog = 16;
48
47
  const hashSize = 1 << hashSizeLog;
49
48
  const hashShift = minMatch * 8 - hashSizeLog;
50
49
  const mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
51
-
52
50
  const skipStrength = 6; // variable step for fast scan
53
51
 
54
52
  const hasher = 2654435761 | 0; // prime number used to hash minMatch
55
- // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill
56
53
 
54
+ // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill
57
55
  function imulPolyfill(a, b) {
58
56
  const ah = a >>> 16 & 0xffff;
59
57
  const al = a & 0xffff;
60
58
  const bh = b >>> 16 & 0xffff;
61
- const bl = b & 0xffff; // the shift by 0 fixes the sign on the high part
59
+ const bl = b & 0xffff;
60
+ // the shift by 0 fixes the sign on the high part
62
61
  // the final |0 converts the unsigned value into a signed value
63
-
64
62
  return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
65
63
  }
66
-
67
64
  const imul = Math.imul ? Math.imul : imulPolyfill;
68
-
69
65
  function getUint32(a, i) {
70
66
  return a[i + 3] | a[i + 2] << 8 | a[i + 1] << 16 | a[i] << 24;
71
67
  }
72
-
73
68
  function copy(dest, src, di, si, len) {
74
69
  for (let i = 0; i < len; ++i) {
75
70
  dest[di++] = src[si++];
76
71
  }
77
72
  }
78
-
79
73
  export function calcUncompressedLen(src) {
80
74
  const sn = src.length;
81
-
82
75
  if (sn === 0) {
83
76
  return 0;
84
77
  }
85
-
86
78
  let si = 0;
87
79
  let di = 0;
88
-
89
80
  while (true) {
90
81
  // literals and match lengths (token)
91
82
  let lLen = src[si] >> 4;
92
83
  let mLen = src[si] & 0xf;
93
-
94
84
  if (++si === sn) {
95
85
  throw errInvalidSource;
96
- } // literals
97
-
86
+ }
98
87
 
88
+ // literals
99
89
  if (lLen > 0) {
100
90
  if (lLen === 0xf) {
101
91
  while (src[si] === 0xff) {
102
92
  lLen += 0xff;
103
-
104
93
  if (++si === sn) {
105
94
  throw errInvalidSource;
106
95
  }
107
96
  }
108
-
109
97
  lLen += src[si];
110
-
111
98
  if (++si === sn) {
112
99
  throw errInvalidSource;
113
100
  }
114
101
  }
115
-
116
102
  di += lLen;
117
103
  si += lLen;
118
-
119
104
  if (si >= sn) {
120
105
  return di;
121
106
  }
122
107
  }
123
-
124
108
  si += 2;
125
-
126
109
  if (si >= sn) {
127
110
  throw errInvalidSource;
128
111
  }
129
-
130
112
  const offset = src[si - 2] | src[si - 1] << 8;
131
-
132
113
  if (di - offset < 0 || offset === 0) {
133
114
  throw errInvalidSource;
134
- } // match
135
-
115
+ }
136
116
 
117
+ // match
137
118
  if (mLen === 0xf) {
138
119
  while (src[si] === 0xff) {
139
120
  mLen += 0xff;
140
-
141
121
  if (++si === sn) {
142
122
  throw errInvalidSource;
143
123
  }
144
124
  }
145
-
146
125
  mLen += src[si];
147
-
148
126
  if (++si === sn) {
149
127
  throw errInvalidSource;
150
128
  }
151
- } // minimum match length is 4
152
-
153
-
154
- mLen += 4; // copy the match (NB. match is at least 4 bytes long)
129
+ }
130
+ // minimum match length is 4
131
+ mLen += 4;
155
132
 
133
+ // copy the match (NB. match is at least 4 bytes long)
156
134
  for (; mLen >= offset; mLen -= offset) {
157
135
  di += offset;
158
136
  }
159
-
160
137
  di += mLen;
161
138
  }
162
139
  }
163
140
  export function uncompressBlock(src, dest) {
164
141
  const sn = src.length;
165
142
  const dn = dest.length;
166
-
167
143
  if (sn === 0) {
168
144
  return 0;
169
145
  }
170
-
171
146
  let si = 0;
172
147
  let di = 0;
173
-
174
148
  while (true) {
175
149
  // literals and match lengths (token)
176
150
  let lLen = src[si] >> 4;
177
151
  let mLen = src[si] & 0xf;
178
-
179
152
  if (++si === sn) {
180
153
  throw errInvalidSource;
181
- } // literals
182
-
154
+ }
183
155
 
156
+ // literals
184
157
  if (lLen > 0) {
185
158
  if (lLen === 0xf) {
186
159
  while (src[si] === 0xff) {
187
160
  lLen += 0xff;
188
-
189
161
  if (++si === sn) {
190
162
  throw errInvalidSource;
191
163
  }
192
164
  }
193
-
194
165
  lLen += src[si];
195
-
196
166
  if (++si === sn) {
197
167
  throw errInvalidSource;
198
168
  }
199
169
  }
200
-
201
170
  if (dn - di < lLen || si + lLen > sn) {
202
171
  throw errShortBuffer;
203
172
  }
204
-
205
173
  copy(dest, src, di, si, lLen);
206
174
  di += lLen;
207
175
  si += lLen;
208
-
209
176
  if (si >= sn) {
210
177
  return di;
211
178
  }
212
179
  }
213
-
214
180
  si += 2;
215
-
216
181
  if (si >= sn) {
217
182
  throw errInvalidSource;
218
183
  }
219
-
220
184
  const offset = src[si - 2] | src[si - 1] << 8;
221
-
222
185
  if (di - offset < 0 || offset === 0) {
223
186
  throw errInvalidSource;
224
- } // match
225
-
187
+ }
226
188
 
189
+ // match
227
190
  if (mLen === 0xf) {
228
191
  while (src[si] === 0xff) {
229
192
  mLen += 0xff;
230
-
231
193
  if (++si === sn) {
232
194
  throw errInvalidSource;
233
195
  }
234
196
  }
235
-
236
197
  mLen += src[si];
237
-
238
198
  if (++si === sn) {
239
199
  throw errInvalidSource;
240
200
  }
241
- } // minimum match length is 4
242
-
243
-
201
+ }
202
+ // minimum match length is 4
244
203
  mLen += 4;
245
-
246
204
  if (dn - di <= mLen) {
247
205
  throw errShortBuffer;
248
- } // copy the match (NB. match is at least 4 bytes long)
249
-
206
+ }
250
207
 
208
+ // copy the match (NB. match is at least 4 bytes long)
251
209
  for (; mLen >= offset; mLen -= offset) {
252
210
  copy(dest, dest, di, di - offset, offset);
253
211
  di += offset;
254
212
  }
255
-
256
213
  copy(dest, dest, di, di - offset, mLen);
257
214
  di += mLen;
258
215
  }
@@ -263,33 +220,32 @@ export function compressBlockBound(n) {
263
220
  export function compressBlock(src, dest, soffset) {
264
221
  const sn = src.length - mfLimit;
265
222
  const dn = dest.length;
266
-
267
223
  if (sn <= 0 || dn === 0 || soffset >= sn) {
268
224
  return 0;
269
225
  }
270
-
271
226
  let si = 0,
272
- di = 0; // fast scan strategy:
227
+ di = 0;
228
+
229
+ // fast scan strategy:
273
230
  // we only need a hash table to store the last sequences (4 bytes)
231
+ const hashTable = new Uint32Array(hashSize);
274
232
 
275
- const hashTable = new Uint32Array(hashSize); // Initialise the hash table with the first 64Kb of the input buffer
233
+ // Initialise the hash table with the first 64Kb of the input buffer
276
234
  // (used when compressing dependent blocks)
277
-
278
235
  while (si < soffset) {
279
236
  const h = imul(getUint32(src, si), hasher) >>> hashShift;
280
237
  hashTable[h] = ++si;
281
238
  }
282
-
283
239
  let anchor = si;
284
240
  let fma = 1 << skipStrength;
285
-
286
241
  while (si < sn - minMatch) {
287
242
  // hash the next 4 bytes (sequence)...
288
- const h = imul(getUint32(src, si), hasher) >>> hashShift; // -1 to separate existing entries from new ones
289
-
290
- const ref = hashTable[h] - 1; // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
291
-
292
- hashTable[h] = si + 1; // no need to check the last 3 bytes in the first literal 4 bytes as
243
+ const h = imul(getUint32(src, si), hasher) >>> hashShift;
244
+ // -1 to separate existing entries from new ones
245
+ const ref = hashTable[h] - 1;
246
+ // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
247
+ hashTable[h] = si + 1;
248
+ // no need to check the last 3 bytes in the first literal 4 bytes as
293
249
  // this guarantees that the next match, if any, is compressed with
294
250
  // a lower size, since to have some compression we must have:
295
251
  // ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
@@ -298,141 +254,120 @@ export function compressBlock(src, dest, soffset) {
298
254
  // ll >= 1, ml >= 4
299
255
  // => ll+ml >= 5
300
256
  // => so overlap must be 0
301
- // the sequence is new, out of bound (64kb) or not valid: try next sequence
302
257
 
303
- if (ref < 0 || //(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
258
+ // the sequence is new, out of bound (64kb) or not valid: try next sequence
259
+ if (ref < 0 ||
260
+ //(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
304
261
  si - ref >> winSizeLog > 0 || src[ref] !== src[si] || src[ref + 1] !== src[si + 1] || src[ref + 2] !== src[si + 2] || src[ref + 3] !== src[si + 3]) {
305
262
  // variable step: improves performance on non-compressible data
306
263
  si += fma >> skipStrength;
307
264
  ++fma;
308
265
  continue;
309
- } // match found
310
-
311
-
266
+ }
267
+ // match found
312
268
  fma = 1 << skipStrength;
313
269
  const lLen = si - anchor;
314
- const offset = si - ref; // encode match length part 1
270
+ const offset = si - ref;
315
271
 
272
+ // encode match length part 1
316
273
  si += minMatch;
317
274
  let mLen = si; // match length has minMatch already
318
-
319
275
  while (si <= sn && src[si] === src[si - offset]) {
320
276
  si++;
321
277
  }
322
-
323
278
  mLen = si - mLen;
324
-
325
279
  if (mLen < 0xf) {
326
280
  dest[di] = mLen;
327
281
  } else {
328
282
  dest[di] = 0xf;
329
- } // encode literals length
330
-
283
+ }
331
284
 
285
+ // encode literals length
332
286
  if (lLen < 0xf) {
333
287
  dest[di] |= lLen << 4;
334
288
  } else {
335
289
  dest[di] |= 0xf0;
336
-
337
290
  if (++di === dn) {
338
291
  throw errShortBuffer;
339
292
  }
340
-
341
293
  let l = lLen - 0xf;
342
-
343
294
  for (; l >= 0xff; l -= 0xff) {
344
295
  dest[di] = 0xff;
345
-
346
296
  if (++di === dn) {
347
297
  throw errShortBuffer;
348
298
  }
349
299
  }
350
-
351
300
  dest[di] = l & 0xff;
352
301
  }
353
-
354
302
  if (++di === dn) {
355
303
  throw errShortBuffer;
356
- } // literals
357
-
304
+ }
358
305
 
306
+ // literals
359
307
  if (di + lLen >= dn) {
360
308
  throw errShortBuffer;
361
309
  }
362
-
363
310
  copy(dest, src, di, anchor, lLen);
364
311
  di += lLen;
365
- anchor = si; // encode offset
312
+ anchor = si;
366
313
 
314
+ // encode offset
367
315
  di += 2;
368
-
369
316
  if (di >= dn) {
370
317
  throw errShortBuffer;
371
318
  }
372
-
373
319
  dest[di - 2] = offset;
374
- dest[di - 1] = offset >> 8; // encode match length part 2
320
+ dest[di - 1] = offset >> 8;
375
321
 
322
+ // encode match length part 2
376
323
  if (mLen >= 0xf) {
377
324
  for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
378
325
  dest[di] = 0xff;
379
-
380
326
  if (++di === dn) {
381
327
  throw errShortBuffer;
382
328
  }
383
329
  }
384
-
385
330
  dest[di] = mLen;
386
-
387
331
  if (++di === dn) {
388
332
  throw errShortBuffer;
389
333
  }
390
334
  }
391
335
  }
392
-
393
336
  if (anchor === 0) {
394
337
  // incompressible
395
338
  return 0;
396
- } // last literals
397
-
339
+ }
398
340
 
341
+ // last literals
399
342
  let lLen = src.length - anchor;
400
-
401
343
  if (lLen < 0xf) {
402
344
  dest[di] = lLen << 4;
403
345
  } else {
404
346
  dest[di] = 0xf0;
405
-
406
347
  if (++di === dn) {
407
348
  throw errShortBuffer;
408
349
  }
409
-
410
350
  for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
411
351
  dest[di] = 0xff;
412
-
413
352
  if (++di === dn) {
414
353
  throw errShortBuffer;
415
354
  }
416
355
  }
417
-
418
356
  dest[di] = lLen;
419
357
  }
420
-
421
358
  if (++di === dn) {
422
359
  throw errShortBuffer;
423
- } // write literals
424
-
360
+ }
425
361
 
362
+ // write literals
426
363
  const lastLen = src.length - anchor;
427
364
  const n = di + lastLen;
428
-
429
365
  if (n > dn) {
430
366
  throw errShortBuffer;
431
367
  } else if (n >= sn) {
432
368
  // incompressible
433
369
  return 0;
434
370
  }
435
-
436
371
  copy(dest, src, di, anchor, lastLen);
437
372
  di += lastLen;
438
373
  return di;
@@ -440,35 +375,33 @@ export function compressBlock(src, dest, soffset) {
440
375
  export function compressBlockHC(src, dest, soffset) {
441
376
  const sn = src.length - mfLimit;
442
377
  const dn = dest.length;
443
-
444
378
  if (sn <= 0 || dn === 0 || soffset >= sn) {
445
379
  return 0;
446
380
  }
447
-
448
381
  let si = 0;
449
- let di = 0; // Hash Chain strategy:
382
+ let di = 0;
383
+
384
+ // Hash Chain strategy:
450
385
  // we need a hash table and a chain table
451
386
  // the chain table cannot contain more entries than the window size (64Kb entries)
452
-
453
387
  const hashTable = new Uint32Array(hashSize);
454
- const chainTable = new Uint32Array(winSize); // Initialise the hash table with the first 64Kb of the input buffer
455
- // (used when compressing dependent blocks)
388
+ const chainTable = new Uint32Array(winSize);
456
389
 
390
+ // Initialise the hash table with the first 64Kb of the input buffer
391
+ // (used when compressing dependent blocks)
457
392
  while (si < soffset) {
458
393
  const h = imul(getUint32(src, si), hasher) >>> hashShift;
459
394
  chainTable[si & winMask] = hashTable[h];
460
395
  hashTable[h] = ++si;
461
396
  }
462
-
463
397
  let anchor = si;
464
-
465
398
  while (si < sn - minMatch) {
466
399
  // hash the next 4 bytes (sequence)...
467
- const h = imul(getUint32(src, si), hasher) >>> hashShift; // follow the chain until out of window and give the longest match
400
+ const h = imul(getUint32(src, si), hasher) >>> hashShift;
468
401
 
402
+ // follow the chain until out of window and give the longest match
469
403
  let mLen = 0;
470
404
  let offset = 0;
471
-
472
405
  for (let next = hashTable[h] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
473
406
  // the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
474
407
  if (src[next + mLen] === src[si + mLen]) {
@@ -479,32 +412,30 @@ export function compressBlockHC(src, dest, soffset) {
479
412
  mLen = ml;
480
413
  offset = si - next;
481
414
  }
482
-
483
415
  break;
484
416
  }
485
417
  }
486
418
  }
487
419
  }
488
-
489
420
  chainTable[si & winMask] = hashTable[h];
490
- hashTable[h] = si + 1; // no match found
421
+ hashTable[h] = si + 1;
491
422
 
423
+ // no match found
492
424
  if (mLen === 0) {
493
425
  ++si;
494
426
  continue;
495
427
  }
496
-
497
428
  let si2 = si + 1;
498
- const ml = si + mLen; // match found
429
+ const ml = si + mLen;
430
+
431
+ // match found
499
432
  // update hash/chain tables with overlaping bytes:
500
433
  // si already hashed, add everything from si+1 up to the match length
501
-
502
434
  while (si2 < ml) {
503
435
  const h = imul(getUint32(src, si2), hasher) >>> hashShift;
504
436
  chainTable[si2 & winMask] = hashTable[h];
505
437
  hashTable[h] = ++si2;
506
438
  }
507
-
508
439
  const lLen = si - anchor;
509
440
  si += mLen;
510
441
  mLen -= minMatch; // match length does not include minMatch
@@ -513,115 +444,96 @@ export function compressBlockHC(src, dest, soffset) {
513
444
  dest[di] = mLen;
514
445
  } else {
515
446
  dest[di] = 0xf;
516
- } // encode literals length
517
-
447
+ }
518
448
 
449
+ // encode literals length
519
450
  if (lLen < 0xf) {
520
451
  dest[di] |= lLen << 4;
521
452
  } else {
522
453
  dest[di] |= 0xf0;
523
-
524
454
  if (++di === dn) {
525
455
  throw errShortBuffer;
526
456
  }
527
-
528
457
  let l = lLen - 0xf;
529
-
530
458
  for (; l >= 0xff; l -= 0xff) {
531
459
  dest[di] = 0xff;
532
-
533
460
  if (++di === dn) {
534
461
  throw errShortBuffer;
535
462
  }
536
463
  }
537
-
538
464
  dest[di] = l & 0xff;
539
465
  }
540
-
541
466
  if (++di === dn) {
542
467
  throw errShortBuffer;
543
- } // literals
544
-
468
+ }
545
469
 
470
+ // literals
546
471
  if (di + lLen >= dn) {
547
472
  throw errShortBuffer;
548
473
  }
549
-
550
474
  copy(dest, src, di, anchor, lLen);
551
475
  di += lLen;
552
- anchor = si; // encode offset
476
+ anchor = si;
553
477
 
478
+ // encode offset
554
479
  di += 2;
555
-
556
480
  if (di >= dn) {
557
481
  throw errShortBuffer;
558
482
  }
559
-
560
483
  dest[di - 2] = offset;
561
- dest[di - 1] = offset >> 8; // encode match length part 2
484
+ dest[di - 1] = offset >> 8;
562
485
 
486
+ // encode match length part 2
563
487
  if (mLen >= 0xf) {
564
488
  for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
565
489
  dest[di] = 0xff;
566
-
567
490
  if (++di === dn) {
568
491
  throw errShortBuffer;
569
492
  }
570
493
  }
571
-
572
494
  dest[di] = mLen;
573
-
574
495
  if (++di === dn) {
575
496
  throw errShortBuffer;
576
497
  }
577
498
  }
578
499
  }
579
-
580
500
  if (anchor === 0) {
581
501
  // incompressible
582
502
  return 0;
583
- } // last literals
584
-
503
+ }
585
504
 
505
+ // last literals
586
506
  let lLen = src.length - anchor;
587
-
588
507
  if (lLen < 0xf) {
589
508
  dest[di] = lLen << 4;
590
509
  } else {
591
510
  dest[di] = 0xf0;
592
-
593
511
  if (++di === dn) {
594
512
  throw errShortBuffer;
595
513
  }
596
-
597
514
  for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
598
515
  dest[di] = 0xff;
599
-
600
516
  if (++di === dn) {
601
517
  throw errShortBuffer;
602
518
  }
603
519
  }
604
-
605
520
  dest[di] = lLen;
606
521
  }
607
-
608
522
  if (++di === dn) {
609
523
  throw errShortBuffer;
610
- } // write literals
611
-
524
+ }
612
525
 
526
+ // write literals
613
527
  const lastLen = src.length - anchor;
614
528
  const n = di + lastLen;
615
-
616
529
  if (n > dn) {
617
530
  throw errShortBuffer;
618
531
  } else if (n >= sn) {
619
532
  // incompressible
620
533
  return 0;
621
534
  }
622
-
623
535
  copy(dest, src, di, anchor, lastLen);
624
536
  di += lastLen;
625
537
  return di;
626
538
  }
627
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJJbnZhbGlkU291cmNlIiwiRXJyb3IiLCJlcnJTaG9ydEJ1ZmZlciIsIm1pbk1hdGNoIiwid2luU2l6ZUxvZyIsIndpblNpemUiLCJ3aW5NYXNrIiwiaGFzaFNpemVMb2ciLCJoYXNoU2l6ZSIsImhhc2hTaGlmdCIsIm1mTGltaXQiLCJza2lwU3RyZW5ndGgiLCJoYXNoZXIiLCJpbXVsUG9seWZpbGwiLCJhIiwiYiIsImFoIiwiYWwiLCJiaCIsImJsIiwiaW11bCIsIk1hdGgiLCJnZXRVaW50MzIiLCJpIiwiY29weSIsImRlc3QiLCJzcmMiLCJkaSIsInNpIiwibGVuIiwiY2FsY1VuY29tcHJlc3NlZExlbiIsInNuIiwibGVuZ3RoIiwibExlbiIsIm1MZW4iLCJvZmZzZXQiLCJ1bmNvbXByZXNzQmxvY2siLCJkbiIsImNvbXByZXNzQmxvY2tCb3VuZCIsIm4iLCJjb21wcmVzc0Jsb2NrIiwic29mZnNldCIsImhhc2hUYWJsZSIsIlVpbnQzMkFycmF5IiwiaCIsImFuY2hvciIsImZtYSIsInJlZiIsImwiLCJsYXN0TGVuIiwiY29tcHJlc3NCbG9ja0hDIiwiY2hhaW5UYWJsZSIsIm5leHQiLCJtbCIsInNpMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGx6NC10cyBAbGljZW5zZSBCU0QtMy1DbGF1c2UgLyBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0byAvIDIwMTYsIG9vdi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBQaWVycmUgQ3VydG9cbiAqIENvcHlyaWdodCAoYykgMjAxNiwgb292XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHh4SGFzaCBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBlcnJJbnZhbGlkU291cmNlID0gbmV3IEVycm9yKFwiaW52YWxpZCBzb3VyY2VcIik7XG5jb25zdCBlcnJTaG9ydEJ1ZmZlciA9IG5ldyBFcnJvcihcInNob3J0IGJ1ZmZlclwiKTtcblxuLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gc2V0dXAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS5cbmNvbnN0IG1pbk1hdGNoID0gNDsgLy8gdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggc2VxdWVuY2Ugc2l6ZSAoNCBieXRlcylcbmNvbnN0IHdpblNpemVMb2cgPSAxNjsgLy8gTFo0IDY0S2Igd2luZG93IHNpemUgbGltaXRcbmNvbnN0IHdpblNpemUgPSAxIDw8IHdpblNpemVMb2c7XG5jb25zdCB3aW5NYXNrID0gd2luU2l6ZSAtIDE7IC8vIDY0S2Igd2luZG93IG9mIHByZXZpb3VzIGRhdGEgZm9yIGRlcGVuZGVudCBibG9ja3NcblxuLy8gaGFzaFNpemVMb2cgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSB1c2VkIHRvIHF1aWNrbHkgZmluZCBhIHByZXZpb3VzIG1hdGNoIHBvc2l0aW9uLlxuLy8gSXRzIHZhbHVlIGluZmx1ZW5jZXMgdGhlIGNvbXByZXNzaW9uIHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2UsIHRoZSBsb3dlciB0aGUgZmFzdGVyLFxuLy8gYnV0IGF0IHRoZSBleHBlbnNlIG9mIHRoZSBjb21wcmVzc2lvbiByYXRpby5cbi8vIDE2IHNlZW1zIHRvIGJlIHRoZSBiZXN0IGNvbXByb21pc2UuXG5jb25zdCBoYXNoU2l6ZUxvZyA9IDE2O1xuY29uc3QgaGFzaFNpemUgPSAxIDw8IGhhc2hTaXplTG9nO1xuY29uc3QgaGFzaFNoaWZ0ID0gbWluTWF0Y2ggKiA4IC0gaGFzaFNpemVMb2c7XG5cbmNvbnN0IG1mTGltaXQgPSA4ICsgbWluTWF0Y2g7IC8vIFRoZSBsYXN0IG1hdGNoIGNhbm5vdCBzdGFydCB3aXRoaW4gdGhlIGxhc3QgMTIgYnl0ZXMuXG5jb25zdCBza2lwU3RyZW5ndGggPSA2OyAvLyB2YXJpYWJsZSBzdGVwIGZvciBmYXN0IHNjYW5cblxuY29uc3QgaGFzaGVyID0gMjY1NDQzNTc2MSB8IDA7IC8vIHByaW1lIG51bWJlciB1c2VkIHRvIGhhc2ggbWluTWF0Y2hcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9pbXVsI1BvbHlmaWxsXG5mdW5jdGlvbiBpbXVsUG9seWZpbGwoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGFsID0gYSAmIDB4ZmZmZjtcbiAgY29uc3QgYmggPSAoYiA+Pj4gMTYpICYgMHhmZmZmO1xuICBjb25zdCBibCA9IGIgJiAweGZmZmY7XG4gIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgLy8gdGhlIGZpbmFsIHwwIGNvbnZlcnRzIHRoZSB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgc2lnbmVkIHZhbHVlXG4gIHJldHVybiAoYWwgKiBibCArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApKSB8IDA7XG59XG5jb25zdCBpbXVsID0gTWF0aC5pbXVsID8gTWF0aC5pbXVsIDogaW11bFBvbHlmaWxsO1xuXG5mdW5jdGlvbiBnZXRVaW50MzIoYTogVWludDhBcnJheSwgaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGFbaSArIDNdIHwgKGFbaSArIDJdIDw8IDgpIHwgKGFbaSArIDFdIDw8IDE2KSB8IChhW2ldIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gY29weShcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkaTogbnVtYmVyLFxuICBzaTogbnVtYmVyLFxuICBsZW46IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBkZXN0W2RpKytdID0gc3JjW3NpKytdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjVW5jb21wcmVzc2VkTGVuKHNyYzogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aDtcbiAgaWYgKHNuID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gbGl0ZXJhbHMgYW5kIG1hdGNoIGxlbmd0aHMgKHRva2VuKVxuICAgIGxldCBsTGVuID0gc3JjW3NpXSA+PiA0O1xuICAgIGxldCBtTGVuID0gc3JjW3NpXSAmIDB4ZjtcbiAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAobExlbiA+IDApIHtcbiAgICAgIGlmIChsTGVuID09PSAweGYpIHtcbiAgICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgICBsTGVuICs9IDB4ZmY7XG4gICAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsTGVuICs9IHNyY1tzaV07XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuXG4gICAgLy8gY29weSB0aGUgbWF0Y2ggKE5CLiBtYXRjaCBpcyBhdCBsZWFzdCA0IGJ5dGVzIGxvbmcpXG4gICAgZm9yICg7IG1MZW4gPj0gb2Zmc2V0OyBtTGVuIC09IG9mZnNldCkge1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBkaSArPSBtTGVuO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvbXByZXNzQmxvY2soc3JjOiBVaW50OEFycmF5LCBkZXN0OiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRuIC0gZGkgPCBsTGVuIHx8IHNpICsgbExlbiA+IHNuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgY29weShkZXN0LCBzcmMsIGRpLCBzaSwgbExlbik7XG4gICAgICBkaSArPSBsTGVuO1xuICAgICAgc2kgKz0gbExlbjtcbiAgICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgICByZXR1cm4gZGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2kgKz0gMjtcbiAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IHNyY1tzaSAtIDJdIHwgKHNyY1tzaSAtIDFdIDw8IDgpO1xuICAgIGlmIChkaSAtIG9mZnNldCA8IDAgfHwgb2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIG1hdGNoXG4gICAgaWYgKG1MZW4gPT09IDB4Zikge1xuICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgbUxlbiArPSAweGZmO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtTGVuICs9IHNyY1tzaV07XG4gICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbWluaW11bSBtYXRjaCBsZW5ndGggaXMgNFxuICAgIG1MZW4gKz0gNDtcbiAgICBpZiAoZG4gLSBkaSA8PSBtTGVuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgIGRpICs9IG9mZnNldDtcbiAgICB9XG4gICAgY29weShkZXN0LCBkZXN0LCBkaSwgZGkgLSBvZmZzZXQsIG1MZW4pO1xuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tCb3VuZChuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbiArICgobiAvIDI1NSkgfCAwKSArIDE2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9jayhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwLFxuICAgIGRpID0gMDtcblxuICAvLyBmYXN0IHNjYW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG9ubHkgbmVlZCBhIGhhc2ggdGFibGUgdG8gc3RvcmUgdGhlIGxhc3Qgc2VxdWVuY2VzICg0IGJ5dGVzKVxuICBjb25zdCBoYXNoVGFibGUgPSBuZXcgVWludDMyQXJyYXkoaGFzaFNpemUpO1xuXG4gIC8vIEluaXRpYWxpc2UgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgZmlyc3QgNjRLYiBvZiB0aGUgaW5wdXQgYnVmZmVyXG4gIC8vICh1c2VkIHdoZW4gY29tcHJlc3NpbmcgZGVwZW5kZW50IGJsb2NrcylcbiAgd2hpbGUgKHNpIDwgc29mZnNldCkge1xuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIGxldCBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgLy8gLTEgdG8gc2VwYXJhdGUgZXhpc3RpbmcgZW50cmllcyBmcm9tIG5ldyBvbmVzXG4gICAgY29uc3QgcmVmID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAvLyAuLi5hbmQgc3RvcmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBoYXNoIHRhYmxlICgrMSB0byBjb21wZW5zYXRlIHRoZSAtMSB1cG9uIHNhdmluZylcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG4gICAgLy8gbm8gbmVlZCB0byBjaGVjayB0aGUgbGFzdCAzIGJ5dGVzIGluIHRoZSBmaXJzdCBsaXRlcmFsIDQgYnl0ZXMgYXNcbiAgICAvLyB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgbmV4dCBtYXRjaCwgaWYgYW55LCBpcyBjb21wcmVzc2VkIHdpdGhcbiAgICAvLyBhIGxvd2VyIHNpemUsIHNpbmNlIHRvIGhhdmUgc29tZSBjb21wcmVzc2lvbiB3ZSBtdXN0IGhhdmU6XG4gICAgLy8gbGwrbWwtb3ZlcmxhcCA+IDEgKyAobGwtMTUpLzI1NSArIChtbC00LTE1KS8yNTUgKyAyICh1bmNvbXByZXNzZWQgc2l6ZT5jb21wcmVzc2VkIHNpemUpXG4gICAgLy8gPT4gbGwrbWw+MysyKm92ZXJsYXAgPT4gbGwrbWw+PSA0KzIqb3ZlcmxhcFxuICAgIC8vIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvIGhhdmU6XG4gICAgLy8gbGwgPj0gMSwgbWwgPj0gNFxuICAgIC8vID0+IGxsK21sID49IDVcbiAgICAvLyA9PiBzbyBvdmVybGFwIG11c3QgYmUgMFxuXG4gICAgLy8gdGhlIHNlcXVlbmNlIGlzIG5ldywgb3V0IG9mIGJvdW5kICg2NGtiKSBvciBub3QgdmFsaWQ6IHRyeSBuZXh0IHNlcXVlbmNlXG4gICAgaWYgKFxuICAgICAgcmVmIDwgMCB8fCAvLyhmbWEgJiAoKDEgPDwgc2tpcFN0cmVuZ3RoKSAtIDEpKSA8IDQgfHwgLy8gdGhpcyBjb2RlIHNlZW1zIGhhcyBhIGJpZyBwZW5hbHR5IGZvciBzaXplLi4uXG4gICAgICAoc2kgLSByZWYpID4+IHdpblNpemVMb2cgPiAwIHx8XG4gICAgICBzcmNbcmVmXSAhPT0gc3JjW3NpXSB8fFxuICAgICAgc3JjW3JlZiArIDFdICE9PSBzcmNbc2kgKyAxXSB8fFxuICAgICAgc3JjW3JlZiArIDJdICE9PSBzcmNbc2kgKyAyXSB8fFxuICAgICAgc3JjW3JlZiArIDNdICE9PSBzcmNbc2kgKyAzXVxuICAgICkge1xuICAgICAgLy8gdmFyaWFibGUgc3RlcDogaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gbm9uLWNvbXByZXNzaWJsZSBkYXRhXG4gICAgICBzaSArPSBmbWEgPj4gc2tpcFN0cmVuZ3RoO1xuICAgICAgKytmbWE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gbWF0Y2ggZm91bmRcbiAgICBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc2kgLSByZWY7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMVxuICAgIHNpICs9IG1pbk1hdGNoO1xuICAgIGxldCBtTGVuID0gc2k7IC8vIG1hdGNoIGxlbmd0aCBoYXMgbWluTWF0Y2ggYWxyZWFkeVxuICAgIHdoaWxlIChzaSA8PSBzbiAmJiBzcmNbc2ldID09PSBzcmNbc2kgLSBvZmZzZXRdKSB7XG4gICAgICBzaSsrO1xuICAgIH1cbiAgICBtTGVuID0gc2kgLSBtTGVuO1xuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrSEMoXG4gIHNyYzogVWludDhBcnJheSxcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc29mZnNldDogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGggLSBtZkxpbWl0O1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPD0gMCB8fCBkbiA9PT0gMCB8fCBzb2Zmc2V0ID49IHNuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICAvLyBIYXNoIENoYWluIHN0cmF0ZWd5OlxuICAvLyB3ZSBuZWVkIGEgaGFzaCB0YWJsZSBhbmQgYSBjaGFpbiB0YWJsZVxuICAvLyB0aGUgY2hhaW4gdGFibGUgY2Fubm90IGNvbnRhaW4gbW9yZSBlbnRyaWVzIHRoYW4gdGhlIHdpbmRvdyBzaXplICg2NEtiIGVudHJpZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG4gIGNvbnN0IGNoYWluVGFibGUgPSBuZXcgVWludDMyQXJyYXkod2luU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgY2hhaW5UYWJsZVtzaSAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIHdoaWxlIChzaSA8IHNuIC0gbWluTWF0Y2gpIHtcbiAgICAvLyBoYXNoIHRoZSBuZXh0IDQgYnl0ZXMgKHNlcXVlbmNlKS4uLlxuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuXG4gICAgLy8gZm9sbG93IHRoZSBjaGFpbiB1bnRpbCBvdXQgb2Ygd2luZG93IGFuZCBnaXZlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAgbGV0IG1MZW4gPSAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoXG4gICAgICBsZXQgbmV4dCA9IGhhc2hUYWJsZVtoXSAtIDE7XG4gICAgICBuZXh0ID4gMCAmJiBuZXh0ID4gc2kgLSB3aW5TaXplO1xuICAgICAgbmV4dCA9IGNoYWluVGFibGVbbmV4dCAmIHdpbk1hc2tdIC0gMVxuICAgICkge1xuICAgICAgLy8gdGhlIGZpcnN0IChtTGVuPT0wKSBvciBuZXh0IGJ5dGUgKG1MZW4+PW1pbk1hdGNoKSBhdCBjdXJyZW50IG1hdGNoIGxlbmd0aCBtdXN0IG1hdGNoIHRvIGltcHJvdmUgb24gdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgaWYgKHNyY1tuZXh0ICsgbUxlbl0gPT09IHNyY1tzaSArIG1MZW5dKSB7XG4gICAgICAgIGZvciAobGV0IG1sID0gMDsgOyArK21sKSB7XG4gICAgICAgICAgaWYgKHNyY1tuZXh0ICsgbWxdICE9PSBzcmNbc2kgKyBtbF0gfHwgc2kgKyBtbCA+IHNuKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIGxvbmdlciBtYXRjaCwga2VlcCBpdHMgcG9zaXRpb24gYW5kIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG1MZW4gPCBtbCAmJiBtbCA+PSBtaW5NYXRjaCkge1xuICAgICAgICAgICAgICBtTGVuID0gbWw7XG4gICAgICAgICAgICAgIG9mZnNldCA9IHNpIC0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gc2kgKyAxO1xuXG4gICAgLy8gbm8gbWF0Y2ggZm91bmRcbiAgICBpZiAobUxlbiA9PT0gMCkge1xuICAgICAgKytzaTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBzaTIgPSBzaSArIDE7XG4gICAgY29uc3QgbWwgPSBzaSArIG1MZW47XG5cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIC8vIHVwZGF0ZSBoYXNoL2NoYWluIHRhYmxlcyB3aXRoIG92ZXJsYXBpbmcgYnl0ZXM6XG4gICAgLy8gc2kgYWxyZWFkeSBoYXNoZWQsIGFkZCBldmVyeXRoaW5nIGZyb20gc2krMSB1cCB0byB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgd2hpbGUgKHNpMiA8IG1sKSB7XG4gICAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaTIpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgICBjaGFpblRhYmxlW3NpMiAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgICAgaGFzaFRhYmxlW2hdID0gKytzaTI7XG4gICAgfVxuXG4gICAgY29uc3QgbExlbiA9IHNpIC0gYW5jaG9yO1xuICAgIHNpICs9IG1MZW47XG4gICAgbUxlbiAtPSBtaW5NYXRjaDsgLy8gbWF0Y2ggbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgbWluTWF0Y2hcblxuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLGdCQUFnQixHQUFHLElBQUlDLEtBQUosQ0FBVSxnQkFBVixDQUF6QjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJRCxLQUFKLENBQVUsY0FBVixDQUF2QixDLENBRUE7O0FBQ0EsTUFBTUUsUUFBUSxHQUFHLENBQWpCLEMsQ0FBb0I7O0FBQ3BCLE1BQU1DLFVBQVUsR0FBRyxFQUFuQixDLENBQXVCOztBQUN2QixNQUFNQyxPQUFPLEdBQUcsS0FBS0QsVUFBckI7QUFDQSxNQUFNRSxPQUFPLEdBQUdELE9BQU8sR0FBRyxDQUExQixDLENBQTZCO0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1FLFdBQVcsR0FBRyxFQUFwQjtBQUNBLE1BQU1DLFFBQVEsR0FBRyxLQUFLRCxXQUF0QjtBQUNBLE1BQU1FLFNBQVMsR0FBR04sUUFBUSxHQUFHLENBQVgsR0FBZUksV0FBakM7QUFFQSxNQUFNRyxPQUFPLEdBQUcsSUFBSVAsUUFBcEIsQyxDQUE4Qjs7QUFDOUIsTUFBTVEsWUFBWSxHQUFHLENBQXJCLEMsQ0FBd0I7O0FBRXhCLE1BQU1DLE1BQU0sR0FBRyxhQUFhLENBQTVCLEMsQ0FBK0I7QUFFL0I7O0FBQ0EsU0FBU0MsWUFBVCxDQUFzQkMsQ0FBdEIsRUFBaUNDLENBQWpDLEVBQW9EO0VBQ2xELE1BQU1DLEVBQUUsR0FBSUYsQ0FBQyxLQUFLLEVBQVAsR0FBYSxN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
539
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJJbnZhbGlkU291cmNlIiwiRXJyb3IiLCJlcnJTaG9ydEJ1ZmZlciIsIm1pbk1hdGNoIiwid2luU2l6ZUxvZyIsIndpblNpemUiLCJ3aW5NYXNrIiwiaGFzaFNpemVMb2ciLCJoYXNoU2l6ZSIsImhhc2hTaGlmdCIsIm1mTGltaXQiLCJza2lwU3RyZW5ndGgiLCJoYXNoZXIiLCJpbXVsUG9seWZpbGwiLCJhIiwiYiIsImFoIiwiYWwiLCJiaCIsImJsIiwiaW11bCIsIk1hdGgiLCJnZXRVaW50MzIiLCJpIiwiY29weSIsImRlc3QiLCJzcmMiLCJkaSIsInNpIiwibGVuIiwiY2FsY1VuY29tcHJlc3NlZExlbiIsInNuIiwibGVuZ3RoIiwibExlbiIsIm1MZW4iLCJvZmZzZXQiLCJ1bmNvbXByZXNzQmxvY2siLCJkbiIsImNvbXByZXNzQmxvY2tCb3VuZCIsIm4iLCJjb21wcmVzc0Jsb2NrIiwic29mZnNldCIsImhhc2hUYWJsZSIsIlVpbnQzMkFycmF5IiwiaCIsImFuY2hvciIsImZtYSIsInJlZiIsImwiLCJsYXN0TGVuIiwiY29tcHJlc3NCbG9ja0hDIiwiY2hhaW5UYWJsZSIsIm5leHQiLCJtbCIsInNpMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGx6NC10cyBAbGljZW5zZSBCU0QtMy1DbGF1c2UgLyBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0byAvIDIwMTYsIG9vdi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBQaWVycmUgQ3VydG9cbiAqIENvcHlyaWdodCAoYykgMjAxNiwgb292XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHh4SGFzaCBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBlcnJJbnZhbGlkU291cmNlID0gbmV3IEVycm9yKFwiaW52YWxpZCBzb3VyY2VcIik7XG5jb25zdCBlcnJTaG9ydEJ1ZmZlciA9IG5ldyBFcnJvcihcInNob3J0IGJ1ZmZlclwiKTtcblxuLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gc2V0dXAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS5cbmNvbnN0IG1pbk1hdGNoID0gNDsgLy8gdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggc2VxdWVuY2Ugc2l6ZSAoNCBieXRlcylcbmNvbnN0IHdpblNpemVMb2cgPSAxNjsgLy8gTFo0IDY0S2Igd2luZG93IHNpemUgbGltaXRcbmNvbnN0IHdpblNpemUgPSAxIDw8IHdpblNpemVMb2c7XG5jb25zdCB3aW5NYXNrID0gd2luU2l6ZSAtIDE7IC8vIDY0S2Igd2luZG93IG9mIHByZXZpb3VzIGRhdGEgZm9yIGRlcGVuZGVudCBibG9ja3NcblxuLy8gaGFzaFNpemVMb2cgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSB1c2VkIHRvIHF1aWNrbHkgZmluZCBhIHByZXZpb3VzIG1hdGNoIHBvc2l0aW9uLlxuLy8gSXRzIHZhbHVlIGluZmx1ZW5jZXMgdGhlIGNvbXByZXNzaW9uIHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2UsIHRoZSBsb3dlciB0aGUgZmFzdGVyLFxuLy8gYnV0IGF0IHRoZSBleHBlbnNlIG9mIHRoZSBjb21wcmVzc2lvbiByYXRpby5cbi8vIDE2IHNlZW1zIHRvIGJlIHRoZSBiZXN0IGNvbXByb21pc2UuXG5jb25zdCBoYXNoU2l6ZUxvZyA9IDE2O1xuY29uc3QgaGFzaFNpemUgPSAxIDw8IGhhc2hTaXplTG9nO1xuY29uc3QgaGFzaFNoaWZ0ID0gbWluTWF0Y2ggKiA4IC0gaGFzaFNpemVMb2c7XG5cbmNvbnN0IG1mTGltaXQgPSA4ICsgbWluTWF0Y2g7IC8vIFRoZSBsYXN0IG1hdGNoIGNhbm5vdCBzdGFydCB3aXRoaW4gdGhlIGxhc3QgMTIgYnl0ZXMuXG5jb25zdCBza2lwU3RyZW5ndGggPSA2OyAvLyB2YXJpYWJsZSBzdGVwIGZvciBmYXN0IHNjYW5cblxuY29uc3QgaGFzaGVyID0gMjY1NDQzNTc2MSB8IDA7IC8vIHByaW1lIG51bWJlciB1c2VkIHRvIGhhc2ggbWluTWF0Y2hcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9pbXVsI1BvbHlmaWxsXG5mdW5jdGlvbiBpbXVsUG9seWZpbGwoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGFsID0gYSAmIDB4ZmZmZjtcbiAgY29uc3QgYmggPSAoYiA+Pj4gMTYpICYgMHhmZmZmO1xuICBjb25zdCBibCA9IGIgJiAweGZmZmY7XG4gIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgLy8gdGhlIGZpbmFsIHwwIGNvbnZlcnRzIHRoZSB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgc2lnbmVkIHZhbHVlXG4gIHJldHVybiAoYWwgKiBibCArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApKSB8IDA7XG59XG5jb25zdCBpbXVsID0gTWF0aC5pbXVsID8gTWF0aC5pbXVsIDogaW11bFBvbHlmaWxsO1xuXG5mdW5jdGlvbiBnZXRVaW50MzIoYTogVWludDhBcnJheSwgaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGFbaSArIDNdIHwgKGFbaSArIDJdIDw8IDgpIHwgKGFbaSArIDFdIDw8IDE2KSB8IChhW2ldIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gY29weShcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkaTogbnVtYmVyLFxuICBzaTogbnVtYmVyLFxuICBsZW46IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBkZXN0W2RpKytdID0gc3JjW3NpKytdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjVW5jb21wcmVzc2VkTGVuKHNyYzogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aDtcbiAgaWYgKHNuID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gbGl0ZXJhbHMgYW5kIG1hdGNoIGxlbmd0aHMgKHRva2VuKVxuICAgIGxldCBsTGVuID0gc3JjW3NpXSA+PiA0O1xuICAgIGxldCBtTGVuID0gc3JjW3NpXSAmIDB4ZjtcbiAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAobExlbiA+IDApIHtcbiAgICAgIGlmIChsTGVuID09PSAweGYpIHtcbiAgICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgICBsTGVuICs9IDB4ZmY7XG4gICAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsTGVuICs9IHNyY1tzaV07XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuXG4gICAgLy8gY29weSB0aGUgbWF0Y2ggKE5CLiBtYXRjaCBpcyBhdCBsZWFzdCA0IGJ5dGVzIGxvbmcpXG4gICAgZm9yICg7IG1MZW4gPj0gb2Zmc2V0OyBtTGVuIC09IG9mZnNldCkge1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBkaSArPSBtTGVuO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvbXByZXNzQmxvY2soc3JjOiBVaW50OEFycmF5LCBkZXN0OiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRuIC0gZGkgPCBsTGVuIHx8IHNpICsgbExlbiA+IHNuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgY29weShkZXN0LCBzcmMsIGRpLCBzaSwgbExlbik7XG4gICAgICBkaSArPSBsTGVuO1xuICAgICAgc2kgKz0gbExlbjtcbiAgICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgICByZXR1cm4gZGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2kgKz0gMjtcbiAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IHNyY1tzaSAtIDJdIHwgKHNyY1tzaSAtIDFdIDw8IDgpO1xuICAgIGlmIChkaSAtIG9mZnNldCA8IDAgfHwgb2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIG1hdGNoXG4gICAgaWYgKG1MZW4gPT09IDB4Zikge1xuICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgbUxlbiArPSAweGZmO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtTGVuICs9IHNyY1tzaV07XG4gICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbWluaW11bSBtYXRjaCBsZW5ndGggaXMgNFxuICAgIG1MZW4gKz0gNDtcbiAgICBpZiAoZG4gLSBkaSA8PSBtTGVuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgIGRpICs9IG9mZnNldDtcbiAgICB9XG4gICAgY29weShkZXN0LCBkZXN0LCBkaSwgZGkgLSBvZmZzZXQsIG1MZW4pO1xuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tCb3VuZChuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbiArICgobiAvIDI1NSkgfCAwKSArIDE2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9jayhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwLFxuICAgIGRpID0gMDtcblxuICAvLyBmYXN0IHNjYW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG9ubHkgbmVlZCBhIGhhc2ggdGFibGUgdG8gc3RvcmUgdGhlIGxhc3Qgc2VxdWVuY2VzICg0IGJ5dGVzKVxuICBjb25zdCBoYXNoVGFibGUgPSBuZXcgVWludDMyQXJyYXkoaGFzaFNpemUpO1xuXG4gIC8vIEluaXRpYWxpc2UgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgZmlyc3QgNjRLYiBvZiB0aGUgaW5wdXQgYnVmZmVyXG4gIC8vICh1c2VkIHdoZW4gY29tcHJlc3NpbmcgZGVwZW5kZW50IGJsb2NrcylcbiAgd2hpbGUgKHNpIDwgc29mZnNldCkge1xuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIGxldCBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgLy8gLTEgdG8gc2VwYXJhdGUgZXhpc3RpbmcgZW50cmllcyBmcm9tIG5ldyBvbmVzXG4gICAgY29uc3QgcmVmID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAvLyAuLi5hbmQgc3RvcmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBoYXNoIHRhYmxlICgrMSB0byBjb21wZW5zYXRlIHRoZSAtMSB1cG9uIHNhdmluZylcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG4gICAgLy8gbm8gbmVlZCB0byBjaGVjayB0aGUgbGFzdCAzIGJ5dGVzIGluIHRoZSBmaXJzdCBsaXRlcmFsIDQgYnl0ZXMgYXNcbiAgICAvLyB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgbmV4dCBtYXRjaCwgaWYgYW55LCBpcyBjb21wcmVzc2VkIHdpdGhcbiAgICAvLyBhIGxvd2VyIHNpemUsIHNpbmNlIHRvIGhhdmUgc29tZSBjb21wcmVzc2lvbiB3ZSBtdXN0IGhhdmU6XG4gICAgLy8gbGwrbWwtb3ZlcmxhcCA+IDEgKyAobGwtMTUpLzI1NSArIChtbC00LTE1KS8yNTUgKyAyICh1bmNvbXByZXNzZWQgc2l6ZT5jb21wcmVzc2VkIHNpemUpXG4gICAgLy8gPT4gbGwrbWw+MysyKm92ZXJsYXAgPT4gbGwrbWw+PSA0KzIqb3ZlcmxhcFxuICAgIC8vIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvIGhhdmU6XG4gICAgLy8gbGwgPj0gMSwgbWwgPj0gNFxuICAgIC8vID0+IGxsK21sID49IDVcbiAgICAvLyA9PiBzbyBvdmVybGFwIG11c3QgYmUgMFxuXG4gICAgLy8gdGhlIHNlcXVlbmNlIGlzIG5ldywgb3V0IG9mIGJvdW5kICg2NGtiKSBvciBub3QgdmFsaWQ6IHRyeSBuZXh0IHNlcXVlbmNlXG4gICAgaWYgKFxuICAgICAgcmVmIDwgMCB8fCAvLyhmbWEgJiAoKDEgPDwgc2tpcFN0cmVuZ3RoKSAtIDEpKSA8IDQgfHwgLy8gdGhpcyBjb2RlIHNlZW1zIGhhcyBhIGJpZyBwZW5hbHR5IGZvciBzaXplLi4uXG4gICAgICAoc2kgLSByZWYpID4+IHdpblNpemVMb2cgPiAwIHx8XG4gICAgICBzcmNbcmVmXSAhPT0gc3JjW3NpXSB8fFxuICAgICAgc3JjW3JlZiArIDFdICE9PSBzcmNbc2kgKyAxXSB8fFxuICAgICAgc3JjW3JlZiArIDJdICE9PSBzcmNbc2kgKyAyXSB8fFxuICAgICAgc3JjW3JlZiArIDNdICE9PSBzcmNbc2kgKyAzXVxuICAgICkge1xuICAgICAgLy8gdmFyaWFibGUgc3RlcDogaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gbm9uLWNvbXByZXNzaWJsZSBkYXRhXG4gICAgICBzaSArPSBmbWEgPj4gc2tpcFN0cmVuZ3RoO1xuICAgICAgKytmbWE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gbWF0Y2ggZm91bmRcbiAgICBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc2kgLSByZWY7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMVxuICAgIHNpICs9IG1pbk1hdGNoO1xuICAgIGxldCBtTGVuID0gc2k7IC8vIG1hdGNoIGxlbmd0aCBoYXMgbWluTWF0Y2ggYWxyZWFkeVxuICAgIHdoaWxlIChzaSA8PSBzbiAmJiBzcmNbc2ldID09PSBzcmNbc2kgLSBvZmZzZXRdKSB7XG4gICAgICBzaSsrO1xuICAgIH1cbiAgICBtTGVuID0gc2kgLSBtTGVuO1xuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrSEMoXG4gIHNyYzogVWludDhBcnJheSxcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc29mZnNldDogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGggLSBtZkxpbWl0O1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPD0gMCB8fCBkbiA9PT0gMCB8fCBzb2Zmc2V0ID49IHNuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICAvLyBIYXNoIENoYWluIHN0cmF0ZWd5OlxuICAvLyB3ZSBuZWVkIGEgaGFzaCB0YWJsZSBhbmQgYSBjaGFpbiB0YWJsZVxuICAvLyB0aGUgY2hhaW4gdGFibGUgY2Fubm90IGNvbnRhaW4gbW9yZSBlbnRyaWVzIHRoYW4gdGhlIHdpbmRvdyBzaXplICg2NEtiIGVudHJpZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG4gIGNvbnN0IGNoYWluVGFibGUgPSBuZXcgVWludDMyQXJyYXkod2luU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgY2hhaW5UYWJsZVtzaSAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIHdoaWxlIChzaSA8IHNuIC0gbWluTWF0Y2gpIHtcbiAgICAvLyBoYXNoIHRoZSBuZXh0IDQgYnl0ZXMgKHNlcXVlbmNlKS4uLlxuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuXG4gICAgLy8gZm9sbG93IHRoZSBjaGFpbiB1bnRpbCBvdXQgb2Ygd2luZG93IGFuZCBnaXZlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAgbGV0IG1MZW4gPSAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoXG4gICAgICBsZXQgbmV4dCA9IGhhc2hUYWJsZVtoXSAtIDE7XG4gICAgICBuZXh0ID4gMCAmJiBuZXh0ID4gc2kgLSB3aW5TaXplO1xuICAgICAgbmV4dCA9IGNoYWluVGFibGVbbmV4dCAmIHdpbk1hc2tdIC0gMVxuICAgICkge1xuICAgICAgLy8gdGhlIGZpcnN0IChtTGVuPT0wKSBvciBuZXh0IGJ5dGUgKG1MZW4+PW1pbk1hdGNoKSBhdCBjdXJyZW50IG1hdGNoIGxlbmd0aCBtdXN0IG1hdGNoIHRvIGltcHJvdmUgb24gdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgaWYgKHNyY1tuZXh0ICsgbUxlbl0gPT09IHNyY1tzaSArIG1MZW5dKSB7XG4gICAgICAgIGZvciAobGV0IG1sID0gMDsgOyArK21sKSB7XG4gICAgICAgICAgaWYgKHNyY1tuZXh0ICsgbWxdICE9PSBzcmNbc2kgKyBtbF0gfHwgc2kgKyBtbCA+IHNuKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIGxvbmdlciBtYXRjaCwga2VlcCBpdHMgcG9zaXRpb24gYW5kIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG1MZW4gPCBtbCAmJiBtbCA+PSBtaW5NYXRjaCkge1xuICAgICAgICAgICAgICBtTGVuID0gbWw7XG4gICAgICAgICAgICAgIG9mZnNldCA9IHNpIC0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gc2kgKyAxO1xuXG4gICAgLy8gbm8gbWF0Y2ggZm91bmRcbiAgICBpZiAobUxlbiA9PT0gMCkge1xuICAgICAgKytzaTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBzaTIgPSBzaSArIDE7XG4gICAgY29uc3QgbWwgPSBzaSArIG1MZW47XG5cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIC8vIHVwZGF0ZSBoYXNoL2NoYWluIHRhYmxlcyB3aXRoIG92ZXJsYXBpbmcgYnl0ZXM6XG4gICAgLy8gc2kgYWxyZWFkeSBoYXNoZWQsIGFkZCBldmVyeXRoaW5nIGZyb20gc2krMSB1cCB0byB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgd2hpbGUgKHNpMiA8IG1sKSB7XG4gICAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaTIpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgICBjaGFpblRhYmxlW3NpMiAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgICAgaGFzaFRhYmxlW2hdID0gKytzaTI7XG4gICAgfVxuXG4gICAgY29uc3QgbExlbiA9IHNpIC0gYW5jaG9yO1xuICAgIHNpICs9IG1MZW47XG4gICAgbUxlbiAtPSBtaW5NYXRjaDsgLy8gbWF0Y2ggbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgbWluTWF0Y2hcblxuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLElBQUlDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztBQUNwRCxNQUFNQyxjQUFjLEdBQUcsSUFBSUQsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7QUFFaEQ7QUFDQSxNQUFNRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEIsTUFBTUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU1DLE9BQU8sR0FBRyxDQUFDLElBQUlELFVBQVU7QUFDL0IsTUFBTUUsT0FBTyxHQUFHRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUUsV0FBVyxHQUFHLEVBQUU7QUFDdEIsTUFBTUMsUUFBUSxHQUFHLENBQUMsSUFBSUQsV0FBVztBQUNqQyxNQUFNRSxTQUFTLEdBQUdOLFFBQVEsR0FBRyxDQUFDLEdBQUdJLFdBQVc7QUFFNUMsTUFBTUcsT0FBTyxHQUFHLENBQUMsR0FBR1AsUUFBUSxDQUFDLENBQUM7QUFDOUIsTUFBTVEsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUV4QixNQUFNQyxNQUFNLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUUvQjtBQUNBLFNBQVNDLFlBQVksQ0FBQ0MsQ0FBUyxFQUFFQyxDQUFTLEVBQVU7RUFDbEQsTUFBTUMsRUFBRSxHQUFJRixDQUFD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