@secrecy/lib 1.0.0-dev.8 → 1.0.0-dev.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +1 -1
  2. package/dist/BaseClient.d.ts +104 -0
  3. package/dist/BaseClient.js +430 -0
  4. package/{lib → dist}/PopupTools.d.ts +1 -1
  5. package/dist/PopupTools.js +196 -0
  6. package/{lib → dist}/ZeusThunder.d.ts +0 -0
  7. package/dist/ZeusThunder.js +65 -0
  8. package/dist/cache.d.ts +6 -0
  9. package/dist/cache.js +4 -0
  10. package/dist/client/SecrecyAppClient.d.ts +17 -0
  11. package/dist/client/SecrecyAppClient.js +227 -0
  12. package/dist/client/SecrecyCloudClient.d.ts +89 -0
  13. package/dist/client/SecrecyCloudClient.js +1411 -0
  14. package/dist/client/SecrecyDbClient.d.ts +21 -0
  15. package/dist/client/SecrecyDbClient.js +177 -0
  16. package/dist/client/SecrecyMailClient.d.ts +42 -0
  17. package/dist/client/SecrecyMailClient.js +1022 -0
  18. package/dist/client/SecrecyPayClient.d.ts +28 -0
  19. package/dist/client/SecrecyPayClient.js +68 -0
  20. package/dist/client/SecrecyWalletClient.d.ts +30 -0
  21. package/dist/client/SecrecyWalletClient.js +73 -0
  22. package/{lib → dist}/client/convert/file.d.ts +3 -3
  23. package/dist/client/convert/file.js +33 -0
  24. package/dist/client/convert/mail.d.ts +3 -0
  25. package/dist/client/convert/mail.js +43 -0
  26. package/dist/client/convert/node.d.ts +9 -0
  27. package/dist/client/convert/node.js +88 -0
  28. package/{lib → dist}/client/helpers.d.ts +6 -1
  29. package/dist/client/helpers.js +119 -0
  30. package/dist/client/index.d.ts +34 -0
  31. package/dist/client/index.js +46 -0
  32. package/{lib → dist}/client/storage.d.ts +0 -0
  33. package/dist/client/storage.js +12 -0
  34. package/dist/client/types/File.d.ts +14 -0
  35. package/dist/client/types/File.js +3 -0
  36. package/{lib → dist}/client/types/Inputs.d.ts +2 -7
  37. package/dist/client/types/Inputs.js +3 -0
  38. package/dist/client/types/Node.d.ts +56 -0
  39. package/dist/client/types/Node.js +3 -0
  40. package/{lib → dist}/client/types/UserAppNotifications.d.ts +1 -1
  41. package/dist/client/types/UserAppNotifications.js +3 -0
  42. package/{lib → dist}/client/types/UserAppSettings.d.ts +1 -3
  43. package/dist/client/types/UserAppSettings.js +3 -0
  44. package/{lib → dist}/client/types/index.d.ts +9 -43
  45. package/dist/client/types/index.js +8 -0
  46. package/dist/client/types/selectors.d.ts +400 -0
  47. package/dist/client/types/selectors.js +135 -0
  48. package/{lib → dist}/crypto/file.d.ts +0 -0
  49. package/dist/crypto/file.js +195 -0
  50. package/{lib → dist}/crypto/index.d.ts +0 -0
  51. package/dist/crypto/index.js +45 -0
  52. package/dist/error.d.ts +33 -0
  53. package/dist/error.js +3 -0
  54. package/dist/index.d.ts +14 -0
  55. package/dist/index.js +10 -0
  56. package/{lib → dist}/minify/index.d.ts +0 -0
  57. package/dist/minify/index.js +23 -0
  58. package/{lib → dist}/minify/lz4.d.ts +0 -0
  59. package/dist/minify/lz4.js +539 -0
  60. package/{lib → dist}/sodium.d.ts +0 -0
  61. package/dist/sodium.js +6 -0
  62. package/{lib → dist}/utils/store-buddy.d.ts +0 -0
  63. package/dist/utils/store-buddy.js +58 -0
  64. package/{lib → dist}/utils/time.d.ts +0 -0
  65. package/dist/utils/time.js +12 -0
  66. package/{lib → dist/utils}/utils.d.ts +0 -0
  67. package/dist/utils/utils.js +47 -0
  68. package/{lib → dist}/worker/md5.d.ts +0 -0
  69. package/dist/worker/md5.js +24 -0
  70. package/{lib → dist}/worker/sodium.d.ts +0 -0
  71. package/dist/worker/sodium.js +118 -0
  72. package/{lib → dist}/worker/workerCodes.d.ts +0 -0
  73. package/dist/worker/workerCodes.js +255 -0
  74. package/{lib → dist}/zeus/const.d.ts +5 -0
  75. package/dist/zeus/const.js +1670 -0
  76. package/dist/zeus/index.d.ts +7896 -0
  77. package/dist/zeus/index.js +602 -0
  78. package/package.json +64 -54
  79. package/lib/BaseClient.d.ts +0 -266
  80. package/lib/BaseClient.js +0 -1332
  81. package/lib/PopupTools.js +0 -213
  82. package/lib/ZeusThunder.js +0 -112
  83. package/lib/cache.d.ts +0 -7
  84. package/lib/cache.js +0 -5
  85. package/lib/client/convert/file.js +0 -39
  86. package/lib/client/convert/folder.d.ts +0 -8
  87. package/lib/client/convert/folder.js +0 -264
  88. package/lib/client/convert/mail.d.ts +0 -3
  89. package/lib/client/convert/mail.js +0 -46
  90. package/lib/client/convert/vFile.d.ts +0 -5
  91. package/lib/client/convert/vFile.js +0 -164
  92. package/lib/client/helpers.js +0 -116
  93. package/lib/client/index.d.ts +0 -168
  94. package/lib/client/index.js +0 -3795
  95. package/lib/client/storage.js +0 -12
  96. package/lib/client/types/File.d.ts +0 -21
  97. package/lib/client/types/File.js +0 -2
  98. package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
  99. package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
  100. package/lib/client/types/Folder.d.ts +0 -68
  101. package/lib/client/types/Folder.js +0 -7
  102. package/lib/client/types/Inputs.js +0 -2
  103. package/lib/client/types/UserAppNotifications.js +0 -2
  104. package/lib/client/types/UserAppSettings.js +0 -2
  105. package/lib/client/types/VFile.d.ts +0 -62
  106. package/lib/client/types/VFile.js +0 -4
  107. package/lib/client/types/index.js +0 -9
  108. package/lib/client/types/queries.d.ts +0 -535
  109. package/lib/client/types/queries.js +0 -192
  110. package/lib/crypto/file.js +0 -291
  111. package/lib/crypto/index.js +0 -37
  112. package/lib/index.d.ts +0 -11
  113. package/lib/index.js +0 -40
  114. package/lib/minify/index.js +0 -28
  115. package/lib/minify/lz4.js +0 -633
  116. package/lib/sodium.js +0 -28
  117. package/lib/utils/store-buddy.js +0 -69
  118. package/lib/utils/time.js +0 -22
  119. package/lib/utils.js +0 -188
  120. package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
  121. package/lib/worker/__mock__/sodium.worker.js +0 -57
  122. package/lib/worker/md5.js +0 -43
  123. package/lib/worker/sodium.js +0 -155
  124. package/lib/worker/workerCodes.js +0 -3
  125. package/lib/zeus/const.js +0 -1644
  126. package/lib/zeus/index.d.ts +0 -26279
  127. package/lib/zeus/index.js +0 -552
