Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Incognito-old
Path: blob/main/static/src/gs/public/microsoft-flight-simulator/bzip2.js
1325 views
1
/*
2
bzip2.js - a small bzip2 decompression implementation
3
4
Copyright 2011 by antimatter15 ([email protected])
5
6
Based on micro-bunzip by Rob Landley ([email protected]).
7
Copyright (c) 2011 by antimatter15 ([email protected]).
8
Permission is hereby granted, free of charge, to any person obtaining a
9
copy of this software and associated documentation files (the "Software"),
10
to deal in the Software without restriction, including without limitation
11
the rights to use, copy, modify, merge, publish, distribute, sublicense,
12
and/or sell copies of the Software, and to permit persons to whom the
13
Software is furnished to do so, subject to the following conditions:
14
15
The above copyright notice and this permission notice shall be included
16
in all copies or substantial portions of the Software.
17
18
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
22
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
24
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*/
26
27
let bzip2 = {};
28
29
bzip2.crcTable =
30
[
31
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
32
0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
33
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
34
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
35
0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
36
0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
37
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
38
0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
39
0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
40
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
41
0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
42
0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
43
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
44
0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
45
0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
46
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
47
0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
48
0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
49
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
50
0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
51
0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
52
0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
53
0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
54
0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
55
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
56
0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
57
0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
58
0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
59
0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
60
0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
61
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
62
0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
63
0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
64
0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
65
0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
66
0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
67
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
68
0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
69
0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
70
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
71
0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
72
0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
73
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
74
0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
75
0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
76
0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
77
0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
78
0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
79
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
80
0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
81
0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
82
0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
83
0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
84
0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
85
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
86
0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
87
0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
88
0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
89
0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
90
0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
91
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
92
0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
93
0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
94
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
95
];
96
97
bzip2.array = function(bytes) {
98
var bit = 0, byte = 0;
99
var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF ];
100
return function(n) {
101
var result = 0;
102
while(n > 0) {
103
var left = 8 - bit;
104
if (n >= left) {
105
result <<= left;
106
result |= (BITMASK[left] & bytes[byte++]);
107
bit = 0;
108
n -= left;
109
} else {
110
result <<= n;
111
result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit));
112
bit += n;
113
n = 0;
114
}
115
}
116
return result;
117
}
118
}
119
120
bzip2.IsBZIP2 = function(buffer) {
121
if ((buffer[0] == 0x42) && (buffer[1] == 0x5A) && (buffer[2] == 0x68)) return true;
122
return false;
123
}
124
125
126
bzip2.simple = function(srcbuffer, stream) {
127
var bits = bzip2.array(srcbuffer);
128
var size = bzip2.header(bits);
129
var ret = false;
130
var bufsize = 100000 * size;
131
var buf = new Int32Array(bufsize);
132
133
this.byteCount = new Int32Array(256);
134
this.symToByte = new Uint8Array(256);
135
this.mtfSymbol = new Int32Array(256);
136
this.selectors = new Uint8Array(0x8000);
137
138
do {
139
ret = bzip2.decompress(bits, stream, buf, bufsize);
140
} while(!ret);
141
}
142
143
bzip2.header = function(bits) {
144
if (bits(8*3) !== 4348520) console.log("No magic number found");
145
const i = bits(8) - 48;
146
if (i < 1 || i > 9) console.log("Not a BZIP archive");
147
return i;
148
};
149
150
151
//takes a function for reading the block data (starting with 0x314159265359)
152
//a block size (0-9) (optional, defaults to 9)
153
//a length at which to stop decompressing and return the output
154
bzip2.decompress = function(bits, stream, buf, bufsize) {
155
let limit;
156
let base;
157
let uc;
158
let k;
159
let j;
160
const MAX_HUFCODE_BITS = 20;
161
const MAX_SYMBOLS = 258;
162
const SYMBOL_RUNA = 0;
163
const SYMBOL_RUNB = 1;
164
const GROUP_SIZE = 50;
165
let crc = 0 ^ (-1);
166
167
var h = '';
168
let i = 0;
169
for(; i < 6; i++) h += bits(8).toString(16);
170
if (h == "177245385090") return true; //last block
171
if (h != "314159265359") console.log("eek not valid bzip data");
172
let crcblock = bits(32) | 0; // CRC code
173
if (bits(1)) console.log("unsupported obsolete version");
174
let origPtr = bits(24);
175
if (origPtr > bufsize) console.log("Initial position larger than buffer size");
176
let t = bits(16);
177
let symTotal = 0;
178
for (i = 0; i < 16; i++) {
179
if (t & (1 << (15 - i))) {
180
k = bits(16);
181
for(j = 0; j < 16; j++) {
182
if (k & (1 << (15 - j))) {
183
this.symToByte[symTotal++] = (16 * i) + j;
184
}
185
}
186
}
187
}
188
189
let groupCount = bits(3);
190
if (groupCount < 2 || groupCount > 6) console.log("another error");
191
let nSelectors = bits(15);
192
if (nSelectors == 0) console.log("meh");
193
for(i = 0; i < groupCount; i++) this.mtfSymbol[i] = i;
194
195
for(i = 0; i < nSelectors; i++) {
196
for(j = 0; bits(1); j++) if (j >= groupCount) console.log("whoops another error");
197
uc = this.mtfSymbol[j];
198
for(k = j-1; k>=0; k--) {
199
this.mtfSymbol[k+1] = this.mtfSymbol[k];
200
}
201
this.mtfSymbol[0] = uc;
202
this.selectors[i] = uc;
203
}
204
205
let symCount = symTotal + 2;
206
let groups = [];
207
let length = new Uint8Array(MAX_SYMBOLS),
208
temp = new Uint8Array(MAX_HUFCODE_BITS + 1);
209
210
let hufGroup;
211
212
for(j = 0; j < groupCount; j++) {
213
t = bits(5); //lengths
214
for(i = 0; i < symCount; i++) {
215
while(true){
216
if (t < 1 || t > MAX_HUFCODE_BITS) console.log("I gave up a while ago on writing error messages");
217
if (!bits(1)) break;
218
if (!bits(1)) t++;
219
else t--;
220
}
221
length[i] = t;
222
}
223
let minLen, maxLen;
224
minLen = maxLen = length[0];
225
for(i = 1; i < symCount; i++) {
226
if (length[i] > maxLen) maxLen = length[i];
227
else if (length[i] < minLen) minLen = length[i];
228
}
229
hufGroup = groups[j] = {};
230
hufGroup.permute = new Int32Array(MAX_SYMBOLS);
231
hufGroup.limit = new Int32Array(MAX_HUFCODE_BITS + 1);
232
hufGroup.base = new Int32Array(MAX_HUFCODE_BITS + 1);
233
234
hufGroup.minLen = minLen;
235
hufGroup.maxLen = maxLen;
236
base = hufGroup.base.subarray(1);
237
limit = hufGroup.limit.subarray(1);
238
let pp = 0;
239
for(i = minLen; i <= maxLen; i++)
240
for(t = 0; t < symCount; t++)
241
if (length[t] == i) hufGroup.permute[pp++] = t;
242
for(i = minLen; i <= maxLen; i++) temp[i] = limit[i] = 0;
243
for(i = 0; i < symCount; i++) temp[length[i]]++;
244
pp = t = 0;
245
for(i = minLen; i < maxLen; i++) {
246
pp += temp[i];
247
limit[i] = pp - 1;
248
pp <<= 1;
249
base[i+1] = pp - (t += temp[i]);
250
}
251
limit[maxLen] = pp + temp[maxLen] - 1;
252
base[minLen] = 0;
253
}
254
255
for(i = 0; i < 256; i++) {
256
this.mtfSymbol[i] = i;
257
this.byteCount[i] = 0;
258
}
259
let runPos;
260
let count;
261
let selector;
262
runPos = count = symCount = selector = 0;
263
while(true) {
264
if (!(symCount--)) {
265
symCount = GROUP_SIZE - 1;
266
if (selector >= nSelectors) console.log("meow i'm a kitty, that's an error");
267
hufGroup = groups[this.selectors[selector++]];
268
base = hufGroup.base.subarray(1);
269
limit = hufGroup.limit.subarray(1);
270
}
271
i = hufGroup.minLen;
272
j = bits(i);
273
while(true) {
274
if (i > hufGroup.maxLen) console.log("rawr i'm a dinosaur");
275
if (j <= limit[i]) break;
276
i++;
277
j = (j << 1) | bits(1);
278
}
279
j -= base[i];
280
if (j < 0 || j >= MAX_SYMBOLS) console.log("moo i'm a cow");
281
let nextSym = hufGroup.permute[j];
282
if (nextSym == SYMBOL_RUNA || nextSym == SYMBOL_RUNB) {
283
if (!runPos){
284
runPos = 1;
285
t = 0;
286
}
287
if (nextSym == SYMBOL_RUNA) t += runPos;
288
else t += 2 * runPos;
289
runPos <<= 1;
290
continue;
291
}
292
if (runPos) {
293
runPos = 0;
294
if (count + t >= bufsize) console.log("Boom.");
295
uc = this.symToByte[this.mtfSymbol[0]];
296
this.byteCount[uc] += t;
297
while(t--) buf[count++] = uc;
298
}
299
if (nextSym > symTotal) break;
300
if (count >= bufsize) console.log("I can't think of anything. Error");
301
i = nextSym - 1;
302
uc = this.mtfSymbol[i];
303
for(k = i-1; k>=0; k--) {
304
this.mtfSymbol[k+1] = this.mtfSymbol[k];
305
}
306
this.mtfSymbol[0] = uc
307
uc = this.symToByte[uc];
308
this.byteCount[uc]++;
309
buf[count++] = uc;
310
}
311
if (origPtr < 0 || origPtr >= count) console.log("I'm a monkey and I'm throwing something at someone, namely you");
312
j = 0;
313
for(i = 0; i < 256; i++) {
314
k = j + this.byteCount[i];
315
this.byteCount[i] = j;
316
j = k;
317
}
318
for(i = 0; i < count; i++) {
319
uc = buf[i] & 0xff;
320
buf[this.byteCount[uc]] |= (i << 8);
321
this.byteCount[uc]++;
322
}
323
let pos = 0, current = 0, run = 0;
324
if (count) {
325
pos = buf[origPtr];
326
current = (pos & 0xff);
327
pos >>= 8;
328
run = -1;
329
}
330
let copies, previous, outbyte;
331
while(count) {
332
count--;
333
previous = current;
334
pos = buf[pos];
335
current = pos & 0xff;
336
pos >>= 8;
337
if (run++ == 3) {
338
copies = current;
339
outbyte = previous;
340
current = -1;
341
} else {
342
copies = 1;
343
outbyte = current;
344
}
345
while(copies--) {
346
crc = ((crc << 8) ^ this.crcTable[((crc>>24) ^ outbyte) & 0xFF])&0xFFFFFFFF; // crc32
347
stream(outbyte);
348
}
349
if (current != previous) run = 0;
350
}
351
352
crc = (crc ^ (-1)) >>> 0;
353
if ((crc|0) != (crcblock|0)) console.log("Error in bzip2: crc32 do not match");
354
return false;
355
}
356
357