@oathompsonjones/mini-games 1.0.0

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.
@@ -0,0 +1,206 @@
1
+ export type StringType = 2 | 10 | 16;
2
+ /**
3
+ * Represents a long integer using an array of 32-bit numbers.
4
+ * Provides static methods for bitwise operations which do not modify the original values.
5
+ * Provides non-static equivalents to the above operations, which are carried out in place.
6
+ */
7
+ export default class LongInt {
8
+ /**
9
+ * Holds the array of 32-bit numbers.
10
+ */
11
+ readonly data: Uint32Array;
12
+ /**
13
+ * Creates an instance of LongInt.
14
+ *
15
+ * @param values A little-endian array of 32-bit numbers to fill the `LongInt`.
16
+ */
17
+ constructor(values: number[] | Uint32Array);
18
+ /**
19
+ * Creates an instance of LongInt.
20
+ *
21
+ * @param length The number of 32-bit numbers to construct the `LongInt` out of.
22
+ */
23
+ constructor(length: number);
24
+ /**
25
+ * Creates an instance of LongInt.
26
+ *
27
+ * @param longInt A `LongInt` object to duplicate.
28
+ */
29
+ constructor(longInt: LongInt);
30
+ /**
31
+ * Gets the number of 32-bit words which make the LongInt.
32
+ */
33
+ get wordCount(): number;
34
+ /**
35
+ * Carries out a bitwise and (&) operation on the two numbers.
36
+ *
37
+ * @param left The left number.
38
+ * @param right The right number.
39
+ * @returns The result of left & right.
40
+ */
41
+ static and(left: LongInt, right: LongInt | number): LongInt;
42
+ /**
43
+ * Carries out a bitwise or (|) operation on the two numbers.
44
+ *
45
+ * @param left The left number.
46
+ * @param right The right number.
47
+ * @returns The result of left | right.
48
+ */
49
+ static or(left: LongInt, right: LongInt | number): LongInt;
50
+ /**
51
+ * Carries out a bitwise xor (^) operation on the two numbers.
52
+ *
53
+ * @param left The left number.
54
+ * @param right The right number.
55
+ * @returns The result of left ^ right.
56
+ */
57
+ static xor(left: LongInt, right: LongInt | number): LongInt;
58
+ /**
59
+ * Carries out a bitwise not (~) operation on the number.
60
+ *
61
+ * @param number The number to negate.
62
+ * @returns The result of ~number.
63
+ */
64
+ static not(number: LongInt): LongInt;
65
+ /**
66
+ * Carries out a bitwise left shift (<<) operation on the number.
67
+ *
68
+ * @param number The number to shift.
69
+ * @param shiftAmount The number of places to shift.
70
+ * @returns The result of number << shiftAmount.
71
+ */
72
+ static leftShift(number: LongInt, shiftAmount: number): LongInt;
73
+ /**
74
+ * Carries out a bitwise unsigned right shift (>>>) operation on the number.
75
+ *
76
+ * @param number The number to shift.
77
+ * @param shiftAmount The number of places to shift.
78
+ * @returns The result of number >>> shiftAmount.
79
+ */
80
+ static rightShift(number: LongInt, shiftAmount: number): LongInt;
81
+ /**
82
+ * Carries out a bitwise arithmetic right shift (>>) operation on the number.
83
+ *
84
+ * @param number The number to shift.
85
+ * @param shiftAmount The number of places to shift.
86
+ * @returns The result of number >> shiftAmount.
87
+ */
88
+ static arithmeticRightShift(number: LongInt, shiftAmount: number): LongInt;
89
+ /**
90
+ * Determines whether or not 2 LongInts have equal values.
91
+ *
92
+ * @param longInt1 The first LongInt.
93
+ * @param longInt2 The second LongInt (can also be a number).
94
+ * @returns Whether or not they are equal.
95
+ */
96
+ static equals(longInt1: LongInt, longInt2: LongInt | number): boolean;
97
+ /**
98
+ * Creates a new LongInt object with the given value, stretched or truncated to the same size as this.
99
+ *
100
+ * @param longInt The LongInt to match the dimensions of.
101
+ * @param value The LongInt object to use as the value.
102
+ * @returns The new LongInt.
103
+ */
104
+ static getMatchingLongInt(longInt: LongInt, value: LongInt): LongInt;
105
+ /**
106
+ * Creates a new LongInt object using the given value, stretched or truncated to the same size as this.
107
+ *
108
+ * @param longInt The LongInt to match the dimensions of.
109
+ * @param values An array of 32-bit numbers to use as the value.
110
+ * @returns The new LongInt.
111
+ */
112
+ static getMatchingLongInt(longInt: LongInt, values: number[] | Uint32Array): LongInt;
113
+ /**
114
+ * Creates a new LongInt object using the given value, stretched or truncated to the same size as this.
115
+ *
116
+ * @param longInt The LongInt to match the dimensions of.
117
+ * @param value A 32-bit number to use as the value.
118
+ * @returns The new LongInt.
119
+ */
120
+ static getMatchingLongInt(longInt: LongInt, value?: number): LongInt;
121
+ /**
122
+ * Carries out an in-place bitwise and (&) operation on this number and the one provided.
123
+ *
124
+ * @param right The right number.
125
+ * @returns The new value of this & right.
126
+ */
127
+ and(right: LongInt | number): this;
128
+ /**
129
+ * Carries out an in-place bitwise or (|) operation on this number and the one provided.
130
+ *
131
+ * @param right The right number.
132
+ * @returns The new value of this | right.
133
+ */
134
+ or(right: LongInt | number): this;
135
+ /**
136
+ * Carries out an in-place bitwise xor (^) operation on this number and the one provided.
137
+ *
138
+ * @param right The right number.
139
+ * @returns The new value of this ^ right.
140
+ */
141
+ xor(right: LongInt | number): this;
142
+ /**
143
+ * Carries out an in-place bitwise not (~) operation on this nurmbe.
144
+ *
145
+ * @returns The result of ~this.
146
+ */
147
+ not(): this;
148
+ /**
149
+ * Carries out an in-place bitwise left shift (<<) operation on this number.
150
+ *
151
+ * @param shiftAmount The number of places to shift.
152
+ * @returns The result of this << shiftAmount.
153
+ */
154
+ leftShift(shiftAmount: number): this;
155
+ /**
156
+ * Carries out an in-place bitwise unsigned right shift (>>>) operation on this number.
157
+ *
158
+ * @param shiftAmount The number of places to shift.
159
+ * @returns The result of this >>> shiftAmount.
160
+ */
161
+ rightShift(shiftAmount: number): this;
162
+ /**
163
+ * Carries out an in-place bitwise arithmetic right shift (>>) operation on this number.
164
+ *
165
+ * @param shiftAmount The number of places to shift.
166
+ * @returns The result of this >> shiftAmount.
167
+ */
168
+ arithmeticRightShift(shiftAmount: number): this;
169
+ /**
170
+ * Determines whether or not this LongInt has equal value to another.
171
+ *
172
+ * @param value The LongInt or number to compare to.
173
+ * @returns Whether or not they are equal.
174
+ */
175
+ equals(value: LongInt | number): boolean;
176
+ /**
177
+ * Returns a string representation of the LongInt.
178
+ *
179
+ * @param type The base of the string to print.
180
+ * @returns The string representation.
181
+ */
182
+ toString(type: StringType): string;
183
+ /**
184
+ * Creates a new LongInt object with the given value, stretched or truncated to the same size as this.
185
+ *
186
+ * @param longInt The LongInt object to use as the value.
187
+ * @returns The new LongInt.
188
+ */
189
+ private getMatchingLongInt;
190
+ /**
191
+ * Shifts the 32-bit number array to the right.
192
+ *
193
+ * @param count How many places to shift the array.
194
+ * @param fillValue The value to fill empty spaces with.
195
+ * @returns The new value of this.
196
+ */
197
+ private shiftArrayRight;
198
+ /**
199
+ * Shifts the 32-bit number array to the left.
200
+ *
201
+ * @param count How many places to shift the array.
202
+ * @param fillValue The value to fill empty spaces with.
203
+ * @returns The new value of this.
204
+ */
205
+ private shiftArrayLeft;
206
+ }
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Represents a long integer using an array of 32-bit numbers.
3
+ * Provides static methods for bitwise operations which do not modify the original values.
4
+ * Provides non-static equivalents to the above operations, which are carried out in place.
5
+ */
6
+ export default class LongInt {
7
+ /**
8
+ * Holds the array of 32-bit numbers.
9
+ */
10
+ data;
11
+ constructor(args) {
12
+ if (args instanceof Array || args instanceof Uint32Array)
13
+ this.data = new Uint32Array(args);
14
+ else if (args instanceof LongInt)
15
+ this.data = new Uint32Array(args.data);
16
+ else
17
+ this.data = new Uint32Array(args).fill(0);
18
+ }
19
+ /**
20
+ * Gets the number of 32-bit words which make the LongInt.
21
+ */
22
+ get wordCount() {
23
+ return this.data.length;
24
+ }
25
+ /**
26
+ * Carries out a bitwise and (&) operation on the two numbers.
27
+ *
28
+ * @param left The left number.
29
+ * @param right The right number.
30
+ * @returns The result of left & right.
31
+ */
32
+ static and(left, right) {
33
+ return new LongInt(left).and(right);
34
+ }
35
+ /**
36
+ * Carries out a bitwise or (|) operation on the two numbers.
37
+ *
38
+ * @param left The left number.
39
+ * @param right The right number.
40
+ * @returns The result of left | right.
41
+ */
42
+ static or(left, right) {
43
+ return new LongInt(left).or(right);
44
+ }
45
+ /**
46
+ * Carries out a bitwise xor (^) operation on the two numbers.
47
+ *
48
+ * @param left The left number.
49
+ * @param right The right number.
50
+ * @returns The result of left ^ right.
51
+ */
52
+ static xor(left, right) {
53
+ return new LongInt(left).xor(right);
54
+ }
55
+ /**
56
+ * Carries out a bitwise not (~) operation on the number.
57
+ *
58
+ * @param number The number to negate.
59
+ * @returns The result of ~number.
60
+ */
61
+ static not(number) {
62
+ return new LongInt(number).not();
63
+ }
64
+ /**
65
+ * Carries out a bitwise left shift (<<) operation on the number.
66
+ *
67
+ * @param number The number to shift.
68
+ * @param shiftAmount The number of places to shift.
69
+ * @returns The result of number << shiftAmount.
70
+ */
71
+ static leftShift(number, shiftAmount) {
72
+ return new LongInt(number).leftShift(shiftAmount);
73
+ }
74
+ /**
75
+ * Carries out a bitwise unsigned right shift (>>>) operation on the number.
76
+ *
77
+ * @param number The number to shift.
78
+ * @param shiftAmount The number of places to shift.
79
+ * @returns The result of number >>> shiftAmount.
80
+ */
81
+ static rightShift(number, shiftAmount) {
82
+ return new LongInt(number).rightShift(shiftAmount);
83
+ }
84
+ /**
85
+ * Carries out a bitwise arithmetic right shift (>>) operation on the number.
86
+ *
87
+ * @param number The number to shift.
88
+ * @param shiftAmount The number of places to shift.
89
+ * @returns The result of number >> shiftAmount.
90
+ */
91
+ static arithmeticRightShift(number, shiftAmount) {
92
+ return new LongInt(number).arithmeticRightShift(shiftAmount);
93
+ }
94
+ /**
95
+ * Determines whether or not 2 LongInts have equal values.
96
+ *
97
+ * @param longInt1 The first LongInt.
98
+ * @param longInt2 The second LongInt (can also be a number).
99
+ * @returns Whether or not they are equal.
100
+ */
101
+ static equals(longInt1, longInt2) {
102
+ return longInt1.equals(longInt2);
103
+ }
104
+ static getMatchingLongInt(longInt, value = 0) {
105
+ return new LongInt(longInt).getMatchingLongInt(value);
106
+ }
107
+ /**
108
+ * Carries out an in-place bitwise and (&) operation on this number and the one provided.
109
+ *
110
+ * @param right The right number.
111
+ * @returns The new value of this & right.
112
+ */
113
+ and(right) {
114
+ const rightLongInt = this.getMatchingLongInt(right);
115
+ for (let i = 0; i < this.data.length; i++)
116
+ this.data[i] &= rightLongInt.data[i];
117
+ return this;
118
+ }
119
+ /**
120
+ * Carries out an in-place bitwise or (|) operation on this number and the one provided.
121
+ *
122
+ * @param right The right number.
123
+ * @returns The new value of this | right.
124
+ */
125
+ or(right) {
126
+ const rightLongInt = this.getMatchingLongInt(right);
127
+ for (let i = 0; i < this.data.length; i++)
128
+ this.data[i] |= rightLongInt.data[i];
129
+ return this;
130
+ }
131
+ /**
132
+ * Carries out an in-place bitwise xor (^) operation on this number and the one provided.
133
+ *
134
+ * @param right The right number.
135
+ * @returns The new value of this ^ right.
136
+ */
137
+ xor(right) {
138
+ const rightLongInt = this.getMatchingLongInt(right);
139
+ for (let i = 0; i < this.data.length; i++)
140
+ this.data[i] ^= rightLongInt.data[i];
141
+ return this;
142
+ }
143
+ /**
144
+ * Carries out an in-place bitwise not (~) operation on this nurmbe.
145
+ *
146
+ * @returns The result of ~this.
147
+ */
148
+ not() {
149
+ for (let i = 0; i < this.data.length; i++)
150
+ this.data[i] = ~this.data[i];
151
+ return this;
152
+ }
153
+ /**
154
+ * Carries out an in-place bitwise left shift (<<) operation on this number.
155
+ *
156
+ * @param shiftAmount The number of places to shift.
157
+ * @returns The result of this << shiftAmount.
158
+ */
159
+ leftShift(shiftAmount) {
160
+ if (shiftAmount === 0)
161
+ return this;
162
+ if (shiftAmount > 31)
163
+ this.shiftArrayRight(Math.floor(shiftAmount / 32));
164
+ if (shiftAmount !== 32) {
165
+ const singleShiftAmount = shiftAmount % 32;
166
+ for (let i = this.data.length - 1; i >= 0; i--)
167
+ this.data[i] = this.data[i] << singleShiftAmount | this.data[i - 1] >>> 32 - singleShiftAmount;
168
+ }
169
+ return this;
170
+ }
171
+ /**
172
+ * Carries out an in-place bitwise unsigned right shift (>>>) operation on this number.
173
+ *
174
+ * @param shiftAmount The number of places to shift.
175
+ * @returns The result of this >>> shiftAmount.
176
+ */
177
+ rightShift(shiftAmount) {
178
+ if (shiftAmount === 0)
179
+ return this;
180
+ if (shiftAmount !== 32) {
181
+ const singleShiftAmount = shiftAmount % 32;
182
+ for (let i = 0; i < this.data.length; i++)
183
+ this.data[i] = this.data[i] >>> singleShiftAmount | this.data[i + 1] << 32 - singleShiftAmount;
184
+ }
185
+ if (shiftAmount > 31)
186
+ this.shiftArrayLeft(Math.floor(shiftAmount / 32));
187
+ return this;
188
+ }
189
+ /**
190
+ * Carries out an in-place bitwise arithmetic right shift (>>) operation on this number.
191
+ *
192
+ * @param shiftAmount The number of places to shift.
193
+ * @returns The result of this >> shiftAmount.
194
+ */
195
+ arithmeticRightShift(shiftAmount) {
196
+ if (shiftAmount === 0)
197
+ return this;
198
+ if (shiftAmount !== 32) {
199
+ const singleShiftAmount = shiftAmount % 32;
200
+ for (let i = 0; i < this.data.length; i++)
201
+ this.data[i] = this.data[i] >> singleShiftAmount | this.data[i + 1] << 32 - singleShiftAmount;
202
+ }
203
+ if (shiftAmount > 31)
204
+ this.shiftArrayLeft(Math.floor(shiftAmount / 32), ~0 >>> 0);
205
+ return this;
206
+ }
207
+ /**
208
+ * Determines whether or not this LongInt has equal value to another.
209
+ *
210
+ * @param value The LongInt or number to compare to.
211
+ * @returns Whether or not they are equal.
212
+ */
213
+ equals(value) {
214
+ const longInt = value instanceof LongInt ? value : new LongInt([value]);
215
+ const longestLongInt = this.data.length > longInt.data.length ? this : longInt;
216
+ const longInt1 = LongInt.getMatchingLongInt(longestLongInt, this);
217
+ const longInt2 = LongInt.getMatchingLongInt(longestLongInt, longInt);
218
+ for (let i = 0; i < longestLongInt.data.length; i++) {
219
+ if (longInt1.data[i] !== longInt2.data[i])
220
+ return false;
221
+ }
222
+ return true;
223
+ }
224
+ /**
225
+ * Returns a string representation of the LongInt.
226
+ *
227
+ * @param type The base of the string to print.
228
+ * @returns The string representation.
229
+ */
230
+ toString(type) {
231
+ let padLength = 0;
232
+ switch (type) {
233
+ case 2:
234
+ padLength = 32;
235
+ break;
236
+ case 10:
237
+ padLength = 10;
238
+ break;
239
+ case 16:
240
+ padLength = 8;
241
+ break;
242
+ }
243
+ return [...this.data]
244
+ .reverse()
245
+ .map((num) => num.toString(type).padStart(padLength, "0"))
246
+ .join(" ");
247
+ }
248
+ getMatchingLongInt(value = 0) {
249
+ let integers = [];
250
+ switch (true) {
251
+ case value instanceof Uint32Array:
252
+ if (value.length < this.data.length)
253
+ integers = [...value, ...Array(this.data.length - value.length).fill(0)];
254
+ else if (value.length > this.data.length)
255
+ integers = value.slice(0, this.data.length);
256
+ else
257
+ integers = value;
258
+ break;
259
+ case value instanceof LongInt:
260
+ if (value.data.length < this.data.length)
261
+ integers = [...value.data, ...Array(this.data.length - value.data.length).fill(0)];
262
+ else if (value.data.length > this.data.length)
263
+ integers = value.data.slice(0, this.data.length);
264
+ else
265
+ integers = value.data;
266
+ break;
267
+ case value instanceof Array:
268
+ if (value.length < this.data.length)
269
+ integers = [...value, ...Array(this.data.length - value.length).fill(0)];
270
+ else if (value.length > this.data.length)
271
+ integers = value.slice(0, this.data.length);
272
+ else
273
+ integers = value;
274
+ break;
275
+ default:
276
+ integers = [value, ...Array(this.data.length - 1).fill(0)];
277
+ break;
278
+ }
279
+ return new LongInt(integers);
280
+ }
281
+ /**
282
+ * Shifts the 32-bit number array to the right.
283
+ *
284
+ * @param count How many places to shift the array.
285
+ * @param fillValue The value to fill empty spaces with.
286
+ * @returns The new value of this.
287
+ */
288
+ shiftArrayRight(count, fillValue = 0) {
289
+ if (count < 0)
290
+ return this.shiftArrayLeft(-count, fillValue);
291
+ for (let i = this.data.length - 1; i >= 0; i--)
292
+ this.data[i] = this.data[i - count] ?? fillValue;
293
+ return this;
294
+ }
295
+ /**
296
+ * Shifts the 32-bit number array to the left.
297
+ *
298
+ * @param count How many places to shift the array.
299
+ * @param fillValue The value to fill empty spaces with.
300
+ * @returns The new value of this.
301
+ */
302
+ shiftArrayLeft(count, fillValue = 0) {
303
+ if (count < 0)
304
+ return this.shiftArrayRight(-count, fillValue);
305
+ for (let i = 0; i < this.data.length; i++)
306
+ this.data[i] = this.data[i + count] ?? fillValue;
307
+ return this;
308
+ }
309
+ }
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9uZ0ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaXRCb2FyZC9sb25nSW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQU87SUFDeEI7O09BRUc7SUFDYSxJQUFJLENBQWM7SUFvQmxDLFlBQW1CLElBQStDO1FBQzlELElBQUksSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksV0FBVztZQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pDLElBQUksSUFBSSxZQUFZLE9BQU87WUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRXZDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQWEsRUFBRSxLQUF1QjtRQUNwRCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFhLEVBQUUsS0FBdUI7UUFDbkQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBYSxFQUFFLEtBQXVCO1FBQ3BELE9B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QUcsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssY0FBYyxDQUFDLEtBQWEsRUFBRSxZQUFvQixDQUFDO1FBQ3ZELElBQUksS0FBSyxHQUFHLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTdHJpbmdUeXBlID0gMiB8IDEwIHwgMTY7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvbmcgaW50ZWdlciB1c2luZyBhbiBhcnJheSBvZiAzMi1iaXQgbnVtYmVycy5cbiAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBiaXR3aXNlIG9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgdmFsdWVzLlxuICogUHJvdmlkZXMgbm9uLXN0YXRpYyBlcXVpdmFsZW50cyB0byB0aGUgYWJvdmUgb3BlcmF0aW9ucywgd2hpY2ggYXJlIGNhcnJpZWQgb3V0IGluIHBsYWNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb25nSW50IHtcbiAgICAvKipcbiAgICAgKiBIb2xkcyB0aGUgYXJyYXkgb2YgMzItYml0IG51bWJlcnMuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IFVpbnQzMkFycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBMb25nSW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlcyBBIGxpdHRsZS1lbmRpYW4gYXJyYXkgb2YgMzItYml0IG51bWJlcnMgdG8gZmlsbCB0aGUgYExvbmdJbnRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih2YWx1ZXM6IG51bWJlcltdIHwgVWludDMyQXJyYXkpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTG9uZ0ludC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiAzMi1iaXQgbnVtYmVycyB0byBjb25zdHJ1Y3QgdGhlIGBMb25nSW50YCBvdXQgb2YuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIExvbmdJbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9uZ0ludCBBIGBMb25nSW50YCBvYmplY3QgdG8gZHVwbGljYXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihsb25nSW50OiBMb25nSW50KTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoYXJnczogTG9uZ0ludCB8IG51bWJlcltdIHwgVWludDMyQXJyYXkgfCBudW1iZXIpIHtcbiAgICAgICAgaWYgKGFyZ3MgaW5zdGFuY2VvZiBBcnJheSB8fCBhcmdzIGluc3RhbmNlb2YgVWludDMyQXJyYXkpXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkoYXJncyk7XG4gICAgICAgIGVsc2UgaWYgKGFyZ3MgaW5zdGFuY2VvZiBMb25nSW50KVxuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQzMkFycmF5KGFyZ3MuZGF0YSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShhcmdzKS5maWxsKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgd2hpY2ggbWFrZSB0aGUgTG9uZ0ludC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHdvcmRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgYW5kICgmKSBvcGVyYXRpb24gb24gdGhlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgbnVtYmVyLlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbGVmdCAmIHJpZ2h0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYW5kKGxlZnQ6IExvbmdJbnQsIHJpZ2h0OiBMb25nSW50IHwgbnVtYmVyKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChsZWZ0KS5hbmQocmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBvciAofCkgb3BlcmF0aW9uIG9uIHRoZSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IG51bWJlci5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgfCByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG9yKGxlZnQ6IExvbmdJbnQsIHJpZ2h0OiBMb25nSW50IHwgbnVtYmVyKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChsZWZ0KS5vcihyaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIHhvciAoXikgb3BlcmF0aW9uIG9uIHRoZSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IG51bWJlci5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGxlZnQgXiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHhvcihsZWZ0OiBMb25nSW50LCByaWdodDogTG9uZ0ludCB8IG51bWJlcik6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobGVmdCkueG9yKHJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24gb24gdGhlIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIG51bWJlciB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB+bnVtYmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm90KG51bWJlcjogTG9uZ0ludCk6IExvbmdJbnQge1xuICAgICAgICByZXR1cm4gbmV3IExvbmdJbnQobnVtYmVyKS5ub3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgbGVmdCBzaGlmdCAoPDwpIG9wZXJhdGlvbiBvbiB0aGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG51bWJlciBUaGUgbnVtYmVyIHRvIHNoaWZ0LlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIG51bWJlciA8PCBzaGlmdEFtb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGxlZnRTaGlmdChudW1iZXI6IExvbmdJbnQsIHNoaWZ0QW1vdW50OiBudW1iZXIpOiBMb25nSW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nSW50KG51bWJlcikubGVmdFNoaWZ0KHNoaWZ0QW1vdW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgdW5zaWduZWQgcmlnaHQgc2hpZnQgKD4+Pikgb3BlcmF0aW9uIG9uIHRoZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBudW1iZXIgdG8gc2hpZnQuXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbnVtYmVyID4+PiBzaGlmdEFtb3VudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJpZ2h0U2hpZnQobnVtYmVyOiBMb25nSW50LCBzaGlmdEFtb3VudDogbnVtYmVyKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChudW1iZXIpLnJpZ2h0U2hpZnQoc2hpZnRBbW91bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0ICg+Pikgb3BlcmF0aW9uIG9uIHRoZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBudW1iZXIgdG8gc2hpZnQuXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IFRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHNoaWZ0LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgbnVtYmVyID4+IHNoaWZ0QW1vdW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpdGhtZXRpY1JpZ2h0U2hpZnQobnVtYmVyOiBMb25nSW50LCBzaGlmdEFtb3VudDogbnVtYmVyKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChudW1iZXIpLmFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IDIgTG9uZ0ludHMgaGF2ZSBlcXVhbCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9uZ0ludDEgVGhlIGZpcnN0IExvbmdJbnQuXG4gICAgICogQHBhcmFtIGxvbmdJbnQyIFRoZSBzZWNvbmQgTG9uZ0ludCAoY2FuIGFsc28gYmUgYSBudW1iZXIpLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZXF1YWxzKGxvbmdJbnQxOiBMb25nSW50LCBsb25nSW50MjogTG9uZ0ludCB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbG9uZ0ludDEuZXF1YWxzKGxvbmdJbnQyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IExvbmdJbnQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHZhbHVlLCBzdHJldGNoZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzYW1lIHNpemUgYXMgdGhpcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb25nSW50IFRoZSBMb25nSW50IHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgTG9uZ0ludCBvYmplY3QgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWU6IExvbmdJbnQpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHZhbHVlLCBzdHJldGNoZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzYW1lIHNpemUgYXMgdGhpcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb25nSW50IFRoZSBMb25nSW50IHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mLlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgQW4gYXJyYXkgb2YgMzItYml0IG51bWJlcnMgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXRjaGluZ0xvbmdJbnQobG9uZ0ludDogTG9uZ0ludCwgdmFsdWVzOiBudW1iZXJbXSB8IFVpbnQzMkFycmF5KTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IExvbmdJbnQgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiB2YWx1ZSwgc3RyZXRjaGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2FtZSBzaXplIGFzIHRoaXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9uZ0ludCBUaGUgTG9uZ0ludCB0byBtYXRjaCB0aGUgZGltZW5zaW9ucyBvZi5cbiAgICAgKiBAcGFyYW0gdmFsdWUgQSAzMi1iaXQgbnVtYmVyIHRvIHVzZSBhcyB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWF0Y2hpbmdMb25nSW50KGxvbmdJbnQ6IExvbmdJbnQsIHZhbHVlPzogbnVtYmVyKTogTG9uZ0ludDtcbiAgICBwdWJsaWMgc3RhdGljIGdldE1hdGNoaW5nTG9uZ0ludChsb25nSW50OiBMb25nSW50LCB2YWx1ZTogTG9uZ0ludCB8IG51bWJlcltdIHwgVWludDMyQXJyYXkgfCBudW1iZXIgPSAwKTogTG9uZ0ludCB7XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChsb25nSW50KS5nZXRNYXRjaGluZ0xvbmdJbnQodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2UgYW5kICgmKSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIgYW5kIHRoZSBvbmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgJiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYW5kKHJpZ2h0OiBMb25nSW50IHwgbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHJpZ2h0TG9uZ0ludCA9IHRoaXMuZ2V0TWF0Y2hpbmdMb25nSW50KHJpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gJj0gcmlnaHRMb25nSW50LmRhdGFbaV0hO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhbiBpbi1wbGFjZSBiaXR3aXNlIG9yICh8KSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIgYW5kIHRoZSBvbmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgfCByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3IocmlnaHQ6IExvbmdJbnQgfCBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcmlnaHRMb25nSW50ID0gdGhpcy5nZXRNYXRjaGluZ0xvbmdJbnQocmlnaHQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSB8PSByaWdodExvbmdJbnQuZGF0YVtpXSE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIgYW5kIHRoZSBvbmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgXiByaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgeG9yKHJpZ2h0OiBMb25nSW50IHwgbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHJpZ2h0TG9uZ0ludCA9IHRoaXMuZ2V0TWF0Y2hpbmdMb25nSW50KHJpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gXj0gcmlnaHRMb25nSW50LmRhdGFbaV0hO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhbiBpbi1wbGFjZSBiaXR3aXNlIG5vdCAofikgb3BlcmF0aW9uIG9uIHRoaXMgbnVybWJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB+dGhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbm90KCk6IHRoaXMge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IH50aGlzLmRhdGFbaV0hO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhbiBpbi1wbGFjZSBiaXR3aXNlIGxlZnQgc2hpZnQgKDw8KSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgVGhlIG51bWJlciBvZiBwbGFjZXMgdG8gc2hpZnQuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGlzIDw8IHNoaWZ0QW1vdW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZWZ0U2hpZnQoc2hpZnRBbW91bnQ6IG51bWJlcik6IHRoaXMge1xuICAgICAgICBpZiAoc2hpZnRBbW91bnQgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID4gMzEpXG4gICAgICAgICAgICB0aGlzLnNoaWZ0QXJyYXlSaWdodChNYXRoLmZsb29yKHNoaWZ0QW1vdW50IC8gMzIpKTtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ICE9PSAzMikge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlU2hpZnRBbW91bnQgPSBzaGlmdEFtb3VudCAlIDMyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaV0hIDw8IHNpbmdsZVNoaWZ0QW1vdW50IHwgdGhpcy5kYXRhW2kgLSAxXSEgPj4+IDMyIC0gc2luZ2xlU2hpZnRBbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYW4gaW4tcGxhY2UgYml0d2lzZSB1bnNpZ25lZCByaWdodCBzaGlmdCAoPj4+KSBvcGVyYXRpb24gb24gdGhpcyBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgVGhlIG51bWJlciBvZiBwbGFjZXMgdG8gc2hpZnQuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGlzID4+PiBzaGlmdEFtb3VudC5cbiAgICAqL1xuICAgIHB1YmxpYyByaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChzaGlmdEFtb3VudCAhPT0gMzIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVNoaWZ0QW1vdW50ID0gc2hpZnRBbW91bnQgJSAzMjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IHRoaXMuZGF0YVtpXSEgPj4+IHNpbmdsZVNoaWZ0QW1vdW50IHwgdGhpcy5kYXRhW2kgKyAxXSEgPDwgMzIgLSBzaW5nbGVTaGlmdEFtb3VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hpZnRBbW91bnQgPiAzMSlcbiAgICAgICAgICAgIHRoaXMuc2hpZnRBcnJheUxlZnQoTWF0aC5mbG9vcihzaGlmdEFtb3VudCAvIDMyKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGFuIGluLXBsYWNlIGJpdHdpc2UgYXJpdGhtZXRpYyByaWdodCBzaGlmdCAoPj4pIG9wZXJhdGlvbiBvbiB0aGlzIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoaXMgPj4gc2hpZnRBbW91bnQuXG4gICAgICovXG4gICAgcHVibGljIGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNoaWZ0QW1vdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChzaGlmdEFtb3VudCAhPT0gMzIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVNoaWZ0QW1vdW50ID0gc2hpZnRBbW91bnQgJSAzMjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IHRoaXMuZGF0YVtpXSEgPj4gc2luZ2xlU2hpZnRBbW91bnQgfCB0aGlzLmRhdGFbaSArIDFdISA8PCAzMiAtIHNpbmdsZVNoaWZ0QW1vdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGlmdEFtb3VudCA+IDMxKVxuICAgICAgICAgICAgdGhpcy5zaGlmdEFycmF5TGVmdChNYXRoLmZsb29yKHNoaWZ0QW1vdW50IC8gMzIpLCB+MCA+Pj4gMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBMb25nSW50IGhhcyBlcXVhbCB2YWx1ZSB0byBhbm90aGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBMb25nSW50IG9yIG51bWJlciB0byBjb21wYXJlIHRvLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IExvbmdJbnQgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbG9uZ0ludCA9IHZhbHVlIGluc3RhbmNlb2YgTG9uZ0ludCA/IHZhbHVlIDogbmV3IExvbmdJbnQoW3ZhbHVlXSk7XG4gICAgICAgIGNvbnN0IGxvbmdlc3RMb25nSW50ID0gdGhpcy5kYXRhLmxlbmd0aCA+IGxvbmdJbnQuZGF0YS5sZW5ndGggPyB0aGlzIDogbG9uZ0ludDtcbiAgICAgICAgY29uc3QgbG9uZ0ludDEgPSBMb25nSW50LmdldE1hdGNoaW5nTG9uZ0ludChsb25nZXN0TG9uZ0ludCwgdGhpcyk7XG4gICAgICAgIGNvbnN0IGxvbmdJbnQyID0gTG9uZ0ludC5nZXRNYXRjaGluZ0xvbmdJbnQobG9uZ2VzdExvbmdJbnQsIGxvbmdJbnQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvbmdlc3RMb25nSW50LmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsb25nSW50MS5kYXRhW2ldICE9PSBsb25nSW50Mi5kYXRhW2ldKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBMb25nSW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIGJhc2Ugb2YgdGhlIHN0cmluZyB0byBwcmludC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZyh0eXBlOiBTdHJpbmdUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHBhZExlbmd0aCA9IDA7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDMyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBwYWRMZW5ndGggPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZGF0YV1cbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5tYXAoKG51bSkgPT4gbnVtLnRvU3RyaW5nKHR5cGUpLnBhZFN0YXJ0KHBhZExlbmd0aCwgXCIwXCIpKVxuICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIHN0cmV0Y2hlZCBvciB0cnVuY2F0ZWQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB0aGlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvbmdJbnQgVGhlIExvbmdJbnQgb2JqZWN0IHRvIHVzZSBhcyB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdMb25nSW50KGxvbmdJbnQ6IExvbmdJbnQpOiBMb25nSW50O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTG9uZ0ludCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHZhbHVlLCBzdHJldGNoZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzYW1lIHNpemUgYXMgdGhpcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgQW4gYXJyYXkgb2YgMzItYml0IG51bWJlcnMgdG8gdXNlIGFzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IExvbmdJbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ0xvbmdJbnQodmFsdWVzOiBudW1iZXJbXSB8IFVpbnQzMkFycmF5KTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IExvbmdJbnQgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiB2YWx1ZSwgc3RyZXRjaGVkIG9yIHRydW5jYXRlZCB0byB0aGUgc2FtZSBzaXplIGFzIHRoaXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQSAzMi1iaXQgbnVtYmVyIHRvIHVzZSBhcyB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdMb25nSW50KHZhbHVlPzogbnVtYmVyKTogTG9uZ0ludDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZ0ludCB3aXRoIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgdGhpcyBvbmUsIHVzaW5nIHRoZSBnaXZlbiBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIExvbmdJbnQuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBMb25nSW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdMb25nSW50KHZhbHVlOiBMb25nSW50IHwgbnVtYmVyW10gfCBVaW50MzJBcnJheSB8IG51bWJlcik6IExvbmdJbnQ7XG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ0xvbmdJbnQodmFsdWU6IExvbmdJbnQgfCBudW1iZXJbXSB8IFVpbnQzMkFycmF5IHwgbnVtYmVyID0gMCk6IExvbmdJbnQge1xuICAgICAgICBsZXQgaW50ZWdlcnM6IG51bWJlcltdIHwgVWludDMyQXJyYXkgPSBbXTtcbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICBjYXNlIHZhbHVlIGluc3RhbmNlb2YgVWludDMyQXJyYXk6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMuZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gWy4uLnZhbHVlLCAuLi5BcnJheTxudW1iZXI+KHRoaXMuZGF0YS5sZW5ndGggLSB2YWx1ZS5sZW5ndGgpLmZpbGwoMCldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IHRoaXMuZGF0YS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXJzID0gdmFsdWUuc2xpY2UoMCwgdGhpcy5kYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB2YWx1ZSBpbnN0YW5jZW9mIExvbmdJbnQ6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmRhdGEubGVuZ3RoIDwgdGhpcy5kYXRhLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSBbLi4udmFsdWUuZGF0YSwgLi4uQXJyYXk8bnVtYmVyPih0aGlzLmRhdGEubGVuZ3RoIC0gdmFsdWUuZGF0YS5sZW5ndGgpLmZpbGwoMCldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmRhdGEubGVuZ3RoID4gdGhpcy5kYXRhLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSB2YWx1ZS5kYXRhLnNsaWNlKDAsIHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSB2YWx1ZS5kYXRhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5OlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLmRhdGEubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IFsuLi52YWx1ZSwgLi4uQXJyYXk8bnVtYmVyPih0aGlzLmRhdGEubGVuZ3RoIC0gdmFsdWUubGVuZ3RoKS5maWxsKDApXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLmRhdGEubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyA9IHZhbHVlLnNsaWNlKDAsIHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcnMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaW50ZWdlcnMgPSBbdmFsdWUsIC4uLkFycmF5PG51bWJlcj4odGhpcy5kYXRhLmxlbmd0aCAtIDEpLmZpbGwoMCldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTG9uZ0ludChpbnRlZ2Vycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hpZnRzIHRoZSAzMi1iaXQgbnVtYmVyIGFycmF5IHRvIHRoZSByaWdodC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb3VudCBIb3cgbWFueSBwbGFjZXMgdG8gc2hpZnQgdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSBmaWxsVmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgZW1wdHkgc3BhY2VzIHdpdGguXG4gICAgICogQHJldHVybnMgVGhlIG5ldyB2YWx1ZSBvZiB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2hpZnRBcnJheVJpZ2h0KGNvdW50OiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyID0gMCk6IHRoaXMge1xuICAgICAgICBpZiAoY291bnQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hpZnRBcnJheUxlZnQoLWNvdW50LCBmaWxsVmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gdGhpcy5kYXRhW2kgLSBjb3VudF0gPz8gZmlsbFZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaGlmdHMgdGhlIDMyLWJpdCBudW1iZXIgYXJyYXkgdG8gdGhlIGxlZnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY291bnQgSG93IG1hbnkgcGxhY2VzIHRvIHNoaWZ0IHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0gZmlsbFZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGVtcHR5IHNwYWNlcyB3aXRoLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgdmFsdWUgb2YgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNoaWZ0QXJyYXlMZWZ0KGNvdW50OiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyID0gMCk6IHRoaXMge1xuICAgICAgICBpZiAoY291bnQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hpZnRBcnJheVJpZ2h0KC1jb3VudCwgZmlsbFZhbHVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmRhdGFbaV0gPSB0aGlzLmRhdGFbaSArIGNvdW50XSA/PyBmaWxsVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,46 @@
1
+ import BitBoard from "./bitBoard.js";
2
+ import LongInt from "./longInt.js";
3
+ /**
4
+ * A BitBoard which uses an array of 32-bit numbers.
5
+ */
6
+ export default class LongIntBitBoard extends BitBoard<LongInt> {
7
+ /**
8
+ * Creates an instance of LongIntBitBoard.
9
+ *
10
+ * @param longInt The data to fill the BitBoard with.
11
+ */
12
+ constructor(longInt: LongInt);
13
+ /**
14
+ * Creates an instance of LongIntBitBoard.
15
+ *
16
+ * @param uint32Array The data to fill the BitBoard with.
17
+ */
18
+ constructor(uint32Array: Uint32Array);
19
+ /**
20
+ * Creates an instance of LongIntBitBoard.
21
+ *
22
+ * @param numberArray The data to fill the BitBoard with.
23
+ */
24
+ constructor(numberArray: number[]);
25
+ /**
26
+ * Creates an instance of LongIntBitBoard.
27
+ *
28
+ * @param length The length of the LongInt.
29
+ */
30
+ constructor(length: number);
31
+ getBit(bit: number): 0 | 1;
32
+ setBit(bit: number): void;
33
+ clearBit(bit: number): void;
34
+ toggleBit(bit: number): void;
35
+ clearAll(): void;
36
+ setAll(): void;
37
+ getBits(LSB: number, numberOfBits: number): LongInt;
38
+ and(right: LongIntBitBoard | number): this;
39
+ or(right: LongIntBitBoard | number): this;
40
+ xor(right: LongIntBitBoard | number): this;
41
+ not(): this;
42
+ leftShift(shiftAmount: number): this;
43
+ rightShift(shiftAmount: number): this;
44
+ arithmeticRightShift(shiftAmount: number): this;
45
+ equals(value: LongInt | LongIntBitBoard | number): boolean;
46
+ }