package/lib/minify/lz4.js DELETED
@@ -1,633 +0,0 @@
1
- // lz4-ts @license BSD-3-Clause / Copyright (c) 2015, Pierre Curto / 2016, oov. All rights reserved.
2
-
3
- /**
4
- * Copyright (c) 2015, Pierre Curto
5
- * Copyright (c) 2016, oov
6
- * All rights reserved.
7
- *
8
- * Redistribution and use in source and binary forms, with or without
9
- * modification, are permitted provided that the following conditions are met:
10
- *
11
- * * Redistributions of source code must retain the above copyright notice, this
12
- * list of conditions and the following disclaimer.
13
- *
14
- * * Redistributions in binary form must reproduce the above copyright notice,
15
- * this list of conditions and the following disclaimer in the documentation
16
- * and/or other materials provided with the distribution.
17
- *
18
- * * Neither the name of xxHash nor the names of its
19
- * contributors may be used to endorse or promote products derived from
20
- * this software without specific prior written permission.
21
- *
22
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
- */
33
- var errInvalidSource = new Error("invalid source");
34
- var errShortBuffer = new Error("short buffer"); // The following constants are used to setup the compression algorithm.
35
-
36
- var minMatch = 4; // the minimum size of the match sequence size (4 bytes)
37
-
38
- var winSizeLog = 16; // LZ4 64Kb window size limit
39
-
40
- var winSize = 1 << winSizeLog;
41
- var winMask = winSize - 1; // 64Kb window of previous data for dependent blocks
42
- // hashSizeLog determines the size of the hash table used to quickly find a previous match position.
43
- // Its value influences the compression speed and memory usage, the lower the faster,
44
- // but at the expense of the compression ratio.
45
- // 16 seems to be the best compromise.
46
-
47
- var hashSizeLog = 16;
48
- var hashSize = 1 << hashSizeLog;
49
- var hashShift = minMatch * 8 - hashSizeLog;
50
- var mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
51
-
52
- var skipStrength = 6; // variable step for fast scan
53
-
54
- var 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
-
57
- function imulPolyfill(a, b) {
58
- var ah = a >>> 16 & 0xffff;
59
- var al = a & 0xffff;
60
- var bh = b >>> 16 & 0xffff;
61
- var bl = b & 0xffff; // the shift by 0 fixes the sign on the high part
62
- // the final |0 converts the unsigned value into a signed value
63
-
64
- return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
65
- }
66
-
67
- var imul = Math.imul ? Math.imul : imulPolyfill;
68
-
69
- function getUint32(a, i) {
70
- return a[i + 3] | a[i + 2] << 8 | a[i + 1] << 16 | a[i] << 24;
71
- }
72
-
73
- function copy(dest, src, di, si, len) {
74
- for (var i = 0; i < len; ++i) {
75
- dest[di++] = src[si++];
76
- }
77
- }
78
-
79
- export function calcUncompressedLen(src) {
80
- var sn = src.length;
81
-
82
- if (sn === 0) {
83
- return 0;
84
- }
85
-
86
- var si = 0;
87
- var di = 0;
88
-
89
- while (true) {
90
- // literals and match lengths (token)
91
- var lLen = src[si] >> 4;
92
- var mLen = src[si] & 0xf;
93
-
94
- if (++si === sn) {
95
- throw errInvalidSource;
96
- } // literals
97
-
98
-
99
- if (lLen > 0) {
100
- if (lLen === 0xf) {
101
- while (src[si] === 0xff) {
102
- lLen += 0xff;
103
-
104
- if (++si === sn) {
105
- throw errInvalidSource;
106
- }
107
- }
108
-
109
- lLen += src[si];
110
-
111
- if (++si === sn) {
112
- throw errInvalidSource;
113
- }
114
- }
115
-
116
- di += lLen;
117
- si += lLen;
118
-
119
- if (si >= sn) {
120
- return di;
121
- }
122
- }
123
-
124
- si += 2;
125
-
126
- if (si >= sn) {
127
- throw errInvalidSource;
128
- }
129
-
130
- var offset = src[si - 2] | src[si - 1] << 8;
131
-
132
- if (di - offset < 0 || offset === 0) {
133
- throw errInvalidSource;
134
- } // match
135
-
136
-
137
- if (mLen === 0xf) {
138
- while (src[si] === 0xff) {
139
- mLen += 0xff;
140
-
141
- if (++si === sn) {
142
- throw errInvalidSource;
143
- }
144
- }
145
-
146
- mLen += src[si];
147
-
148
- if (++si === sn) {
149
- throw errInvalidSource;
150
- }
151
- } // minimum match length is 4
152
-
153
-
154
- mLen += 4; // copy the match (NB. match is at least 4 bytes long)
155
-
156
- for (; mLen >= offset; mLen -= offset) {
157
- di += offset;
158
- }
159
-
160
- di += mLen;
161
- }
162
- }
163
- export function uncompressBlock(src, dest) {
164
- var sn = src.length;
165
- var dn = dest.length;
166
-
167
- if (sn === 0) {
168
- return 0;
169
- }
170
-
171
- var si = 0;
172
- var di = 0;
173
-
174
- while (true) {
175
- // literals and match lengths (token)
176
- var lLen = src[si] >> 4;
177
- var mLen = src[si] & 0xf;
178
-
179
- if (++si === sn) {
180
- throw errInvalidSource;
181
- } // literals
182
-
183
-
184
- if (lLen > 0) {
185
- if (lLen === 0xf) {
186
- while (src[si] === 0xff) {
187
- lLen += 0xff;
188
-
189
- if (++si === sn) {
190
- throw errInvalidSource;
191
- }
192
- }
193
-
194
- lLen += src[si];
195
-
196
- if (++si === sn) {
197
- throw errInvalidSource;
198
- }
199
- }
200
-
201
- if (dn - di < lLen || si + lLen > sn) {
202
- throw errShortBuffer;
203
- }
204
-
205
- copy(dest, src, di, si, lLen);
206
- di += lLen;
207
- si += lLen;
208
-
209
- if (si >= sn) {
210
- return di;
211
- }
212
- }
213
-
214
- si += 2;
215
-
216
- if (si >= sn) {
217
- throw errInvalidSource;
218
- }
219
-
220
- var offset = src[si - 2] | src[si - 1] << 8;
221
-
222
- if (di - offset < 0 || offset === 0) {
223
- throw errInvalidSource;
224
- } // match
225
-
226
-
227
- if (mLen === 0xf) {
228
- while (src[si] === 0xff) {
229
- mLen += 0xff;
230
-
231
- if (++si === sn) {
232
- throw errInvalidSource;
233
- }
234
- }
235
-
236
- mLen += src[si];
237
-
238
- if (++si === sn) {
239
- throw errInvalidSource;
240
- }
241
- } // minimum match length is 4
242
-
243
-
244
- mLen += 4;
245
-
246
- if (dn - di <= mLen) {
247
- throw errShortBuffer;
248
- } // copy the match (NB. match is at least 4 bytes long)
249
-
250
-
251
- for (; mLen >= offset; mLen -= offset) {
252
- copy(dest, dest, di, di - offset, offset);
253
- di += offset;
254
- }
255
-
256
- copy(dest, dest, di, di - offset, mLen);
257
- di += mLen;
258
- }
259
- }
260
- export function compressBlockBound(n) {
261
- return n + (n / 255 | 0) + 16;
262
- }
263
- export function compressBlock(src, dest, soffset) {
264
- var sn = src.length - mfLimit;
265
- var dn = dest.length;
266
-
267
- if (sn <= 0 || dn === 0 || soffset >= sn) {
268
- return 0;
269
- }
270
-
271
- var si = 0,
272
- di = 0; // fast scan strategy:
273
- // we only need a hash table to store the last sequences (4 bytes)
274
-
275
- var hashTable = new Uint32Array(hashSize); // Initialise the hash table with the first 64Kb of the input buffer
276
- // (used when compressing dependent blocks)
277
-
278
- while (si < soffset) {
279
- var h = imul(getUint32(src, si), hasher) >>> hashShift;
280
- hashTable[h] = ++si;
281
- }
282
-
283
- var anchor = si;
284
- var fma = 1 << skipStrength;
285
-
286
- while (si < sn - minMatch) {
287
- // hash the next 4 bytes (sequence)...
288
- var _h = imul(getUint32(src, si), hasher) >>> hashShift; // -1 to separate existing entries from new ones
289
-
290
-
291
- var ref = hashTable[_h] - 1; // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
292
-
293
- hashTable[_h] = si + 1; // no need to check the last 3 bytes in the first literal 4 bytes as
294
- // this guarantees that the next match, if any, is compressed with
295
- // a lower size, since to have some compression we must have:
296
- // ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
297
- // => ll+ml>3+2*overlap => ll+ml>= 4+2*overlap
298
- // and by definition we do have:
299
- // ll >= 1, ml >= 4
300
- // => ll+ml >= 5
301
- // => so overlap must be 0
302
- // the sequence is new, out of bound (64kb) or not valid: try next sequence
303
-
304
- if (ref < 0 || //(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
305
- 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]) {
306
- // variable step: improves performance on non-compressible data
307
- si += fma >> skipStrength;
308
- ++fma;
309
- continue;
310
- } // match found
311
-
312
-
313
- fma = 1 << skipStrength;
314
-
315
- var _lLen = si - anchor;
316
-
317
- var offset = si - ref; // encode match length part 1
318
-
319
- si += minMatch;
320
- var mLen = si; // match length has minMatch already
321
-
322
- while (si <= sn && src[si] === src[si - offset]) {
323
- si++;
324
- }
325
-
326
- mLen = si - mLen;
327
-
328
- if (mLen < 0xf) {
329
- dest[di] = mLen;
330
- } else {
331
- dest[di] = 0xf;
332
- } // encode literals length
333
-
334
-
335
- if (_lLen < 0xf) {
336
- dest[di] |= _lLen << 4;
337
- } else {
338
- dest[di] |= 0xf0;
339
-
340
- if (++di === dn) {
341
- throw errShortBuffer;
342
- }
343
-
344
- var l = _lLen - 0xf;
345
-
346
- for (; l >= 0xff; l -= 0xff) {
347
- dest[di] = 0xff;
348
-
349
- if (++di === dn) {
350
- throw errShortBuffer;
351
- }
352
- }
353
-
354
- dest[di] = l & 0xff;
355
- }
356
-
357
- if (++di === dn) {
358
- throw errShortBuffer;
359
- } // literals
360
-
361
-
362
- if (di + _lLen >= dn) {
363
- throw errShortBuffer;
364
- }
365
-
366
- copy(dest, src, di, anchor, _lLen);
367
- di += _lLen;
368
- anchor = si; // encode offset
369
-
370
- di += 2;
371
-
372
- if (di >= dn) {
373
- throw errShortBuffer;
374
- }
375
-
376
- dest[di - 2] = offset;
377
- dest[di - 1] = offset >> 8; // encode match length part 2
378
-
379
- if (mLen >= 0xf) {
380
- for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
381
- dest[di] = 0xff;
382
-
383
- if (++di === dn) {
384
- throw errShortBuffer;
385
- }
386
- }
387
-
388
- dest[di] = mLen;
389
-
390
- if (++di === dn) {
391
- throw errShortBuffer;
392
- }
393
- }
394
- }
395
-
396
- if (anchor === 0) {
397
- // incompressible
398
- return 0;
399
- } // last literals
400
-
401
-
402
- var lLen = src.length - anchor;
403
-
404
- if (lLen < 0xf) {
405
- dest[di] = lLen << 4;
406
- } else {
407
- dest[di] = 0xf0;
408
-
409
- if (++di === dn) {
410
- throw errShortBuffer;
411
- }
412
-
413
- for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
414
- dest[di] = 0xff;
415
-
416
- if (++di === dn) {
417
- throw errShortBuffer;
418
- }
419
- }
420
-
421
- dest[di] = lLen;
422
- }
423
-
424
- if (++di === dn) {
425
- throw errShortBuffer;
426
- } // write literals
427
-
428
-
429
- var lastLen = src.length - anchor;
430
- var n = di + lastLen;
431
-
432
- if (n > dn) {
433
- throw errShortBuffer;
434
- } else if (n >= sn) {
435
- // incompressible
436
- return 0;
437
- }
438
-
439
- copy(dest, src, di, anchor, lastLen);
440
- di += lastLen;
441
- return di;
442
- }
443
- export function compressBlockHC(src, dest, soffset) {
444
- var sn = src.length - mfLimit;
445
- var dn = dest.length;
446
-
447
- if (sn <= 0 || dn === 0 || soffset >= sn) {
448
- return 0;
449
- }
450
-
451
- var si = 0;
452
- var di = 0; // Hash Chain strategy:
453
- // we need a hash table and a chain table
454
- // the chain table cannot contain more entries than the window size (64Kb entries)
455
-
456
- var hashTable = new Uint32Array(hashSize);
457
- var chainTable = new Uint32Array(winSize); // Initialise the hash table with the first 64Kb of the input buffer
458
- // (used when compressing dependent blocks)
459
-
460
- while (si < soffset) {
461
- var h = imul(getUint32(src, si), hasher) >>> hashShift;
462
- chainTable[si & winMask] = hashTable[h];
463
- hashTable[h] = ++si;
464
- }
465
-
466
- var anchor = si;
467
-
468
- while (si < sn - minMatch) {
469
- // hash the next 4 bytes (sequence)...
470
- var _h2 = imul(getUint32(src, si), hasher) >>> hashShift; // follow the chain until out of window and give the longest match
471
-
472
-
473
- var mLen = 0;
474
- var offset = 0;
475
-
476
- for (var next = hashTable[_h2] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
477
- // the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
478
- if (src[next + mLen] === src[si + mLen]) {
479
- for (var _ml = 0;; ++_ml) {
480
- if (src[next + _ml] !== src[si + _ml] || si + _ml > sn) {
481
- // found a longer match, keep its position and length
482
- if (mLen < _ml && _ml >= minMatch) {
483
- mLen = _ml;
484
- offset = si - next;
485
- }
486
-
487
- break;
488
- }
489
- }
490
- }
491
- }
492
-
493
- chainTable[si & winMask] = hashTable[_h2];
494
- hashTable[_h2] = si + 1; // no match found
495
-
496
- if (mLen === 0) {
497
- ++si;
498
- continue;
499
- }
500
-
501
- var si2 = si + 1;
502
- var ml = si + mLen; // match found
503
- // update hash/chain tables with overlaping bytes:
504
- // si already hashed, add everything from si+1 up to the match length
505
-
506
- while (si2 < ml) {
507
- var _h3 = imul(getUint32(src, si2), hasher) >>> hashShift;
508
-
509
- chainTable[si2 & winMask] = hashTable[_h3];
510
- hashTable[_h3] = ++si2;
511
- }
512
-
513
- var _lLen2 = si - anchor;
514
-
515
- si += mLen;
516
- mLen -= minMatch; // match length does not include minMatch
517
-
518
- if (mLen < 0xf) {
519
- dest[di] = mLen;
520
- } else {
521
- dest[di] = 0xf;
522
- } // encode literals length
523
-
524
-
525
- if (_lLen2 < 0xf) {
526
- dest[di] |= _lLen2 << 4;
527
- } else {
528
- dest[di] |= 0xf0;
529
-
530
- if (++di === dn) {
531
- throw errShortBuffer;
532
- }
533
-
534
- var l = _lLen2 - 0xf;
535
-
536
- for (; l >= 0xff; l -= 0xff) {
537
- dest[di] = 0xff;
538
-
539
- if (++di === dn) {
540
- throw errShortBuffer;
541
- }
542
- }
543
-
544
- dest[di] = l & 0xff;
545
- }
546
-
547
- if (++di === dn) {
548
- throw errShortBuffer;
549
- } // literals
550
-
551
-
552
- if (di + _lLen2 >= dn) {
553
- throw errShortBuffer;
554
- }
555
-
556
- copy(dest, src, di, anchor, _lLen2);
557
- di += _lLen2;
558
- anchor = si; // encode offset
559
-
560
- di += 2;
561
-
562
- if (di >= dn) {
563
- throw errShortBuffer;
564
- }
565
-
566
- dest[di - 2] = offset;
567
- dest[di - 1] = offset >> 8; // encode match length part 2
568
-
569
- if (mLen >= 0xf) {
570
- for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
571
- dest[di] = 0xff;
572
-
573
- if (++di === dn) {
574
- throw errShortBuffer;
575
- }
576
- }
577
-
578
- dest[di] = mLen;
579
-
580
- if (++di === dn) {
581
- throw errShortBuffer;
582
- }
583
- }
584
- }
585
-
586
- if (anchor === 0) {
587
- // incompressible
588
- return 0;
589
- } // last literals
590
-
591
-
592
- var lLen = src.length - anchor;
593
-
594
- if (lLen < 0xf) {
595
- dest[di] = lLen << 4;
596
- } else {
597
- dest[di] = 0xf0;
598
-
599
- if (++di === dn) {
600
- throw errShortBuffer;
601
- }
602
-
603
- for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
604
- dest[di] = 0xff;
605
-
606
- if (++di === dn) {
607
- throw errShortBuffer;
608
- }
609
- }
610
-
611
- dest[di] = lLen;
612
- }
613
-
614
- if (++di === dn) {
615
- throw errShortBuffer;
616
- } // write literals
617
-
618
-
619
- var lastLen = src.length - anchor;
620
- var n = di + lastLen;
621
-
622
- if (n > dn) {
623
- throw errShortBuffer;
624
- } else if (n >= sn) {
625
- // incompressible
626
- return 0;
627
- }
628
-
629
- copy(dest, src, di, anchor, lastLen);
630
- di += lastLen;
631
- return di;
632
- }
633
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sIm5hbWVzIjpbImVyckludmFsaWRTb3VyY2UiLCJFcnJvciIsImVyclNob3J0QnVmZmVyIiwibWluTWF0Y2giLCJ3aW5TaXplTG9nIiwid2luU2l6ZSIsIndpbk1hc2siLCJoYXNoU2l6ZUxvZyIsImhhc2hTaXplIiwiaGFzaFNoaWZ0IiwibWZMaW1pdCIsInNraXBTdHJlbmd0aCIsImhhc2hlciIsImltdWxQb2x5ZmlsbCIsImEiLCJiIiwiYWgiLCJhbCIsImJoIiwiYmwiLCJpbXVsIiwiTWF0aCIsImdldFVpbnQzMiIsImkiLCJjb3B5IiwiZGVzdCIsInNyYyIsImRpIiwic2kiLCJsZW4iLCJjYWxjVW5jb21wcmVzc2VkTGVuIiwic24iLCJsZW5ndGgiLCJsTGVuIiwibUxlbiIsIm9mZnNldCIsInVuY29tcHJlc3NCbG9jayIsImRuIiwiY29tcHJlc3NCbG9ja0JvdW5kIiwibiIsImNvbXByZXNzQmxvY2siLCJzb2Zmc2V0IiwiaGFzaFRhYmxlIiwiVWludDMyQXJyYXkiLCJoIiwiYW5jaG9yIiwiZm1hIiwicmVmIiwibCIsImxhc3RMZW4iLCJjb21wcmVzc0Jsb2NrSEMiLCJjaGFpblRhYmxlIiwibmV4dCIsIm1sIiwic2kyIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxnQkFBZ0IsR0FBRyxJQUFJQyxLQUFKLENBQVUsZ0JBQVYsQ0FBekI7QUFDQSxJQUFNQyxjQUFjLEdBQUcsSUFBSUQsS0FBSixDQUFVLGNBQVYsQ0FBdkIsQyxDQUVBOztBQUNBLElBQU1FLFFBQVEsR0FBRyxDQUFqQixDLENBQW9COztBQUNwQixJQUFNQyxV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O0FBQ0QsU0FBSytCLElBQUksSUFBSSxHQUFiLEVBQWtCQSxJQUFJLElBQUksSUFBMUIsRUFBZ0NBLElBQUksSUFBSSxJQUF4QyxFQUE4QztBQUM1Q1IsTUFBQUEsSUFBSSxDQUFDRSxFQUFELENBQUosR0FBVyxJQUFYOztBQUNBLFVBQUksRUFBRUEsRUFBRixLQUFTVSxFQUFiLEVBQWlCO0FBQ2YsY0FBTW5DLGNBQU47QUFDRDtBQUNGOztBQUNEdUIsSUFBQUEsSUFBSSxDQUFDRSxFQUFELENBQUosR0FBV00sSUFBWDtBQUNEOztBQUNELE1BQUksRUFBRU4sRUFBRixLQUFTVSxFQUFiLEVBQWlCO0FBQ2YsVUFBTW5DLGNBQU47QUFDRCxHQTdKTyxDQStKUjs7O0FBQ0EsTUFBTStDLE9BQU8sR0FBR3ZCLEdBQUcsQ0FBQ00sTUFBSixHQUFhYSxNQUE3QjtBQUNBLE1BQU1OLENBQUMsR0FBR1osRUFBRSxHQUFHc0IsT0FBZjs7QUFDQSxNQUFJVixDQUFDLEdBQUdGLEVBQVIsRUFBWTtBQUNWLFVBQU1uQyxjQUFOO0FBQ0QsR0FGRCxNQUVPLElBQUlxQyxDQUFDLElBQUlSLEVBQVQsRUFBYTtBQUNsQjtBQUNBLFdBQU8sQ0FBUDtBQUNEOztBQUNEUCxFQUFBQSxJQUFJLENBQUNDLElBQUQsRUFBT0MsR0FBUCxFQUFZQyxFQUFaLEVBQWdCa0IsTUFBaEIsRUFBd0JJLE9BQXhCLENBQUo7QUFDQXRCLEVBQUFBLEVBQUUsSUFBSXNCLE9BQU47QUFDQSxTQUFPdEIsRUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbHo0LXRzIEBsaWNlbnNlIEJTRC0zLUNsYXVzZSAvIENvcHlyaWdodCAoYykgMjAxNSwgUGllcnJlIEN1cnRvIC8gMjAxNiwgb292LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0b1xuICogQ29weXJpZ2h0IChjKSAyMDE2LCBvb3ZcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgeHhIYXNoIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbmNvbnN0IGVyckludmFsaWRTb3VyY2UgPSBuZXcgRXJyb3IoXCJpbnZhbGlkIHNvdXJjZVwiKTtcbmNvbnN0IGVyclNob3J0QnVmZmVyID0gbmV3IEVycm9yKFwic2hvcnQgYnVmZmVyXCIpO1xuXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byBzZXR1cCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLlxuY29uc3QgbWluTWF0Y2ggPSA0OyAvLyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBtYXRjaCBzZXF1ZW5jZSBzaXplICg0IGJ5dGVzKVxuY29uc3Qgd2luU2l6ZUxvZyA9IDE2OyAvLyBMWjQgNjRLYiB3aW5kb3cgc2l6ZSBsaW1pdFxuY29uc3Qgd2luU2l6ZSA9IDEgPDwgd2luU2l6ZUxvZztcbmNvbnN0IHdpbk1hc2sgPSB3aW5TaXplIC0gMTsgLy8gNjRLYiB3aW5kb3cgb2YgcHJldmlvdXMgZGF0YSBmb3IgZGVwZW5kZW50IGJsb2Nrc1xuXG4vLyBoYXNoU2l6ZUxvZyBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlIHVzZWQgdG8gcXVpY2tseSBmaW5kIGEgcHJldmlvdXMgbWF0Y2ggcG9zaXRpb24uXG4vLyBJdHMgdmFsdWUgaW5mbHVlbmNlcyB0aGUgY29tcHJlc3Npb24gc3BlZWQgYW5kIG1lbW9yeSB1c2FnZSwgdGhlIGxvd2VyIHRoZSBmYXN0ZXIsXG4vLyBidXQgYXQgdGhlIGV4cGVuc2Ugb2YgdGhlIGNvbXByZXNzaW9uIHJhdGlvLlxuLy8gMTYgc2VlbXMgdG8gYmUgdGhlIGJlc3QgY29tcHJvbWlzZS5cbmNvbnN0IGhhc2hTaXplTG9nID0gMTY7XG5jb25zdCBoYXNoU2l6ZSA9IDEgPDwgaGFzaFNpemVMb2c7XG5jb25zdCBoYXNoU2hpZnQgPSBtaW5NYXRjaCAqIDggLSBoYXNoU2l6ZUxvZztcblxuY29uc3QgbWZMaW1pdCA9IDggKyBtaW5NYXRjaDsgLy8gVGhlIGxhc3QgbWF0Y2ggY2Fubm90IHN0YXJ0IHdpdGhpbiB0aGUgbGFzdCAxMiBieXRlcy5cbmNvbnN0IHNraXBTdHJlbmd0aCA9IDY7IC8vIHZhcmlhYmxlIHN0ZXAgZm9yIGZhc3Qgc2NhblxuXG5jb25zdCBoYXNoZXIgPSAyNjU0NDM1NzYxIHwgMDsgLy8gcHJpbWUgbnVtYmVyIHVzZWQgdG8gaGFzaCBtaW5NYXRjaFxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2ltdWwjUG9seWZpbGxcbmZ1bmN0aW9uIGltdWxQb2x5ZmlsbChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGFoID0gKGEgPj4+IDE2KSAmIDB4ZmZmZjtcbiAgY29uc3QgYWwgPSBhICYgMHhmZmZmO1xuICBjb25zdCBiaCA9IChiID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGJsID0gYiAmIDB4ZmZmZjtcbiAgLy8gdGhlIHNoaWZ0IGJ5IDAgZml4ZXMgdGhlIHNpZ24gb24gdGhlIGhpZ2ggcGFydFxuICAvLyB0aGUgZmluYWwgfDAgY29udmVydHMgdGhlIHVuc2lnbmVkIHZhbHVlIGludG8gYSBzaWduZWQgdmFsdWVcbiAgcmV0dXJuIChhbCAqIGJsICsgKCgoYWggKiBibCArIGFsICogYmgpIDw8IDE2KSA+Pj4gMCkpIHwgMDtcbn1cbmNvbnN0IGltdWwgPSBNYXRoLmltdWwgPyBNYXRoLmltdWwgOiBpbXVsUG9seWZpbGw7XG5cbmZ1bmN0aW9uIGdldFVpbnQzMihhOiBVaW50OEFycmF5LCBpOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYVtpICsgM10gfCAoYVtpICsgMl0gPDwgOCkgfCAoYVtpICsgMV0gPDwgMTYpIHwgKGFbaV0gPDwgMjQpO1xufVxuXG5mdW5jdGlvbiBjb3B5KFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzcmM6IFVpbnQ4QXJyYXksXG4gIGRpOiBudW1iZXIsXG4gIHNpOiBudW1iZXIsXG4gIGxlbjogbnVtYmVyXG4pOiB2b2lkIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGRlc3RbZGkrK10gPSBzcmNbc2krK107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNVbmNvbXByZXNzZWRMZW4oc3JjOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGkgKz0gbExlbjtcbiAgICAgIHNpICs9IGxMZW47XG4gICAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgICAgcmV0dXJuIGRpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNpICs9IDI7XG4gICAgaWYgKHNpID49IHNuKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSBzcmNbc2kgLSAyXSB8IChzcmNbc2kgLSAxXSA8PCA4KTtcbiAgICBpZiAoZGkgLSBvZmZzZXQgPCAwIHx8IG9mZnNldCA9PT0gMCkge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBtYXRjaFxuICAgIGlmIChtTGVuID09PSAweGYpIHtcbiAgICAgIHdoaWxlIChzcmNbc2ldID09PSAweGZmKSB7XG4gICAgICAgIG1MZW4gKz0gMHhmZjtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbUxlbiArPSBzcmNbc2ldO1xuICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG1pbmltdW0gbWF0Y2ggbGVuZ3RoIGlzIDRcbiAgICBtTGVuICs9IDQ7XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBkaSArPSBvZmZzZXQ7XG4gICAgfVxuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuY29tcHJlc3NCbG9jayhzcmM6IFVpbnQ4QXJyYXksIGRlc3Q6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGg7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIGxpdGVyYWxzIGFuZCBtYXRjaCBsZW5ndGhzICh0b2tlbilcbiAgICBsZXQgbExlbiA9IHNyY1tzaV0gPj4gNDtcbiAgICBsZXQgbUxlbiA9IHNyY1tzaV0gJiAweGY7XG4gICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIGxpdGVyYWxzXG4gICAgaWYgKGxMZW4gPiAwKSB7XG4gICAgICBpZiAobExlbiA9PT0gMHhmKSB7XG4gICAgICAgIHdoaWxlIChzcmNbc2ldID09PSAweGZmKSB7XG4gICAgICAgICAgbExlbiArPSAweGZmO1xuICAgICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbExlbiArPSBzcmNbc2ldO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZG4gLSBkaSA8IGxMZW4gfHwgc2kgKyBsTGVuID4gc24pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgICBjb3B5KGRlc3QsIHNyYywgZGksIHNpLCBsTGVuKTtcbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuICAgIGlmIChkbiAtIGRpIDw9IG1MZW4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cblxuICAgIC8vIGNvcHkgdGhlIG1hdGNoIChOQi4gbWF0Y2ggaXMgYXQgbGVhc3QgNCBieXRlcyBsb25nKVxuICAgIGZvciAoOyBtTGVuID49IG9mZnNldDsgbUxlbiAtPSBvZmZzZXQpIHtcbiAgICAgIGNvcHkoZGVzdCwgZGVzdCwgZGksIGRpIC0gb2Zmc2V0LCBvZmZzZXQpO1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgbUxlbik7XG4gICAgZGkgKz0gbUxlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9ja0JvdW5kKG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBuICsgKChuIC8gMjU1KSB8IDApICsgMTY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrKFxuICBzcmM6IFVpbnQ4QXJyYXksXG4gIGRlc3Q6IFVpbnQ4QXJyYXksXG4gIHNvZmZzZXQ6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoIC0gbWZMaW1pdDtcbiAgY29uc3QgZG4gPSBkZXN0Lmxlbmd0aDtcbiAgaWYgKHNuIDw9IDAgfHwgZG4gPT09IDAgfHwgc29mZnNldCA+PSBzbikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCBzaSA9IDAsXG4gICAgZGkgPSAwO1xuXG4gIC8vIGZhc3Qgc2NhbiBzdHJhdGVneTpcbiAgLy8gd2Ugb25seSBuZWVkIGEgaGFzaCB0YWJsZSB0byBzdG9yZSB0aGUgbGFzdCBzZXF1ZW5jZXMgKDQgYnl0ZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgaGFzaFRhYmxlW2hdID0gKytzaTtcbiAgfVxuXG4gIGxldCBhbmNob3IgPSBzaTtcbiAgbGV0IGZtYSA9IDEgPDwgc2tpcFN0cmVuZ3RoO1xuICB3aGlsZSAoc2kgPCBzbiAtIG1pbk1hdGNoKSB7XG4gICAgLy8gaGFzaCB0aGUgbmV4dCA0IGJ5dGVzIChzZXF1ZW5jZSkuLi5cbiAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaSksIGhhc2hlcikgPj4+IGhhc2hTaGlmdDtcbiAgICAvLyAtMSB0byBzZXBhcmF0ZSBleGlzdGluZyBlbnRyaWVzIGZyb20gbmV3IG9uZXNcbiAgICBjb25zdCByZWYgPSBoYXNoVGFibGVbaF0gLSAxO1xuICAgIC8vIC4uLmFuZCBzdG9yZSB0aGUgcG9zaXRpb24gb2YgdGhlIGhhc2ggaW4gdGhlIGhhc2ggdGFibGUgKCsxIHRvIGNvbXBlbnNhdGUgdGhlIC0xIHVwb24gc2F2aW5nKVxuICAgIGhhc2hUYWJsZVtoXSA9IHNpICsgMTtcbiAgICAvLyBubyBuZWVkIHRvIGNoZWNrIHRoZSBsYXN0IDMgYnl0ZXMgaW4gdGhlIGZpcnN0IGxpdGVyYWwgNCBieXRlcyBhc1xuICAgIC8vIHRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBuZXh0IG1hdGNoLCBpZiBhbnksIGlzIGNvbXByZXNzZWQgd2l0aFxuICAgIC8vIGEgbG93ZXIgc2l6ZSwgc2luY2UgdG8gaGF2ZSBzb21lIGNvbXByZXNzaW9uIHdlIG11c3QgaGF2ZTpcbiAgICAvLyBsbCttbC1vdmVybGFwID4gMSArIChsbC0xNSkvMjU1ICsgKG1sLTQtMTUpLzI1NSArIDIgKHVuY29tcHJlc3NlZCBzaXplPmNvbXByZXNzZWQgc2l6ZSlcbiAgICAvLyA9PiBsbCttbD4zKzIqb3ZlcmxhcCA9PiBsbCttbD49IDQrMipvdmVybGFwXG4gICAgLy8gYW5kIGJ5IGRlZmluaXRpb24gd2UgZG8gaGF2ZTpcbiAgICAvLyBsbCA+PSAxLCBtbCA+PSA0XG4gICAgLy8gPT4gbGwrbWwgPj0gNVxuICAgIC8vID0+IHNvIG92ZXJsYXAgbXVzdCBiZSAwXG5cbiAgICAvLyB0aGUgc2VxdWVuY2UgaXMgbmV3LCBvdXQgb2YgYm91bmQgKDY0a2IpIG9yIG5vdCB2YWxpZDogdHJ5IG5leHQgc2VxdWVuY2VcbiAgICBpZiAoXG4gICAgICByZWYgPCAwIHx8IC8vKGZtYSAmICgoMSA8PCBza2lwU3RyZW5ndGgpIC0gMSkpIDwgNCB8fCAvLyB0aGlzIGNvZGUgc2VlbXMgaGFzIGEgYmlnIHBlbmFsdHkgZm9yIHNpemUuLi5cbiAgICAgIChzaSAtIHJlZikgPj4gd2luU2l6ZUxvZyA+IDAgfHxcbiAgICAgIHNyY1tyZWZdICE9PSBzcmNbc2ldIHx8XG4gICAgICBzcmNbcmVmICsgMV0gIT09IHNyY1tzaSArIDFdIHx8XG4gICAgICBzcmNbcmVmICsgMl0gIT09IHNyY1tzaSArIDJdIHx8XG4gICAgICBzcmNbcmVmICsgM10gIT09IHNyY1tzaSArIDNdXG4gICAgKSB7XG4gICAgICAvLyB2YXJpYWJsZSBzdGVwOiBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvbiBub24tY29tcHJlc3NpYmxlIGRhdGFcbiAgICAgIHNpICs9IGZtYSA+PiBza2lwU3RyZW5ndGg7XG4gICAgICArK2ZtYTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIGZtYSA9IDEgPDwgc2tpcFN0cmVuZ3RoO1xuICAgIGNvbnN0IGxMZW4gPSBzaSAtIGFuY2hvcjtcbiAgICBjb25zdCBvZmZzZXQgPSBzaSAtIHJlZjtcblxuICAgIC8vIGVuY29kZSBtYXRjaCBsZW5ndGggcGFydCAxXG4gICAgc2kgKz0gbWluTWF0Y2g7XG4gICAgbGV0IG1MZW4gPSBzaTsgLy8gbWF0Y2ggbGVuZ3RoIGhhcyBtaW5NYXRjaCBhbHJlYWR5XG4gICAgd2hpbGUgKHNpIDw9IHNuICYmIHNyY1tzaV0gPT09IHNyY1tzaSAtIG9mZnNldF0pIHtcbiAgICAgIHNpKys7XG4gICAgfVxuICAgIG1MZW4gPSBzaSAtIG1MZW47XG4gICAgaWYgKG1MZW4gPCAweGYpIHtcbiAgICAgIGRlc3RbZGldID0gbUxlbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdFtkaV0gPSAweGY7XG4gICAgfVxuXG4gICAgLy8gZW5jb2RlIGxpdGVyYWxzIGxlbmd0aFxuICAgIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSB8PSBsTGVuIDw8IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldIHw9IDB4ZjA7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgICBsZXQgbCA9IGxMZW4gLSAweGY7XG4gICAgICBmb3IgKDsgbCA+PSAweGZmOyBsIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBsICYgMHhmZjtcbiAgICB9XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChkaSArIGxMZW4gPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbExlbik7XG4gICAgZGkgKz0gbExlbjtcbiAgICBhbmNob3IgPSBzaTtcblxuICAgIC8vIGVuY29kZSBvZmZzZXRcbiAgICBkaSArPSAyO1xuICAgIGlmIChkaSA+PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGRlc3RbZGkgLSAyXSA9IG9mZnNldDtcbiAgICBkZXN0W2RpIC0gMV0gPSBvZmZzZXQgPj4gODtcblxuICAgIC8vIGVuY29kZSBtYXRjaCBsZW5ndGggcGFydCAyXG4gICAgaWYgKG1MZW4gPj0gMHhmKSB7XG4gICAgICBmb3IgKG1MZW4gLT0gMHhmOyBtTGVuID49IDB4ZmY7IG1MZW4gLT0gMHhmZikge1xuICAgICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFuY2hvciA9PT0gMCkge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvLyBsYXN0IGxpdGVyYWxzXG4gIGxldCBsTGVuID0gc3JjLmxlbmd0aCAtIGFuY2hvcjtcbiAgaWYgKGxMZW4gPCAweGYpIHtcbiAgICBkZXN0W2RpXSA9IGxMZW4gPDwgNDtcbiAgfSBlbHNlIHtcbiAgICBkZXN0W2RpXSA9IDB4ZjA7XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgZm9yIChsTGVuIC09IDB4ZjsgbExlbiA+PSAweGZmOyBsTGVuIC09IDB4ZmYpIHtcbiAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVzdFtkaV0gPSBsTGVuO1xuICB9XG4gIGlmICgrK2RpID09PSBkbikge1xuICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICB9XG5cbiAgLy8gd3JpdGUgbGl0ZXJhbHNcbiAgY29uc3QgbGFzdExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGNvbnN0IG4gPSBkaSArIGxhc3RMZW47XG4gIGlmIChuID4gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChuID49IHNuKSB7XG4gICAgLy8gaW5jb21wcmVzc2libGVcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbGFzdExlbik7XG4gIGRpICs9IGxhc3RMZW47XG4gIHJldHVybiBkaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tIQyhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIC8vIEhhc2ggQ2hhaW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG5lZWQgYSBoYXNoIHRhYmxlIGFuZCBhIGNoYWluIHRhYmxlXG4gIC8vIHRoZSBjaGFpbiB0YWJsZSBjYW5ub3QgY29udGFpbiBtb3JlIGVudHJpZXMgdGhhbiB0aGUgd2luZG93IHNpemUgKDY0S2IgZW50cmllcylcbiAgY29uc3QgaGFzaFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KGhhc2hTaXplKTtcbiAgY29uc3QgY2hhaW5UYWJsZSA9IG5ldyBVaW50MzJBcnJheSh3aW5TaXplKTtcblxuICAvLyBJbml0aWFsaXNlIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlIGZpcnN0IDY0S2Igb2YgdGhlIGlucHV0IGJ1ZmZlclxuICAvLyAodXNlZCB3aGVuIGNvbXByZXNzaW5nIGRlcGVuZGVudCBibG9ja3MpXG4gIHdoaWxlIChzaSA8IHNvZmZzZXQpIHtcbiAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaSksIGhhc2hlcikgPj4+IGhhc2hTaGlmdDtcbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gKytzaTtcbiAgfVxuXG4gIGxldCBhbmNob3IgPSBzaTtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG5cbiAgICAvLyBmb2xsb3cgdGhlIGNoYWluIHVudGlsIG91dCBvZiB3aW5kb3cgYW5kIGdpdmUgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICBsZXQgbUxlbiA9IDA7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChcbiAgICAgIGxldCBuZXh0ID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAgIG5leHQgPiAwICYmIG5leHQgPiBzaSAtIHdpblNpemU7XG4gICAgICBuZXh0ID0gY2hhaW5UYWJsZVtuZXh0ICYgd2luTWFza10gLSAxXG4gICAgKSB7XG4gICAgICAvLyB0aGUgZmlyc3QgKG1MZW49PTApIG9yIG5leHQgYnl0ZSAobUxlbj49bWluTWF0Y2gpIGF0IGN1cnJlbnQgbWF0Y2ggbGVuZ3RoIG11c3QgbWF0Y2ggdG8gaW1wcm92ZSBvbiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICBpZiAoc3JjW25leHQgKyBtTGVuXSA9PT0gc3JjW3NpICsgbUxlbl0pIHtcbiAgICAgICAgZm9yIChsZXQgbWwgPSAwOyA7ICsrbWwpIHtcbiAgICAgICAgICBpZiAoc3JjW25leHQgKyBtbF0gIT09IHNyY1tzaSArIG1sXSB8fCBzaSArIG1sID4gc24pIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIGEgbG9uZ2VyIG1hdGNoLCBrZWVwIGl0cyBwb3NpdGlvbiBhbmQgbGVuZ3RoXG4gICAgICAgICAgICBpZiAobUxlbiA8IG1sICYmIG1sID49IG1pbk1hdGNoKSB7XG4gICAgICAgICAgICAgIG1MZW4gPSBtbDtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gc2kgLSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNoYWluVGFibGVbc2kgJiB3aW5NYXNrXSA9IGhhc2hUYWJsZVtoXTtcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG5cbiAgICAvLyBubyBtYXRjaCBmb3VuZFxuICAgIGlmIChtTGVuID09PSAwKSB7XG4gICAgICArK3NpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHNpMiA9IHNpICsgMTtcbiAgICBjb25zdCBtbCA9IHNpICsgbUxlbjtcblxuICAgIC8vIG1hdGNoIGZvdW5kXG4gICAgLy8gdXBkYXRlIGhhc2gvY2hhaW4gdGFibGVzIHdpdGggb3ZlcmxhcGluZyBieXRlczpcbiAgICAvLyBzaSBhbHJlYWR5IGhhc2hlZCwgYWRkIGV2ZXJ5dGhpbmcgZnJvbSBzaSsxIHVwIHRvIHRoZSBtYXRjaCBsZW5ndGhcbiAgICB3aGlsZSAoc2kyIDwgbWwpIHtcbiAgICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpMiksIGhhc2hlcikgPj4+IGhhc2hTaGlmdDtcbiAgICAgIGNoYWluVGFibGVbc2kyICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgICBoYXNoVGFibGVbaF0gPSArK3NpMjtcbiAgICB9XG5cbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgc2kgKz0gbUxlbjtcbiAgICBtTGVuIC09IG1pbk1hdGNoOyAvLyBtYXRjaCBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSBtaW5NYXRjaFxuXG4gICAgaWYgKG1MZW4gPCAweGYpIHtcbiAgICAgIGRlc3RbZGldID0gbUxlbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdFtkaV0gPSAweGY7XG4gICAgfVxuXG4gICAgLy8gZW5jb2RlIGxpdGVyYWxzIGxlbmd0aFxuICAgIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSB8PSBsTGVuIDw8IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldIHw9IDB4ZjA7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgICBsZXQgbCA9IGxMZW4gLSAweGY7XG4gICAgICBmb3IgKDsgbCA+PSAweGZmOyBsIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBsICYgMHhmZjtcbiAgICB9XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChkaSArIGxMZW4gPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbExlbik7XG4gICAgZGkgKz0gbExlbjtcbiAgICBhbmNob3IgPSBzaTtcblxuICAgIC8vIGVuY29kZSBvZmZzZXRcbiAgICBkaSArPSAyO1xuICAgIGlmIChkaSA+PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGRlc3RbZGkgLSAyXSA9IG9mZnNldDtcbiAgICBkZXN0W2RpIC0gMV0gPSBvZmZzZXQgPj4gODtcblxuICAgIC8vIGVuY29kZSBtYXRjaCBsZW5ndGggcGFydCAyXG4gICAgaWYgKG1MZW4gPj0gMHhmKSB7XG4gICAgICBmb3IgKG1MZW4gLT0gMHhmOyBtTGVuID49IDB4ZmY7IG1MZW4gLT0gMHhmZikge1xuICAgICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFuY2hvciA9PT0gMCkge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvLyBsYXN0IGxpdGVyYWxzXG4gIGxldCBsTGVuID0gc3JjLmxlbmd0aCAtIGFuY2hvcjtcbiAgaWYgKGxMZW4gPCAweGYpIHtcbiAgICBkZXN0W2RpXSA9IGxMZW4gPDwgNDtcbiAgfSBlbHNlIHtcbiAgICBkZXN0W2RpXSA9IDB4ZjA7XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgZm9yIChsTGVuIC09IDB4ZjsgbExlbiA+PSAweGZmOyBsTGVuIC09IDB4ZmYpIHtcbiAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVzdFtkaV0gPSBsTGVuO1xuICB9XG4gIGlmICgrK2RpID09PSBkbikge1xuICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICB9XG5cbiAgLy8gd3JpdGUgbGl0ZXJhbHNcbiAgY29uc3QgbGFzdExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGNvbnN0IG4gPSBkaSArIGxhc3RMZW47XG4gIGlmIChuID4gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChuID49IHNuKSB7XG4gICAgLy8gaW5jb21wcmVzc2libGVcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbGFzdExlbik7XG4gIGRpICs9IGxhc3RMZW47XG4gIHJldHVybiBkaTtcbn1cbiJdfQ==