@datagrok-libraries/utils 0.0.1 → 0.0.5
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.
- package/package.json +4 -3
- package/src/bit-array.js +656 -0
- package/src/bit-array.ts +756 -0
- package/src/operations.js +144 -0
- package/src/operations.ts +160 -0
- package/src/reduce-dimensionality.js +233 -0
- package/src/reduce-dimensionality.ts +272 -0
- package/src/sequence-encoder.js +116 -0
- package/src/sequence-encoder.ts +131 -0
- package/src/spe.js +151 -0
- package/src/spe.ts +172 -0
- package/src/string-measure.js +46 -0
- package/src/string-measure.ts +54 -0
- package/src/string-utils.js +9 -0
- package/src/string-utils.ts +8 -0
- package/src/table-validation.js +47 -0
- package/src/table-validation.ts +67 -0
- package/src/test-utils.js +80 -0
- package/src/test-utils.ts +97 -0
- package/src/type_declarations.js +37 -0
- package/src/type_declarations.ts +54 -0
- package/tsconfig.json +52 -50
package/src/bit-array.js
ADDED
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
export default class BitArray {
|
|
2
|
+
constructor(length, defaultValue = false) {
|
|
3
|
+
this._length = 0;
|
|
4
|
+
this._version = 0;
|
|
5
|
+
this._updateLevel = 0;
|
|
6
|
+
this._selectedCount = 0;
|
|
7
|
+
this._selectedCountVersion = -1;
|
|
8
|
+
this._selectedIndexesVersion = -1;
|
|
9
|
+
this._versionedName = '';
|
|
10
|
+
this._versionedNameVersion = -1;
|
|
11
|
+
this.SHRINK_THRESHOLD = 0x100;
|
|
12
|
+
this._length = length;
|
|
13
|
+
this._data = BitArray._createBuffer(length);
|
|
14
|
+
if (defaultValue) {
|
|
15
|
+
for (let i = 0; i < this._data.length; i++) {
|
|
16
|
+
this._data[i] = -1;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
assureGoez(num, argName) {
|
|
21
|
+
if (num < 0)
|
|
22
|
+
throw new Error(`${argName} should be greater than zero`);
|
|
23
|
+
}
|
|
24
|
+
assureInRange(value, min, max, argName) {
|
|
25
|
+
if ((value < min) || (value > max)) {
|
|
26
|
+
throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
copy(src, dst, count) {
|
|
30
|
+
for (let i = 0; i < count; i++) {
|
|
31
|
+
dst[i] = src[i];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
copyFrom(other) {
|
|
35
|
+
if (this._length != other._length) {
|
|
36
|
+
throw new Error(`Lengths differ (${this._length} != ${other._length})`);
|
|
37
|
+
}
|
|
38
|
+
this.copy(other._data, this._data, this.lengthInInts);
|
|
39
|
+
this._version++;
|
|
40
|
+
}
|
|
41
|
+
get length() {
|
|
42
|
+
return this._length;
|
|
43
|
+
}
|
|
44
|
+
get buffer() {
|
|
45
|
+
return this._data;
|
|
46
|
+
}
|
|
47
|
+
set buffer(data) {
|
|
48
|
+
this._data = data;
|
|
49
|
+
this._version++;
|
|
50
|
+
}
|
|
51
|
+
get version() {
|
|
52
|
+
return this._version;
|
|
53
|
+
}
|
|
54
|
+
set version(value) {
|
|
55
|
+
this._version = value;
|
|
56
|
+
}
|
|
57
|
+
incrementVersion(notify = true) {
|
|
58
|
+
this._version++;
|
|
59
|
+
}
|
|
60
|
+
get lengthInInts() {
|
|
61
|
+
return Math.floor((this._length + 0x1f) / 0x20);
|
|
62
|
+
}
|
|
63
|
+
get versionedName() {
|
|
64
|
+
return this._version == this._versionedNameVersion ? this._versionedName : '';
|
|
65
|
+
}
|
|
66
|
+
set versionedName(name) {
|
|
67
|
+
this._versionedName = name;
|
|
68
|
+
this._versionedNameVersion = this._version;
|
|
69
|
+
}
|
|
70
|
+
get self() {
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
setLength(value) {
|
|
74
|
+
if (value < 0) {
|
|
75
|
+
throw new Error('should be >= 0');
|
|
76
|
+
}
|
|
77
|
+
if (value == this._length)
|
|
78
|
+
return;
|
|
79
|
+
const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);
|
|
80
|
+
if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {
|
|
81
|
+
const newData = new Uint32Array(nIntsNeeded);
|
|
82
|
+
this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);
|
|
83
|
+
this._data = newData;
|
|
84
|
+
}
|
|
85
|
+
if (value > this._length) {
|
|
86
|
+
if (this._length % 0x20 > 0) {
|
|
87
|
+
this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;
|
|
88
|
+
}
|
|
89
|
+
this._data.fill(0, this.lengthInInts, nIntsNeeded);
|
|
90
|
+
}
|
|
91
|
+
this._length = value;
|
|
92
|
+
this._version++;
|
|
93
|
+
}
|
|
94
|
+
static fromAnd(set1, set2) {
|
|
95
|
+
if (set1._length != set2._length) {
|
|
96
|
+
throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);
|
|
97
|
+
}
|
|
98
|
+
const temp = new BitArray(set1._length);
|
|
99
|
+
temp._length = set1._length;
|
|
100
|
+
temp._data = BitArray._createBuffer(temp._length);
|
|
101
|
+
temp._version = 0;
|
|
102
|
+
const len = set1.lengthInInts;
|
|
103
|
+
for (let i = 0; i < len; i++) {
|
|
104
|
+
temp._data[i] = set1._data[i] & set2._data[i];
|
|
105
|
+
}
|
|
106
|
+
return temp;
|
|
107
|
+
}
|
|
108
|
+
static _createBuffer(length) {
|
|
109
|
+
return new Uint32Array(Math.floor((length + 0x1f) / 0x20));
|
|
110
|
+
}
|
|
111
|
+
static fromValues(values) {
|
|
112
|
+
const temp = new BitArray(values.length);
|
|
113
|
+
temp._version = 0;
|
|
114
|
+
for (let i = 0; i < temp._length; i++) {
|
|
115
|
+
if (values[i]) {
|
|
116
|
+
temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return temp;
|
|
120
|
+
}
|
|
121
|
+
/// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).
|
|
122
|
+
static fromSeq(count, flag) {
|
|
123
|
+
const temp = new BitArray(count);
|
|
124
|
+
for (let i = 0; i < count; ++i) {
|
|
125
|
+
temp.setBit(i, flag(i));
|
|
126
|
+
}
|
|
127
|
+
temp._version = 0;
|
|
128
|
+
return temp;
|
|
129
|
+
}
|
|
130
|
+
/// Constructs a [BitSet] from a string [s] containing '0' or '1'.
|
|
131
|
+
static fromString(s) {
|
|
132
|
+
return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');
|
|
133
|
+
}
|
|
134
|
+
/// Constructs a [BitSet], based on length [_length] and byte array [_data].
|
|
135
|
+
static fromUint32Array(_length, _data) {
|
|
136
|
+
const temp = new BitArray(_length);
|
|
137
|
+
temp._data = _data;
|
|
138
|
+
return temp;
|
|
139
|
+
}
|
|
140
|
+
/// Deserializes a [BitSet] from [bytes].
|
|
141
|
+
static fromBytes(bytes) {
|
|
142
|
+
const len = bytes.length;
|
|
143
|
+
const temp = new BitArray(len * 8);
|
|
144
|
+
temp._data = new Uint32Array(Math.floor((len + 3) / 4));
|
|
145
|
+
temp._length = len * 8;
|
|
146
|
+
let num1 = 0;
|
|
147
|
+
let num2 = 0;
|
|
148
|
+
while ((len - num2) >= 4) {
|
|
149
|
+
temp._data[num1++] = (((bytes[num2] & 0xff) |
|
|
150
|
+
((bytes[num2 + 1] & 0xff) << 8)) |
|
|
151
|
+
((bytes[num2 + 2] & 0xff) << 0x10)) |
|
|
152
|
+
((bytes[num2 + 3] & 0xff) << 0x18);
|
|
153
|
+
num2 += 4;
|
|
154
|
+
}
|
|
155
|
+
if (len - num2 == 3) {
|
|
156
|
+
temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;
|
|
157
|
+
}
|
|
158
|
+
if (len - num2 == 2) {
|
|
159
|
+
temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;
|
|
160
|
+
}
|
|
161
|
+
if (len - num2 == 1) {
|
|
162
|
+
temp._data[num1] |= bytes[num2] & 0xff;
|
|
163
|
+
}
|
|
164
|
+
temp._version = 0;
|
|
165
|
+
return temp;
|
|
166
|
+
}
|
|
167
|
+
toString() {
|
|
168
|
+
return `${this._length} bits, ${this.countBits(true)} set`;
|
|
169
|
+
}
|
|
170
|
+
/// Performs deep comparison of two bitsets.
|
|
171
|
+
equals(other) {
|
|
172
|
+
if (this == other)
|
|
173
|
+
return true;
|
|
174
|
+
if (other == null)
|
|
175
|
+
return false;
|
|
176
|
+
if (this._length != other._length)
|
|
177
|
+
return false;
|
|
178
|
+
if (this._length == 0)
|
|
179
|
+
return true;
|
|
180
|
+
for (let i = 0; i < this._data.length - 1; i++) {
|
|
181
|
+
if (this._data[i] != other._data[i])
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
for (let i = (this._data.length - 1) * 8; i < this._length; i++) {
|
|
185
|
+
if (this.getBit(i) != other.getBit(i)) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
/** Clones a bitset. */
|
|
192
|
+
clone() {
|
|
193
|
+
const bitArray = new BitArray(0, false);
|
|
194
|
+
bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)
|
|
195
|
+
bitArray._length = this._length;
|
|
196
|
+
bitArray._version = this._version;
|
|
197
|
+
return bitArray;
|
|
198
|
+
}
|
|
199
|
+
/** Initializes a bitset. */
|
|
200
|
+
init(flag, notify) {
|
|
201
|
+
this.setAll(false, false);
|
|
202
|
+
for (let i = 0; i < this._length; i++) {
|
|
203
|
+
if (flag(i)) {
|
|
204
|
+
this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.incrementVersion(notify);
|
|
208
|
+
return this;
|
|
209
|
+
}
|
|
210
|
+
/// Inverts a bitset.
|
|
211
|
+
invert(notify = true) {
|
|
212
|
+
for (let i = 0; i < this._data.length; i++) {
|
|
213
|
+
this._data[i] ^= -1;
|
|
214
|
+
}
|
|
215
|
+
this.incrementVersion(notify);
|
|
216
|
+
}
|
|
217
|
+
/// Sets all bits to [value], optionally suppressing notifications.
|
|
218
|
+
setAll(value, notify = false) {
|
|
219
|
+
const flags = value ? -1 : 0;
|
|
220
|
+
const len = this.lengthInInts;
|
|
221
|
+
for (let i = 0; i < len; i++) {
|
|
222
|
+
this._data[i] = flags;
|
|
223
|
+
} //todo: optimize
|
|
224
|
+
this.incrementVersion(notify);
|
|
225
|
+
}
|
|
226
|
+
/// Sets bits at [indexes] position to [value].
|
|
227
|
+
/// Clears the bitset if [clear] flag is true.
|
|
228
|
+
/// Change notification is raised when [notify] is true.
|
|
229
|
+
setIndexes(indexes, value = true, clear = true, notify = true) {
|
|
230
|
+
if (clear) {
|
|
231
|
+
this.setAll(!value, false);
|
|
232
|
+
}
|
|
233
|
+
for (const i of indexes) {
|
|
234
|
+
this.setFast(i, value);
|
|
235
|
+
}
|
|
236
|
+
this.incrementVersion(notify);
|
|
237
|
+
}
|
|
238
|
+
everyIndex(indexes, value = true) {
|
|
239
|
+
for (const index of indexes) {
|
|
240
|
+
if (this.getBit(index) != value) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
anyIndex(indexes, value = true) {
|
|
247
|
+
for (const index of indexes) {
|
|
248
|
+
if (this.getBit(index) == value) {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
setWhere(check, value = true, clear = true, notify = true, allowClear = true) {
|
|
255
|
+
if (clear && allowClear) {
|
|
256
|
+
this.setAll(!value, false);
|
|
257
|
+
}
|
|
258
|
+
if (allowClear) {
|
|
259
|
+
for (let i = 0; i < this._length; i++) {
|
|
260
|
+
if (check(i)) {
|
|
261
|
+
this.setFast(i, value);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
for (let i = 0; i < this._length; i++) {
|
|
267
|
+
this.setFast(i, check(i) ? value : !value);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
this.incrementVersion(notify);
|
|
271
|
+
}
|
|
272
|
+
setRange(from, to, value, notify = true) {
|
|
273
|
+
this.assureInRange(from, 0, this._length - 1, 'from');
|
|
274
|
+
this.assureInRange(to, 0, this._length - 1, 'to');
|
|
275
|
+
const start = Math.min(from, to);
|
|
276
|
+
const end = Math.max(from, to);
|
|
277
|
+
//todo: optimize
|
|
278
|
+
if (value) {
|
|
279
|
+
for (let i = start; i <= end; i++) {
|
|
280
|
+
this.setTrue(i);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
for (let i = start; i <= end; i++) {
|
|
285
|
+
this.setFalse(i);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
this.incrementVersion(notify);
|
|
289
|
+
return this;
|
|
290
|
+
}
|
|
291
|
+
/// Sets n randomly chosen bits to value, remaining bits to !value.
|
|
292
|
+
setRandom(n, value, notify = true) {
|
|
293
|
+
if (n < 0 || n > this._length) {
|
|
294
|
+
throw new Error('n must be >= 0 && <= Count');
|
|
295
|
+
}
|
|
296
|
+
if (n > this._length / 2) {
|
|
297
|
+
this.setRandom(this._length - n, !value);
|
|
298
|
+
}
|
|
299
|
+
this.setAll(!value);
|
|
300
|
+
for (let k = 0; k < n;) {
|
|
301
|
+
const i = Math.floor(Math.random() * this._length);
|
|
302
|
+
if (this.getBit(i) == value)
|
|
303
|
+
continue;
|
|
304
|
+
this.setFast(i, value);
|
|
305
|
+
k++;
|
|
306
|
+
}
|
|
307
|
+
this.incrementVersion(notify);
|
|
308
|
+
}
|
|
309
|
+
/// Modifies current bitset by performing the bitwise AND operation against the
|
|
310
|
+
/// corresponding elements in the specified bitset.
|
|
311
|
+
and(value, notify = true) {
|
|
312
|
+
if (this._length != value._length) {
|
|
313
|
+
throw new Error('Array lengths differ.');
|
|
314
|
+
}
|
|
315
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
316
|
+
this._data[i] &= value._data[i];
|
|
317
|
+
}
|
|
318
|
+
this.incrementVersion(notify);
|
|
319
|
+
return this;
|
|
320
|
+
}
|
|
321
|
+
/// Performs the bitwise AND NOT operation on the elements in the current bitset
|
|
322
|
+
/// against the corresponding elements in the specified bitset.
|
|
323
|
+
andNot(value, notify = true) {
|
|
324
|
+
if (this._length != value._length) {
|
|
325
|
+
throw new Error('Array lengths differ.');
|
|
326
|
+
}
|
|
327
|
+
const len = this.lengthInInts;
|
|
328
|
+
for (let num2 = 0; num2 < len; num2++) {
|
|
329
|
+
this._data[num2] &= ~value._data[num2];
|
|
330
|
+
}
|
|
331
|
+
this.incrementVersion(notify);
|
|
332
|
+
return this;
|
|
333
|
+
}
|
|
334
|
+
/// Performs the bitwise NOT AND operation on the elements in the current bitset
|
|
335
|
+
/// against the corresponding elements in the specified bitset.
|
|
336
|
+
notAnd(value, notify = true) {
|
|
337
|
+
if (this._length != value._length) {
|
|
338
|
+
throw new Error('Array lengths differ.');
|
|
339
|
+
}
|
|
340
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
341
|
+
this._data[i] = (~this._data[i]) & value._data[i];
|
|
342
|
+
}
|
|
343
|
+
this.incrementVersion(notify);
|
|
344
|
+
return this;
|
|
345
|
+
}
|
|
346
|
+
/// Inverts all bit values in the current bitset
|
|
347
|
+
not(notify = true) {
|
|
348
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
349
|
+
this._data[i] = ~this._data[i];
|
|
350
|
+
}
|
|
351
|
+
this.incrementVersion(notify);
|
|
352
|
+
return this;
|
|
353
|
+
}
|
|
354
|
+
/// Performs the bitwise OR operation on the elements in the current bitset
|
|
355
|
+
/// against the corresponding elements in the specified bitset.
|
|
356
|
+
or(value, notify = true) {
|
|
357
|
+
if (this._length != value._length) {
|
|
358
|
+
throw new Error('Array lengths differ.');
|
|
359
|
+
}
|
|
360
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
361
|
+
this._data[i] |= value._data[i];
|
|
362
|
+
}
|
|
363
|
+
this.incrementVersion(notify);
|
|
364
|
+
return this;
|
|
365
|
+
}
|
|
366
|
+
/// Performs the bitwise exclusive OR operation on the elements in the current bitset
|
|
367
|
+
/// against the corresponding elements in the specified bitset.
|
|
368
|
+
xor(value, notify = true) {
|
|
369
|
+
if (this._length != value._length) {
|
|
370
|
+
throw new Error('Array lengths differ.');
|
|
371
|
+
}
|
|
372
|
+
for (let i = 0, len = this.lengthInInts; i < len; i++) {
|
|
373
|
+
this._data[i] ^= value._data[i];
|
|
374
|
+
}
|
|
375
|
+
this.incrementVersion(notify);
|
|
376
|
+
return this;
|
|
377
|
+
}
|
|
378
|
+
/// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.
|
|
379
|
+
insertAt(pos, n, flag = false) {
|
|
380
|
+
this.assureInRange(pos, 0, this._length, 'pos');
|
|
381
|
+
if (n == 0)
|
|
382
|
+
return;
|
|
383
|
+
//TODO: optimize
|
|
384
|
+
//the most primitive implementation, optimize it later!
|
|
385
|
+
// beginUpdate();
|
|
386
|
+
const oldlength = this._length;
|
|
387
|
+
this.setLength(this._length + n);
|
|
388
|
+
//if (!contains(!flag)) return; // nothing to do
|
|
389
|
+
for (let i = oldlength - 1; i >= pos; i--) {
|
|
390
|
+
this.setBit(i + n, this.getBit(i));
|
|
391
|
+
}
|
|
392
|
+
for (let i = pos; i < pos + n; i++) {
|
|
393
|
+
this.setBit(i, flag);
|
|
394
|
+
}
|
|
395
|
+
// endUpdate();
|
|
396
|
+
}
|
|
397
|
+
/// Deletes n bits beginning at position pos, resizing self and shifting remaining
|
|
398
|
+
/// bits appropriately.
|
|
399
|
+
removeAt(pos, n = 1) {
|
|
400
|
+
// the most primitive implementation, optimize it later!
|
|
401
|
+
if (n < 0) {
|
|
402
|
+
throw new Error('n cannot be negative');
|
|
403
|
+
}
|
|
404
|
+
this.assureInRange(pos, 0, this._length - n, 'pos');
|
|
405
|
+
if (this.contains(true)) {
|
|
406
|
+
for (let i = pos; i < this._length - n; i++) {
|
|
407
|
+
this.setBit(i, this.getBit(i + n));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
this.setLength(this._length - n);
|
|
411
|
+
}
|
|
412
|
+
removeByMask(mask, flag = true) {
|
|
413
|
+
if (this._length != mask.length) {
|
|
414
|
+
throw new Error('length != mask.length');
|
|
415
|
+
}
|
|
416
|
+
if (mask == this) { // no need to iterate
|
|
417
|
+
this.setLength(mask.countBits(!flag));
|
|
418
|
+
this.setAll(!flag);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
let dstIdx = 0;
|
|
422
|
+
for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;) {
|
|
423
|
+
this.setFast(dstIdx++, this.getBit(srcIdx));
|
|
424
|
+
}
|
|
425
|
+
this._length = dstIdx;
|
|
426
|
+
this._version++;
|
|
427
|
+
}
|
|
428
|
+
return this;
|
|
429
|
+
}
|
|
430
|
+
/// Similar to the [] operator.
|
|
431
|
+
getBit(pos) {
|
|
432
|
+
return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;
|
|
433
|
+
}
|
|
434
|
+
/// Similar to the [] operator.
|
|
435
|
+
setBit(pos, bit, notify = true) {
|
|
436
|
+
this.setFast(pos, bit);
|
|
437
|
+
if (notify) {
|
|
438
|
+
this._version++;
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
this._version++;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/// Sets [i]-th bit to [value], does not check bounds, does not increment version
|
|
445
|
+
setFast(i, value) {
|
|
446
|
+
if (value) {
|
|
447
|
+
this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
setTrue(pos) {
|
|
454
|
+
this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);
|
|
455
|
+
}
|
|
456
|
+
setFalse(pos) {
|
|
457
|
+
this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));
|
|
458
|
+
}
|
|
459
|
+
trueCount() {
|
|
460
|
+
return this.countBits(true);
|
|
461
|
+
}
|
|
462
|
+
falseCount() {
|
|
463
|
+
return this.countBits(false);
|
|
464
|
+
}
|
|
465
|
+
/// Counts bits of the specified value.
|
|
466
|
+
countBits(value) {
|
|
467
|
+
if (this._length == 0)
|
|
468
|
+
return 0;
|
|
469
|
+
if (this._selectedCountVersion != this._version) {
|
|
470
|
+
this._selectedCount = 0;
|
|
471
|
+
const len = this.lengthInInts;
|
|
472
|
+
let i = 0;
|
|
473
|
+
for (; i < len - 1; i++) {
|
|
474
|
+
for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint
|
|
475
|
+
this._selectedCount += BitArray._onBitCount[k & 0xff];
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// The last int.
|
|
479
|
+
let k = this._data[i];
|
|
480
|
+
const remainingBits = this._length & 0x1f;
|
|
481
|
+
if (remainingBits != 0) { // if remainingBits == 0, the last int is fully used and ALL bits should be left as is.
|
|
482
|
+
k &= ~((4294967295) << remainingBits);
|
|
483
|
+
}
|
|
484
|
+
for (; k != 0; k >>>= 8) {
|
|
485
|
+
this._selectedCount += BitArray._onBitCount[k & 0xff];
|
|
486
|
+
}
|
|
487
|
+
this._selectedCountVersion = this._version;
|
|
488
|
+
}
|
|
489
|
+
return (value ? this._selectedCount : this._length - this._selectedCount);
|
|
490
|
+
}
|
|
491
|
+
/// Returns a number of set bits where also [check] is true
|
|
492
|
+
countWhere(check) {
|
|
493
|
+
let result = 0;
|
|
494
|
+
if (this.trueCount() == this._length) {
|
|
495
|
+
for (let i = 0; i < this._length; i++) {
|
|
496
|
+
result += check(i) ? 1 : 0;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
for (let i = -1; (i = this.findNext(i, true)) != -1;) {
|
|
501
|
+
result += check(i) ? 1 : 0;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return result;
|
|
505
|
+
}
|
|
506
|
+
/// Performs bit "and" and counts bits of the specified value, without bitset modification.
|
|
507
|
+
andWithCountBits(second, value) {
|
|
508
|
+
if (this._length == 0)
|
|
509
|
+
return 0;
|
|
510
|
+
let count = 0;
|
|
511
|
+
const len = this.lengthInInts;
|
|
512
|
+
let i = 0;
|
|
513
|
+
for (; i < len - 1; i++) {
|
|
514
|
+
for (var k = this._data[i] & second._data[i]; k != 0; k >>>= 8) {
|
|
515
|
+
count += BitArray._onBitCount[k & 0xff];
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// The last int.
|
|
519
|
+
var k = this._data[i] & second._data[i];
|
|
520
|
+
const remainingBits = this._length & 0x1f;
|
|
521
|
+
if (remainingBits != 0) {
|
|
522
|
+
k &= ~((4294967295) << remainingBits);
|
|
523
|
+
}
|
|
524
|
+
for (; k != 0; k >>>= 8) {
|
|
525
|
+
count += BitArray._onBitCount[k & 0xff];
|
|
526
|
+
}
|
|
527
|
+
return (value ? count : this._length - count);
|
|
528
|
+
}
|
|
529
|
+
clear() {
|
|
530
|
+
this.setLength(0);
|
|
531
|
+
}
|
|
532
|
+
contains(value) {
|
|
533
|
+
return this.findNext(-1, value) >= 0;
|
|
534
|
+
}
|
|
535
|
+
get allTrue() {
|
|
536
|
+
return this.countBits(true) == this._length;
|
|
537
|
+
}
|
|
538
|
+
get allFalse() {
|
|
539
|
+
return this.countBits(false) == this._length;
|
|
540
|
+
}
|
|
541
|
+
get anyTrue() {
|
|
542
|
+
return this.countBits(true) > 0;
|
|
543
|
+
}
|
|
544
|
+
get anyFalse() {
|
|
545
|
+
return this.countBits(false) > 0;
|
|
546
|
+
}
|
|
547
|
+
/// Returns the position of the next bit of the specified value, starting from the specified position.
|
|
548
|
+
/// Returns -1, if there are no such bits.
|
|
549
|
+
findNext(index, value = true) {
|
|
550
|
+
this.assureInRange(index, -1, this._length, 'index');
|
|
551
|
+
if (index >= this._length - 1)
|
|
552
|
+
return -1;
|
|
553
|
+
index = index < 0 ? 0 : index + 1; // skip start
|
|
554
|
+
let unusedBits = index & 0x1f;
|
|
555
|
+
const numInts = this.lengthInInts;
|
|
556
|
+
for (let i = Math.floor(index / 32); i < numInts; i++) {
|
|
557
|
+
let k = (value ? this._data[i] : ~this._data[i]); // uint cast
|
|
558
|
+
if (unusedBits != 0) {
|
|
559
|
+
k &= ((0xffffffff << unusedBits) & 0xffffffff);
|
|
560
|
+
unusedBits = 0;
|
|
561
|
+
}
|
|
562
|
+
else if (!value && k == -4294967296) // looking for false, all bits are set
|
|
563
|
+
{
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
566
|
+
for (let j = 0; k != 0; j += 8, k >>>= 8) {
|
|
567
|
+
const p = BitArray._firstOnBit[k & 0xff];
|
|
568
|
+
if (p >= 0) {
|
|
569
|
+
index = p + (i * 32) + j;
|
|
570
|
+
if (index >= this._length)
|
|
571
|
+
return -1;
|
|
572
|
+
return index;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return -1;
|
|
577
|
+
}
|
|
578
|
+
/// Finds previous bit of the specified value in the bitset.
|
|
579
|
+
findPrev(index, value = true) {
|
|
580
|
+
if (index == 0)
|
|
581
|
+
return -1;
|
|
582
|
+
this.assureInRange(index, -1, this._length, 'index');
|
|
583
|
+
index = index < 0 ? this._length - 1 : index - 1; // skip start
|
|
584
|
+
const lastIntIdx = Math.floor(index / 0x20);
|
|
585
|
+
let remainingBits = (index + 1) & 0x1f;
|
|
586
|
+
for (let i = lastIntIdx; i >= 0; i--) {
|
|
587
|
+
let k = (value ? this._data[i] : ~this._data[i]); // cast
|
|
588
|
+
if (remainingBits != 0) {
|
|
589
|
+
k &= ~((4294967295) << remainingBits);
|
|
590
|
+
remainingBits = 0;
|
|
591
|
+
}
|
|
592
|
+
for (let j = 24; k != 0; j -= 8, k <<= 8) {
|
|
593
|
+
const p = BitArray._lastOnBit[k >>> 0x18];
|
|
594
|
+
if (p >= 0) {
|
|
595
|
+
return p + (i * 32) + j;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
return -1;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
BitArray._onBitCount = Int8Array.from([
|
|
603
|
+
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
|
|
604
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
605
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
606
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
607
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
608
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
609
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
610
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
611
|
+
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
612
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
613
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
614
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
615
|
+
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
616
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
617
|
+
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
618
|
+
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
|
|
619
|
+
]);
|
|
620
|
+
BitArray._firstOnBit = Int8Array.from([
|
|
621
|
+
-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
622
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
623
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
624
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
625
|
+
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
626
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
627
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
628
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
629
|
+
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
630
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
631
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
632
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
633
|
+
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
634
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
635
|
+
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
636
|
+
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
|
|
637
|
+
]);
|
|
638
|
+
BitArray._lastOnBit = Int8Array.from([
|
|
639
|
+
-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
640
|
+
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
641
|
+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
642
|
+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
643
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
644
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
645
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
646
|
+
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
647
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
648
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
649
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
650
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
651
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
652
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
653
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
654
|
+
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
|
655
|
+
]);
|
|
656
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQWtFM0IsWUFBWSxNQUFjLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFWaEQsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLElBQUksWUFBWSxFQUFFO1lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNwQjtTQUNGO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUNyQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE9BQU8sOEJBQThCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLE9BQWU7UUFDcEUsSUFBSSxDQUFDLEtB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Q0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xyXG4gIHN0YXRpYyBfb25CaXRDb3VudCA9IEludDhBcnJheS5mcm9tKFtcclxuICAgIDAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsXHJcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxyXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcclxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXHJcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxyXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcclxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXHJcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxyXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcclxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcclxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXHJcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxyXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcclxuICAgIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsIDUsIDYsIDYsIDcsIDYsIDcsIDcsIDhdKTtcclxuXHJcbiAgc3RhdGljIF9maXJzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xyXG4gICAgLTEsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNywgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDYsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDBdKTtcclxuXHJcbiAgc3RhdGljIF9sYXN0T25CaXQgPSBJbnQ4QXJyYXkuZnJvbShbXHJcbiAgICAtMSwgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMyxcclxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXHJcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxyXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcclxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXHJcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxyXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcclxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgN10pO1xyXG5cclxuICBfZGF0YTogVWludDMyQXJyYXk7XHJcbiAgX2xlbmd0aCA9IDA7XHJcbiAgX3ZlcnNpb24gPSAwO1xyXG4gIF91cGRhdGVMZXZlbCA9IDA7XHJcbiAgX3NlbGVjdGVkQ291bnQgPSAwO1xyXG4gIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xyXG4gIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XHJcbiAgX3ZlcnNpb25lZE5hbWUgPSAnJztcclxuICBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcclxuICBTSFJJTktfVEhSRVNIT0xEID0gMHgxMDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fbGVuZ3RoID0gbGVuZ3RoO1xyXG4gICAgdGhpcy5fZGF0YSA9IEJpdEFycmF5Ll9jcmVhdGVCdWZmZXIobGVuZ3RoKTtcclxuXHJcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuX2RhdGFbaV0gPSAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXNzdXJlR29leihudW06IG51bWJlciwgYXJnTmFtZTogU3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xyXG4gIH1cclxuXHJcbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCh2YWx1ZSA8IG1pbikgfHwgKHZhbHVlID4gbWF4KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG90aGVyLl9sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvcHkob3RoZXIuX2RhdGEsIHRoaXMuX2RhdGEsIHRoaXMubGVuZ3RoSW5JbnRzKTtcclxuICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICB9XHJcblxyXG4gIGdldCBsZW5ndGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJ1ZmZlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgc2V0IGJ1ZmZlcihkYXRhOiBVaW50MzJBcnJheSkge1xyXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLl92ZXJzaW9uKys7XHJcbiAgfVxyXG5cclxuICBnZXQgdmVyc2lvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZlcnNpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmVyc2lvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaW5jcmVtZW50VmVyc2lvbihub3RpZnkgPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl92ZXJzaW9uKys7XHJcbiAgfVxyXG5cclxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xyXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKHRoaXMuX2xlbmd0aCArIDB4MWYpIC8gMHgyMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmVyc2lvbmVkTmFtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uID09IHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID8gdGhpcy5fdmVyc2lvbmVkTmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZlcnNpb25lZE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcclxuICAgIHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICB9XHJcblxyXG4gIGdldCBzZWxmKCkge1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRMZW5ndGgodmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBiZSA+PSAwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlID09IHRoaXMuX2xlbmd0aCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbkludHNOZWVkZWQgPSBNYXRoLmZsb29yKCh2YWx1ZSArIDB4MWYpIC8gMHgyMCk7XHJcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDMyQXJyYXkobkludHNOZWVkZWQpO1xyXG4gICAgICB0aGlzLmNvcHkodGhpcy5fZGF0YSwgbmV3RGF0YSwgKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpID8gdGhpcy5fZGF0YS5sZW5ndGggOiBuSW50c05lZWRlZCk7XHJcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5fbGVuZ3RoICUgMHgyMCA+IDApIHtcclxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZGF0YS5maWxsKDAsIHRoaXMubGVuZ3RoSW5JbnRzLCBuSW50c05lZWRlZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcclxuICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmcm9tQW5kKHNldDE6IEJpdEFycmF5LCBzZXQyOiBCaXRBcnJheSk6IEJpdEFycmF5IHtcclxuICAgIGlmIChzZXQxLl9sZW5ndGggIT0gc2V0Mi5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGVuZ3RocyBkaWZmZXIgKCR7c2V0MS5fbGVuZ3RofSAhPSAke3NldDIuX2xlbmd0aH0pYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xyXG4gICAgdGVtcC5fbGVuZ3RoID0gc2V0MS5fbGVuZ3RoO1xyXG4gICAgdGVtcC5fZGF0YSA9IEJpdEFycmF5Ll9jcmVhdGVCdWZmZXIodGVtcC5fbGVuZ3RoKTtcclxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xyXG5cclxuICAgIGNvbnN0IGxlbiA9IHNldDEubGVuZ3RoSW5JbnRzO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0ZW1wLl9kYXRhW2ldID0gc2V0MS5fZGF0YVtpXSAmIHNldDIuX2RhdGFbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBfY3JlYXRlQnVmZmVyKGxlbmd0aDogbnVtYmVyKTogVWludDMyQXJyYXkge1xyXG4gICAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW5ndGggKyAweDFmKSAvIDB4MjApKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmcm9tVmFsdWVzKHZhbHVlczogQXJyYXk8Ym9vbGVhbj4pOiBCaXRBcnJheSB7XHJcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xyXG4gICAgdGVtcC5fdmVyc2lvbiA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodmFsdWVzW2ldKSB7XHJcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxyXG4gIHN0YXRpYyBmcm9tU2VxKGNvdW50OiBudW1iZXIsIGZsYWc6IEZ1bmN0aW9uKTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShjb3VudCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcclxuICAgICAgdGVtcC5zZXRCaXQoaSwgZmxhZyhpKSk7XHJcbiAgICB9XHJcbiAgICB0ZW1wLl92ZXJzaW9uID0gMDtcclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXHJcbiAgc3RhdGljIGZyb21TdHJpbmcoczogc3RyaW5nKTogQml0QXJyYXkge1xyXG4gICAgcmV0dXJuIEJpdEFycmF5LmZyb21TZXEocy5sZW5ndGgsIChpOiBudW1iZXIpID0+IHMuY2hhckF0KGkpID09ICcxJyk7XHJcbiAgfVxyXG5cclxuICAvLy8gQ29uc3RydWN0cyBhIFtCaXRTZXRdLCBiYXNlZCBvbiBsZW5ndGggW19sZW5ndGhdIGFuZCBieXRlIGFycmF5IFtfZGF0YV0uXHJcbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcclxuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkoX2xlbmd0aCk7XHJcbiAgICB0ZW1wLl9kYXRhID0gX2RhdGE7XHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXHJcbiAgc3RhdGljIGZyb21CeXRlcyhieXRlczogVWludDhBcnJheSk6IEJpdEFycmF5IHtcclxuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmxlbmd0aDtcclxuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XHJcbiAgICB0ZW1wLl9kYXRhID0gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbiArIDMpIC8gNCkpO1xyXG4gICAgdGVtcC5fbGVuZ3RoID0gbGVuICogODtcclxuICAgIGxldCBudW0xID0gMDsgbGV0IG51bTIgPSAwO1xyXG5cclxuICAgIHdoaWxlICgobGVuIC0gbnVtMikgPj0gNCkge1xyXG4gICAgICB0ZW1wLl9kYXRhW251bTErK10gPSAoXHJcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHxcclxuICAgICAgICAoKGJ5dGVzW251bTIgKyAxXSAmIDB4ZmYpIDw8IDgpKSB8XHJcbiAgICAgICAgKChieXRlc1tudW0yICsgMl0gJiAweGZmKSA8PCAweDEwKSkgfFxyXG4gICAgICAgICgoYnl0ZXNbbnVtMiArIDNdICYgMHhmZikgPDwgMHgxOCk7XHJcblxyXG4gICAgICBudW0yICs9IDQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxlbiAtIG51bTIgPT0gMykge1xyXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxlbiAtIG51bTIgPT0gMikge1xyXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsZW4gLSBudW0yID09IDEpIHtcclxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSBieXRlc1tudW0yXSAmIDB4ZmY7XHJcbiAgICB9XHJcblxyXG4gICAgdGVtcC5fdmVyc2lvbiA9IDA7XHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cclxuICBlcXVhbHMob3RoZXI6IEJpdEFycmF5KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gKHRoaXMuX2RhdGEubGVuZ3RoIC0gMSkgKiA4OyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xvbmVzIGEgYml0c2V0LiAqL1xyXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcclxuICAgIGNvbnN0IGJpdEFycmF5ID0gbmV3IEJpdEFycmF5KDAsIGZhbHNlKTtcclxuICAgIGJpdEFycmF5Ll9kYXRhID0gVWludDMyQXJyYXkuZnJvbSh0aGlzLl9kYXRhKTsgLy8gZWZmZWN0aXZlIGxlbmd0aDogKGxlbmd0aEluSW50cylcclxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XHJcbiAgICBiaXRBcnJheS5fdmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XHJcbiAgICByZXR1cm4gYml0QXJyYXk7XHJcbiAgfVxyXG5cclxuICAvKiogSW5pdGlhbGl6ZXMgYSBiaXRzZXQuICovXHJcbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xyXG4gICAgdGhpcy5zZXRBbGwoZmFsc2UsIGZhbHNlKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChmbGFnKGkpKSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBJbnZlcnRzIGEgYml0c2V0LlxyXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxyXG4gIHNldEFsbCh2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZsYWdzID0gdmFsdWUgPyAtMSA6IDA7XHJcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcclxuICAgIH0gLy90b2RvOiBvcHRpbWl6ZVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cclxuICAvLy8gQ2xlYXJzIHRoZSBiaXRzZXQgaWYgW2NsZWFyXSBmbGFnIGlzIHRydWUuXHJcbiAgLy8vIENoYW5nZSBub3RpZmljYXRpb24gaXMgcmFpc2VkIHdoZW4gW25vdGlmeV0gaXMgdHJ1ZS5cclxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlPXRydWUsIGNsZWFyPXRydWUsIG5vdGlmeT10cnVlKTogdm9pZCB7XHJcbiAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGV4ZXMpIHtcclxuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICB9XHJcblxyXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWU9dHJ1ZSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdldEJpdChpbmRleCkgIT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWU9dHJ1ZSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdldEJpdChpbmRleCkgPT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZT10cnVlLCBjbGVhcj10cnVlLCBub3RpZnk9dHJ1ZSwgYWxsb3dDbGVhcj10cnVlKTogdm9pZCB7XHJcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcikge1xyXG4gICAgICB0aGlzLnNldEFsbCghdmFsdWUsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWxsb3dDbGVhcikge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGNoZWNrKGkpKSB7XHJcbiAgICAgICAgICB0aGlzLnNldEZhc3QoaSwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gIH1cclxuXHJcbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5PXRydWUpOiBCaXRBcnJheSB7XHJcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZSh0bywgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ3RvJyk7XHJcblxyXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XHJcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1heChmcm9tLCB0byk7XHJcblxyXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgIHRoaXMuc2V0VHJ1ZShpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gU2V0cyBuIHJhbmRvbWx5IGNob3NlbiBiaXRzIHRvIHZhbHVlLCByZW1haW5pbmcgYml0cyB0byAhdmFsdWUuXHJcbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeT10cnVlKTogdm9pZCB7XHJcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ24gbXVzdCBiZSA+PSAwICYmIDw9IENvdW50Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG4gPiB0aGlzLl9sZW5ndGggLyAyKSB7XHJcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRBbGwoIXZhbHVlKTtcclxuXHJcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IG47ICkge1xyXG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5fbGVuZ3RoKTtcclxuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpID09IHZhbHVlKSBjb250aW51ZTtcclxuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcclxuICAgICAgaysrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIE1vZGlmaWVzIGN1cnJlbnQgYml0c2V0IGJ5IHBlcmZvcm1pbmcgdGhlIGJpdHdpc2UgQU5EIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZVxyXG4gIC8vLyBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeT10cnVlKTogQml0QXJyYXkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcclxuICAvLy8gYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGJpdHNldC5cclxuICBhbmROb3QodmFsdWU6IEJpdEFycmF5LCBub3RpZnk9dHJ1ZSk6IEJpdEFycmF5IHtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xyXG4gICAgZm9yIChsZXQgbnVtMiA9IDA7IG51bTIgPCBsZW47IG51bTIrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcclxuICAvLy8gYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGJpdHNldC5cclxuICBub3RBbmQodmFsdWU6IEJpdEFycmF5LCBub3RpZnk9dHJ1ZSk6IEJpdEFycmF5IHtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSAofnRoaXMuX2RhdGFbaV0pICYgdmFsdWUuX2RhdGFbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBJbnZlcnRzIGFsbCBiaXQgdmFsdWVzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcclxuICAvLy8gYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGJpdHNldC5cclxuICBvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcclxuICAvLy8gYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGJpdHNldC5cclxuICB4b3IodmFsdWU6IEJpdEFycmF5LCBub3RpZnkgPSB0cnVlKSB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cclxuICBpbnNlcnRBdChwb3M6IG51bWJlciwgbjogbnVtYmVyLCBmbGFnID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCwgJ3BvcycpO1xyXG5cclxuICAgIGlmIChuID09IDApIHJldHVybjtcclxuXHJcbiAgICAvL1RPRE86IG9wdGltaXplXHJcbiAgICAvL3RoZSBtb3N0IHByaW1pdGl2ZSBpbXBsZW1lbnRhdGlvbiwgb3B0aW1pemUgaXQgbGF0ZXIhXHJcblxyXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcclxuICAgIGNvbnN0IG9sZGxlbmd0aCA9IHRoaXMuX2xlbmd0aDtcclxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCArIG4pO1xyXG5cclxuICAgIC8vaWYgKCFjb250YWlucyghZmxhZykpIHJldHVybjsgLy8gbm90aGluZyB0byBkb1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7XHJcbiAgICAgIHRoaXMuc2V0Qml0KGkgKyBuLCB0aGlzLmdldEJpdChpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHBvcyArIG47IGkrKykge1xyXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlbmRVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vLyBEZWxldGVzIG4gYml0cyBiZWdpbm5pbmcgYXQgcG9zaXRpb24gcG9zLCByZXNpemluZyBzZWxmIGFuZCBzaGlmdGluZyByZW1haW5pbmdcclxuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxyXG4gIHJlbW92ZUF0KHBvczogbnVtYmVyLCBuID0gMSk6IHZvaWQge1xyXG4gICAgLy8gdGhlIG1vc3QgcHJpbWl0aXZlIGltcGxlbWVudGF0aW9uLCBvcHRpbWl6ZSBpdCBsYXRlciFcclxuICAgIGlmIChuIDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ24gY2Fubm90IGJlIG5lZ2F0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoIC0gbiwgJ3BvcycpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCB0aGlzLl9sZW5ndGggLSBuOyBpKyspIHtcclxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoIC0gbik7XHJcbiAgfVxyXG5cclxuICByZW1vdmVCeU1hc2sobWFzazogQml0QXJyYXksIGZsYWcgPSB0cnVlKTogQml0QXJyYXkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBtYXNrLmxlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xlbmd0aCAhPSBtYXNrLmxlbmd0aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXHJcbiAgICAgIHRoaXMuc2V0TGVuZ3RoKG1hc2suY291bnRCaXRzKCFmbGFnKSk7XHJcbiAgICAgIHRoaXMuc2V0QWxsKCFmbGFnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBkc3RJZHggPSAwO1xyXG5cclxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspIHtcclxuICAgICAgICB0aGlzLnNldEZhc3QoZHN0SWR4KyssIHRoaXMuZ2V0Qml0KHNyY0lkeCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9sZW5ndGggPSBkc3RJZHg7XHJcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cclxuICBnZXRCaXQocG9zOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmICgxIDw8IChwb3MgJiAweDFmKSkpICE9IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gU2ltaWxhciB0byB0aGUgW10gb3BlcmF0b3IuXHJcbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcclxuICAgIHRoaXMuc2V0RmFzdChwb3MsIGJpdCk7XHJcbiAgICBpZiAobm90aWZ5KSB7XHJcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyBTZXRzIFtpXS10aCBiaXQgdG8gW3ZhbHVlXSwgZG9lcyBub3QgY2hlY2sgYm91bmRzLCBkb2VzIG5vdCBpbmNyZW1lbnQgdmVyc2lvblxyXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldICY9IH4oMSA8PCAoaSAmIDB4MWYpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFRydWUocG9zOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihwb3MgLyAweDIwKV0gfD0gMSA8PCAocG9zICYgMHgxZik7XHJcbiAgfVxyXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICY9IH4oMSA8PCAocG9zICYgMHgxZikpO1xyXG4gIH1cclxuXHJcbiAgdHJ1ZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSk7XHJcbiAgfVxyXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gQ291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICBjb3VudEJpdHModmFsdWU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcclxuXHJcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRDb3VudFZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcclxuICAgICAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7XHJcbiAgICAgIGxldCBpID0gMDtcclxuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcclxuICAgICAgICBmb3IgKGxldCBrID0gdGhpcy5fZGF0YVtpXTsgayAhPSAwOyBrID4+Pj0gOCkgeyAvL3RvZG86IGNhc3QgZGF0YVtpXSB0byB1aW50XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZENvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZSBsYXN0IGludC5cclxuICAgICAgbGV0IGsgPSB0aGlzLl9kYXRhW2ldO1xyXG4gICAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcclxuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgey8vIGlmIHJlbWFpbmluZ0JpdHMgPT0gMCwgdGhlIGxhc3QgaW50IGlzIGZ1bGx5IHVzZWQgYW5kIEFMTCBiaXRzIHNob3VsZCBiZSBsZWZ0IGFzIGlzLlxyXG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoOyBrICE9IDA7IGsgPj4+PSA4KSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRDb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnRWZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKHZhbHVlID8gdGhpcy5fc2VsZWN0ZWRDb3VudCA6IHRoaXMuX2xlbmd0aCAtIHRoaXMuX3NlbGVjdGVkQ291bnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIFJldHVybnMgYSBudW1iZXIgb2Ygc2V0IGJpdHMgd2hlcmUgYWxzbyBbY2hlY2tdIGlzIHRydWVcclxuICBjb3VudFdoZXJlKGNoZWNrOiBGdW5jdGlvbik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGlmICh0aGlzLnRydWVDb3VudCgpID09IHRoaXMuX2xlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcmVzdWx0ICs9IGNoZWNrKGkpID8gMSA6IDA7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAtMTsgKGkgPSB0aGlzLmZpbmROZXh0KGksIHRydWUpKSAhPSAtMTspIHtcclxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxyXG4gIGFuZFdpdGhDb3VudEJpdHMoc2Vjb25kOiBCaXRBcnJheSwgdmFsdWU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcclxuXHJcbiAgICBsZXQgY291bnQgPSAwOyBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgbGV0IGkgPSAwO1xyXG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcclxuICAgICAgZm9yICh2YXIgayA9IHRoaXMuX2RhdGFbaV0gJiBzZWNvbmQuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHtcclxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgbGFzdCBpbnQuXHJcbiAgICB2YXIgayA9IHRoaXMuX2RhdGFbaV0gJiBzZWNvbmQuX2RhdGFbaV07XHJcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcclxuICAgIGlmIChyZW1haW5pbmdCaXRzICE9IDApIHtcclxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcclxuICAgIH1cclxuICAgIGZvciAoOyBrICE9IDA7IGsgPj4+PSA4KSB7XHJcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKHZhbHVlID8gY291bnQgOiB0aGlzLl9sZW5ndGggLSBjb3VudCk7XHJcbiAgfVxyXG5cclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xyXG4gIH1cclxuICBjb250YWlucyh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZE5leHQoLTEsIHZhbHVlKSA+PSAwO1xyXG4gIH1cclxuICBnZXQgYWxsVHJ1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKSA9PSB0aGlzLl9sZW5ndGg7XHJcbiAgfVxyXG4gIGdldCBhbGxGYWxzZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xyXG4gIH1cclxuICBnZXQgYW55VHJ1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKSA+IDA7XHJcbiAgfVxyXG4gIGdldCBhbnlGYWxzZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGJpdCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uXHJcbiAgLy8vIFJldHVybnMgLTEsIGlmIHRoZXJlIGFyZSBubyBzdWNoIGJpdHMuXHJcbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShpbmRleCwgLTEsIHRoaXMuX2xlbmd0aCwgJ2luZGV4Jyk7XHJcblxyXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcclxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gMCA6IGluZGV4ICsgMTsgLy8gc2tpcCBzdGFydFxyXG4gICAgbGV0IHVudXNlZEJpdHMgPSBpbmRleCAmIDB4MWY7XHJcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IE1hdGguZmxvb3IoaW5kZXggLyAzMik7IGkgPCBudW1JbnRzOyBpKyspIHtcclxuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcclxuICAgICAgaWYgKHVudXNlZEJpdHMgIT0gMCkge1xyXG4gICAgICAgIGsgJj0gKCgweGZmZmZmZmZmIDw8IHVudXNlZEJpdHMpICYgMHhmZmZmZmZmZik7XHJcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmIGsgPT0gLTQyOTQ5NjcyOTYpIC8vIGxvb2tpbmcgZm9yIGZhbHNlLCBhbGwgYml0cyBhcmUgc2V0XHJcbiAgICAgIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGsgIT0gMDsgaiArPSA4LCBrID4+Pj0gOCkge1xyXG4gICAgICAgIGNvbnN0IHAgPSBCaXRBcnJheS5fZmlyc3RPbkJpdFtrICYgMHhmZl07XHJcbiAgICAgICAgaWYgKHAgPj0gMCkge1xyXG4gICAgICAgICAgaW5kZXggPSBwICsgKGkgKiAzMikgKyBqO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8vIEZpbmRzIHByZXZpb3VzIGJpdCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoZSBiaXRzZXQuXHJcbiAgZmluZFByZXYoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcclxuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XHJcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xyXG5cclxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxyXG5cclxuICAgIGNvbnN0IGxhc3RJbnRJZHggPSBNYXRoLmZsb29yKGluZGV4IC8gMHgyMCk7XHJcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gbGFzdEludElkeDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XHJcbiAgICAgIGlmIChyZW1haW5pbmdCaXRzICE9IDApIHtcclxuICAgICAgICBrICY9IH4oKDQyOTQ5NjcyOTUpIDw8IHJlbWFpbmluZ0JpdHMpO1xyXG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGogPSAyNDsgayAhPSAwOyBqIC09IDgsIGsgPDw9IDgpIHtcclxuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcclxuICAgICAgICBpZiAocCA+PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcbn1cclxuIl19
|