Files
config-pacs-docker/nv/html/nv-nopdf/styles/packages/silentcicero_jszip.js
2025-02-26 14:49:25 +07:00

9500 lines
1.1 MiB
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//////////////////////////////////////////////////////////////////////////
// //
// This is a generated file. You can view the original //
// source in your browser if your browser supports source maps. //
// Source maps are supported by all recent versions of Chrome, Safari, //
// and Firefox, and by Internet Explorer 11. //
// //
//////////////////////////////////////////////////////////////////////////
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
/* Package-scope variables */
var JSZip;
(function(){
//////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/silentcicero_jszip/packages/silentcicero_jszip.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//
(function () {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/silentcicero:jszip/lib/jszip.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/*! // 1
// 2
JSZip - A Javascript class for generating and reading zip files // 3
<http://stuartk.com/jszip> // 4
// 5
(c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com> // 6
Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. // 7
// 8
JSZip uses the library pako released under the MIT license : // 9
https://github.com/nodeca/pako/blob/master/LICENSE // 10
*/ // 11
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
'use strict'; // 13
// private property // 14
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // 15
// 16
// 17
// public method for encoding // 18
exports.encode = function(input, utf8) { // 19
var output = ""; // 20
var chr1, chr2, chr3, enc1, enc2, enc3, enc4; // 21
var i = 0; // 22
// 23
while (i < input.length) { // 24
// 25
chr1 = input.charCodeAt(i++); // 26
chr2 = input.charCodeAt(i++); // 27
chr3 = input.charCodeAt(i++); // 28
// 29
enc1 = chr1 >> 2; // 30
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); // 31
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); // 32
enc4 = chr3 & 63; // 33
// 34
if (isNaN(chr2)) { // 35
enc3 = enc4 = 64; // 36
} // 37
else if (isNaN(chr3)) { // 38
enc4 = 64; // 39
} // 40
// 41
output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); // 42
// 43
} // 44
// 45
return output; // 46
}; // 47
// 48
// public method for decoding // 49
exports.decode = function(input, utf8) { // 50
var output = ""; // 51
var chr1, chr2, chr3; // 52
var enc1, enc2, enc3, enc4; // 53
var i = 0; // 54
// 55
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); // 56
// 57
while (i < input.length) { // 58
// 59
enc1 = _keyStr.indexOf(input.charAt(i++)); // 60
enc2 = _keyStr.indexOf(input.charAt(i++)); // 61
enc3 = _keyStr.indexOf(input.charAt(i++)); // 62
enc4 = _keyStr.indexOf(input.charAt(i++)); // 63
// 64
chr1 = (enc1 << 2) | (enc2 >> 4); // 65
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); // 66
chr3 = ((enc3 & 3) << 6) | enc4; // 67
// 68
output = output + String.fromCharCode(chr1); // 69
// 70
if (enc3 != 64) { // 71
output = output + String.fromCharCode(chr2); // 72
} // 73
if (enc4 != 64) { // 74
output = output + String.fromCharCode(chr3); // 75
} // 76
// 77
} // 78
// 79
return output; // 80
// 81
}; // 82
// 83
},{}],2:[function(_dereq_,module,exports){ // 84
'use strict'; // 85
function CompressedObject() { // 86
this.compressedSize = 0; // 87
this.uncompressedSize = 0; // 88
this.crc32 = 0; // 89
this.compressionMethod = null; // 90
this.compressedContent = null; // 91
} // 92
// 93
CompressedObject.prototype = { // 94
/** // 95
* Return the decompressed content in an unspecified format. // 96
* The format will depend on the decompressor. // 97
* @return {Object} the decompressed content. // 98
*/ // 99
getContent: function() { // 100
return null; // see implementation // 101
}, // 102
/** // 103
* Return the compressed content in an unspecified format. // 104
* The format will depend on the compressed conten source. // 105
* @return {Object} the compressed content. // 106
*/ // 107
getCompressedContent: function() { // 108
return null; // see implementation // 109
} // 110
}; // 111
module.exports = CompressedObject; // 112
// 113
},{}],3:[function(_dereq_,module,exports){ // 114
'use strict'; // 115
exports.STORE = { // 116
magic: "\x00\x00", // 117
compress: function(content, compressionOptions) { // 118
return content; // no compression // 119
}, // 120
uncompress: function(content) { // 121
return content; // no compression // 122
}, // 123
compressInputType: null, // 124
uncompressInputType: null // 125
}; // 126
exports.DEFLATE = _dereq_('./flate'); // 127
// 128
},{"./flate":8}],4:[function(_dereq_,module,exports){ // 129
'use strict'; // 130
// 131
var utils = _dereq_('./utils'); // 132
// 133
var table = [ // 134
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, // 135
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, // 136
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, // 137
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, // 138
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, // 139
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, // 140
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, // 141
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, // 142
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, // 143
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, // 144
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, // 145
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, // 146
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, // 147
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, // 148
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, // 149
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, // 150
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, // 151
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, // 152
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, // 153
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, // 154
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, // 155
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, // 156
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, // 157
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, // 158
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, // 159
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, // 160
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, // 161
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, // 162
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, // 163
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, // 164
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, // 165
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, // 166
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, // 167
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, // 168
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, // 169
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, // 170
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, // 171
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, // 172
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, // 173
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, // 174
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, // 175
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, // 176
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, // 177
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, // 178
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, // 179
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, // 180
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, // 181
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, // 182
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, // 183
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, // 184
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, // 185
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, // 186
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, // 187
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, // 188
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, // 189
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, // 190
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, // 191
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, // 192
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, // 193
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, // 194
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, // 195
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, // 196
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, // 197
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D // 198
]; // 199
// 200
/** // 201
* // 202
* Javascript crc32 // 203
* http://www.webtoolkit.info/ // 204
* // 205
*/ // 206
module.exports = function crc32(input, crc) { // 207
if (typeof input === "undefined" || !input.length) { // 208
return 0; // 209
} // 210
// 211
var isArray = utils.getTypeOf(input) !== "string"; // 212
// 213
if (typeof(crc) == "undefined") { // 214
crc = 0; // 215
} // 216
var x = 0; // 217
var y = 0; // 218
var b = 0; // 219
// 220
crc = crc ^ (-1); // 221
for (var i = 0, iTop = input.length; i < iTop; i++) { // 222
b = isArray ? input[i] : input.charCodeAt(i); // 223
y = (crc ^ b) & 0xFF; // 224
x = table[y]; // 225
crc = (crc >>> 8) ^ x; // 226
} // 227
// 228
return crc ^ (-1); // 229
}; // 230
// vim: set shiftwidth=4 softtabstop=4: // 231
// 232
},{"./utils":21}],5:[function(_dereq_,module,exports){ // 233
'use strict'; // 234
var utils = _dereq_('./utils'); // 235
// 236
function DataReader(data) { // 237
this.data = null; // type : see implementation // 238
this.length = 0; // 239
this.index = 0; // 240
} // 241
DataReader.prototype = { // 242
/** // 243
* Check that the offset will not go too far. // 244
* @param {string} offset the additional offset to check. // 245
* @throws {Error} an Error if the offset is out of bounds. // 246
*/ // 247
checkOffset: function(offset) { // 248
this.checkIndex(this.index + offset); // 249
}, // 250
/** // 251
* Check that the specifed index will not be too far. // 252
* @param {string} newIndex the index to check. // 253
* @throws {Error} an Error if the index is out of bounds. // 254
*/ // 255
checkIndex: function(newIndex) { // 256
if (this.length < newIndex || newIndex < 0) { // 257
throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
} // 259
}, // 260
/** // 261
* Change the index. // 262
* @param {number} newIndex The new index. // 263
* @throws {Error} if the new index is out of the data. // 264
*/ // 265
setIndex: function(newIndex) { // 266
this.checkIndex(newIndex); // 267
this.index = newIndex; // 268
}, // 269
/** // 270
* Skip the next n bytes. // 271
* @param {number} n the number of bytes to skip. // 272
* @throws {Error} if the new index is out of the data. // 273
*/ // 274
skip: function(n) { // 275
this.setIndex(this.index + n); // 276
}, // 277
/** // 278
* Get the byte at the specified index. // 279
* @param {number} i the index to use. // 280
* @return {number} a byte. // 281
*/ // 282
byteAt: function(i) { // 283
// see implementations // 284
}, // 285
/** // 286
* Get the next number with a given byte size. // 287
* @param {number} size the number of bytes to read. // 288
* @return {number} the corresponding number. // 289
*/ // 290
readInt: function(size) { // 291
var result = 0, // 292
i; // 293
this.checkOffset(size); // 294
for (i = this.index + size - 1; i >= this.index; i--) { // 295
result = (result << 8) + this.byteAt(i); // 296
} // 297
this.index += size; // 298
return result; // 299
}, // 300
/** // 301
* Get the next string with a given byte size. // 302
* @param {number} size the number of bytes to read. // 303
* @return {string} the corresponding string. // 304
*/ // 305
readString: function(size) { // 306
return utils.transformTo("string", this.readData(size)); // 307
}, // 308
/** // 309
* Get raw data without conversion, <size> bytes. // 310
* @param {number} size the number of bytes to read. // 311
* @return {Object} the raw data, implementation specific. // 312
*/ // 313
readData: function(size) { // 314
// see implementations // 315
}, // 316
/** // 317
* Find the last occurence of a zip signature (4 bytes). // 318
* @param {string} sig the signature to find. // 319
* @return {number} the index of the last occurence, -1 if not found. // 320
*/ // 321
lastIndexOfSignature: function(sig) { // 322
// see implementations // 323
}, // 324
/** // 325
* Get the next date. // 326
* @return {Date} the date. // 327
*/ // 328
readDate: function() { // 329
var dostime = this.readInt(4); // 330
return new Date( // 331
((dostime >> 25) & 0x7f) + 1980, // year // 332
((dostime >> 21) & 0x0f) - 1, // month // 333
(dostime >> 16) & 0x1f, // day // 334
(dostime >> 11) & 0x1f, // hour // 335
(dostime >> 5) & 0x3f, // minute // 336
(dostime & 0x1f) << 1); // second // 337
} // 338
}; // 339
module.exports = DataReader; // 340
// 341
},{"./utils":21}],6:[function(_dereq_,module,exports){ // 342
'use strict'; // 343
exports.base64 = false; // 344
exports.binary = false; // 345
exports.dir = false; // 346
exports.createFolders = false; // 347
exports.date = null; // 348
exports.compression = null; // 349
exports.compressionOptions = null; // 350
exports.comment = null; // 351
exports.unixPermissions = null; // 352
exports.dosPermissions = null; // 353
// 354
},{}],7:[function(_dereq_,module,exports){ // 355
'use strict'; // 356
var utils = _dereq_('./utils'); // 357
// 358
/** // 359
* @deprecated // 360
* This function will be removed in a future version without replacement. // 361
*/ // 362
exports.string2binary = function(str) { // 363
return utils.string2binary(str); // 364
}; // 365
// 366
/** // 367
* @deprecated // 368
* This function will be removed in a future version without replacement. // 369
*/ // 370
exports.string2Uint8Array = function(str) { // 371
return utils.transformTo("uint8array", str); // 372
}; // 373
// 374
/** // 375
* @deprecated // 376
* This function will be removed in a future version without replacement. // 377
*/ // 378
exports.uint8Array2String = function(array) { // 379
return utils.transformTo("string", array); // 380
}; // 381
// 382
/** // 383
* @deprecated // 384
* This function will be removed in a future version without replacement. // 385
*/ // 386
exports.string2Blob = function(str) { // 387
var buffer = utils.transformTo("arraybuffer", str); // 388
return utils.arrayBuffer2Blob(buffer); // 389
}; // 390
// 391
/** // 392
* @deprecated // 393
* This function will be removed in a future version without replacement. // 394
*/ // 395
exports.arrayBuffer2Blob = function(buffer) { // 396
return utils.arrayBuffer2Blob(buffer); // 397
}; // 398
// 399
/** // 400
* @deprecated // 401
* This function will be removed in a future version without replacement. // 402
*/ // 403
exports.transformTo = function(outputType, input) { // 404
return utils.transformTo(outputType, input); // 405
}; // 406
// 407
/** // 408
* @deprecated // 409
* This function will be removed in a future version without replacement. // 410
*/ // 411
exports.getTypeOf = function(input) { // 412
return utils.getTypeOf(input); // 413
}; // 414
// 415
/** // 416
* @deprecated // 417
* This function will be removed in a future version without replacement. // 418
*/ // 419
exports.checkSupport = function(type) { // 420
return utils.checkSupport(type); // 421
}; // 422
// 423
/** // 424
* @deprecated // 425
* This value will be removed in a future version without replacement. // 426
*/ // 427
exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS; // 428
// 429
/** // 430
* @deprecated // 431
* This value will be removed in a future version without replacement. // 432
*/ // 433
exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS; // 434
// 435
// 436
/** // 437
* @deprecated // 438
* This function will be removed in a future version without replacement. // 439
*/ // 440
exports.pretty = function(str) { // 441
return utils.pretty(str); // 442
}; // 443
// 444
/** // 445
* @deprecated // 446
* This function will be removed in a future version without replacement. // 447
*/ // 448
exports.findCompression = function(compressionMethod) { // 449
return utils.findCompression(compressionMethod); // 450
}; // 451
// 452
/** // 453
* @deprecated // 454
* This function will be removed in a future version without replacement. // 455
*/ // 456
exports.isRegExp = function (object) { // 457
return utils.isRegExp(object); // 458
}; // 459
// 460
// 461
},{"./utils":21}],8:[function(_dereq_,module,exports){ // 462
'use strict'; // 463
var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
// 465
var pako = _dereq_("pako"); // 466
exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; // 467
exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; // 468
// 469
exports.magic = "\x08\x00"; // 470
exports.compress = function(input, compressionOptions) { // 471
return pako.deflateRaw(input, { // 472
level : compressionOptions.level || -1 // default compression // 473
}); // 474
}; // 475
exports.uncompress = function(input) { // 476
return pako.inflateRaw(input); // 477
}; // 478
// 479
},{"pako":24}],9:[function(_dereq_,module,exports){ // 480
'use strict'; // 481
// 482
var base64 = _dereq_('./base64'); // 483
// 484
/** // 485
Usage: // 486
zip = new JSZip(); // 487
zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing"); // 488
zip.folder("images").file("smile.gif", base64Data, {base64: true}); // 489
zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")}); // 490
zip.remove("tempfile"); // 491
// 492
base64zip = zip.generate(); // 493
// 494
**/ // 495
// 496
/** // 497
* Representation a of zip file in js // 498
* @constructor // 499
* @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional). // 500
* @param {Object=} options the options for creating this objects (optional). // 501
*/ // 502
function JSZip(data, options) { // 503
// if this constructor is used without `new`, it adds `new` before itself: // 504
if(!(this instanceof JSZip)) return new JSZip(data, options); // 505
// 506
// object containing the files : // 507
// { // 508
// "folder/" : {...}, // 509
// "folder/data.txt" : {...} // 510
// } // 511
this.files = {}; // 512
// 513
this.comment = null; // 514
// 515
// Where we are in the hierarchy // 516
this.root = ""; // 517
if (data) { // 518
this.load(data, options); // 519
} // 520
this.clone = function() { // 521
var newObj = new JSZip(); // 522
for (var i in this) { // 523
if (typeof this[i] !== "function") { // 524
newObj[i] = this[i]; // 525
} // 526
} // 527
return newObj; // 528
}; // 529
} // 530
JSZip.prototype = _dereq_('./object'); // 531
JSZip.prototype.load = _dereq_('./load'); // 532
JSZip.support = _dereq_('./support'); // 533
JSZip.defaults = _dereq_('./defaults'); // 534
// 535
/** // 536
* @deprecated // 537
* This namespace will be removed in a future version without replacement. // 538
*/ // 539
JSZip.utils = _dereq_('./deprecatedPublicUtils'); // 540
// 541
JSZip.base64 = { // 542
/** // 543
* @deprecated // 544
* This method will be removed in a future version without replacement. // 545
*/ // 546
encode : function(input) { // 547
return base64.encode(input); // 548
}, // 549
/** // 550
* @deprecated // 551
* This method will be removed in a future version without replacement. // 552
*/ // 553
decode : function(input) { // 554
return base64.decode(input); // 555
} // 556
}; // 557
JSZip.compressions = _dereq_('./compressions'); // 558
module.exports = JSZip; // 559
// 560
},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
'use strict'; // 562
var base64 = _dereq_('./base64'); // 563
var ZipEntries = _dereq_('./zipEntries'); // 564
module.exports = function(data, options) { // 565
var files, zipEntries, i, input; // 566
options = options || {}; // 567
if (options.base64) { // 568
data = base64.decode(data); // 569
} // 570
// 571
zipEntries = new ZipEntries(data, options); // 572
files = zipEntries.files; // 573
for (i = 0; i < files.length; i++) { // 574
input = files[i]; // 575
this.file(input.fileName, input.decompressed, { // 576
binary: true, // 577
optimizedBinaryString: true, // 578
date: input.date, // 579
dir: input.dir, // 580
comment : input.fileComment.length ? input.fileComment : null, // 581
unixPermissions : input.unixPermissions, // 582
dosPermissions : input.dosPermissions, // 583
createFolders: options.createFolders // 584
}); // 585
} // 586
if (zipEntries.zipComment.length) { // 587
this.comment = zipEntries.zipComment; // 588
} // 589
// 590
return this; // 591
}; // 592
// 593
},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){ // 594
(function (Buffer){ // 595
'use strict'; // 596
module.exports = function(data, encoding){ // 597
return new Buffer(data, encoding); // 598
}; // 599
module.exports.test = function(b){ // 600
return Buffer.isBuffer(b); // 601
}; // 602
// 603
}).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined)) // 604
},{}],12:[function(_dereq_,module,exports){ // 605
'use strict'; // 606
var Uint8ArrayReader = _dereq_('./uint8ArrayReader'); // 607
// 608
function NodeBufferReader(data) { // 609
this.data = data; // 610
this.length = this.data.length; // 611
this.index = 0; // 612
} // 613
NodeBufferReader.prototype = new Uint8ArrayReader(); // 614
// 615
/** // 616
* @see DataReader.readData // 617
*/ // 618
NodeBufferReader.prototype.readData = function(size) { // 619
this.checkOffset(size); // 620
var result = this.data.slice(this.index, this.index + size); // 621
this.index += size; // 622
return result; // 623
}; // 624
module.exports = NodeBufferReader; // 625
// 626
},{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){ // 627
'use strict'; // 628
var support = _dereq_('./support'); // 629
var utils = _dereq_('./utils'); // 630
var crc32 = _dereq_('./crc32'); // 631
var signature = _dereq_('./signature'); // 632
var defaults = _dereq_('./defaults'); // 633
var base64 = _dereq_('./base64'); // 634
var compressions = _dereq_('./compressions'); // 635
var CompressedObject = _dereq_('./compressedObject'); // 636
var nodeBuffer = _dereq_('./nodeBuffer'); // 637
var utf8 = _dereq_('./utf8'); // 638
var StringWriter = _dereq_('./stringWriter'); // 639
var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter'); // 640
// 641
/** // 642
* Returns the raw data of a ZipObject, decompress the content if necessary. // 643
* @param {ZipObject} file the file to use. // 644
* @return {String|ArrayBuffer|Uint8Array|Buffer} the data. // 645
*/ // 646
var getRawData = function(file) { // 647
if (file._data instanceof CompressedObject) { // 648
file._data = file._data.getContent(); // 649
file.options.binary = true; // 650
file.options.base64 = false; // 651
// 652
if (utils.getTypeOf(file._data) === "uint8array") { // 653
var copy = file._data; // 654
// when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array. // 655
// if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
file._data = new Uint8Array(copy.length); // 657
// with an empty Uint8Array, Opera fails with a "Offset larger than array size" // 658
if (copy.length !== 0) { // 659
file._data.set(copy, 0); // 660
} // 661
} // 662
} // 663
return file._data; // 664
}; // 665
// 666
/** // 667
* Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it. // 668
* @param {ZipObject} file the file to use. // 669
* @return {String|ArrayBuffer|Uint8Array|Buffer} the data. // 670
*/ // 671
var getBinaryData = function(file) { // 672
var result = getRawData(file), // 673
type = utils.getTypeOf(result); // 674
if (type === "string") { // 675
if (!file.options.binary) { // 676
// unicode text ! // 677
// unicode string => binary string is a painful process, check if we can avoid it. // 678
if (support.nodebuffer) { // 679
return nodeBuffer(result, "utf-8"); // 680
} // 681
} // 682
return file.asBinary(); // 683
} // 684
return result; // 685
}; // 686
// 687
/** // 688
* Transform this._data into a string. // 689
* @param {function} filter a function String -> String, applied if not null on the result. // 690
* @return {String} the string representing this._data. // 691
*/ // 692
var dataToString = function(asUTF8) { // 693
var result = getRawData(this); // 694
if (result === null || typeof result === "undefined") { // 695
return ""; // 696
} // 697
// if the data is a base64 string, we decode it before checking the encoding ! // 698
if (this.options.base64) { // 699
result = base64.decode(result); // 700
} // 701
if (asUTF8 && this.options.binary) { // 702
// JSZip.prototype.utf8decode supports arrays as input // 703
// skip to array => string step, utf8decode will do it. // 704
result = out.utf8decode(result); // 705
} // 706
else { // 707
// no utf8 transformation, do the array => string step. // 708
result = utils.transformTo("string", result); // 709
} // 710
// 711
if (!asUTF8 && !this.options.binary) { // 712
result = utils.transformTo("string", out.utf8encode(result)); // 713
} // 714
return result; // 715
}; // 716
/** // 717
* A simple object representing a file in the zip file. // 718
* @constructor // 719
* @param {string} name the name of the file // 720
* @param {String|ArrayBuffer|Uint8Array|Buffer} data the data // 721
* @param {Object} options the options of the file // 722
*/ // 723
var ZipObject = function(name, data, options) { // 724
this.name = name; // 725
this.dir = options.dir; // 726
this.date = options.date; // 727
this.comment = options.comment; // 728
this.unixPermissions = options.unixPermissions; // 729
this.dosPermissions = options.dosPermissions; // 730
// 731
this._data = data; // 732
this.options = options; // 733
// 734
/* // 735
* This object contains initial values for dir and date. // 736
* With them, we can check if the user changed the deprecated metadata in // 737
* `ZipObject#options` or not. // 738
*/ // 739
this._initialMetadata = { // 740
dir : options.dir, // 741
date : options.date // 742
}; // 743
}; // 744
// 745
ZipObject.prototype = { // 746
/** // 747
* Return the content as UTF8 string. // 748
* @return {string} the UTF8 string. // 749
*/ // 750
asText: function() { // 751
return dataToString.call(this, true); // 752
}, // 753
/** // 754
* Returns the binary content. // 755
* @return {string} the content as binary. // 756
*/ // 757
asBinary: function() { // 758
return dataToString.call(this, false); // 759
}, // 760
/** // 761
* Returns the content as a nodejs Buffer. // 762
* @return {Buffer} the content as a Buffer. // 763
*/ // 764
asNodeBuffer: function() { // 765
var result = getBinaryData(this); // 766
return utils.transformTo("nodebuffer", result); // 767
}, // 768
/** // 769
* Returns the content as an Uint8Array. // 770
* @return {Uint8Array} the content as an Uint8Array. // 771
*/ // 772
asUint8Array: function() { // 773
var result = getBinaryData(this); // 774
return utils.transformTo("uint8array", result); // 775
}, // 776
/** // 777
* Returns the content as an ArrayBuffer. // 778
* @return {ArrayBuffer} the content as an ArrayBufer. // 779
*/ // 780
asArrayBuffer: function() { // 781
return this.asUint8Array().buffer; // 782
} // 783
}; // 784
// 785
/** // 786
* Transform an integer into a string in hexadecimal. // 787
* @private // 788
* @param {number} dec the number to convert. // 789
* @param {number} bytes the number of bytes to generate. // 790
* @returns {string} the result. // 791
*/ // 792
var decToHex = function(dec, bytes) { // 793
var hex = "", // 794
i; // 795
for (i = 0; i < bytes; i++) { // 796
hex += String.fromCharCode(dec & 0xff); // 797
dec = dec >>> 8; // 798
} // 799
return hex; // 800
}; // 801
// 802
/** // 803
* Merge the objects passed as parameters into a new one. // 804
* @private // 805
* @param {...Object} var_args All objects to merge. // 806
* @return {Object} a new object with the data of the others. // 807
*/ // 808
var extend = function() { // 809
var result = {}, i, attr; // 810
for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers // 811
for (attr in arguments[i]) { // 812
if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { // 813
result[attr] = arguments[i][attr]; // 814
} // 815
} // 816
} // 817
return result; // 818
}; // 819
// 820
/** // 821
* Transforms the (incomplete) options from the user into the complete // 822
* set of options to create a file. // 823
* @private // 824
* @param {Object} o the options from the user. // 825
* @return {Object} the complete set of options. // 826
*/ // 827
var prepareFileAttrs = function(o) { // 828
o = o || {}; // 829
if (o.base64 === true && (o.binary === null || o.binary === undefined)) { // 830
o.binary = true; // 831
} // 832
o = extend(o, defaults); // 833
o.date = o.date || new Date(); // 834
if (o.compression !== null) o.compression = o.compression.toUpperCase(); // 835
// 836
return o; // 837
}; // 838
// 839
/** // 840
* Add a file in the current folder. // 841
* @private // 842
* @param {string} name the name of the file // 843
* @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file // 844
* @param {Object} o the options of the file // 845
* @return {Object} the new file. // 846
*/ // 847
var fileAdd = function(name, data, o) { // 848
// be sure sub folders exist // 849
var dataType = utils.getTypeOf(data), // 850
parent; // 851
// 852
o = prepareFileAttrs(o); // 853
// 854
if (typeof o.unixPermissions === "string") { // 855
o.unixPermissions = parseInt(o.unixPermissions, 8); // 856
} // 857
// 858
// UNX_IFDIR 0040000 see zipinfo.c // 859
if (o.unixPermissions && (o.unixPermissions & 0x4000)) { // 860
o.dir = true; // 861
} // 862
// Bit 4 Directory // 863
if (o.dosPermissions && (o.dosPermissions & 0x0010)) { // 864
o.dir = true; // 865
} // 866
// 867
if (o.dir) { // 868
name = forceTrailingSlash(name); // 869
} // 870
// 871
if (o.createFolders && (parent = parentFolder(name))) { // 872
folderAdd.call(this, parent, true); // 873
} // 874
// 875
if (o.dir || data === null || typeof data === "undefined") { // 876
o.base64 = false; // 877
o.binary = false; // 878
data = null; // 879
dataType = null; // 880
} // 881
else if (dataType === "string") { // 882
if (o.binary && !o.base64) { // 883
// optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask // 884
if (o.optimizedBinaryString !== true) { // 885
// this is a string, not in a base64 format. // 886
// Be sure that this is a correct "binary string" // 887
data = utils.string2binary(data); // 888
} // 889
} // 890
} // 891
else { // arraybuffer, uint8array, ... // 892
o.base64 = false; // 893
o.binary = true; // 894
// 895
if (!dataType && !(data instanceof CompressedObject)) { // 896
throw new Error("The data of '" + name + "' is in an unsupported format !"); // 897
} // 898
// 899
// special case : it's way easier to work with Uint8Array than with ArrayBuffer // 900
if (dataType === "arraybuffer") { // 901
data = utils.transformTo("uint8array", data); // 902
} // 903
} // 904
// 905
var object = new ZipObject(name, data, o); // 906
this.files[name] = object; // 907
return object; // 908
}; // 909
// 910
/** // 911
* Find the parent folder of the path. // 912
* @private // 913
* @param {string} path the path to use // 914
* @return {string} the parent folder, or "" // 915
*/ // 916
var parentFolder = function (path) { // 917
if (path.slice(-1) == '/') { // 918
path = path.substring(0, path.length - 1); // 919
} // 920
var lastSlash = path.lastIndexOf('/'); // 921
return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; // 922
}; // 923
// 924
// 925
/** // 926
* Returns the path with a slash at the end. // 927
* @private // 928
* @param {String} path the path to check. // 929
* @return {String} the path with a trailing slash. // 930
*/ // 931
var forceTrailingSlash = function(path) { // 932
// Check the name ends with a / // 933
if (path.slice(-1) != "/") { // 934
path += "/"; // IE doesn't like substr(-1) // 935
} // 936
return path; // 937
}; // 938
/** // 939
* Add a (sub) folder in the current folder. // 940
* @private // 941
* @param {string} name the folder's name // 942
* @param {boolean=} [createFolders] If true, automatically create sub // 943
* folders. Defaults to false. // 944
* @return {Object} the new folder. // 945
*/ // 946
var folderAdd = function(name, createFolders) { // 947
createFolders = (typeof createFolders !== 'undefined') ? createFolders : false; // 948
// 949
name = forceTrailingSlash(name); // 950
// 951
// Does this folder already exist? // 952
if (!this.files[name]) { // 953
fileAdd.call(this, name, null, { // 954
dir: true, // 955
createFolders: createFolders // 956
}); // 957
} // 958
return this.files[name]; // 959
}; // 960
// 961
/** // 962
* Generate a JSZip.CompressedObject for a given zipOject. // 963
* @param {ZipObject} file the object to read. // 964
* @param {JSZip.compression} compression the compression to use. // 965
* @param {Object} compressionOptions the options to use when compressing. // 966
* @return {JSZip.CompressedObject} the compressed result. // 967
*/ // 968
var generateCompressedObjectFrom = function(file, compression, compressionOptions) { // 969
var result = new CompressedObject(), // 970
content; // 971
// 972
// the data has not been decompressed, we might reuse things ! // 973
if (file._data instanceof CompressedObject) { // 974
result.uncompressedSize = file._data.uncompressedSize; // 975
result.crc32 = file._data.crc32; // 976
// 977
if (result.uncompressedSize === 0 || file.dir) { // 978
compression = compressions['STORE']; // 979
result.compressedContent = ""; // 980
result.crc32 = 0; // 981
} // 982
else if (file._data.compressionMethod === compression.magic) { // 983
result.compressedContent = file._data.getCompressedContent(); // 984
} // 985
else { // 986
content = file._data.getContent(); // 987
// need to decompress / recompress // 988
result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
} // 990
} // 991
else { // 992
// have uncompressed data // 993
content = getBinaryData(file); // 994
if (!content || content.length === 0 || file.dir) { // 995
compression = compressions['STORE']; // 996
content = ""; // 997
} // 998
result.uncompressedSize = content.length; // 999
result.crc32 = crc32(content); // 1000
result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
} // 1002
// 1003
result.compressedSize = result.compressedContent.length; // 1004
result.compressionMethod = compression.magic; // 1005
// 1006
return result; // 1007
}; // 1008
// 1009
// 1010
// 1011
// 1012
/** // 1013
* Generate the UNIX part of the external file attributes. // 1014
* @param {Object} unixPermissions the unix permissions or null. // 1015
* @param {Boolean} isDir true if the entry is a directory, false otherwise. // 1016
* @return {Number} a 32 bit integer. // 1017
* // 1018
* adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute : // 1019
* // 1020
* TTTTsstrwxrwxrwx0000000000ADVSHR // 1021
* ^^^^____________________________ file type, see zipinfo.c (UNX_*) // 1022
* ^^^_________________________ setuid, setgid, sticky // 1023
* ^^^^^^^^^________________ permissions // 1024
* ^^^^^^^^^^______ not used ? // 1025
* ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only
*/ // 1027
var generateUnixExternalFileAttr = function (unixPermissions, isDir) { // 1028
// 1029
var result = unixPermissions; // 1030
if (!unixPermissions) { // 1031
// I can't use octal values in strict mode, hence the hexa. // 1032
// 040775 => 0x41fd // 1033
// 0100664 => 0x81b4 // 1034
result = isDir ? 0x41fd : 0x81b4; // 1035
} // 1036
// 1037
return (result & 0xFFFF) << 16; // 1038
}; // 1039
// 1040
/** // 1041
* Generate the DOS part of the external file attributes. // 1042
* @param {Object} dosPermissions the dos permissions or null. // 1043
* @param {Boolean} isDir true if the entry is a directory, false otherwise. // 1044
* @return {Number} a 32 bit integer. // 1045
* // 1046
* Bit 0 Read-Only // 1047
* Bit 1 Hidden // 1048
* Bit 2 System // 1049
* Bit 3 Volume Label // 1050
* Bit 4 Directory // 1051
* Bit 5 Archive // 1052
*/ // 1053
var generateDosExternalFileAttr = function (dosPermissions, isDir) { // 1054
// 1055
// the dir flag is already set for compatibility // 1056
// 1057
return (dosPermissions || 0) & 0x3F; // 1058
}; // 1059
// 1060
/** // 1061
* Generate the various parts used in the construction of the final zip file. // 1062
* @param {string} name the file name. // 1063
* @param {ZipObject} file the file content. // 1064
* @param {JSZip.CompressedObject} compressedObject the compressed object. // 1065
* @param {number} offset the current offset from the start of the zip file. // 1066
* @param {String} platform let's pretend we are this platform (change platform dependents fields) // 1067
* @return {object} the zip parts. // 1068
*/ // 1069
var generateZipParts = function(name, file, compressedObject, offset, platform) { // 1070
var data = compressedObject.compressedContent, // 1071
utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)), // 1072
comment = file.comment || "", // 1073
utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)), // 1074
useUTF8ForFileName = utfEncodedFileName.length !== file.name.length, // 1075
useUTF8ForComment = utfEncodedComment.length !== comment.length, // 1076
o = file.options, // 1077
dosTime, // 1078
dosDate, // 1079
extraFields = "", // 1080
unicodePathExtraField = "", // 1081
unicodeCommentExtraField = "", // 1082
dir, date; // 1083
// 1084
// 1085
// handle the deprecated options.dir // 1086
if (file._initialMetadata.dir !== file.dir) { // 1087
dir = file.dir; // 1088
} else { // 1089
dir = o.dir; // 1090
} // 1091
// 1092
// handle the deprecated options.date // 1093
if(file._initialMetadata.date !== file.date) { // 1094
date = file.date; // 1095
} else { // 1096
date = o.date; // 1097
} // 1098
// 1099
var extFileAttr = 0; // 1100
var versionMadeBy = 0; // 1101
if (dir) { // 1102
// dos or unix, we set the dos dir flag // 1103
extFileAttr |= 0x00010; // 1104
} // 1105
if(platform === "UNIX") { // 1106
versionMadeBy = 0x031E; // UNIX, version 3.0 // 1107
extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir); // 1108
} else { // DOS or other, fallback to DOS // 1109
versionMadeBy = 0x0014; // DOS, version 2.0 // 1110
extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir); // 1111
} // 1112
// 1113
// date // 1114
// @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html // 1115
// @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html // 1116
// @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html // 1117
// 1118
dosTime = date.getHours(); // 1119
dosTime = dosTime << 6; // 1120
dosTime = dosTime | date.getMinutes(); // 1121
dosTime = dosTime << 5; // 1122
dosTime = dosTime | date.getSeconds() / 2; // 1123
// 1124
dosDate = date.getFullYear() - 1980; // 1125
dosDate = dosDate << 4; // 1126
dosDate = dosDate | (date.getMonth() + 1); // 1127
dosDate = dosDate << 5; // 1128
dosDate = dosDate | date.getDate(); // 1129
// 1130
if (useUTF8ForFileName) { // 1131
// set the unicode path extra field. unzip needs at least one extra // 1132
// field to correctly handle unicode path, so using the path is as good // 1133
// as any other information. This could improve the situation with // 1134
// other archive managers too. // 1135
// This field is usually used without the utf8 flag, with a non // 1136
// unicode path in the header (winrar, winzip). This helps (a bit) // 1137
// with the messy Windows' default compressed folders feature but // 1138
// breaks on p7zip which doesn't seek the unicode path extra field. // 1139
// So for now, UTF-8 everywhere ! // 1140
unicodePathExtraField = // 1141
// Version // 1142
decToHex(1, 1) + // 1143
// NameCRC32 // 1144
decToHex(crc32(utfEncodedFileName), 4) + // 1145
// UnicodeName // 1146
utfEncodedFileName; // 1147
// 1148
extraFields += // 1149
// Info-ZIP Unicode Path Extra Field // 1150
"\x75\x70" + // 1151
// size // 1152
decToHex(unicodePathExtraField.length, 2) + // 1153
// content // 1154
unicodePathExtraField; // 1155
} // 1156
// 1157
if(useUTF8ForComment) { // 1158
// 1159
unicodeCommentExtraField = // 1160
// Version // 1161
decToHex(1, 1) + // 1162
// CommentCRC32 // 1163
decToHex(this.crc32(utfEncodedComment), 4) + // 1164
// UnicodeName // 1165
utfEncodedComment; // 1166
// 1167
extraFields += // 1168
// Info-ZIP Unicode Path Extra Field // 1169
"\x75\x63" + // 1170
// size // 1171
decToHex(unicodeCommentExtraField.length, 2) + // 1172
// content // 1173
unicodeCommentExtraField; // 1174
} // 1175
// 1176
var header = ""; // 1177
// 1178
// version needed to extract // 1179
header += "\x0A\x00"; // 1180
// general purpose bit flag // 1181
// set bit 11 if utf8 // 1182
header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00"; // 1183
// compression method // 1184
header += compressedObject.compressionMethod; // 1185
// last mod file time // 1186
header += decToHex(dosTime, 2); // 1187
// last mod file date // 1188
header += decToHex(dosDate, 2); // 1189
// crc-32 // 1190
header += decToHex(compressedObject.crc32, 4); // 1191
// compressed size // 1192
header += decToHex(compressedObject.compressedSize, 4); // 1193
// uncompressed size // 1194
header += decToHex(compressedObject.uncompressedSize, 4); // 1195
// file name length // 1196
header += decToHex(utfEncodedFileName.length, 2); // 1197
// extra field length // 1198
header += decToHex(extraFields.length, 2); // 1199
// 1200
// 1201
var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields; // 1202
// 1203
var dirRecord = signature.CENTRAL_FILE_HEADER + // 1204
// version made by (00: DOS) // 1205
decToHex(versionMadeBy, 2) + // 1206
// file header (common to file and central directory) // 1207
header + // 1208
// file comment length // 1209
decToHex(utfEncodedComment.length, 2) + // 1210
// disk number start // 1211
"\x00\x00" + // 1212
// internal file attributes TODO // 1213
"\x00\x00" + // 1214
// external file attributes // 1215
decToHex(extFileAttr, 4) + // 1216
// relative offset of local header // 1217
decToHex(offset, 4) + // 1218
// file name // 1219
utfEncodedFileName + // 1220
// extra field // 1221
extraFields + // 1222
// file comment // 1223
utfEncodedComment; // 1224
// 1225
return { // 1226
fileRecord: fileRecord, // 1227
dirRecord: dirRecord, // 1228
compressedObject: compressedObject // 1229
}; // 1230
}; // 1231
// 1232
// 1233
// return the actual prototype of JSZip // 1234
var out = { // 1235
/** // 1236
* Read an existing zip and merge the data in the current JSZip object. // 1237
* The implementation is in jszip-load.js, don't forget to include it. // 1238
* @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load // 1239
* @param {Object} options Options for loading the stream. // 1240
* options.base64 : is the stream in base64 ? default : false // 1241
* @return {JSZip} the current JSZip object // 1242
*/ // 1243
load: function(stream, options) { // 1244
throw new Error("Load method is not defined. Is the file jszip-load.js included ?"); // 1245
}, // 1246
// 1247
/** // 1248
* Filter nested files/folders with the specified function. // 1249
* @param {Function} search the predicate to use : // 1250
* function (relativePath, file) {...} // 1251
* It takes 2 arguments : the relative path and the file. // 1252
* @return {Array} An array of matching elements. // 1253
*/ // 1254
filter: function(search) { // 1255
var result = [], // 1256
filename, relativePath, file, fileClone; // 1257
for (filename in this.files) { // 1258
if (!this.files.hasOwnProperty(filename)) { // 1259
continue; // 1260
} // 1261
file = this.files[filename]; // 1262
// return a new object, don't let the user mess with our internal objects :) // 1263
fileClone = new ZipObject(file.name, file._data, extend(file.options)); // 1264
relativePath = filename.slice(this.root.length, filename.length); // 1265
if (filename.slice(0, this.root.length) === this.root && // the file is in the current root // 1266
search(relativePath, fileClone)) { // and the file matches the function // 1267
result.push(fileClone); // 1268
} // 1269
} // 1270
return result; // 1271
}, // 1272
// 1273
/** // 1274
* Add a file to the zip file, or search a file. // 1275
* @param {string|RegExp} name The name of the file to add (if data is defined), // 1276
* the name of the file to find (if no data) or a regex to match files. // 1277
* @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded // 1278
* @param {Object} o File options // 1279
* @return {JSZip|Object|Array} this JSZip object (when adding a file), // 1280
* a file (when searching by string) or an array of files (when searching by regex). // 1281
*/ // 1282
file: function(name, data, o) { // 1283
if (arguments.length === 1) { // 1284
if (utils.isRegExp(name)) { // 1285
var regexp = name; // 1286
return this.filter(function(relativePath, file) { // 1287
return !file.dir && regexp.test(relativePath); // 1288
}); // 1289
} // 1290
else { // text // 1291
return this.filter(function(relativePath, file) { // 1292
return !file.dir && relativePath === name; // 1293
})[0] || null; // 1294
} // 1295
} // 1296
else { // more than one argument : we have data ! // 1297
name = this.root + name; // 1298
fileAdd.call(this, name, data, o); // 1299
} // 1300
return this; // 1301
}, // 1302
// 1303
/** // 1304
* Add a directory to the zip file, or search. // 1305
* @param {String|RegExp} arg The name of the directory to add, or a regex to search folders. // 1306
* @return {JSZip} an object with the new directory as the root, or an array containing matching folders. // 1307
*/ // 1308
folder: function(arg) { // 1309
if (!arg) { // 1310
return this; // 1311
} // 1312
// 1313
if (utils.isRegExp(arg)) { // 1314
return this.filter(function(relativePath, file) { // 1315
return file.dir && arg.test(relativePath); // 1316
}); // 1317
} // 1318
// 1319
// else, name is a new folder // 1320
var name = this.root + arg; // 1321
var newFolder = folderAdd.call(this, name); // 1322
// 1323
// Allow chaining by returning a new object with this folder as the root // 1324
var ret = this.clone(); // 1325
ret.root = newFolder.name; // 1326
return ret; // 1327
}, // 1328
// 1329
/** // 1330
* Delete a file, or a directory and all sub-files, from the zip // 1331
* @param {string} name the name of the file to delete // 1332
* @return {JSZip} this JSZip object // 1333
*/ // 1334
remove: function(name) { // 1335
name = this.root + name; // 1336
var file = this.files[name]; // 1337
if (!file) { // 1338
// Look for any folders // 1339
if (name.slice(-1) != "/") { // 1340
name += "/"; // 1341
} // 1342
file = this.files[name]; // 1343
} // 1344
// 1345
if (file && !file.dir) { // 1346
// file // 1347
delete this.files[name]; // 1348
} else { // 1349
// maybe a folder, delete recursively // 1350
var kids = this.filter(function(relativePath, file) { // 1351
return file.name.slice(0, name.length) === name; // 1352
}); // 1353
for (var i = 0; i < kids.length; i++) { // 1354
delete this.files[kids[i].name]; // 1355
} // 1356
} // 1357
// 1358
return this; // 1359
}, // 1360
// 1361
/** // 1362
* Generate the complete zip file // 1363
* @param {Object} options the options to generate the zip file : // 1364
* - base64, (deprecated, use type instead) true to generate base64. // 1365
* - compression, "STORE" by default. // 1366
* - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. // 1367
* @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file // 1368
*/ // 1369
generate: function(options) { // 1370
options = extend(options || {}, { // 1371
base64: true, // 1372
compression: "STORE", // 1373
compressionOptions : null, // 1374
type: "base64", // 1375
platform: "DOS", // 1376
comment: null, // 1377
mimeType: 'application/zip' // 1378
}); // 1379
// 1380
utils.checkSupport(options.type); // 1381
// 1382
// accept nodejs `process.platform` // 1383
if( // 1384
options.platform === 'darwin' || // 1385
options.platform === 'freebsd' || // 1386
options.platform === 'linux' || // 1387
options.platform === 'sunos' // 1388
) { // 1389
options.platform = "UNIX"; // 1390
} // 1391
if (options.platform === 'win32') { // 1392
options.platform = "DOS"; // 1393
} // 1394
// 1395
var zipData = [], // 1396
localDirLength = 0, // 1397
centralDirLength = 0, // 1398
writer, i, // 1399
utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || "")); // 1400
// 1401
// first, generate all the zip parts. // 1402
for (var name in this.files) { // 1403
if (!this.files.hasOwnProperty(name)) { // 1404
continue; // 1405
} // 1406
var file = this.files[name]; // 1407
// 1408
var compressionName = file.options.compression || options.compression.toUpperCase(); // 1409
var compression = compressions[compressionName]; // 1410
if (!compression) { // 1411
throw new Error(compressionName + " is not a valid compression method !"); // 1412
} // 1413
var compressionOptions = file.options.compressionOptions || options.compressionOptions || {}; // 1414
// 1415
var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions); // 1416
// 1417
var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform); // 1418
localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize; // 1419
centralDirLength += zipPart.dirRecord.length; // 1420
zipData.push(zipPart); // 1421
} // 1422
// 1423
var dirEnd = ""; // 1424
// 1425
// end of central dir signature // 1426
dirEnd = signature.CENTRAL_DIRECTORY_END + // 1427
// number of this disk // 1428
"\x00\x00" + // 1429
// number of the disk with the start of the central directory // 1430
"\x00\x00" + // 1431
// total number of entries in the central directory on this disk // 1432
decToHex(zipData.length, 2) + // 1433
// total number of entries in the central directory // 1434
decToHex(zipData.length, 2) + // 1435
// size of the central directory 4 bytes // 1436
decToHex(centralDirLength, 4) + // 1437
// offset of start of central directory with respect to the starting disk number // 1438
decToHex(localDirLength, 4) + // 1439
// .ZIP file comment length // 1440
decToHex(utfEncodedComment.length, 2) + // 1441
// .ZIP file comment // 1442
utfEncodedComment; // 1443
// 1444
// 1445
// we have all the parts (and the total length) // 1446
// time to create a writer ! // 1447
var typeName = options.type.toLowerCase(); // 1448
if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") { // 1449
writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length); // 1450
}else{ // 1451
writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length); // 1452
} // 1453
// 1454
for (i = 0; i < zipData.length; i++) { // 1455
writer.append(zipData[i].fileRecord); // 1456
writer.append(zipData[i].compressedObject.compressedContent); // 1457
} // 1458
for (i = 0; i < zipData.length; i++) { // 1459
writer.append(zipData[i].dirRecord); // 1460
} // 1461
// 1462
writer.append(dirEnd); // 1463
// 1464
var zip = writer.finalize(); // 1465
// 1466
// 1467
// 1468
switch(options.type.toLowerCase()) { // 1469
// case "zip is an Uint8Array" // 1470
case "uint8array" : // 1471
case "arraybuffer" : // 1472
case "nodebuffer" : // 1473
return utils.transformTo(options.type.toLowerCase(), zip); // 1474
case "blob" : // 1475
return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip), options.mimeType); // 1476
// case "zip is a string" // 1477
case "base64" : // 1478
return (options.base64) ? base64.encode(zip) : zip; // 1479
default : // case "string" : // 1480
return zip; // 1481
} // 1482
// 1483
}, // 1484
// 1485
/** // 1486
* @deprecated // 1487
* This method will be removed in a future version without replacement. // 1488
*/ // 1489
crc32: function (input, crc) { // 1490
return crc32(input, crc); // 1491
}, // 1492
// 1493
/** // 1494
* @deprecated // 1495
* This method will be removed in a future version without replacement. // 1496
*/ // 1497
utf8encode: function (string) { // 1498
return utils.transformTo("string", utf8.utf8encode(string)); // 1499
}, // 1500
// 1501
/** // 1502
* @deprecated // 1503
* This method will be removed in a future version without replacement. // 1504
*/ // 1505
utf8decode: function (input) { // 1506
return utf8.utf8decode(input); // 1507
} // 1508
}; // 1509
module.exports = out; // 1510
// 1511
},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){
'use strict'; // 1513
exports.LOCAL_FILE_HEADER = "PK\x03\x04"; // 1514
exports.CENTRAL_FILE_HEADER = "PK\x01\x02"; // 1515
exports.CENTRAL_DIRECTORY_END = "PK\x05\x06"; // 1516
exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07"; // 1517
exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06"; // 1518
exports.DATA_DESCRIPTOR = "PK\x07\x08"; // 1519
// 1520
},{}],15:[function(_dereq_,module,exports){ // 1521
'use strict'; // 1522
var DataReader = _dereq_('./dataReader'); // 1523
var utils = _dereq_('./utils'); // 1524
// 1525
function StringReader(data, optimizedBinaryString) { // 1526
this.data = data; // 1527
if (!optimizedBinaryString) { // 1528
this.data = utils.string2binary(this.data); // 1529
} // 1530
this.length = this.data.length; // 1531
this.index = 0; // 1532
} // 1533
StringReader.prototype = new DataReader(); // 1534
/** // 1535
* @see DataReader.byteAt // 1536
*/ // 1537
StringReader.prototype.byteAt = function(i) { // 1538
return this.data.charCodeAt(i); // 1539
}; // 1540
/** // 1541
* @see DataReader.lastIndexOfSignature // 1542
*/ // 1543
StringReader.prototype.lastIndexOfSignature = function(sig) { // 1544
return this.data.lastIndexOf(sig); // 1545
}; // 1546
/** // 1547
* @see DataReader.readData // 1548
*/ // 1549
StringReader.prototype.readData = function(size) { // 1550
this.checkOffset(size); // 1551
// this will work because the constructor applied the "& 0xff" mask. // 1552
var result = this.data.slice(this.index, this.index + size); // 1553
this.index += size; // 1554
return result; // 1555
}; // 1556
module.exports = StringReader; // 1557
// 1558
},{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){ // 1559
'use strict'; // 1560
// 1561
var utils = _dereq_('./utils'); // 1562
// 1563
/** // 1564
* An object to write any content to a string. // 1565
* @constructor // 1566
*/ // 1567
var StringWriter = function() { // 1568
this.data = []; // 1569
}; // 1570
StringWriter.prototype = { // 1571
/** // 1572
* Append any content to the current string. // 1573
* @param {Object} input the content to add. // 1574
*/ // 1575
append: function(input) { // 1576
input = utils.transformTo("string", input); // 1577
this.data.push(input); // 1578
}, // 1579
/** // 1580
* Finalize the construction an return the result. // 1581
* @return {string} the generated string. // 1582
*/ // 1583
finalize: function() { // 1584
return this.data.join(""); // 1585
} // 1586
}; // 1587
// 1588
module.exports = StringWriter; // 1589
// 1590
},{"./utils":21}],17:[function(_dereq_,module,exports){ // 1591
(function (Buffer){ // 1592
'use strict'; // 1593
exports.base64 = true; // 1594
exports.array = true; // 1595
exports.string = true; // 1596
exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined"; // 1597
// contains true if JSZip can read/generate nodejs Buffer, false otherwise. // 1598
// Browserify will provide a Buffer implementation for browsers, which is // 1599
// an augmented Uint8Array (i.e., can be used as either Buffer or U8). // 1600
exports.nodebuffer = typeof Buffer !== "undefined"; // 1601
// contains true if JSZip can read/generate Uint8Array, false otherwise. // 1602
exports.uint8array = typeof Uint8Array !== "undefined"; // 1603
// 1604
if (typeof ArrayBuffer === "undefined") { // 1605
exports.blob = false; // 1606
} // 1607
else { // 1608
var buffer = new ArrayBuffer(0); // 1609
try { // 1610
exports.blob = new Blob([buffer], { // 1611
type: "application/zip" // 1612
}).size === 0; // 1613
} // 1614
catch (e) { // 1615
try { // 1616
var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
var builder = new Builder(); // 1618
builder.append(buffer); // 1619
exports.blob = builder.getBlob('application/zip').size === 0; // 1620
} // 1621
catch (e) { // 1622
exports.blob = false; // 1623
} // 1624
} // 1625
} // 1626
// 1627
}).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined)) // 1628
},{}],18:[function(_dereq_,module,exports){ // 1629
'use strict'; // 1630
var DataReader = _dereq_('./dataReader'); // 1631
// 1632
function Uint8ArrayReader(data) { // 1633
if (data) { // 1634
this.data = data; // 1635
this.length = this.data.length; // 1636
this.index = 0; // 1637
} // 1638
} // 1639
Uint8ArrayReader.prototype = new DataReader(); // 1640
/** // 1641
* @see DataReader.byteAt // 1642
*/ // 1643
Uint8ArrayReader.prototype.byteAt = function(i) { // 1644
return this.data[i]; // 1645
}; // 1646
/** // 1647
* @see DataReader.lastIndexOfSignature // 1648
*/ // 1649
Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) { // 1650
var sig0 = sig.charCodeAt(0), // 1651
sig1 = sig.charCodeAt(1), // 1652
sig2 = sig.charCodeAt(2), // 1653
sig3 = sig.charCodeAt(3); // 1654
for (var i = this.length - 4; i >= 0; --i) { // 1655
if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
return i; // 1657
} // 1658
} // 1659
// 1660
return -1; // 1661
}; // 1662
/** // 1663
* @see DataReader.readData // 1664
*/ // 1665
Uint8ArrayReader.prototype.readData = function(size) { // 1666
this.checkOffset(size); // 1667
if(size === 0) { // 1668
// in IE10, when using subarray(idx, idx), we get the array [0x00] instead of []. // 1669
return new Uint8Array(0); // 1670
} // 1671
var result = this.data.subarray(this.index, this.index + size); // 1672
this.index += size; // 1673
return result; // 1674
}; // 1675
module.exports = Uint8ArrayReader; // 1676
// 1677
},{"./dataReader":5}],19:[function(_dereq_,module,exports){ // 1678
'use strict'; // 1679
// 1680
var utils = _dereq_('./utils'); // 1681
// 1682
/** // 1683
* An object to write any content to an Uint8Array. // 1684
* @constructor // 1685
* @param {number} length The length of the array. // 1686
*/ // 1687
var Uint8ArrayWriter = function(length) { // 1688
this.data = new Uint8Array(length); // 1689
this.index = 0; // 1690
}; // 1691
Uint8ArrayWriter.prototype = { // 1692
/** // 1693
* Append any content to the current array. // 1694
* @param {Object} input the content to add. // 1695
*/ // 1696
append: function(input) { // 1697
if (input.length !== 0) { // 1698
// with an empty Uint8Array, Opera fails with a "Offset larger than array size" // 1699
input = utils.transformTo("uint8array", input); // 1700
this.data.set(input, this.index); // 1701
this.index += input.length; // 1702
} // 1703
}, // 1704
/** // 1705
* Finalize the construction an return the result. // 1706
* @return {Uint8Array} the generated array. // 1707
*/ // 1708
finalize: function() { // 1709
return this.data; // 1710
} // 1711
}; // 1712
// 1713
module.exports = Uint8ArrayWriter; // 1714
// 1715
},{"./utils":21}],20:[function(_dereq_,module,exports){ // 1716
'use strict'; // 1717
// 1718
var utils = _dereq_('./utils'); // 1719
var support = _dereq_('./support'); // 1720
var nodeBuffer = _dereq_('./nodeBuffer'); // 1721
// 1722
/** // 1723
* The following functions come from pako, from pako/lib/utils/strings // 1724
* released under the MIT license, see pako https://github.com/nodeca/pako/ // 1725
*/ // 1726
// 1727
// Table with utf8 lengths (calculated by first byte of sequence) // 1728
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, // 1729
// because max possible codepoint is 0x10ffff // 1730
var _utf8len = new Array(256); // 1731
for (var i=0; i<256; i++) { // 1732
_utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1); // 1733
} // 1734
_utf8len[254]=_utf8len[254]=1; // Invalid sequence start // 1735
// 1736
// convert string to array (typed, when possible) // 1737
var string2buf = function (str) { // 1738
var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; // 1739
// 1740
// count binary size // 1741
for (m_pos = 0; m_pos < str_len; m_pos++) { // 1742
c = str.charCodeAt(m_pos); // 1743
if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { // 1744
c2 = str.charCodeAt(m_pos+1); // 1745
if ((c2 & 0xfc00) === 0xdc00) { // 1746
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); // 1747
m_pos++; // 1748
} // 1749
} // 1750
buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; // 1751
} // 1752
// 1753
// allocate buffer // 1754
if (support.uint8array) { // 1755
buf = new Uint8Array(buf_len); // 1756
} else { // 1757
buf = new Array(buf_len); // 1758
} // 1759
// 1760
// convert // 1761
for (i=0, m_pos = 0; i < buf_len; m_pos++) { // 1762
c = str.charCodeAt(m_pos); // 1763
if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { // 1764
c2 = str.charCodeAt(m_pos+1); // 1765
if ((c2 & 0xfc00) === 0xdc00) { // 1766
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); // 1767
m_pos++; // 1768
} // 1769
} // 1770
if (c < 0x80) { // 1771
/* one byte */ // 1772
buf[i++] = c; // 1773
} else if (c < 0x800) { // 1774
/* two bytes */ // 1775
buf[i++] = 0xC0 | (c >>> 6); // 1776
buf[i++] = 0x80 | (c & 0x3f); // 1777
} else if (c < 0x10000) { // 1778
/* three bytes */ // 1779
buf[i++] = 0xE0 | (c >>> 12); // 1780
buf[i++] = 0x80 | (c >>> 6 & 0x3f); // 1781
buf[i++] = 0x80 | (c & 0x3f); // 1782
} else { // 1783
/* four bytes */ // 1784
buf[i++] = 0xf0 | (c >>> 18); // 1785
buf[i++] = 0x80 | (c >>> 12 & 0x3f); // 1786
buf[i++] = 0x80 | (c >>> 6 & 0x3f); // 1787
buf[i++] = 0x80 | (c & 0x3f); // 1788
} // 1789
} // 1790
// 1791
return buf; // 1792
}; // 1793
// 1794
// Calculate max possible position in utf8 buffer, // 1795
// that will not break sequence. If that's not possible // 1796
// - (very small limits) return max size as is. // 1797
// // 1798
// buf[] - utf8 bytes array // 1799
// max - length limit (mandatory); // 1800
var utf8border = function(buf, max) { // 1801
var pos; // 1802
// 1803
max = max || buf.length; // 1804
if (max > buf.length) { max = buf.length; } // 1805
// 1806
// go back from last position, until start of sequence found // 1807
pos = max-1; // 1808
while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } // 1809
// 1810
// Fuckup - very small and broken sequence, // 1811
// return max, because we should return something anyway. // 1812
if (pos < 0) { return max; } // 1813
// 1814
// If we came to start of buffer - that means vuffer is too small, // 1815
// return max too. // 1816
if (pos === 0) { return max; } // 1817
// 1818
return (pos + _utf8len[buf[pos]] > max) ? pos : max; // 1819
}; // 1820
// 1821
// convert array to string // 1822
var buf2string = function (buf) { // 1823
var str, i, out, c, c_len; // 1824
var len = buf.length; // 1825
// 1826
// Reserve max possible length (2 words per char) // 1827
// NB: by unknown reasons, Array is significantly faster for // 1828
// String.fromCharCode.apply than Uint16Array. // 1829
var utf16buf = new Array(len*2); // 1830
// 1831
for (out=0, i=0; i<len;) { // 1832
c = buf[i++]; // 1833
// quick process ascii // 1834
if (c < 0x80) { utf16buf[out++] = c; continue; } // 1835
// 1836
c_len = _utf8len[c]; // 1837
// skip 5 & 6 byte codes // 1838
if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; } // 1839
// 1840
// apply mask on first byte // 1841
c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; // 1842
// join the rest // 1843
while (c_len > 1 && i < len) { // 1844
c = (c << 6) | (buf[i++] & 0x3f); // 1845
c_len--; // 1846
} // 1847
// 1848
// terminated by end of string? // 1849
if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } // 1850
// 1851
if (c < 0x10000) { // 1852
utf16buf[out++] = c; // 1853
} else { // 1854
c -= 0x10000; // 1855
utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); // 1856
utf16buf[out++] = 0xdc00 | (c & 0x3ff); // 1857
} // 1858
} // 1859
// 1860
// shrinkBuf(utf16buf, out) // 1861
if (utf16buf.length !== out) { // 1862
if(utf16buf.subarray) { // 1863
utf16buf = utf16buf.subarray(0, out); // 1864
} else { // 1865
utf16buf.length = out; // 1866
} // 1867
} // 1868
// 1869
// return String.fromCharCode.apply(null, utf16buf); // 1870
return utils.applyFromCharCode(utf16buf); // 1871
}; // 1872
// 1873
// 1874
// That's all for the pako functions. // 1875
// 1876
// 1877
/** // 1878
* Transform a javascript string into an array (typed if possible) of bytes, // 1879
* UTF-8 encoded. // 1880
* @param {String} str the string to encode // 1881
* @return {Array|Uint8Array|Buffer} the UTF-8 encoded string. // 1882
*/ // 1883
exports.utf8encode = function utf8encode(str) { // 1884
if (support.nodebuffer) { // 1885
return nodeBuffer(str, "utf-8"); // 1886
} // 1887
// 1888
return string2buf(str); // 1889
}; // 1890
// 1891
// 1892
/** // 1893
* Transform a bytes array (or a representation) representing an UTF-8 encoded // 1894
* string into a javascript string. // 1895
* @param {Array|Uint8Array|Buffer} buf the data de decode // 1896
* @return {String} the decoded string. // 1897
*/ // 1898
exports.utf8decode = function utf8decode(buf) { // 1899
if (support.nodebuffer) { // 1900
return utils.transformTo("nodebuffer", buf).toString("utf-8"); // 1901
} // 1902
// 1903
buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf); // 1904
// 1905
// return buf2string(buf); // 1906
// Chrome prefers to work with "small" chunks of data // 1907
// for the method buf2string. // 1908
// Firefox and Chrome has their own shortcut, IE doesn't seem to really care. // 1909
var result = [], k = 0, len = buf.length, chunk = 65536; // 1910
while (k < len) { // 1911
var nextBoundary = utf8border(buf, Math.min(k + chunk, len)); // 1912
if (support.uint8array) { // 1913
result.push(buf2string(buf.subarray(k, nextBoundary))); // 1914
} else { // 1915
result.push(buf2string(buf.slice(k, nextBoundary))); // 1916
} // 1917
k = nextBoundary; // 1918
} // 1919
return result.join(""); // 1920
// 1921
}; // 1922
// vim: set shiftwidth=4 softtabstop=4: // 1923
// 1924
},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){ // 1925
'use strict'; // 1926
var support = _dereq_('./support'); // 1927
var compressions = _dereq_('./compressions'); // 1928
var nodeBuffer = _dereq_('./nodeBuffer'); // 1929
/** // 1930
* Convert a string to a "binary string" : a string containing only char codes between 0 and 255. // 1931
* @param {string} str the string to transform. // 1932
* @return {String} the binary string. // 1933
*/ // 1934
exports.string2binary = function(str) { // 1935
var result = ""; // 1936
for (var i = 0; i < str.length; i++) { // 1937
result += String.fromCharCode(str.charCodeAt(i) & 0xff); // 1938
} // 1939
return result; // 1940
}; // 1941
exports.arrayBuffer2Blob = function(buffer, mimeType) { // 1942
exports.checkSupport("blob"); // 1943
mimeType = mimeType || 'application/zip'; // 1944
// 1945
try { // 1946
// Blob constructor // 1947
return new Blob([buffer], { // 1948
type: mimeType // 1949
}); // 1950
} // 1951
catch (e) { // 1952
// 1953
try { // 1954
// deprecated, browser only, old way // 1955
var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
var builder = new Builder(); // 1957
builder.append(buffer); // 1958
return builder.getBlob(mimeType); // 1959
} // 1960
catch (e) { // 1961
// 1962
// well, fuck ?! // 1963
throw new Error("Bug : can't construct the Blob."); // 1964
} // 1965
} // 1966
// 1967
// 1968
}; // 1969
/** // 1970
* The identity function. // 1971
* @param {Object} input the input. // 1972
* @return {Object} the same input. // 1973
*/ // 1974
function identity(input) { // 1975
return input; // 1976
} // 1977
// 1978
/** // 1979
* Fill in an array with a string. // 1980
* @param {String} str the string to use. // 1981
* @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated). // 1982
* @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array. // 1983
*/ // 1984
function stringToArrayLike(str, array) { // 1985
for (var i = 0; i < str.length; ++i) { // 1986
array[i] = str.charCodeAt(i) & 0xFF; // 1987
} // 1988
return array; // 1989
} // 1990
// 1991
/** // 1992
* Transform an array-like object to a string. // 1993
* @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. // 1994
* @return {String} the result. // 1995
*/ // 1996
function arrayLikeToString(array) { // 1997
// Performances notes : // 1998
// -------------------- // 1999
// String.fromCharCode.apply(null, array) is the fastest, see // 2000
// see http://jsperf.com/converting-a-uint8array-to-a-string/2 // 2001
// but the stack is limited (and we can get huge arrays !). // 2002
// // 2003
// result += String.fromCharCode(array[i]); generate too many strings ! // 2004
// // 2005
// This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2 // 2006
var chunk = 65536; // 2007
var result = [], // 2008
len = array.length, // 2009
type = exports.getTypeOf(array), // 2010
k = 0, // 2011
canUseApply = true; // 2012
try { // 2013
switch(type) { // 2014
case "uint8array": // 2015
String.fromCharCode.apply(null, new Uint8Array(0)); // 2016
break; // 2017
case "nodebuffer": // 2018
String.fromCharCode.apply(null, nodeBuffer(0)); // 2019
break; // 2020
} // 2021
} catch(e) { // 2022
canUseApply = false; // 2023
} // 2024
// 2025
// no apply : slow and painful algorithm // 2026
// default browser on android 4.* // 2027
if (!canUseApply) { // 2028
var resultStr = ""; // 2029
for(var i = 0; i < array.length;i++) { // 2030
resultStr += String.fromCharCode(array[i]); // 2031
} // 2032
return resultStr; // 2033
} // 2034
while (k < len && chunk > 1) { // 2035
try { // 2036
if (type === "array" || type === "nodebuffer") { // 2037
result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len)))); // 2038
} // 2039
else { // 2040
result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len)))); // 2041
} // 2042
k += chunk; // 2043
} // 2044
catch (e) { // 2045
chunk = Math.floor(chunk / 2); // 2046
} // 2047
} // 2048
return result.join(""); // 2049
} // 2050
// 2051
exports.applyFromCharCode = arrayLikeToString; // 2052
// 2053
// 2054
/** // 2055
* Copy the data from an array-like to an other array-like. // 2056
* @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array. // 2057
* @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated. // 2058
* @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array. // 2059
*/ // 2060
function arrayLikeToArrayLike(arrayFrom, arrayTo) { // 2061
for (var i = 0; i < arrayFrom.length; i++) { // 2062
arrayTo[i] = arrayFrom[i]; // 2063
} // 2064
return arrayTo; // 2065
} // 2066
// 2067
// a matrix containing functions to transform everything into everything. // 2068
var transform = {}; // 2069
// 2070
// string to ? // 2071
transform["string"] = { // 2072
"string": identity, // 2073
"array": function(input) { // 2074
return stringToArrayLike(input, new Array(input.length)); // 2075
}, // 2076
"arraybuffer": function(input) { // 2077
return transform["string"]["uint8array"](input).buffer; // 2078
}, // 2079
"uint8array": function(input) { // 2080
return stringToArrayLike(input, new Uint8Array(input.length)); // 2081
}, // 2082
"nodebuffer": function(input) { // 2083
return stringToArrayLike(input, nodeBuffer(input.length)); // 2084
} // 2085
}; // 2086
// 2087
// array to ? // 2088
transform["array"] = { // 2089
"string": arrayLikeToString, // 2090
"array": identity, // 2091
"arraybuffer": function(input) { // 2092
return (new Uint8Array(input)).buffer; // 2093
}, // 2094
"uint8array": function(input) { // 2095
return new Uint8Array(input); // 2096
}, // 2097
"nodebuffer": function(input) { // 2098
return nodeBuffer(input); // 2099
} // 2100
}; // 2101
// 2102
// arraybuffer to ? // 2103
transform["arraybuffer"] = { // 2104
"string": function(input) { // 2105
return arrayLikeToString(new Uint8Array(input)); // 2106
}, // 2107
"array": function(input) { // 2108
return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength)); // 2109
}, // 2110
"arraybuffer": identity, // 2111
"uint8array": function(input) { // 2112
return new Uint8Array(input); // 2113
}, // 2114
"nodebuffer": function(input) { // 2115
return nodeBuffer(new Uint8Array(input)); // 2116
} // 2117
}; // 2118
// 2119
// uint8array to ? // 2120
transform["uint8array"] = { // 2121
"string": arrayLikeToString, // 2122
"array": function(input) { // 2123
return arrayLikeToArrayLike(input, new Array(input.length)); // 2124
}, // 2125
"arraybuffer": function(input) { // 2126
return input.buffer; // 2127
}, // 2128
"uint8array": identity, // 2129
"nodebuffer": function(input) { // 2130
return nodeBuffer(input); // 2131
} // 2132
}; // 2133
// 2134
// nodebuffer to ? // 2135
transform["nodebuffer"] = { // 2136
"string": arrayLikeToString, // 2137
"array": function(input) { // 2138
return arrayLikeToArrayLike(input, new Array(input.length)); // 2139
}, // 2140
"arraybuffer": function(input) { // 2141
return transform["nodebuffer"]["uint8array"](input).buffer; // 2142
}, // 2143
"uint8array": function(input) { // 2144
return arrayLikeToArrayLike(input, new Uint8Array(input.length)); // 2145
}, // 2146
"nodebuffer": identity // 2147
}; // 2148
// 2149
/** // 2150
* Transform an input into any type. // 2151
* The supported output type are : string, array, uint8array, arraybuffer, nodebuffer. // 2152
* If no output type is specified, the unmodified input will be returned. // 2153
* @param {String} outputType the output type. // 2154
* @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. // 2155
* @throws {Error} an Error if the browser doesn't support the requested output type. // 2156
*/ // 2157
exports.transformTo = function(outputType, input) { // 2158
if (!input) { // 2159
// undefined, null, etc // 2160
// an empty string won't harm. // 2161
input = ""; // 2162
} // 2163
if (!outputType) { // 2164
return input; // 2165
} // 2166
exports.checkSupport(outputType); // 2167
var inputType = exports.getTypeOf(input); // 2168
var result = transform[inputType][outputType](input); // 2169
return result; // 2170
}; // 2171
// 2172
/** // 2173
* Return the type of the input. // 2174
* The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer. // 2175
* @param {Object} input the input to identify. // 2176
* @return {String} the (lowercase) type of the input. // 2177
*/ // 2178
exports.getTypeOf = function(input) { // 2179
if (typeof input === "string") { // 2180
return "string"; // 2181
} // 2182
if (Object.prototype.toString.call(input) === "[object Array]") { // 2183
return "array"; // 2184
} // 2185
if (support.nodebuffer && nodeBuffer.test(input)) { // 2186
return "nodebuffer"; // 2187
} // 2188
if (support.uint8array && input instanceof Uint8Array) { // 2189
return "uint8array"; // 2190
} // 2191
if (support.arraybuffer && input instanceof ArrayBuffer) { // 2192
return "arraybuffer"; // 2193
} // 2194
}; // 2195
// 2196
/** // 2197
* Throw an exception if the type is not supported. // 2198
* @param {String} type the type to check. // 2199
* @throws {Error} an Error if the browser doesn't support the requested type. // 2200
*/ // 2201
exports.checkSupport = function(type) { // 2202
var supported = support[type.toLowerCase()]; // 2203
if (!supported) { // 2204
throw new Error(type + " is not supported by this browser"); // 2205
} // 2206
}; // 2207
exports.MAX_VALUE_16BITS = 65535; // 2208
exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1 // 2209
// 2210
/** // 2211
* Prettify a string read as binary. // 2212
* @param {string} str the string to prettify. // 2213
* @return {string} a pretty string. // 2214
*/ // 2215
exports.pretty = function(str) { // 2216
var res = '', // 2217
code, i; // 2218
for (i = 0; i < (str || "").length; i++) { // 2219
code = str.charCodeAt(i); // 2220
res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase(); // 2221
} // 2222
return res; // 2223
}; // 2224
// 2225
/** // 2226
* Find a compression registered in JSZip. // 2227
* @param {string} compressionMethod the method magic to find. // 2228
* @return {Object|null} the JSZip compression object, null if none found. // 2229
*/ // 2230
exports.findCompression = function(compressionMethod) { // 2231
for (var method in compressions) { // 2232
if (!compressions.hasOwnProperty(method)) { // 2233
continue; // 2234
} // 2235
if (compressions[method].magic === compressionMethod) { // 2236
return compressions[method]; // 2237
} // 2238
} // 2239
return null; // 2240
}; // 2241
/** // 2242
* Cross-window, cross-Node-context regular expression detection // 2243
* @param {Object} object Anything // 2244
* @return {Boolean} true if the object is a regular expression, // 2245
* false otherwise // 2246
*/ // 2247
exports.isRegExp = function (object) { // 2248
return Object.prototype.toString.call(object) === "[object RegExp]"; // 2249
}; // 2250
// 2251
// 2252
},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){ // 2253
'use strict'; // 2254
var StringReader = _dereq_('./stringReader'); // 2255
var NodeBufferReader = _dereq_('./nodeBufferReader'); // 2256
var Uint8ArrayReader = _dereq_('./uint8ArrayReader'); // 2257
var utils = _dereq_('./utils'); // 2258
var sig = _dereq_('./signature'); // 2259
var ZipEntry = _dereq_('./zipEntry'); // 2260
var support = _dereq_('./support'); // 2261
var jszipProto = _dereq_('./object'); // 2262
// class ZipEntries {{{ // 2263
/** // 2264
* All the entries in the zip file. // 2265
* @constructor // 2266
* @param {String|ArrayBuffer|Uint8Array} data the binary stream to load. // 2267
* @param {Object} loadOptions Options for loading the stream. // 2268
*/ // 2269
function ZipEntries(data, loadOptions) { // 2270
this.files = []; // 2271
this.loadOptions = loadOptions; // 2272
if (data) { // 2273
this.load(data); // 2274
} // 2275
} // 2276
ZipEntries.prototype = { // 2277
/** // 2278
* Check that the reader is on the speficied signature. // 2279
* @param {string} expectedSignature the expected signature. // 2280
* @throws {Error} if it is an other signature. // 2281
*/ // 2282
checkSignature: function(expectedSignature) { // 2283
var signature = this.reader.readString(4); // 2284
if (signature !== expectedSignature) { // 2285
throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
} // 2287
}, // 2288
/** // 2289
* Read the end of the central directory. // 2290
*/ // 2291
readBlockEndOfCentral: function() { // 2292
this.diskNumber = this.reader.readInt(2); // 2293
this.diskWithCentralDirStart = this.reader.readInt(2); // 2294
this.centralDirRecordsOnThisDisk = this.reader.readInt(2); // 2295
this.centralDirRecords = this.reader.readInt(2); // 2296
this.centralDirSize = this.reader.readInt(4); // 2297
this.centralDirOffset = this.reader.readInt(4); // 2298
// 2299
this.zipCommentLength = this.reader.readInt(2); // 2300
// warning : the encoding depends of the system locale // 2301
// On a linux machine with LANG=en_US.utf8, this field is utf8 encoded. // 2302
// On a windows machine, this field is encoded with the localized windows code page. // 2303
this.zipComment = this.reader.readString(this.zipCommentLength); // 2304
// To get consistent behavior with the generation part, we will assume that // 2305
// this is utf8 encoded. // 2306
this.zipComment = jszipProto.utf8decode(this.zipComment); // 2307
}, // 2308
/** // 2309
* Read the end of the Zip 64 central directory. // 2310
* Not merged with the method readEndOfCentral : // 2311
* The end of central can coexist with its Zip64 brother, // 2312
* I don't want to read the wrong number of bytes ! // 2313
*/ // 2314
readBlockZip64EndOfCentral: function() { // 2315
this.zip64EndOfCentralSize = this.reader.readInt(8); // 2316
this.versionMadeBy = this.reader.readString(2); // 2317
this.versionNeeded = this.reader.readInt(2); // 2318
this.diskNumber = this.reader.readInt(4); // 2319
this.diskWithCentralDirStart = this.reader.readInt(4); // 2320
this.centralDirRecordsOnThisDisk = this.reader.readInt(8); // 2321
this.centralDirRecords = this.reader.readInt(8); // 2322
this.centralDirSize = this.reader.readInt(8); // 2323
this.centralDirOffset = this.reader.readInt(8); // 2324
// 2325
this.zip64ExtensibleData = {}; // 2326
var extraDataSize = this.zip64EndOfCentralSize - 44, // 2327
index = 0, // 2328
extraFieldId, // 2329
extraFieldLength, // 2330
extraFieldValue; // 2331
while (index < extraDataSize) { // 2332
extraFieldId = this.reader.readInt(2); // 2333
extraFieldLength = this.reader.readInt(4); // 2334
extraFieldValue = this.reader.readString(extraFieldLength); // 2335
this.zip64ExtensibleData[extraFieldId] = { // 2336
id: extraFieldId, // 2337
length: extraFieldLength, // 2338
value: extraFieldValue // 2339
}; // 2340
} // 2341
}, // 2342
/** // 2343
* Read the end of the Zip 64 central directory locator. // 2344
*/ // 2345
readBlockZip64EndOfCentralLocator: function() { // 2346
this.diskWithZip64CentralDirStart = this.reader.readInt(4); // 2347
this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8); // 2348
this.disksCount = this.reader.readInt(4); // 2349
if (this.disksCount > 1) { // 2350
throw new Error("Multi-volumes zip are not supported"); // 2351
} // 2352
}, // 2353
/** // 2354
* Read the local files, based on the offset read in the central part. // 2355
*/ // 2356
readLocalFiles: function() { // 2357
var i, file; // 2358
for (i = 0; i < this.files.length; i++) { // 2359
file = this.files[i]; // 2360
this.reader.setIndex(file.localHeaderOffset); // 2361
this.checkSignature(sig.LOCAL_FILE_HEADER); // 2362
file.readLocalPart(this.reader); // 2363
file.handleUTF8(); // 2364
file.processAttributes(); // 2365
} // 2366
}, // 2367
/** // 2368
* Read the central directory. // 2369
*/ // 2370
readCentralDir: function() { // 2371
var file; // 2372
// 2373
this.reader.setIndex(this.centralDirOffset); // 2374
while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) { // 2375
file = new ZipEntry({ // 2376
zip64: this.zip64 // 2377
}, this.loadOptions); // 2378
file.readCentralPart(this.reader); // 2379
this.files.push(file); // 2380
} // 2381
}, // 2382
/** // 2383
* Read the end of central directory. // 2384
*/ // 2385
readEndOfCentral: function() { // 2386
var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END); // 2387
if (offset === -1) { // 2388
// Check if the content is a truncated zip or complete garbage. // 2389
// A "LOCAL_FILE_HEADER" is not required at the beginning (auto // 2390
// extractible zip for example) but it can give a good hint. // 2391
// If an ajax request was used without responseType, we will also // 2392
// get unreadable data. // 2393
var isGarbage = true; // 2394
try { // 2395
this.reader.setIndex(0); // 2396
this.checkSignature(sig.LOCAL_FILE_HEADER); // 2397
isGarbage = false; // 2398
} catch (e) {} // 2399
// 2400
if (isGarbage) { // 2401
throw new Error("Can't find end of central directory : is this a zip file ? " + // 2402
"If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html"); // 2403
} else { // 2404
throw new Error("Corrupted zip : can't find end of central directory"); // 2405
} // 2406
} // 2407
this.reader.setIndex(offset); // 2408
this.checkSignature(sig.CENTRAL_DIRECTORY_END); // 2409
this.readBlockEndOfCentral(); // 2410
// 2411
// 2412
/* extract from the zip spec : // 2413
4) If one of the fields in the end of central directory // 2414
record is too small to hold required data, the field // 2415
should be set to -1 (0xFFFF or 0xFFFFFFFF) and the // 2416
ZIP64 format record should be created. // 2417
5) The end of central directory record and the // 2418
Zip64 end of central directory locator record must // 2419
reside on the same disk when splitting or spanning // 2420
an archive. // 2421
*/ // 2422
if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {
this.zip64 = true; // 2424
// 2425
/* // 2426
Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from // 2427
the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents // 2428
all numbers as 64-bit double precision IEEE 754 floating point numbers. // 2429
So, we have 53bits for integers and bitwise operations treat everything as 32bits. // 2430
see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators // 2431
and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5 // 2432
*/ // 2433
// 2434
// should look for a zip64 EOCD locator // 2435
offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); // 2436
if (offset === -1) { // 2437
throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator"); // 2438
} // 2439
this.reader.setIndex(offset); // 2440
this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); // 2441
this.readBlockZip64EndOfCentralLocator(); // 2442
// 2443
// now the zip64 EOCD record // 2444
this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); // 2445
this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); // 2446
this.readBlockZip64EndOfCentral(); // 2447
} // 2448
}, // 2449
prepareReader: function(data) { // 2450
var type = utils.getTypeOf(data); // 2451
if (type === "string" && !support.uint8array) { // 2452
this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString); // 2453
} // 2454
else if (type === "nodebuffer") { // 2455
this.reader = new NodeBufferReader(data); // 2456
} // 2457
else { // 2458
this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data)); // 2459
} // 2460
}, // 2461
/** // 2462
* Read a zip file and create ZipEntries. // 2463
* @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. // 2464
*/ // 2465
load: function(data) { // 2466
this.prepareReader(data); // 2467
this.readEndOfCentral(); // 2468
this.readCentralDir(); // 2469
this.readLocalFiles(); // 2470
} // 2471
}; // 2472
// }}} end of ZipEntries // 2473
module.exports = ZipEntries; // 2474
// 2475
},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
'use strict'; // 2477
var StringReader = _dereq_('./stringReader'); // 2478
var utils = _dereq_('./utils'); // 2479
var CompressedObject = _dereq_('./compressedObject'); // 2480
var jszipProto = _dereq_('./object'); // 2481
// 2482
var MADE_BY_DOS = 0x00; // 2483
var MADE_BY_UNIX = 0x03; // 2484
// 2485
// class ZipEntry {{{ // 2486
/** // 2487
* An entry in the zip file. // 2488
* @constructor // 2489
* @param {Object} options Options of the current file. // 2490
* @param {Object} loadOptions Options for loading the stream. // 2491
*/ // 2492
function ZipEntry(options, loadOptions) { // 2493
this.options = options; // 2494
this.loadOptions = loadOptions; // 2495
} // 2496
ZipEntry.prototype = { // 2497
/** // 2498
* say if the file is encrypted. // 2499
* @return {boolean} true if the file is encrypted, false otherwise. // 2500
*/ // 2501
isEncrypted: function() { // 2502
// bit 1 is set // 2503
return (this.bitFlag & 0x0001) === 0x0001; // 2504
}, // 2505
/** // 2506
* say if the file has utf-8 filename/comment. // 2507
* @return {boolean} true if the filename/comment is in utf-8, false otherwise. // 2508
*/ // 2509
useUTF8: function() { // 2510
// bit 11 is set // 2511
return (this.bitFlag & 0x0800) === 0x0800; // 2512
}, // 2513
/** // 2514
* Prepare the function used to generate the compressed content from this ZipFile. // 2515
* @param {DataReader} reader the reader to use. // 2516
* @param {number} from the offset from where we should read the data. // 2517
* @param {number} length the length of the data to read. // 2518
* @return {Function} the callback to get the compressed content (the type depends of the DataReader class). // 2519
*/ // 2520
prepareCompressedContent: function(reader, from, length) { // 2521
return function() { // 2522
var previousIndex = reader.index; // 2523
reader.setIndex(from); // 2524
var compressedFileData = reader.readData(length); // 2525
reader.setIndex(previousIndex); // 2526
// 2527
return compressedFileData; // 2528
}; // 2529
}, // 2530
/** // 2531
* Prepare the function used to generate the uncompressed content from this ZipFile. // 2532
* @param {DataReader} reader the reader to use. // 2533
* @param {number} from the offset from where we should read the data. // 2534
* @param {number} length the length of the data to read. // 2535
* @param {JSZip.compression} compression the compression used on this file. // 2536
* @param {number} uncompressedSize the uncompressed size to expect. // 2537
* @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class). // 2538
*/ // 2539
prepareContent: function(reader, from, length, compression, uncompressedSize) { // 2540
return function() { // 2541
// 2542
var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent()); // 2543
var uncompressedFileData = compression.uncompress(compressedFileData); // 2544
// 2545
if (uncompressedFileData.length !== uncompressedSize) { // 2546
throw new Error("Bug : uncompressed data size mismatch"); // 2547
} // 2548
// 2549
return uncompressedFileData; // 2550
}; // 2551
}, // 2552
/** // 2553
* Read the local part of a zip file and add the info in this object. // 2554
* @param {DataReader} reader the reader to use. // 2555
*/ // 2556
readLocalPart: function(reader) { // 2557
var compression, localExtraFieldsLength; // 2558
// 2559
// we already know everything from the central dir ! // 2560
// If the central dir data are false, we are doomed. // 2561
// On the bright side, the local part is scary : zip64, data descriptors, both, etc. // 2562
// The less data we get here, the more reliable this should be. // 2563
// Let's skip the whole header and dash to the data ! // 2564
reader.skip(22); // 2565
// in some zip created on windows, the filename stored in the central dir contains \ instead of /. // 2566
// Strangely, the filename here is OK. // 2567
// I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes // 2568
// or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
// Search "unzip mismatching "local" filename continuing with "central" filename version" on // 2570
// the internet. // 2571
// // 2572
// I think I see the logic here : the central directory is used to display // 2573
// content and the local directory is used to extract the files. Mixing / and \
// may be used to display \ to windows users and use / when extracting the files. // 2575
// Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394 // 2576
this.fileNameLength = reader.readInt(2); // 2577
localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir // 2578
this.fileName = reader.readString(this.fileNameLength); // 2579
reader.skip(localExtraFieldsLength); // 2580
// 2581
if (this.compressedSize == -1 || this.uncompressedSize == -1) { // 2582
throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
} // 2584
// 2585
compression = utils.findCompression(this.compressionMethod); // 2586
if (compression === null) { // no compression found // 2587
throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
} // 2589
this.decompressed = new CompressedObject(); // 2590
this.decompressed.compressedSize = this.compressedSize; // 2591
this.decompressed.uncompressedSize = this.uncompressedSize; // 2592
this.decompressed.crc32 = this.crc32; // 2593
this.decompressed.compressionMethod = this.compressionMethod; // 2594
this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
// 2597
// we need to compute the crc32... // 2598
if (this.loadOptions.checkCRC32) { // 2599
this.decompressed = utils.transformTo("string", this.decompressed.getContent()); // 2600
if (jszipProto.crc32(this.decompressed) !== this.crc32) { // 2601
throw new Error("Corrupted zip : CRC32 mismatch"); // 2602
} // 2603
} // 2604
}, // 2605
// 2606
/** // 2607
* Read the central part of a zip file and add the info in this object. // 2608
* @param {DataReader} reader the reader to use. // 2609
*/ // 2610
readCentralPart: function(reader) { // 2611
this.versionMadeBy = reader.readInt(2); // 2612
this.versionNeeded = reader.readInt(2); // 2613
this.bitFlag = reader.readInt(2); // 2614
this.compressionMethod = reader.readString(2); // 2615
this.date = reader.readDate(); // 2616
this.crc32 = reader.readInt(4); // 2617
this.compressedSize = reader.readInt(4); // 2618
this.uncompressedSize = reader.readInt(4); // 2619
this.fileNameLength = reader.readInt(2); // 2620
this.extraFieldsLength = reader.readInt(2); // 2621
this.fileCommentLength = reader.readInt(2); // 2622
this.diskNumberStart = reader.readInt(2); // 2623
this.internalFileAttributes = reader.readInt(2); // 2624
this.externalFileAttributes = reader.readInt(4); // 2625
this.localHeaderOffset = reader.readInt(4); // 2626
// 2627
if (this.isEncrypted()) { // 2628
throw new Error("Encrypted zip are not supported"); // 2629
} // 2630
// 2631
this.fileName = reader.readString(this.fileNameLength); // 2632
this.readExtraFields(reader); // 2633
this.parseZIP64ExtraField(reader); // 2634
this.fileComment = reader.readString(this.fileCommentLength); // 2635
}, // 2636
// 2637
/** // 2638
* Parse the external file attributes and get the unix/dos permissions. // 2639
*/ // 2640
processAttributes: function () { // 2641
this.unixPermissions = null; // 2642
this.dosPermissions = null; // 2643
var madeBy = this.versionMadeBy >> 8; // 2644
// 2645
// Check if we have the DOS directory flag set. // 2646
// We look for it in the DOS and UNIX permissions // 2647
// but some unknown platform could set it as a compatibility flag. // 2648
this.dir = this.externalFileAttributes & 0x0010 ? true : false; // 2649
// 2650
if(madeBy === MADE_BY_DOS) { // 2651
// first 6 bits (0 to 5) // 2652
this.dosPermissions = this.externalFileAttributes & 0x3F; // 2653
} // 2654
// 2655
if(madeBy === MADE_BY_UNIX) { // 2656
this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF; // 2657
// the octal permissions are in (this.unixPermissions & 0x01FF).toString(8); // 2658
} // 2659
// 2660
// fail safe : if the name ends with a / it probably means a folder // 2661
if (!this.dir && this.fileName.slice(-1) === '/') { // 2662
this.dir = true; // 2663
} // 2664
}, // 2665
// 2666
/** // 2667
* Parse the ZIP64 extra field and merge the info in the current ZipEntry. // 2668
* @param {DataReader} reader the reader to use. // 2669
*/ // 2670
parseZIP64ExtraField: function(reader) { // 2671
// 2672
if (!this.extraFields[0x0001]) { // 2673
return; // 2674
} // 2675
// 2676
// should be something, preparing the extra reader // 2677
var extraReader = new StringReader(this.extraFields[0x0001].value); // 2678
// 2679
// I really hope that these 64bits integer can fit in 32 bits integer, because js // 2680
// won't let us have more. // 2681
if (this.uncompressedSize === utils.MAX_VALUE_32BITS) { // 2682
this.uncompressedSize = extraReader.readInt(8); // 2683
} // 2684
if (this.compressedSize === utils.MAX_VALUE_32BITS) { // 2685
this.compressedSize = extraReader.readInt(8); // 2686
} // 2687
if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) { // 2688
this.localHeaderOffset = extraReader.readInt(8); // 2689
} // 2690
if (this.diskNumberStart === utils.MAX_VALUE_32BITS) { // 2691
this.diskNumberStart = extraReader.readInt(4); // 2692
} // 2693
}, // 2694
/** // 2695
* Read the central part of a zip file and add the info in this object. // 2696
* @param {DataReader} reader the reader to use. // 2697
*/ // 2698
readExtraFields: function(reader) { // 2699
var start = reader.index, // 2700
extraFieldId, // 2701
extraFieldLength, // 2702
extraFieldValue; // 2703
// 2704
this.extraFields = this.extraFields || {}; // 2705
// 2706
while (reader.index < start + this.extraFieldsLength) { // 2707
extraFieldId = reader.readInt(2); // 2708
extraFieldLength = reader.readInt(2); // 2709
extraFieldValue = reader.readString(extraFieldLength); // 2710
// 2711
this.extraFields[extraFieldId] = { // 2712
id: extraFieldId, // 2713
length: extraFieldLength, // 2714
value: extraFieldValue // 2715
}; // 2716
} // 2717
}, // 2718
/** // 2719
* Apply an UTF8 transformation if needed. // 2720
*/ // 2721
handleUTF8: function() { // 2722
if (this.useUTF8()) { // 2723
this.fileName = jszipProto.utf8decode(this.fileName); // 2724
this.fileComment = jszipProto.utf8decode(this.fileComment); // 2725
} else { // 2726
var upath = this.findExtraFieldUnicodePath(); // 2727
if (upath !== null) { // 2728
this.fileName = upath; // 2729
} // 2730
var ucomment = this.findExtraFieldUnicodeComment(); // 2731
if (ucomment !== null) { // 2732
this.fileComment = ucomment; // 2733
} // 2734
} // 2735
}, // 2736
// 2737
/** // 2738
* Find the unicode path declared in the extra field, if any. // 2739
* @return {String} the unicode path, null otherwise. // 2740
*/ // 2741
findExtraFieldUnicodePath: function() { // 2742
var upathField = this.extraFields[0x7075]; // 2743
if (upathField) { // 2744
var extraReader = new StringReader(upathField.value); // 2745
// 2746
// wrong version // 2747
if (extraReader.readInt(1) !== 1) { // 2748
return null; // 2749
} // 2750
// 2751
// the crc of the filename changed, this field is out of date. // 2752
if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) { // 2753
return null; // 2754
} // 2755
// 2756
return jszipProto.utf8decode(extraReader.readString(upathField.length - 5)); // 2757
} // 2758
return null; // 2759
}, // 2760
// 2761
/** // 2762
* Find the unicode comment declared in the extra field, if any. // 2763
* @return {String} the unicode comment, null otherwise. // 2764
*/ // 2765
findExtraFieldUnicodeComment: function() { // 2766
var ucommentField = this.extraFields[0x6375]; // 2767
if (ucommentField) { // 2768
var extraReader = new StringReader(ucommentField.value); // 2769
// 2770
// wrong version // 2771
if (extraReader.readInt(1) !== 1) { // 2772
return null; // 2773
} // 2774
// 2775
// the crc of the comment changed, this field is out of date. // 2776
if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) { // 2777
return null; // 2778
} // 2779
// 2780
return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5)); // 2781
} // 2782
return null; // 2783
} // 2784
}; // 2785
module.exports = ZipEntry; // 2786
// 2787
},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){ // 2788
// Top level file is just a mixin of submodules & constants // 2789
'use strict'; // 2790
// 2791
var assign = _dereq_('./lib/utils/common').assign; // 2792
// 2793
var deflate = _dereq_('./lib/deflate'); // 2794
var inflate = _dereq_('./lib/inflate'); // 2795
var constants = _dereq_('./lib/zlib/constants'); // 2796
// 2797
var pako = {}; // 2798
// 2799
assign(pako, deflate, inflate, constants); // 2800
// 2801
module.exports = pako; // 2802
},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
'use strict'; // 2804
// 2805
// 2806
var zlib_deflate = _dereq_('./zlib/deflate.js'); // 2807
var utils = _dereq_('./utils/common'); // 2808
var strings = _dereq_('./utils/strings'); // 2809
var msg = _dereq_('./zlib/messages'); // 2810
var zstream = _dereq_('./zlib/zstream'); // 2811
// 2812
// 2813
/* Public constants ==========================================================*/ // 2814
/* ===========================================================================*/ // 2815
// 2816
var Z_NO_FLUSH = 0; // 2817
var Z_FINISH = 4; // 2818
// 2819
var Z_OK = 0; // 2820
var Z_STREAM_END = 1; // 2821
// 2822
var Z_DEFAULT_COMPRESSION = -1; // 2823
// 2824
var Z_DEFAULT_STRATEGY = 0; // 2825
// 2826
var Z_DEFLATED = 8; // 2827
// 2828
/* ===========================================================================*/ // 2829
// 2830
// 2831
/** // 2832
* class Deflate // 2833
* // 2834
* Generic JS-style wrapper for zlib calls. If you don't need // 2835
* streaming behaviour - use more simple functions: [[deflate]], // 2836
* [[deflateRaw]] and [[gzip]]. // 2837
**/ // 2838
// 2839
/* internal // 2840
* Deflate.chunks -> Array // 2841
* // 2842
* Chunks of output data, if [[Deflate#onData]] not overriden. // 2843
**/ // 2844
// 2845
/** // 2846
* Deflate.result -> Uint8Array|Array // 2847
* // 2848
* Compressed result, generated by default [[Deflate#onData]] // 2849
* and [[Deflate#onEnd]] handlers. Filled after you push last chunk // 2850
* (call [[Deflate#push]] with `Z_FINISH` / `true` param). // 2851
**/ // 2852
// 2853
/** // 2854
* Deflate.err -> Number // 2855
* // 2856
* Error code after deflate finished. 0 (Z_OK) on success. // 2857
* You will not need it in real life, because deflate errors // 2858
* are possible only on wrong options or bad `onData` / `onEnd` // 2859
* custom handlers. // 2860
**/ // 2861
// 2862
/** // 2863
* Deflate.msg -> String // 2864
* // 2865
* Error message, if [[Deflate.err]] != 0 // 2866
**/ // 2867
// 2868
// 2869
/** // 2870
* new Deflate(options) // 2871
* - options (Object): zlib deflate options. // 2872
* // 2873
* Creates new deflator instance with specified params. Throws exception // 2874
* on bad params. Supported options: // 2875
* // 2876
* - `level` // 2877
* - `windowBits` // 2878
* - `memLevel` // 2879
* - `strategy` // 2880
* // 2881
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) // 2882
* for more information on these. // 2883
* // 2884
* Additional options, for internal needs: // 2885
* // 2886
* - `chunkSize` - size of generated data chunks (16K by default) // 2887
* - `raw` (Boolean) - do raw deflate // 2888
* - `gzip` (Boolean) - create gzip wrapper // 2889
* - `to` (String) - if equal to 'string', then result will be "binary string" // 2890
* (each char code [0..255]) // 2891
* - `header` (Object) - custom header for gzip // 2892
* - `text` (Boolean) - true if compressed data believed to be text // 2893
* - `time` (Number) - modification time, unix timestamp // 2894
* - `os` (Number) - operation system code // 2895
* - `extra` (Array) - array of bytes with extra data (max 65536) // 2896
* - `name` (String) - file name (binary string) // 2897
* - `comment` (String) - comment (binary string) // 2898
* - `hcrc` (Boolean) - true if header crc should be added // 2899
* // 2900
* ##### Example: // 2901
* // 2902
* ```javascript // 2903
* var pako = require('pako') // 2904
* , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) // 2905
* , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); // 2906
* // 2907
* var deflate = new pako.Deflate({ level: 3}); // 2908
* // 2909
* deflate.push(chunk1, false); // 2910
* deflate.push(chunk2, true); // true -> last chunk // 2911
* // 2912
* if (deflate.err) { throw new Error(deflate.err); } // 2913
* // 2914
* console.log(deflate.result); // 2915
* ``` // 2916
**/ // 2917
var Deflate = function(options) { // 2918
// 2919
this.options = utils.assign({ // 2920
level: Z_DEFAULT_COMPRESSION, // 2921
method: Z_DEFLATED, // 2922
chunkSize: 16384, // 2923
windowBits: 15, // 2924
memLevel: 8, // 2925
strategy: Z_DEFAULT_STRATEGY, // 2926
to: '' // 2927
}, options || {}); // 2928
// 2929
var opt = this.options; // 2930
// 2931
if (opt.raw && (opt.windowBits > 0)) { // 2932
opt.windowBits = -opt.windowBits; // 2933
} // 2934
// 2935
else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { // 2936
opt.windowBits += 16; // 2937
} // 2938
// 2939
this.err = 0; // error code, if happens (0 = Z_OK) // 2940
this.msg = ''; // error message // 2941
this.ended = false; // used to avoid multiple onEnd() calls // 2942
this.chunks = []; // chunks of compressed data // 2943
// 2944
this.strm = new zstream(); // 2945
this.strm.avail_out = 0; // 2946
// 2947
var status = zlib_deflate.deflateInit2( // 2948
this.strm, // 2949
opt.level, // 2950
opt.method, // 2951
opt.windowBits, // 2952
opt.memLevel, // 2953
opt.strategy // 2954
); // 2955
// 2956
if (status !== Z_OK) { // 2957
throw new Error(msg[status]); // 2958
} // 2959
// 2960
if (opt.header) { // 2961
zlib_deflate.deflateSetHeader(this.strm, opt.header); // 2962
} // 2963
}; // 2964
// 2965
/** // 2966
* Deflate#push(data[, mode]) -> Boolean // 2967
* - data (Uint8Array|Array|String): input data. Strings will be converted to // 2968
* utf8 byte sequence. // 2969
* - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. // 2970
* See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. // 2971
* // 2972
* Sends input data to deflate pipe, generating [[Deflate#onData]] calls with // 2973
* new compressed chunks. Returns `true` on success. The last data block must have // 2974
* mode Z_FINISH (or `true`). That flush internal pending buffers and call // 2975
* [[Deflate#onEnd]]. // 2976
* // 2977
* On fail call [[Deflate#onEnd]] with error code and return false. // 2978
* // 2979
* We strongly recommend to use `Uint8Array` on input for best speed (output // 2980
* array format is detected automatically). Also, don't skip last param and always // 2981
* use the same type in your code (boolean or number). That will improve JS speed. // 2982
* // 2983
* For regular `Array`-s make sure all elements are [0..255]. // 2984
* // 2985
* ##### Example // 2986
* // 2987
* ```javascript // 2988
* push(chunk, false); // push one of data chunks // 2989
* ... // 2990
* push(chunk, true); // push last chunk // 2991
* ``` // 2992
**/ // 2993
Deflate.prototype.push = function(data, mode) { // 2994
var strm = this.strm; // 2995
var chunkSize = this.options.chunkSize; // 2996
var status, _mode; // 2997
// 2998
if (this.ended) { return false; } // 2999
// 3000
_mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH); // 3001
// 3002
// Convert data if needed // 3003
if (typeof data === 'string') { // 3004
// If we need to compress text, change encoding to utf8. // 3005
strm.input = strings.string2buf(data); // 3006
} else { // 3007
strm.input = data; // 3008
} // 3009
// 3010
strm.next_in = 0; // 3011
strm.avail_in = strm.input.length; // 3012
// 3013
do { // 3014
if (strm.avail_out === 0) { // 3015
strm.output = new utils.Buf8(chunkSize); // 3016
strm.next_out = 0; // 3017
strm.avail_out = chunkSize; // 3018
} // 3019
status = zlib_deflate.deflate(strm, _mode); /* no bad return value */ // 3020
// 3021
if (status !== Z_STREAM_END && status !== Z_OK) { // 3022
this.onEnd(status); // 3023
this.ended = true; // 3024
return false; // 3025
} // 3026
if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) { // 3027
if (this.options.to === 'string') { // 3028
this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))); // 3029
} else { // 3030
this.onData(utils.shrinkBuf(strm.output, strm.next_out)); // 3031
} // 3032
} // 3033
} while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END); // 3034
// 3035
// Finalize on the last chunk. // 3036
if (_mode === Z_FINISH) { // 3037
status = zlib_deflate.deflateEnd(this.strm); // 3038
this.onEnd(status); // 3039
this.ended = true; // 3040
return status === Z_OK; // 3041
} // 3042
// 3043
return true; // 3044
}; // 3045
// 3046
// 3047
/** // 3048
* Deflate#onData(chunk) -> Void // 3049
* - chunk (Uint8Array|Array|String): ouput data. Type of array depends // 3050
* on js engine support. When string output requested, each chunk // 3051
* will be string. // 3052
* // 3053
* By default, stores data blocks in `chunks[]` property and glue // 3054
* those in `onEnd`. Override this handler, if you need another behaviour. // 3055
**/ // 3056
Deflate.prototype.onData = function(chunk) { // 3057
this.chunks.push(chunk); // 3058
}; // 3059
// 3060
// 3061
/** // 3062
* Deflate#onEnd(status) -> Void // 3063
* - status (Number): deflate status. 0 (Z_OK) on success, // 3064
* other if not. // 3065
* // 3066
* Called once after you tell deflate that input stream complete // 3067
* or error happenned. By default - join collected chunks, // 3068
* free memory and fill `results` / `err` properties. // 3069
**/ // 3070
Deflate.prototype.onEnd = function(status) { // 3071
// On success - join // 3072
if (status === Z_OK) { // 3073
if (this.options.to === 'string') { // 3074
this.result = this.chunks.join(''); // 3075
} else { // 3076
this.result = utils.flattenChunks(this.chunks); // 3077
} // 3078
} // 3079
this.chunks = []; // 3080
this.err = status; // 3081
this.msg = this.strm.msg; // 3082
}; // 3083
// 3084
// 3085
/** // 3086
* deflate(data[, options]) -> Uint8Array|Array|String // 3087
* - data (Uint8Array|Array|String): input data to compress. // 3088
* - options (Object): zlib deflate options. // 3089
* // 3090
* Compress `data` with deflate alrorythm and `options`. // 3091
* // 3092
* Supported options are: // 3093
* // 3094
* - level // 3095
* - windowBits // 3096
* - memLevel // 3097
* - strategy // 3098
* // 3099
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) // 3100
* for more information on these. // 3101
* // 3102
* Sugar (options): // 3103
* // 3104
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify // 3105
* negative windowBits implicitly. // 3106
* - `to` (String) - if equal to 'string', then result will be "binary string" // 3107
* (each char code [0..255]) // 3108
* // 3109
* ##### Example: // 3110
* // 3111
* ```javascript // 3112
* var pako = require('pako') // 3113
* , data = Uint8Array([1,2,3,4,5,6,7,8,9]); // 3114
* // 3115
* console.log(pako.deflate(data)); // 3116
* ``` // 3117
**/ // 3118
function deflate(input, options) { // 3119
var deflator = new Deflate(options); // 3120
// 3121
deflator.push(input, true); // 3122
// 3123
// That will never happens, if you don't cheat with options :) // 3124
if (deflator.err) { throw deflator.msg; } // 3125
// 3126
return deflator.result; // 3127
} // 3128
// 3129
// 3130
/** // 3131
* deflateRaw(data[, options]) -> Uint8Array|Array|String // 3132
* - data (Uint8Array|Array|String): input data to compress. // 3133
* - options (Object): zlib deflate options. // 3134
* // 3135
* The same as [[deflate]], but creates raw data, without wrapper // 3136
* (header and adler32 crc). // 3137
**/ // 3138
function deflateRaw(input, options) { // 3139
options = options || {}; // 3140
options.raw = true; // 3141
return deflate(input, options); // 3142
} // 3143
// 3144
// 3145
/** // 3146
* gzip(data[, options]) -> Uint8Array|Array|String // 3147
* - data (Uint8Array|Array|String): input data to compress. // 3148
* - options (Object): zlib deflate options. // 3149
* // 3150
* The same as [[deflate]], but create gzip wrapper instead of // 3151
* deflate one. // 3152
**/ // 3153
function gzip(input, options) { // 3154
options = options || {}; // 3155
options.gzip = true; // 3156
return deflate(input, options); // 3157
} // 3158
// 3159
// 3160
exports.Deflate = Deflate; // 3161
exports.deflate = deflate; // 3162
exports.deflateRaw = deflateRaw; // 3163
exports.gzip = gzip; // 3164
},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
'use strict'; // 3166
// 3167
// 3168
var zlib_inflate = _dereq_('./zlib/inflate.js'); // 3169
var utils = _dereq_('./utils/common'); // 3170
var strings = _dereq_('./utils/strings'); // 3171
var c = _dereq_('./zlib/constants'); // 3172
var msg = _dereq_('./zlib/messages'); // 3173
var zstream = _dereq_('./zlib/zstream'); // 3174
var gzheader = _dereq_('./zlib/gzheader'); // 3175
// 3176
// 3177
/** // 3178
* class Inflate // 3179
* // 3180
* Generic JS-style wrapper for zlib calls. If you don't need // 3181
* streaming behaviour - use more simple functions: [[inflate]] // 3182
* and [[inflateRaw]]. // 3183
**/ // 3184
// 3185
/* internal // 3186
* inflate.chunks -> Array // 3187
* // 3188
* Chunks of output data, if [[Inflate#onData]] not overriden. // 3189
**/ // 3190
// 3191
/** // 3192
* Inflate.result -> Uint8Array|Array|String // 3193
* // 3194
* Uncompressed result, generated by default [[Inflate#onData]] // 3195
* and [[Inflate#onEnd]] handlers. Filled after you push last chunk // 3196
* (call [[Inflate#push]] with `Z_FINISH` / `true` param). // 3197
**/ // 3198
// 3199
/** // 3200
* Inflate.err -> Number // 3201
* // 3202
* Error code after inflate finished. 0 (Z_OK) on success. // 3203
* Should be checked if broken data possible. // 3204
**/ // 3205
// 3206
/** // 3207
* Inflate.msg -> String // 3208
* // 3209
* Error message, if [[Inflate.err]] != 0 // 3210
**/ // 3211
// 3212
// 3213
/** // 3214
* new Inflate(options) // 3215
* - options (Object): zlib inflate options. // 3216
* // 3217
* Creates new inflator instance with specified params. Throws exception // 3218
* on bad params. Supported options: // 3219
* // 3220
* - `windowBits` // 3221
* // 3222
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) // 3223
* for more information on these. // 3224
* // 3225
* Additional options, for internal needs: // 3226
* // 3227
* - `chunkSize` - size of generated data chunks (16K by default) // 3228
* - `raw` (Boolean) - do raw inflate // 3229
* - `to` (String) - if equal to 'string', then result will be converted // 3230
* from utf8 to utf16 (javascript) string. When string output requested, // 3231
* chunk length can differ from `chunkSize`, depending on content. // 3232
* // 3233
* By default, when no options set, autodetect deflate/gzip data format via // 3234
* wrapper header. // 3235
* // 3236
* ##### Example: // 3237
* // 3238
* ```javascript // 3239
* var pako = require('pako') // 3240
* , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) // 3241
* , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); // 3242
* // 3243
* var inflate = new pako.Inflate({ level: 3}); // 3244
* // 3245
* inflate.push(chunk1, false); // 3246
* inflate.push(chunk2, true); // true -> last chunk // 3247
* // 3248
* if (inflate.err) { throw new Error(inflate.err); } // 3249
* // 3250
* console.log(inflate.result); // 3251
* ``` // 3252
**/ // 3253
var Inflate = function(options) { // 3254
// 3255
this.options = utils.assign({ // 3256
chunkSize: 16384, // 3257
windowBits: 0, // 3258
to: '' // 3259
}, options || {}); // 3260
// 3261
var opt = this.options; // 3262
// 3263
// Force window size for `raw` data, if not set directly, // 3264
// because we have no header for autodetect. // 3265
if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { // 3266
opt.windowBits = -opt.windowBits; // 3267
if (opt.windowBits === 0) { opt.windowBits = -15; } // 3268
} // 3269
// 3270
// If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate // 3271
if ((opt.windowBits >= 0) && (opt.windowBits < 16) && // 3272
!(options && options.windowBits)) { // 3273
opt.windowBits += 32; // 3274
} // 3275
// 3276
// Gzip header has no info about windows size, we can do autodetect only // 3277
// for deflate. So, if window size not set, force it to max when gzip possible // 3278
if ((opt.windowBits > 15) && (opt.windowBits < 48)) { // 3279
// bit 3 (16) -> gzipped data // 3280
// bit 4 (32) -> autodetect gzip/deflate // 3281
if ((opt.windowBits & 15) === 0) { // 3282
opt.windowBits |= 15; // 3283
} // 3284
} // 3285
// 3286
this.err = 0; // error code, if happens (0 = Z_OK) // 3287
this.msg = ''; // error message // 3288
this.ended = false; // used to avoid multiple onEnd() calls // 3289
this.chunks = []; // chunks of compressed data // 3290
// 3291
this.strm = new zstream(); // 3292
this.strm.avail_out = 0; // 3293
// 3294
var status = zlib_inflate.inflateInit2( // 3295
this.strm, // 3296
opt.windowBits // 3297
); // 3298
// 3299
if (status !== c.Z_OK) { // 3300
throw new Error(msg[status]); // 3301
} // 3302
// 3303
this.header = new gzheader(); // 3304
// 3305
zlib_inflate.inflateGetHeader(this.strm, this.header); // 3306
}; // 3307
// 3308
/** // 3309
* Inflate#push(data[, mode]) -> Boolean // 3310
* - data (Uint8Array|Array|String): input data // 3311
* - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. // 3312
* See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. // 3313
* // 3314
* Sends input data to inflate pipe, generating [[Inflate#onData]] calls with // 3315
* new output chunks. Returns `true` on success. The last data block must have // 3316
* mode Z_FINISH (or `true`). That flush internal pending buffers and call // 3317
* [[Inflate#onEnd]]. // 3318
* // 3319
* On fail call [[Inflate#onEnd]] with error code and return false. // 3320
* // 3321
* We strongly recommend to use `Uint8Array` on input for best speed (output // 3322
* format is detected automatically). Also, don't skip last param and always // 3323
* use the same type in your code (boolean or number). That will improve JS speed. // 3324
* // 3325
* For regular `Array`-s make sure all elements are [0..255]. // 3326
* // 3327
* ##### Example // 3328
* // 3329
* ```javascript // 3330
* push(chunk, false); // push one of data chunks // 3331
* ... // 3332
* push(chunk, true); // push last chunk // 3333
* ``` // 3334
**/ // 3335
Inflate.prototype.push = function(data, mode) { // 3336
var strm = this.strm; // 3337
var chunkSize = this.options.chunkSize; // 3338
var status, _mode; // 3339
var next_out_utf8, tail, utf8str; // 3340
// 3341
if (this.ended) { return false; } // 3342
_mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); // 3343
// 3344
// Convert data if needed // 3345
if (typeof data === 'string') { // 3346
// Only binary strings can be decompressed on practice // 3347
strm.input = strings.binstring2buf(data); // 3348
} else { // 3349
strm.input = data; // 3350
} // 3351
// 3352
strm.next_in = 0; // 3353
strm.avail_in = strm.input.length; // 3354
// 3355
do { // 3356
if (strm.avail_out === 0) { // 3357
strm.output = new utils.Buf8(chunkSize); // 3358
strm.next_out = 0; // 3359
strm.avail_out = chunkSize; // 3360
} // 3361
// 3362
status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ // 3363
// 3364
if (status !== c.Z_STREAM_END && status !== c.Z_OK) { // 3365
this.onEnd(status); // 3366
this.ended = true; // 3367
return false; // 3368
} // 3369
// 3370
if (strm.next_out) { // 3371
if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) { // 3372
// 3373
if (this.options.to === 'string') { // 3374
// 3375
next_out_utf8 = strings.utf8border(strm.output, strm.next_out); // 3376
// 3377
tail = strm.next_out - next_out_utf8; // 3378
utf8str = strings.buf2string(strm.output, next_out_utf8); // 3379
// 3380
// move tail // 3381
strm.next_out = tail; // 3382
strm.avail_out = chunkSize - tail; // 3383
if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } // 3384
// 3385
this.onData(utf8str); // 3386
// 3387
} else { // 3388
this.onData(utils.shrinkBuf(strm.output, strm.next_out)); // 3389
} // 3390
} // 3391
} // 3392
} while ((strm.avail_in > 0) && status !== c.Z_STREAM_END); // 3393
// 3394
if (status === c.Z_STREAM_END) { // 3395
_mode = c.Z_FINISH; // 3396
} // 3397
// Finalize on the last chunk. // 3398
if (_mode === c.Z_FINISH) { // 3399
status = zlib_inflate.inflateEnd(this.strm); // 3400
this.onEnd(status); // 3401
this.ended = true; // 3402
return status === c.Z_OK; // 3403
} // 3404
// 3405
return true; // 3406
}; // 3407
// 3408
// 3409
/** // 3410
* Inflate#onData(chunk) -> Void // 3411
* - chunk (Uint8Array|Array|String): ouput data. Type of array depends // 3412
* on js engine support. When string output requested, each chunk // 3413
* will be string. // 3414
* // 3415
* By default, stores data blocks in `chunks[]` property and glue // 3416
* those in `onEnd`. Override this handler, if you need another behaviour. // 3417
**/ // 3418
Inflate.prototype.onData = function(chunk) { // 3419
this.chunks.push(chunk); // 3420
}; // 3421
// 3422
// 3423
/** // 3424
* Inflate#onEnd(status) -> Void // 3425
* - status (Number): inflate status. 0 (Z_OK) on success, // 3426
* other if not. // 3427
* // 3428
* Called once after you tell inflate that input stream complete // 3429
* or error happenned. By default - join collected chunks, // 3430
* free memory and fill `results` / `err` properties. // 3431
**/ // 3432
Inflate.prototype.onEnd = function(status) { // 3433
// On success - join // 3434
if (status === c.Z_OK) { // 3435
if (this.options.to === 'string') { // 3436
// Glue & convert here, until we teach pako to send // 3437
// utf8 alligned strings to onData // 3438
this.result = this.chunks.join(''); // 3439
} else { // 3440
this.result = utils.flattenChunks(this.chunks); // 3441
} // 3442
} // 3443
this.chunks = []; // 3444
this.err = status; // 3445
this.msg = this.strm.msg; // 3446
}; // 3447
// 3448
// 3449
/** // 3450
* inflate(data[, options]) -> Uint8Array|Array|String // 3451
* - data (Uint8Array|Array|String): input data to decompress. // 3452
* - options (Object): zlib inflate options. // 3453
* // 3454
* Decompress `data` with inflate/ungzip and `options`. Autodetect // 3455
* format via wrapper header by default. That's why we don't provide // 3456
* separate `ungzip` method. // 3457
* // 3458
* Supported options are: // 3459
* // 3460
* - windowBits // 3461
* // 3462
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) // 3463
* for more information. // 3464
* // 3465
* Sugar (options): // 3466
* // 3467
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify // 3468
* negative windowBits implicitly. // 3469
* - `to` (String) - if equal to 'string', then result will be converted // 3470
* from utf8 to utf16 (javascript) string. When string output requested, // 3471
* chunk length can differ from `chunkSize`, depending on content. // 3472
* // 3473
* // 3474
* ##### Example: // 3475
* // 3476
* ```javascript // 3477
* var pako = require('pako') // 3478
* , input = pako.deflate([1,2,3,4,5,6,7,8,9]) // 3479
* , output; // 3480
* // 3481
* try { // 3482
* output = pako.inflate(input); // 3483
* } catch (err) // 3484
* console.log(err); // 3485
* } // 3486
* ``` // 3487
**/ // 3488
function inflate(input, options) { // 3489
var inflator = new Inflate(options); // 3490
// 3491
inflator.push(input, true); // 3492
// 3493
// That will never happens, if you don't cheat with options :) // 3494
if (inflator.err) { throw inflator.msg; } // 3495
// 3496
return inflator.result; // 3497
} // 3498
// 3499
// 3500
/** // 3501
* inflateRaw(data[, options]) -> Uint8Array|Array|String // 3502
* - data (Uint8Array|Array|String): input data to decompress. // 3503
* - options (Object): zlib inflate options. // 3504
* // 3505
* The same as [[inflate]], but creates raw data, without wrapper // 3506
* (header and adler32 crc). // 3507
**/ // 3508
function inflateRaw(input, options) { // 3509
options = options || {}; // 3510
options.raw = true; // 3511
return inflate(input, options); // 3512
} // 3513
// 3514
// 3515
/** // 3516
* ungzip(data[, options]) -> Uint8Array|Array|String // 3517
* - data (Uint8Array|Array|String): input data to decompress. // 3518
* - options (Object): zlib inflate options. // 3519
* // 3520
* Just shortcut to [[inflate]], because it autodetects format // 3521
* by header.content. Done for convenience. // 3522
**/ // 3523
// 3524
// 3525
exports.Inflate = Inflate; // 3526
exports.inflate = inflate; // 3527
exports.inflateRaw = inflateRaw; // 3528
exports.ungzip = inflate; // 3529
// 3530
},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){
'use strict'; // 3532
// 3533
// 3534
var TYPED_OK = (typeof Uint8Array !== 'undefined') && // 3535
(typeof Uint16Array !== 'undefined') && // 3536
(typeof Int32Array !== 'undefined'); // 3537
// 3538
// 3539
exports.assign = function (obj /*from1, from2, from3, ...*/) { // 3540
var sources = Array.prototype.slice.call(arguments, 1); // 3541
while (sources.length) { // 3542
var source = sources.shift(); // 3543
if (!source) { continue; } // 3544
// 3545
if (typeof(source) !== 'object') { // 3546
throw new TypeError(source + 'must be non-object'); // 3547
} // 3548
// 3549
for (var p in source) { // 3550
if (source.hasOwnProperty(p)) { // 3551
obj[p] = source[p]; // 3552
} // 3553
} // 3554
} // 3555
// 3556
return obj; // 3557
}; // 3558
// 3559
// 3560
// reduce buffer size, avoiding mem copy // 3561
exports.shrinkBuf = function (buf, size) { // 3562
if (buf.length === size) { return buf; } // 3563
if (buf.subarray) { return buf.subarray(0, size); } // 3564
buf.length = size; // 3565
return buf; // 3566
}; // 3567
// 3568
// 3569
var fnTyped = { // 3570
arraySet: function (dest, src, src_offs, len, dest_offs) { // 3571
if (src.subarray && dest.subarray) { // 3572
dest.set(src.subarray(src_offs, src_offs+len), dest_offs); // 3573
return; // 3574
} // 3575
// Fallback to ordinary array // 3576
for(var i=0; i<len; i++) { // 3577
dest[dest_offs + i] = src[src_offs + i]; // 3578
} // 3579
}, // 3580
// Join array of chunks to single array. // 3581
flattenChunks: function(chunks) { // 3582
var i, l, len, pos, chunk, result; // 3583
// 3584
// calculate data length // 3585
len = 0; // 3586
for (i=0, l=chunks.length; i<l; i++) { // 3587
len += chunks[i].length; // 3588
} // 3589
// 3590
// join chunks // 3591
result = new Uint8Array(len); // 3592
pos = 0; // 3593
for (i=0, l=chunks.length; i<l; i++) { // 3594
chunk = chunks[i]; // 3595
result.set(chunk, pos); // 3596
pos += chunk.length; // 3597
} // 3598
// 3599
return result; // 3600
} // 3601
}; // 3602
// 3603
var fnUntyped = { // 3604
arraySet: function (dest, src, src_offs, len, dest_offs) { // 3605
for(var i=0; i<len; i++) { // 3606
dest[dest_offs + i] = src[src_offs + i]; // 3607
} // 3608
}, // 3609
// Join array of chunks to single array. // 3610
flattenChunks: function(chunks) { // 3611
return [].concat.apply([], chunks); // 3612
} // 3613
}; // 3614
// 3615
// 3616
// Enable/Disable typed arrays use, for testing // 3617
// // 3618
exports.setTyped = function (on) { // 3619
if (on) { // 3620
exports.Buf8 = Uint8Array; // 3621
exports.Buf16 = Uint16Array; // 3622
exports.Buf32 = Int32Array; // 3623
exports.assign(exports, fnTyped); // 3624
} else { // 3625
exports.Buf8 = Array; // 3626
exports.Buf16 = Array; // 3627
exports.Buf32 = Array; // 3628
exports.assign(exports, fnUntyped); // 3629
} // 3630
}; // 3631
// 3632
exports.setTyped(TYPED_OK); // 3633
},{}],28:[function(_dereq_,module,exports){ // 3634
// String encode/decode helpers // 3635
'use strict'; // 3636
// 3637
// 3638
var utils = _dereq_('./common'); // 3639
// 3640
// 3641
// Quick check if we can use fast array to bin string conversion // 3642
// // 3643
// - apply(Array) can fail on Android 2.2 // 3644
// - apply(Uint8Array) can fail on iOS 5.1 Safary // 3645
// // 3646
var STR_APPLY_OK = true; // 3647
var STR_APPLY_UIA_OK = true; // 3648
// 3649
try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; } // 3650
try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; } // 3651
// 3652
// 3653
// Table with utf8 lengths (calculated by first byte of sequence) // 3654
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, // 3655
// because max possible codepoint is 0x10ffff // 3656
var _utf8len = new utils.Buf8(256); // 3657
for (var i=0; i<256; i++) { // 3658
_utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1); // 3659
} // 3660
_utf8len[254]=_utf8len[254]=1; // Invalid sequence start // 3661
// 3662
// 3663
// convert string to array (typed, when possible) // 3664
exports.string2buf = function (str) { // 3665
var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; // 3666
// 3667
// count binary size // 3668
for (m_pos = 0; m_pos < str_len; m_pos++) { // 3669
c = str.charCodeAt(m_pos); // 3670
if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { // 3671
c2 = str.charCodeAt(m_pos+1); // 3672
if ((c2 & 0xfc00) === 0xdc00) { // 3673
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); // 3674
m_pos++; // 3675
} // 3676
} // 3677
buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; // 3678
} // 3679
// 3680
// allocate buffer // 3681
buf = new utils.Buf8(buf_len); // 3682
// 3683
// convert // 3684
for (i=0, m_pos = 0; i < buf_len; m_pos++) { // 3685
c = str.charCodeAt(m_pos); // 3686
if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { // 3687
c2 = str.charCodeAt(m_pos+1); // 3688
if ((c2 & 0xfc00) === 0xdc00) { // 3689
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); // 3690
m_pos++; // 3691
} // 3692
} // 3693
if (c < 0x80) { // 3694
/* one byte */ // 3695
buf[i++] = c; // 3696
} else if (c < 0x800) { // 3697
/* two bytes */ // 3698
buf[i++] = 0xC0 | (c >>> 6); // 3699
buf[i++] = 0x80 | (c & 0x3f); // 3700
} else if (c < 0x10000) { // 3701
/* three bytes */ // 3702
buf[i++] = 0xE0 | (c >>> 12); // 3703
buf[i++] = 0x80 | (c >>> 6 & 0x3f); // 3704
buf[i++] = 0x80 | (c & 0x3f); // 3705
} else { // 3706
/* four bytes */ // 3707
buf[i++] = 0xf0 | (c >>> 18); // 3708
buf[i++] = 0x80 | (c >>> 12 & 0x3f); // 3709
buf[i++] = 0x80 | (c >>> 6 & 0x3f); // 3710
buf[i++] = 0x80 | (c & 0x3f); // 3711
} // 3712
} // 3713
// 3714
return buf; // 3715
}; // 3716
// 3717
// Helper (used in 2 places) // 3718
function buf2binstring(buf, len) { // 3719
// use fallback for big arrays to avoid stack overflow // 3720
if (len < 65537) { // 3721
if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) { // 3722
return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len)); // 3723
} // 3724
} // 3725
// 3726
var result = ''; // 3727
for(var i=0; i < len; i++) { // 3728
result += String.fromCharCode(buf[i]); // 3729
} // 3730
return result; // 3731
} // 3732
// 3733
// 3734
// Convert byte array to binary string // 3735
exports.buf2binstring = function(buf) { // 3736
return buf2binstring(buf, buf.length); // 3737
}; // 3738
// 3739
// 3740
// Convert binary string (typed, when possible) // 3741
exports.binstring2buf = function(str) { // 3742
var buf = new utils.Buf8(str.length); // 3743
for(var i=0, len=buf.length; i < len; i++) { // 3744
buf[i] = str.charCodeAt(i); // 3745
} // 3746
return buf; // 3747
}; // 3748
// 3749
// 3750
// convert array to string // 3751
exports.buf2string = function (buf, max) { // 3752
var i, out, c, c_len; // 3753
var len = max || buf.length; // 3754
// 3755
// Reserve max possible length (2 words per char) // 3756
// NB: by unknown reasons, Array is significantly faster for // 3757
// String.fromCharCode.apply than Uint16Array. // 3758
var utf16buf = new Array(len*2); // 3759
// 3760
for (out=0, i=0; i<len;) { // 3761
c = buf[i++]; // 3762
// quick process ascii // 3763
if (c < 0x80) { utf16buf[out++] = c; continue; } // 3764
// 3765
c_len = _utf8len[c]; // 3766
// skip 5 & 6 byte codes // 3767
if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; } // 3768
// 3769
// apply mask on first byte // 3770
c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; // 3771
// join the rest // 3772
while (c_len > 1 && i < len) { // 3773
c = (c << 6) | (buf[i++] & 0x3f); // 3774
c_len--; // 3775
} // 3776
// 3777
// terminated by end of string? // 3778
if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } // 3779
// 3780
if (c < 0x10000) { // 3781
utf16buf[out++] = c; // 3782
} else { // 3783
c -= 0x10000; // 3784
utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); // 3785
utf16buf[out++] = 0xdc00 | (c & 0x3ff); // 3786
} // 3787
} // 3788
// 3789
return buf2binstring(utf16buf, out); // 3790
}; // 3791
// 3792
// 3793
// Calculate max possible position in utf8 buffer, // 3794
// that will not break sequence. If that's not possible // 3795
// - (very small limits) return max size as is. // 3796
// // 3797
// buf[] - utf8 bytes array // 3798
// max - length limit (mandatory); // 3799
exports.utf8border = function(buf, max) { // 3800
var pos; // 3801
// 3802
max = max || buf.length; // 3803
if (max > buf.length) { max = buf.length; } // 3804
// 3805
// go back from last position, until start of sequence found // 3806
pos = max-1; // 3807
while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } // 3808
// 3809
// Fuckup - very small and broken sequence, // 3810
// return max, because we should return something anyway. // 3811
if (pos < 0) { return max; } // 3812
// 3813
// If we came to start of buffer - that means vuffer is too small, // 3814
// return max too. // 3815
if (pos === 0) { return max; } // 3816
// 3817
return (pos + _utf8len[buf[pos]] > max) ? pos : max; // 3818
}; // 3819
// 3820
},{"./common":27}],29:[function(_dereq_,module,exports){ // 3821
'use strict'; // 3822
// 3823
// Note: adler32 takes 12% for level 0 and 2% for level 6. // 3824
// It doesn't worth to make additional optimizationa as in original. // 3825
// Small size is preferable. // 3826
// 3827
function adler32(adler, buf, len, pos) { // 3828
var s1 = (adler & 0xffff) |0 // 3829
, s2 = ((adler >>> 16) & 0xffff) |0 // 3830
, n = 0; // 3831
// 3832
while (len !== 0) { // 3833
// Set limit ~ twice less than 5552, to keep // 3834
// s2 in 31-bits, because we force signed ints. // 3835
// in other case %= will fail. // 3836
n = len > 2000 ? 2000 : len; // 3837
len -= n; // 3838
// 3839
do { // 3840
s1 = (s1 + buf[pos++]) |0; // 3841
s2 = (s2 + s1) |0; // 3842
} while (--n); // 3843
// 3844
s1 %= 65521; // 3845
s2 %= 65521; // 3846
} // 3847
// 3848
return (s1 | (s2 << 16)) |0; // 3849
} // 3850
// 3851
// 3852
module.exports = adler32; // 3853
},{}],30:[function(_dereq_,module,exports){ // 3854
module.exports = { // 3855
// 3856
/* Allowed flush values; see deflate() and inflate() below for details */ // 3857
Z_NO_FLUSH: 0, // 3858
Z_PARTIAL_FLUSH: 1, // 3859
Z_SYNC_FLUSH: 2, // 3860
Z_FULL_FLUSH: 3, // 3861
Z_FINISH: 4, // 3862
Z_BLOCK: 5, // 3863
Z_TREES: 6, // 3864
// 3865
/* Return codes for the compression/decompression functions. Negative values // 3866
* are errors, positive values are used for special but normal events. // 3867
*/ // 3868
Z_OK: 0, // 3869
Z_STREAM_END: 1, // 3870
Z_NEED_DICT: 2, // 3871
Z_ERRNO: -1, // 3872
Z_STREAM_ERROR: -2, // 3873
Z_DATA_ERROR: -3, // 3874
//Z_MEM_ERROR: -4, // 3875
Z_BUF_ERROR: -5, // 3876
//Z_VERSION_ERROR: -6, // 3877
// 3878
/* compression levels */ // 3879
Z_NO_COMPRESSION: 0, // 3880
Z_BEST_SPEED: 1, // 3881
Z_BEST_COMPRESSION: 9, // 3882
Z_DEFAULT_COMPRESSION: -1, // 3883
// 3884
// 3885
Z_FILTERED: 1, // 3886
Z_HUFFMAN_ONLY: 2, // 3887
Z_RLE: 3, // 3888
Z_FIXED: 4, // 3889
Z_DEFAULT_STRATEGY: 0, // 3890
// 3891
/* Possible values of the data_type field (though see inflate()) */ // 3892
Z_BINARY: 0, // 3893
Z_TEXT: 1, // 3894
//Z_ASCII: 1, // = Z_TEXT (deprecated) // 3895
Z_UNKNOWN: 2, // 3896
// 3897
/* The deflate compression method */ // 3898
Z_DEFLATED: 8 // 3899
//Z_NULL: null // Use -1 or null inline, depending on var type // 3900
}; // 3901
},{}],31:[function(_dereq_,module,exports){ // 3902
'use strict'; // 3903
// 3904
// Note: we can't get significant speed boost here. // 3905
// So write code to minimize size - no pregenerated tables // 3906
// and array tools dependencies. // 3907
// 3908
// 3909
// Use ordinary array, since untyped makes no boost here // 3910
function makeTable() { // 3911
var c, table = []; // 3912
// 3913
for(var n =0; n < 256; n++){ // 3914
c = n; // 3915
for(var k =0; k < 8; k++){ // 3916
c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); // 3917
} // 3918
table[n] = c; // 3919
} // 3920
// 3921
return table; // 3922
} // 3923
// 3924
// Create table on load. Just 255 signed longs. Not a problem. // 3925
var crcTable = makeTable(); // 3926
// 3927
// 3928
function crc32(crc, buf, len, pos) { // 3929
var t = crcTable // 3930
, end = pos + len; // 3931
// 3932
crc = crc ^ (-1); // 3933
// 3934
for (var i = pos; i < end; i++ ) { // 3935
crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; // 3936
} // 3937
// 3938
return (crc ^ (-1)); // >>> 0; // 3939
} // 3940
// 3941
// 3942
module.exports = crc32; // 3943
},{}],32:[function(_dereq_,module,exports){ // 3944
'use strict'; // 3945
// 3946
var utils = _dereq_('../utils/common'); // 3947
var trees = _dereq_('./trees'); // 3948
var adler32 = _dereq_('./adler32'); // 3949
var crc32 = _dereq_('./crc32'); // 3950
var msg = _dereq_('./messages'); // 3951
// 3952
/* Public constants ==========================================================*/ // 3953
/* ===========================================================================*/ // 3954
// 3955
// 3956
/* Allowed flush values; see deflate() and inflate() below for details */ // 3957
var Z_NO_FLUSH = 0; // 3958
var Z_PARTIAL_FLUSH = 1; // 3959
//var Z_SYNC_FLUSH = 2; // 3960
var Z_FULL_FLUSH = 3; // 3961
var Z_FINISH = 4; // 3962
var Z_BLOCK = 5; // 3963
//var Z_TREES = 6; // 3964
// 3965
// 3966
/* Return codes for the compression/decompression functions. Negative values // 3967
* are errors, positive values are used for special but normal events. // 3968
*/ // 3969
var Z_OK = 0; // 3970
var Z_STREAM_END = 1; // 3971
//var Z_NEED_DICT = 2; // 3972
//var Z_ERRNO = -1; // 3973
var Z_STREAM_ERROR = -2; // 3974
var Z_DATA_ERROR = -3; // 3975
//var Z_MEM_ERROR = -4; // 3976
var Z_BUF_ERROR = -5; // 3977
//var Z_VERSION_ERROR = -6; // 3978
// 3979
// 3980
/* compression levels */ // 3981
//var Z_NO_COMPRESSION = 0; // 3982
//var Z_BEST_SPEED = 1; // 3983
//var Z_BEST_COMPRESSION = 9; // 3984
var Z_DEFAULT_COMPRESSION = -1; // 3985
// 3986
// 3987
var Z_FILTERED = 1; // 3988
var Z_HUFFMAN_ONLY = 2; // 3989
var Z_RLE = 3; // 3990
var Z_FIXED = 4; // 3991
var Z_DEFAULT_STRATEGY = 0; // 3992
// 3993
/* Possible values of the data_type field (though see inflate()) */ // 3994
//var Z_BINARY = 0; // 3995
//var Z_TEXT = 1; // 3996
//var Z_ASCII = 1; // = Z_TEXT // 3997
var Z_UNKNOWN = 2; // 3998
// 3999
// 4000
/* The deflate compression method */ // 4001
var Z_DEFLATED = 8; // 4002
// 4003
/*============================================================================*/ // 4004
// 4005
// 4006
var MAX_MEM_LEVEL = 9; // 4007
/* Maximum value for memLevel in deflateInit2 */ // 4008
var MAX_WBITS = 15; // 4009
/* 32K LZ77 window */ // 4010
var DEF_MEM_LEVEL = 8; // 4011
// 4012
// 4013
var LENGTH_CODES = 29; // 4014
/* number of length codes, not counting the special END_BLOCK code */ // 4015
var LITERALS = 256; // 4016
/* number of literal bytes 0..255 */ // 4017
var L_CODES = LITERALS + 1 + LENGTH_CODES; // 4018
/* number of Literal or Length codes, including the END_BLOCK code */ // 4019
var D_CODES = 30; // 4020
/* number of distance codes */ // 4021
var BL_CODES = 19; // 4022
/* number of codes used to transfer the bit lengths */ // 4023
var HEAP_SIZE = 2*L_CODES + 1; // 4024
/* maximum heap size */ // 4025
var MAX_BITS = 15; // 4026
/* All codes must not exceed MAX_BITS bits */ // 4027
// 4028
var MIN_MATCH = 3; // 4029
var MAX_MATCH = 258; // 4030
var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); // 4031
// 4032
var PRESET_DICT = 0x20; // 4033
// 4034
var INIT_STATE = 42; // 4035
var EXTRA_STATE = 69; // 4036
var NAME_STATE = 73; // 4037
var COMMENT_STATE = 91; // 4038
var HCRC_STATE = 103; // 4039
var BUSY_STATE = 113; // 4040
var FINISH_STATE = 666; // 4041
// 4042
var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ // 4043
var BS_BLOCK_DONE = 2; /* block flush performed */ // 4044
var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ // 4045
var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ // 4046
// 4047
var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. // 4048
// 4049
function err(strm, errorCode) { // 4050
strm.msg = msg[errorCode]; // 4051
return errorCode; // 4052
} // 4053
// 4054
function rank(f) { // 4055
return ((f) << 1) - ((f) > 4 ? 9 : 0); // 4056
} // 4057
// 4058
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } // 4059
// 4060
// 4061
/* ========================================================================= // 4062
* Flush as much pending output as possible. All deflate() output goes // 4063
* through this function so some applications may wish to modify it // 4064
* to avoid allocating a large strm->output buffer and copying into it. // 4065
* (See also read_buf()). // 4066
*/ // 4067
function flush_pending(strm) { // 4068
var s = strm.state; // 4069
// 4070
//_tr_flush_bits(s); // 4071
var len = s.pending; // 4072
if (len > strm.avail_out) { // 4073
len = strm.avail_out; // 4074
} // 4075
if (len === 0) { return; } // 4076
// 4077
utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); // 4078
strm.next_out += len; // 4079
s.pending_out += len; // 4080
strm.total_out += len; // 4081
strm.avail_out -= len; // 4082
s.pending -= len; // 4083
if (s.pending === 0) { // 4084
s.pending_out = 0; // 4085
} // 4086
} // 4087
// 4088
// 4089
function flush_block_only (s, last) { // 4090
trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); // 4091
s.block_start = s.strstart; // 4092
flush_pending(s.strm); // 4093
} // 4094
// 4095
// 4096
function put_byte(s, b) { // 4097
s.pending_buf[s.pending++] = b; // 4098
} // 4099
// 4100
// 4101
/* ========================================================================= // 4102
* Put a short in the pending buffer. The 16-bit value is put in MSB order. // 4103
* IN assertion: the stream state is correct and there is enough room in // 4104
* pending_buf. // 4105
*/ // 4106
function putShortMSB(s, b) { // 4107
// put_byte(s, (Byte)(b >> 8)); // 4108
// put_byte(s, (Byte)(b & 0xff)); // 4109
s.pending_buf[s.pending++] = (b >>> 8) & 0xff; // 4110
s.pending_buf[s.pending++] = b & 0xff; // 4111
} // 4112
// 4113
// 4114
/* =========================================================================== // 4115
* Read a new buffer from the current input stream, update the adler32 // 4116
* and total number of bytes read. All deflate() input goes through // 4117
* this function so some applications may wish to modify it to avoid // 4118
* allocating a large strm->input buffer and copying from it. // 4119
* (See also flush_pending()). // 4120
*/ // 4121
function read_buf(strm, buf, start, size) { // 4122
var len = strm.avail_in; // 4123
// 4124
if (len > size) { len = size; } // 4125
if (len === 0) { return 0; } // 4126
// 4127
strm.avail_in -= len; // 4128
// 4129
utils.arraySet(buf, strm.input, strm.next_in, len, start); // 4130
if (strm.state.wrap === 1) { // 4131
strm.adler = adler32(strm.adler, buf, len, start); // 4132
} // 4133
// 4134
else if (strm.state.wrap === 2) { // 4135
strm.adler = crc32(strm.adler, buf, len, start); // 4136
} // 4137
// 4138
strm.next_in += len; // 4139
strm.total_in += len; // 4140
// 4141
return len; // 4142
} // 4143
// 4144
// 4145
/* =========================================================================== // 4146
* Set match_start to the longest match starting at the given string and // 4147
* return its length. Matches shorter or equal to prev_length are discarded, // 4148
* in which case the result is equal to prev_length and match_start is // 4149
* garbage. // 4150
* IN assertions: cur_match is the head of the hash chain for the current // 4151
* string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 // 4152
* OUT assertion: the match length is not greater than s->lookahead. // 4153
*/ // 4154
function longest_match(s, cur_match) { // 4155
var chain_length = s.max_chain_length; /* max hash chain length */ // 4156
var scan = s.strstart; /* current string */ // 4157
var match; /* matched string */ // 4158
var len; /* length of current match */ // 4159
var best_len = s.prev_length; /* best match length so far */ // 4160
var nice_match = s.nice_match; /* stop if match long enough */ // 4161
var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? // 4162
s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; // 4163
// 4164
var _win = s.window; // shortcut // 4165
// 4166
var wmask = s.w_mask; // 4167
var prev = s.prev; // 4168
// 4169
/* Stop when cur_match becomes <= limit. To simplify the code, // 4170
* we prevent matches with the string of window index 0. // 4171
*/ // 4172
// 4173
var strend = s.strstart + MAX_MATCH; // 4174
var scan_end1 = _win[scan + best_len - 1]; // 4175
var scan_end = _win[scan + best_len]; // 4176
// 4177
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. // 4178
* It is easy to get rid of this optimization if necessary. // 4179
*/ // 4180
// Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); // 4181
// 4182
/* Do not waste too much time if we already have a good match: */ // 4183
if (s.prev_length >= s.good_match) { // 4184
chain_length >>= 2; // 4185
} // 4186
/* Do not look for matches beyond the end of the input. This is necessary // 4187
* to make deflate deterministic. // 4188
*/ // 4189
if (nice_match > s.lookahead) { nice_match = s.lookahead; } // 4190
// 4191
// Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); // 4192
// 4193
do { // 4194
// Assert(cur_match < s->strstart, "no future"); // 4195
match = cur_match; // 4196
// 4197
/* Skip to next match if the match length cannot increase // 4198
* or if the match length is less than 2. Note that the checks below // 4199
* for insufficient lookahead only occur occasionally for performance // 4200
* reasons. Therefore uninitialized memory will be accessed, and // 4201
* conditional jumps will be made that depend on those values. // 4202
* However the length of the match is limited to the lookahead, so // 4203
* the output of deflate is not affected by the uninitialized values. // 4204
*/ // 4205
// 4206
if (_win[match + best_len] !== scan_end || // 4207
_win[match + best_len - 1] !== scan_end1 || // 4208
_win[match] !== _win[scan] || // 4209
_win[++match] !== _win[scan + 1]) { // 4210
continue; // 4211
} // 4212
// 4213
/* The check at best_len-1 can be removed because it will be made // 4214
* again later. (This heuristic is not always a win.) // 4215
* It is not necessary to compare scan[2] and match[2] since they // 4216
* are always equal when the other bytes match, given that // 4217
* the hash keys are equal and that HASH_BITS >= 8. // 4218
*/ // 4219
scan += 2; // 4220
match++; // 4221
// Assert(*scan == *match, "match[2]?"); // 4222
// 4223
/* We check for insufficient lookahead only every 8th comparison; // 4224
* the 256th check will be made at strstart+258. // 4225
*/ // 4226
do { // 4227
/*jshint noempty:false*/ // 4228
} while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && // 4229
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && // 4230
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && // 4231
_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && // 4232
scan < strend); // 4233
// 4234
// Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); // 4235
// 4236
len = MAX_MATCH - (strend - scan); // 4237
scan = strend - MAX_MATCH; // 4238
// 4239
if (len > best_len) { // 4240
s.match_start = cur_match; // 4241
best_len = len; // 4242
if (len >= nice_match) { // 4243
break; // 4244
} // 4245
scan_end1 = _win[scan + best_len - 1]; // 4246
scan_end = _win[scan + best_len]; // 4247
} // 4248
} while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); // 4249
// 4250
if (best_len <= s.lookahead) { // 4251
return best_len; // 4252
} // 4253
return s.lookahead; // 4254
} // 4255
// 4256
// 4257
/* =========================================================================== // 4258
* Fill the window when the lookahead becomes insufficient. // 4259
* Updates strstart and lookahead. // 4260
* // 4261
* IN assertion: lookahead < MIN_LOOKAHEAD // 4262
* OUT assertions: strstart <= window_size-MIN_LOOKAHEAD // 4263
* At least one byte has been read, or avail_in == 0; reads are // 4264
* performed for at least two bytes (required for the zip translate_eol // 4265
* option -- not supported here). // 4266
*/ // 4267
function fill_window(s) { // 4268
var _w_size = s.w_size; // 4269
var p, n, m, more, str; // 4270
// 4271
//Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); // 4272
// 4273
do { // 4274
more = s.window_size - s.lookahead - s.strstart; // 4275
// 4276
// JS ints have 32 bit, block below not needed // 4277
/* Deal with !@#$% 64K limit: */ // 4278
//if (sizeof(int) <= 2) { // 4279
// if (more == 0 && s->strstart == 0 && s->lookahead == 0) { // 4280
// more = wsize; // 4281
// // 4282
// } else if (more == (unsigned)(-1)) { // 4283
// /* Very unlikely, but possible on 16 bit machine if // 4284
// * strstart == 0 && lookahead == 1 (input done a byte at time) // 4285
// */ // 4286
// more--; // 4287
// } // 4288
//} // 4289
// 4290
// 4291
/* If the window is almost full and there is insufficient lookahead, // 4292
* move the upper half to the lower one to make room in the upper half. // 4293
*/ // 4294
if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { // 4295
// 4296
utils.arraySet(s.window, s.window, _w_size, _w_size, 0); // 4297
s.match_start -= _w_size; // 4298
s.strstart -= _w_size; // 4299
/* we now have strstart >= MAX_DIST */ // 4300
s.block_start -= _w_size; // 4301
// 4302
/* Slide the hash table (could be avoided with 32 bit values // 4303
at the expense of memory usage). We slide even when level == 0 // 4304
to keep the hash table consistent if we switch back to level > 0 // 4305
later. (Using level 0 permanently is not an optimal usage of // 4306
zlib, so we don't care about this pathological case.) // 4307
*/ // 4308
// 4309
n = s.hash_size; // 4310
p = n; // 4311
do { // 4312
m = s.head[--p]; // 4313
s.head[p] = (m >= _w_size ? m - _w_size : 0); // 4314
} while (--n); // 4315
// 4316
n = _w_size; // 4317
p = n; // 4318
do { // 4319
m = s.prev[--p]; // 4320
s.prev[p] = (m >= _w_size ? m - _w_size : 0); // 4321
/* If n is not on any hash chain, prev[n] is garbage but // 4322
* its value will never be used. // 4323
*/ // 4324
} while (--n); // 4325
// 4326
more += _w_size; // 4327
} // 4328
if (s.strm.avail_in === 0) { // 4329
break; // 4330
} // 4331
// 4332
/* If there was no sliding: // 4333
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && // 4334
* more == window_size - lookahead - strstart // 4335
* => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) // 4336
* => more >= window_size - 2*WSIZE + 2 // 4337
* In the BIG_MEM or MMAP case (not yet supported), // 4338
* window_size == input_size + MIN_LOOKAHEAD && // 4339
* strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. // 4340
* Otherwise, window_size == 2*WSIZE so more >= 2. // 4341
* If there was sliding, more >= WSIZE. So in all cases, more >= 2. // 4342
*/ // 4343
//Assert(more >= 2, "more < 2"); // 4344
n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); // 4345
s.lookahead += n; // 4346
// 4347
/* Initialize the hash value now that we have some input: */ // 4348
if (s.lookahead + s.insert >= MIN_MATCH) { // 4349
str = s.strstart - s.insert; // 4350
s.ins_h = s.window[str]; // 4351
// 4352
/* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ // 4353
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; // 4354
//#if MIN_MATCH != 3 // 4355
// Call update_hash() MIN_MATCH-3 more times // 4356
//#endif // 4357
while (s.insert) { // 4358
/* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ // 4359
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask; // 4360
// 4361
s.prev[str & s.w_mask] = s.head[s.ins_h]; // 4362
s.head[s.ins_h] = str; // 4363
str++; // 4364
s.insert--; // 4365
if (s.lookahead + s.insert < MIN_MATCH) { // 4366
break; // 4367
} // 4368
} // 4369
} // 4370
/* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, // 4371
* but this is not important since only literal bytes will be emitted. // 4372
*/ // 4373
// 4374
} while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); // 4375
// 4376
/* If the WIN_INIT bytes after the end of the current data have never been // 4377
* written, then zero those bytes in order to avoid memory check reports of // 4378
* the use of uninitialized (or uninitialised as Julian writes) bytes by // 4379
* the longest match routines. Update the high water mark for the next // 4380
* time through here. WIN_INIT is set to MAX_MATCH since the longest match // 4381
* routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. // 4382
*/ // 4383
// if (s.high_water < s.window_size) { // 4384
// var curr = s.strstart + s.lookahead; // 4385
// var init = 0; // 4386
// // 4387
// if (s.high_water < curr) { // 4388
// /* Previous high water mark below current data -- zero WIN_INIT // 4389
// * bytes or up to end of window, whichever is less. // 4390
// */ // 4391
// init = s.window_size - curr; // 4392
// if (init > WIN_INIT) // 4393
// init = WIN_INIT; // 4394
// zmemzero(s->window + curr, (unsigned)init); // 4395
// s->high_water = curr + init; // 4396
// } // 4397
// else if (s->high_water < (ulg)curr + WIN_INIT) { // 4398
// /* High water mark at or above current data, but below current data // 4399
// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up // 4400
// * to end of window, whichever is less. // 4401
// */ // 4402
// init = (ulg)curr + WIN_INIT - s->high_water; // 4403
// if (init > s->window_size - s->high_water) // 4404
// init = s->window_size - s->high_water; // 4405
// zmemzero(s->window + s->high_water, (unsigned)init); // 4406
// s->high_water += init; // 4407
// } // 4408
// } // 4409
// // 4410
// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, // 4411
// "not enough room for search"); // 4412
} // 4413
// 4414
/* =========================================================================== // 4415
* Copy without compression as much as possible from the input stream, return // 4416
* the current block state. // 4417
* This function does not insert new strings in the dictionary since // 4418
* uncompressible data is probably not useful. This function is used // 4419
* only for the level=0 compression option. // 4420
* NOTE: this function should be optimized to avoid extra copying from // 4421
* window to pending_buf. // 4422
*/ // 4423
function deflate_stored(s, flush) { // 4424
/* Stored blocks are limited to 0xffff bytes, pending_buf is limited // 4425
* to pending_buf_size, and each stored block has a 5 byte header: // 4426
*/ // 4427
var max_block_size = 0xffff; // 4428
// 4429
if (max_block_size > s.pending_buf_size - 5) { // 4430
max_block_size = s.pending_buf_size - 5; // 4431
} // 4432
// 4433
/* Copy as much as possible from input to output: */ // 4434
for (;;) { // 4435
/* Fill the window as much as possible: */ // 4436
if (s.lookahead <= 1) { // 4437
// 4438
//Assert(s->strstart < s->w_size+MAX_DIST(s) || // 4439
// s->block_start >= (long)s->w_size, "slide too late"); // 4440
// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || // 4441
// s.block_start >= s.w_size)) { // 4442
// throw new Error("slide too late"); // 4443
// } // 4444
// 4445
fill_window(s); // 4446
if (s.lookahead === 0 && flush === Z_NO_FLUSH) { // 4447
return BS_NEED_MORE; // 4448
} // 4449
// 4450
if (s.lookahead === 0) { // 4451
break; // 4452
} // 4453
/* flush the current block */ // 4454
} // 4455
//Assert(s->block_start >= 0L, "block gone"); // 4456
// if (s.block_start < 0) throw new Error("block gone"); // 4457
// 4458
s.strstart += s.lookahead; // 4459
s.lookahead = 0; // 4460
// 4461
/* Emit a stored block if pending_buf will be full: */ // 4462
var max_start = s.block_start + max_block_size; // 4463
// 4464
if (s.strstart === 0 || s.strstart >= max_start) { // 4465
/* strstart == 0 is possible when wraparound on 16-bit machine */ // 4466
s.lookahead = s.strstart - max_start; // 4467
s.strstart = max_start; // 4468
/*** FLUSH_BLOCK(s, 0); ***/ // 4469
flush_block_only(s, false); // 4470
if (s.strm.avail_out === 0) { // 4471
return BS_NEED_MORE; // 4472
} // 4473
/***/ // 4474
// 4475
// 4476
} // 4477
/* Flush if we may have to slide, otherwise block_start may become // 4478
* negative and the data will be gone: // 4479
*/ // 4480
if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { // 4481
/*** FLUSH_BLOCK(s, 0); ***/ // 4482
flush_block_only(s, false); // 4483
if (s.strm.avail_out === 0) { // 4484
return BS_NEED_MORE; // 4485
} // 4486
/***/ // 4487
} // 4488
} // 4489
// 4490
s.insert = 0; // 4491
// 4492
if (flush === Z_FINISH) { // 4493
/*** FLUSH_BLOCK(s, 1); ***/ // 4494
flush_block_only(s, true); // 4495
if (s.strm.avail_out === 0) { // 4496
return BS_FINISH_STARTED; // 4497
} // 4498
/***/ // 4499
return BS_FINISH_DONE; // 4500
} // 4501
// 4502
if (s.strstart > s.block_start) { // 4503
/*** FLUSH_BLOCK(s, 0); ***/ // 4504
flush_block_only(s, false); // 4505
if (s.strm.avail_out === 0) { // 4506
return BS_NEED_MORE; // 4507
} // 4508
/***/ // 4509
} // 4510
// 4511
return BS_NEED_MORE; // 4512
} // 4513
// 4514
/* =========================================================================== // 4515
* Compress as much as possible from the input stream, return the current // 4516
* block state. // 4517
* This function does not perform lazy evaluation of matches and inserts // 4518
* new strings in the dictionary only for unmatched strings or for short // 4519
* matches. It is used only for the fast compression options. // 4520
*/ // 4521
function deflate_fast(s, flush) { // 4522
var hash_head; /* head of the hash chain */ // 4523
var bflush; /* set if current block must be flushed */ // 4524
// 4525
for (;;) { // 4526
/* Make sure that we always have enough lookahead, except // 4527
* at the end of the input file. We need MAX_MATCH bytes // 4528
* for the next match, plus MIN_MATCH bytes to insert the // 4529
* string following the next match. // 4530
*/ // 4531
if (s.lookahead < MIN_LOOKAHEAD) { // 4532
fill_window(s); // 4533
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { // 4534
return BS_NEED_MORE; // 4535
} // 4536
if (s.lookahead === 0) { // 4537
break; /* flush the current block */ // 4538
} // 4539
} // 4540
// 4541
/* Insert the string window[strstart .. strstart+2] in the // 4542
* dictionary, and set hash_head to the head of the hash chain: // 4543
*/ // 4544
hash_head = 0/*NIL*/; // 4545
if (s.lookahead >= MIN_MATCH) { // 4546
/*** INSERT_STRING(s, s.strstart, hash_head); ***/ // 4547
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; // 4548
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; // 4549
s.head[s.ins_h] = s.strstart; // 4550
/***/ // 4551
} // 4552
// 4553
/* Find the longest match, discarding those <= prev_length. // 4554
* At this point we have always match_length < MIN_MATCH // 4555
*/ // 4556
if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { // 4557
/* To simplify the code, we prevent matches with the string // 4558
* of window index 0 (in particular we have to avoid a match // 4559
* of the string with itself at the start of the input file). // 4560
*/ // 4561
s.match_length = longest_match(s, hash_head); // 4562
/* longest_match() sets match_start */ // 4563
} // 4564
if (s.match_length >= MIN_MATCH) { // 4565
// check_match(s, s.strstart, s.match_start, s.match_length); // for debug only // 4566
// 4567
/*** _tr_tally_dist(s, s.strstart - s.match_start, // 4568
s.match_length - MIN_MATCH, bflush); ***/ // 4569
bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); // 4570
// 4571
s.lookahead -= s.match_length; // 4572
// 4573
/* Insert new strings in the hash table only if the match length // 4574
* is not too large. This saves time but degrades compression. // 4575
*/ // 4576
if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { // 4577
s.match_length--; /* string at strstart already in table */ // 4578
do { // 4579
s.strstart++; // 4580
/*** INSERT_STRING(s, s.strstart, hash_head); ***/ // 4581
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; // 4582
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; // 4583
s.head[s.ins_h] = s.strstart; // 4584
/***/ // 4585
/* strstart never exceeds WSIZE-MAX_MATCH, so there are // 4586
* always MIN_MATCH bytes ahead. // 4587
*/ // 4588
} while (--s.match_length !== 0); // 4589
s.strstart++; // 4590
} else // 4591
{ // 4592
s.strstart += s.match_length; // 4593
s.match_length = 0; // 4594
s.ins_h = s.window[s.strstart]; // 4595
/* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ // 4596
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; // 4597
// 4598
//#if MIN_MATCH != 3 // 4599
// Call UPDATE_HASH() MIN_MATCH-3 more times // 4600
//#endif // 4601
/* If lookahead < MIN_MATCH, ins_h is garbage, but it does not // 4602
* matter since it will be recomputed at next deflate call. // 4603
*/ // 4604
} // 4605
} else { // 4606
/* No match, output a literal byte */ // 4607
//Tracevv((stderr,"%c", s.window[s.strstart])); // 4608
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ // 4609
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); // 4610
// 4611
s.lookahead--; // 4612
s.strstart++; // 4613
} // 4614
if (bflush) { // 4615
/*** FLUSH_BLOCK(s, 0); ***/ // 4616
flush_block_only(s, false); // 4617
if (s.strm.avail_out === 0) { // 4618
return BS_NEED_MORE; // 4619
} // 4620
/***/ // 4621
} // 4622
} // 4623
s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1); // 4624
if (flush === Z_FINISH) { // 4625
/*** FLUSH_BLOCK(s, 1); ***/ // 4626
flush_block_only(s, true); // 4627
if (s.strm.avail_out === 0) { // 4628
return BS_FINISH_STARTED; // 4629
} // 4630
/***/ // 4631
return BS_FINISH_DONE; // 4632
} // 4633
if (s.last_lit) { // 4634
/*** FLUSH_BLOCK(s, 0); ***/ // 4635
flush_block_only(s, false); // 4636
if (s.strm.avail_out === 0) { // 4637
return BS_NEED_MORE; // 4638
} // 4639
/***/ // 4640
} // 4641
return BS_BLOCK_DONE; // 4642
} // 4643
// 4644
/* =========================================================================== // 4645
* Same as above, but achieves better compression. We use a lazy // 4646
* evaluation for matches: a match is finally adopted only if there is // 4647
* no better match at the next window position. // 4648
*/ // 4649
function deflate_slow(s, flush) { // 4650
var hash_head; /* head of hash chain */ // 4651
var bflush; /* set if current block must be flushed */ // 4652
// 4653
var max_insert; // 4654
// 4655
/* Process the input block. */ // 4656
for (;;) { // 4657
/* Make sure that we always have enough lookahead, except // 4658
* at the end of the input file. We need MAX_MATCH bytes // 4659
* for the next match, plus MIN_MATCH bytes to insert the // 4660
* string following the next match. // 4661
*/ // 4662
if (s.lookahead < MIN_LOOKAHEAD) { // 4663
fill_window(s); // 4664
if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { // 4665
return BS_NEED_MORE; // 4666
} // 4667
if (s.lookahead === 0) { break; } /* flush the current block */ // 4668
} // 4669
// 4670
/* Insert the string window[strstart .. strstart+2] in the // 4671
* dictionary, and set hash_head to the head of the hash chain: // 4672
*/ // 4673
hash_head = 0/*NIL*/; // 4674
if (s.lookahead >= MIN_MATCH) { // 4675
/*** INSERT_STRING(s, s.strstart, hash_head); ***/ // 4676
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; // 4677
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; // 4678
s.head[s.ins_h] = s.strstart; // 4679
/***/ // 4680
} // 4681
// 4682
/* Find the longest match, discarding those <= prev_length. // 4683
*/ // 4684
s.prev_length = s.match_length; // 4685
s.prev_match = s.match_start; // 4686
s.match_length = MIN_MATCH-1; // 4687
// 4688
if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && // 4689
s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { // 4690
/* To simplify the code, we prevent matches with the string // 4691
* of window index 0 (in particular we have to avoid a match // 4692
* of the string with itself at the start of the input file). // 4693
*/ // 4694
s.match_length = longest_match(s, hash_head); // 4695
/* longest_match() sets match_start */ // 4696
// 4697
if (s.match_length <= 5 && // 4698
(s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
// 4700
/* If prev_match is also MIN_MATCH, match_start is garbage // 4701
* but we will ignore the current match anyway. // 4702
*/ // 4703
s.match_length = MIN_MATCH-1; // 4704
} // 4705
} // 4706
/* If there was a match at the previous step and the current // 4707
* match is not better, output the previous match: // 4708
*/ // 4709
if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { // 4710
max_insert = s.strstart + s.lookahead - MIN_MATCH; // 4711
/* Do not insert strings in hash table beyond this. */ // 4712
// 4713
//check_match(s, s.strstart-1, s.prev_match, s.prev_length); // 4714
// 4715
/***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, // 4716
s.prev_length - MIN_MATCH, bflush);***/ // 4717
bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH); // 4718
/* Insert in hash table all strings up to the end of the match. // 4719
* strstart-1 and strstart are already inserted. If there is not // 4720
* enough lookahead, the last two strings are not inserted in // 4721
* the hash table. // 4722
*/ // 4723
s.lookahead -= s.prev_length-1; // 4724
s.prev_length -= 2; // 4725
do { // 4726
if (++s.strstart <= max_insert) { // 4727
/*** INSERT_STRING(s, s.strstart, hash_head); ***/ // 4728
s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; // 4729
hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; // 4730
s.head[s.ins_h] = s.strstart; // 4731
/***/ // 4732
} // 4733
} while (--s.prev_length !== 0); // 4734
s.match_available = 0; // 4735
s.match_length = MIN_MATCH-1; // 4736
s.strstart++; // 4737
// 4738
if (bflush) { // 4739
/*** FLUSH_BLOCK(s, 0); ***/ // 4740
flush_block_only(s, false); // 4741
if (s.strm.avail_out === 0) { // 4742
return BS_NEED_MORE; // 4743
} // 4744
/***/ // 4745
} // 4746
// 4747
} else if (s.match_available) { // 4748
/* If there was no match at the previous position, output a // 4749
* single literal. If there was a match but the current match // 4750
* is longer, truncate the previous match to a single literal. // 4751
*/ // 4752
//Tracevv((stderr,"%c", s->window[s->strstart-1])); // 4753
/*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ // 4754
bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]); // 4755
// 4756
if (bflush) { // 4757
/*** FLUSH_BLOCK_ONLY(s, 0) ***/ // 4758
flush_block_only(s, false); // 4759
/***/ // 4760
} // 4761
s.strstart++; // 4762
s.lookahead--; // 4763
if (s.strm.avail_out === 0) { // 4764
return BS_NEED_MORE; // 4765
} // 4766
} else { // 4767
/* There is no previous match to compare with, wait for // 4768
* the next step to decide. // 4769
*/ // 4770
s.match_available = 1; // 4771
s.strstart++; // 4772
s.lookahead--; // 4773
} // 4774
} // 4775
//Assert (flush != Z_NO_FLUSH, "no flush?"); // 4776
if (s.match_available) { // 4777
//Tracevv((stderr,"%c", s->window[s->strstart-1])); // 4778
/*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ // 4779
bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]); // 4780
// 4781
s.match_available = 0; // 4782
} // 4783
s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1; // 4784
if (flush === Z_FINISH) { // 4785
/*** FLUSH_BLOCK(s, 1); ***/ // 4786
flush_block_only(s, true); // 4787
if (s.strm.avail_out === 0) { // 4788
return BS_FINISH_STARTED; // 4789
} // 4790
/***/ // 4791
return BS_FINISH_DONE; // 4792
} // 4793
if (s.last_lit) { // 4794
/*** FLUSH_BLOCK(s, 0); ***/ // 4795
flush_block_only(s, false); // 4796
if (s.strm.avail_out === 0) { // 4797
return BS_NEED_MORE; // 4798
} // 4799
/***/ // 4800
} // 4801
// 4802
return BS_BLOCK_DONE; // 4803
} // 4804
// 4805
// 4806
/* =========================================================================== // 4807
* For Z_RLE, simply look for runs of bytes, generate matches only of distance // 4808
* one. Do not maintain a hash table. (It will be regenerated if this run of // 4809
* deflate switches away from Z_RLE.) // 4810
*/ // 4811
function deflate_rle(s, flush) { // 4812
var bflush; /* set if current block must be flushed */ // 4813
var prev; /* byte at distance one to match */ // 4814
var scan, strend; /* scan goes up to strend for length of run */ // 4815
// 4816
var _win = s.window; // 4817
// 4818
for (;;) { // 4819
/* Make sure that we always have enough lookahead, except // 4820
* at the end of the input file. We need MAX_MATCH bytes // 4821
* for the longest run, plus one for the unrolled loop. // 4822
*/ // 4823
if (s.lookahead <= MAX_MATCH) { // 4824
fill_window(s); // 4825
if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { // 4826
return BS_NEED_MORE; // 4827
} // 4828
if (s.lookahead === 0) { break; } /* flush the current block */ // 4829
} // 4830
// 4831
/* See how many times the previous byte repeats */ // 4832
s.match_length = 0; // 4833
if (s.lookahead >= MIN_MATCH && s.strstart > 0) { // 4834
scan = s.strstart - 1; // 4835
prev = _win[scan]; // 4836
if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { // 4837
strend = s.strstart + MAX_MATCH; // 4838
do { // 4839
/*jshint noempty:false*/ // 4840
} while (prev === _win[++scan] && prev === _win[++scan] && // 4841
prev === _win[++scan] && prev === _win[++scan] && // 4842
prev === _win[++scan] && prev === _win[++scan] && // 4843
prev === _win[++scan] && prev === _win[++scan] && // 4844
scan < strend); // 4845
s.match_length = MAX_MATCH - (strend - scan); // 4846
if (s.match_length > s.lookahead) { // 4847
s.match_length = s.lookahead; // 4848
} // 4849
} // 4850
//Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); // 4851
} // 4852
// 4853
/* Emit match if have run of MIN_MATCH or longer, else emit literal */ // 4854
if (s.match_length >= MIN_MATCH) { // 4855
//check_match(s, s.strstart, s.strstart - 1, s.match_length); // 4856
// 4857
/*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ // 4858
bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); // 4859
// 4860
s.lookahead -= s.match_length; // 4861
s.strstart += s.match_length; // 4862
s.match_length = 0; // 4863
} else { // 4864
/* No match, output a literal byte */ // 4865
//Tracevv((stderr,"%c", s->window[s->strstart])); // 4866
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ // 4867
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); // 4868
// 4869
s.lookahead--; // 4870
s.strstart++; // 4871
} // 4872
if (bflush) { // 4873
/*** FLUSH_BLOCK(s, 0); ***/ // 4874
flush_block_only(s, false); // 4875
if (s.strm.avail_out === 0) { // 4876
return BS_NEED_MORE; // 4877
} // 4878
/***/ // 4879
} // 4880
} // 4881
s.insert = 0; // 4882
if (flush === Z_FINISH) { // 4883
/*** FLUSH_BLOCK(s, 1); ***/ // 4884
flush_block_only(s, true); // 4885
if (s.strm.avail_out === 0) { // 4886
return BS_FINISH_STARTED; // 4887
} // 4888
/***/ // 4889
return BS_FINISH_DONE; // 4890
} // 4891
if (s.last_lit) { // 4892
/*** FLUSH_BLOCK(s, 0); ***/ // 4893
flush_block_only(s, false); // 4894
if (s.strm.avail_out === 0) { // 4895
return BS_NEED_MORE; // 4896
} // 4897
/***/ // 4898
} // 4899
return BS_BLOCK_DONE; // 4900
} // 4901
// 4902
/* =========================================================================== // 4903
* For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. // 4904
* (It will be regenerated if this run of deflate switches away from Huffman.) // 4905
*/ // 4906
function deflate_huff(s, flush) { // 4907
var bflush; /* set if current block must be flushed */ // 4908
// 4909
for (;;) { // 4910
/* Make sure that we have a literal to write. */ // 4911
if (s.lookahead === 0) { // 4912
fill_window(s); // 4913
if (s.lookahead === 0) { // 4914
if (flush === Z_NO_FLUSH) { // 4915
return BS_NEED_MORE; // 4916
} // 4917
break; /* flush the current block */ // 4918
} // 4919
} // 4920
// 4921
/* Output a literal byte */ // 4922
s.match_length = 0; // 4923
//Tracevv((stderr,"%c", s->window[s->strstart])); // 4924
/*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ // 4925
bflush = trees._tr_tally(s, 0, s.window[s.strstart]); // 4926
s.lookahead--; // 4927
s.strstart++; // 4928
if (bflush) { // 4929
/*** FLUSH_BLOCK(s, 0); ***/ // 4930
flush_block_only(s, false); // 4931
if (s.strm.avail_out === 0) { // 4932
return BS_NEED_MORE; // 4933
} // 4934
/***/ // 4935
} // 4936
} // 4937
s.insert = 0; // 4938
if (flush === Z_FINISH) { // 4939
/*** FLUSH_BLOCK(s, 1); ***/ // 4940
flush_block_only(s, true); // 4941
if (s.strm.avail_out === 0) { // 4942
return BS_FINISH_STARTED; // 4943
} // 4944
/***/ // 4945
return BS_FINISH_DONE; // 4946
} // 4947
if (s.last_lit) { // 4948
/*** FLUSH_BLOCK(s, 0); ***/ // 4949
flush_block_only(s, false); // 4950
if (s.strm.avail_out === 0) { // 4951
return BS_NEED_MORE; // 4952
} // 4953
/***/ // 4954
} // 4955
return BS_BLOCK_DONE; // 4956
} // 4957
// 4958
/* Values for max_lazy_match, good_match and max_chain_length, depending on // 4959
* the desired pack level (0..9). The values given below have been tuned to // 4960
* exclude worst case performance for pathological files. Better values may be // 4961
* found for specific files. // 4962
*/ // 4963
var Config = function (good_length, max_lazy, nice_length, max_chain, func) { // 4964
this.good_length = good_length; // 4965
this.max_lazy = max_lazy; // 4966
this.nice_length = nice_length; // 4967
this.max_chain = max_chain; // 4968
this.func = func; // 4969
}; // 4970
// 4971
var configuration_table; // 4972
// 4973
configuration_table = [ // 4974
/* good lazy nice chain */ // 4975
new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ // 4976
new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ // 4977
new Config(4, 5, 16, 8, deflate_fast), /* 2 */ // 4978
new Config(4, 6, 32, 32, deflate_fast), /* 3 */ // 4979
// 4980
new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ // 4981
new Config(8, 16, 32, 32, deflate_slow), /* 5 */ // 4982
new Config(8, 16, 128, 128, deflate_slow), /* 6 */ // 4983
new Config(8, 32, 128, 256, deflate_slow), /* 7 */ // 4984
new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ // 4985
new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ // 4986
]; // 4987
// 4988
// 4989
/* =========================================================================== // 4990
* Initialize the "longest match" routines for a new zlib stream // 4991
*/ // 4992
function lm_init(s) { // 4993
s.window_size = 2 * s.w_size; // 4994
// 4995
/*** CLEAR_HASH(s); ***/ // 4996
zero(s.head); // Fill with NIL (= 0); // 4997
// 4998
/* Set the default configuration parameters: // 4999
*/ // 5000
s.max_lazy_match = configuration_table[s.level].max_lazy; // 5001
s.good_match = configuration_table[s.level].good_length; // 5002
s.nice_match = configuration_table[s.level].nice_length; // 5003
s.max_chain_length = configuration_table[s.level].max_chain; // 5004
// 5005
s.strstart = 0; // 5006
s.block_start = 0; // 5007
s.lookahead = 0; // 5008
s.insert = 0; // 5009
s.match_length = s.prev_length = MIN_MATCH - 1; // 5010
s.match_available = 0; // 5011
s.ins_h = 0; // 5012
} // 5013
// 5014
// 5015
function DeflateState() { // 5016
this.strm = null; /* pointer back to this zlib stream */ // 5017
this.status = 0; /* as the name implies */ // 5018
this.pending_buf = null; /* output still pending */ // 5019
this.pending_buf_size = 0; /* size of pending_buf */ // 5020
this.pending_out = 0; /* next pending byte to output to the stream */ // 5021
this.pending = 0; /* nb of bytes in the pending buffer */ // 5022
this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ // 5023
this.gzhead = null; /* gzip header information to write */ // 5024
this.gzindex = 0; /* where in extra, name, or comment */ // 5025
this.method = Z_DEFLATED; /* can only be DEFLATED */ // 5026
this.last_flush = -1; /* value of flush param for previous deflate call */ // 5027
// 5028
this.w_size = 0; /* LZ77 window size (32K by default) */ // 5029
this.w_bits = 0; /* log2(w_size) (8..16) */ // 5030
this.w_mask = 0; /* w_size - 1 */ // 5031
// 5032
this.window = null; // 5033
/* Sliding window. Input bytes are read into the second half of the window, // 5034
* and move to the first half later to keep a dictionary of at least wSize // 5035
* bytes. With this organization, matches are limited to a distance of // 5036
* wSize-MAX_MATCH bytes, but this ensures that IO is always // 5037
* performed with a length multiple of the block size. // 5038
*/ // 5039
// 5040
this.window_size = 0; // 5041
/* Actual size of window: 2*wSize, except when the user input buffer // 5042
* is directly used as sliding window. // 5043
*/ // 5044
// 5045
this.prev = null; // 5046
/* Link to older string with same hash index. To limit the size of this // 5047
* array to 64K, this link is maintained only for the last 32K strings. // 5048
* An index in this array is thus a window index modulo 32K. // 5049
*/ // 5050
// 5051
this.head = null; /* Heads of the hash chains or NIL. */ // 5052
// 5053
this.ins_h = 0; /* hash index of string to be inserted */ // 5054
this.hash_size = 0; /* number of elements in hash table */ // 5055
this.hash_bits = 0; /* log2(hash_size) */ // 5056
this.hash_mask = 0; /* hash_size-1 */ // 5057
// 5058
this.hash_shift = 0; // 5059
/* Number of bits by which ins_h must be shifted at each input // 5060
* step. It must be such that after MIN_MATCH steps, the oldest // 5061
* byte no longer takes part in the hash key, that is: // 5062
* hash_shift * MIN_MATCH >= hash_bits // 5063
*/ // 5064
// 5065
this.block_start = 0; // 5066
/* Window position at the beginning of the current output block. Gets // 5067
* negative when the window is moved backwards. // 5068
*/ // 5069
// 5070
this.match_length = 0; /* length of best match */ // 5071
this.prev_match = 0; /* previous match */ // 5072
this.match_available = 0; /* set if previous match exists */ // 5073
this.strstart = 0; /* start of string to insert */ // 5074
this.match_start = 0; /* start of matching string */ // 5075
this.lookahead = 0; /* number of valid bytes ahead in window */ // 5076
// 5077
this.prev_length = 0; // 5078
/* Length of the best match at previous step. Matches not greater than this // 5079
* are discarded. This is used in the lazy match evaluation. // 5080
*/ // 5081
// 5082
this.max_chain_length = 0; // 5083
/* To speed up deflation, hash chains are never searched beyond this // 5084
* length. A higher limit improves compression ratio but degrades the // 5085
* speed. // 5086
*/ // 5087
// 5088
this.max_lazy_match = 0; // 5089
/* Attempt to find a better match only when the current match is strictly // 5090
* smaller than this value. This mechanism is used only for compression // 5091
* levels >= 4. // 5092
*/ // 5093
// That's alias to max_lazy_match, don't use directly // 5094
//this.max_insert_length = 0; // 5095
/* Insert new strings in the hash table only if the match length is not // 5096
* greater than this length. This saves time but degrades compression. // 5097
* max_insert_length is used only for compression levels <= 3. // 5098
*/ // 5099
// 5100
this.level = 0; /* compression level (1..9) */ // 5101
this.strategy = 0; /* favor or force Huffman coding*/ // 5102
// 5103
this.good_match = 0; // 5104
/* Use a faster search when the previous match is longer than this */ // 5105
// 5106
this.nice_match = 0; /* Stop searching when current match exceeds this */ // 5107
// 5108
/* used by trees.c: */ // 5109
// 5110
/* Didn't use ct_data typedef below to suppress compiler warning */ // 5111
// 5112
// struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ // 5113
// struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ // 5114
// struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ // 5115
// 5116
// Use flat array of DOUBLE size, with interleaved fata, // 5117
// because JS does not support effective // 5118
this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); // 5119
this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2); // 5120
this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2); // 5121
zero(this.dyn_ltree); // 5122
zero(this.dyn_dtree); // 5123
zero(this.bl_tree); // 5124
// 5125
this.l_desc = null; /* desc. for literal tree */ // 5126
this.d_desc = null; /* desc. for distance tree */ // 5127
this.bl_desc = null; /* desc. for bit length tree */ // 5128
// 5129
//ush bl_count[MAX_BITS+1]; // 5130
this.bl_count = new utils.Buf16(MAX_BITS+1); // 5131
/* number of codes at each bit length for an optimal tree */ // 5132
// 5133
//int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ // 5134
this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */ // 5135
zero(this.heap); // 5136
// 5137
this.heap_len = 0; /* number of elements in the heap */ // 5138
this.heap_max = 0; /* element of largest frequency */ // 5139
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. // 5140
* The same heap array is used to build all trees. // 5141
*/ // 5142
// 5143
this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1]; // 5144
zero(this.depth); // 5145
/* Depth of each subtree used as tie breaker for trees of equal frequency // 5146
*/ // 5147
// 5148
this.l_buf = 0; /* buffer index for literals or lengths */ // 5149
// 5150
this.lit_bufsize = 0; // 5151
/* Size of match buffer for literals/lengths. There are 4 reasons for // 5152
* limiting lit_bufsize to 64K: // 5153
* - frequencies can be kept in 16 bit counters // 5154
* - if compression is not successful for the first block, all input // 5155
* data is still in the window so we can still emit a stored block even // 5156
* when input comes from standard input. (This can also be done for // 5157
* all blocks if lit_bufsize is not greater than 32K.) // 5158
* - if compression is not successful for a file smaller than 64K, we can // 5159
* even emit a stored file instead of a stored block (saving 5 bytes). // 5160
* This is applicable only for zip (not gzip or zlib). // 5161
* - creating new Huffman trees less frequently may not provide fast // 5162
* adaptation to changes in the input data statistics. (Take for // 5163
* example a binary file with poorly compressible code followed by // 5164
* a highly compressible string table.) Smaller buffer sizes give // 5165
* fast adaptation but have of course the overhead of transmitting // 5166
* trees more frequently. // 5167
* - I can't count above 4 // 5168
*/ // 5169
// 5170
this.last_lit = 0; /* running index in l_buf */ // 5171
// 5172
this.d_buf = 0; // 5173
/* Buffer index for distances. To simplify the code, d_buf and l_buf have // 5174
* the same number of elements. To use different lengths, an extra flag // 5175
* array would be necessary. // 5176
*/ // 5177
// 5178
this.opt_len = 0; /* bit length of current block with optimal trees */ // 5179
this.static_len = 0; /* bit length of current block with static trees */ // 5180
this.matches = 0; /* number of string matches in current block */ // 5181
this.insert = 0; /* bytes at end of window left to insert */ // 5182
// 5183
// 5184
this.bi_buf = 0; // 5185
/* Output buffer. bits are inserted starting at the bottom (least // 5186
* significant bits). // 5187
*/ // 5188
this.bi_valid = 0; // 5189
/* Number of valid bits in bi_buf. All bits above the last valid bit // 5190
* are always zero. // 5191
*/ // 5192
// 5193
// Used for window memory init. We safely ignore it for JS. That makes // 5194
// sense only for pointers and memory check tools. // 5195
//this.high_water = 0; // 5196
/* High water mark offset in window for initialized bytes -- bytes above // 5197
* this are set to zero in order to avoid memory check warnings when // 5198
* longest match routines access bytes past the input. This is then // 5199
* updated to the new high water mark. // 5200
*/ // 5201
} // 5202
// 5203
// 5204
function deflateResetKeep(strm) { // 5205
var s; // 5206
// 5207
if (!strm || !strm.state) { // 5208
return err(strm, Z_STREAM_ERROR); // 5209
} // 5210
// 5211
strm.total_in = strm.total_out = 0; // 5212
strm.data_type = Z_UNKNOWN; // 5213
// 5214
s = strm.state; // 5215
s.pending = 0; // 5216
s.pending_out = 0; // 5217
// 5218
if (s.wrap < 0) { // 5219
s.wrap = -s.wrap; // 5220
/* was made negative by deflate(..., Z_FINISH); */ // 5221
} // 5222
s.status = (s.wrap ? INIT_STATE : BUSY_STATE); // 5223
strm.adler = (s.wrap === 2) ? // 5224
0 // crc32(0, Z_NULL, 0) // 5225
: // 5226
1; // adler32(0, Z_NULL, 0) // 5227
s.last_flush = Z_NO_FLUSH; // 5228
trees._tr_init(s); // 5229
return Z_OK; // 5230
} // 5231
// 5232
// 5233
function deflateReset(strm) { // 5234
var ret = deflateResetKeep(strm); // 5235
if (ret === Z_OK) { // 5236
lm_init(strm.state); // 5237
} // 5238
return ret; // 5239
} // 5240
// 5241
// 5242
function deflateSetHeader(strm, head) { // 5243
if (!strm || !strm.state) { return Z_STREAM_ERROR; } // 5244
if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } // 5245
strm.state.gzhead = head; // 5246
return Z_OK; // 5247
} // 5248
// 5249
// 5250
function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { // 5251
if (!strm) { // === Z_NULL // 5252
return Z_STREAM_ERROR; // 5253
} // 5254
var wrap = 1; // 5255
// 5256
if (level === Z_DEFAULT_COMPRESSION) { // 5257
level = 6; // 5258
} // 5259
// 5260
if (windowBits < 0) { /* suppress zlib wrapper */ // 5261
wrap = 0; // 5262
windowBits = -windowBits; // 5263
} // 5264
// 5265
else if (windowBits > 15) { // 5266
wrap = 2; /* write gzip wrapper instead */ // 5267
windowBits -= 16; // 5268
} // 5269
// 5270
// 5271
if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || // 5272
windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || // 5273
strategy < 0 || strategy > Z_FIXED) { // 5274
return err(strm, Z_STREAM_ERROR); // 5275
} // 5276
// 5277
// 5278
if (windowBits === 8) { // 5279
windowBits = 9; // 5280
} // 5281
/* until 256-byte window bug fixed */ // 5282
// 5283
var s = new DeflateState(); // 5284
// 5285
strm.state = s; // 5286
s.strm = strm; // 5287
// 5288
s.wrap = wrap; // 5289
s.gzhead = null; // 5290
s.w_bits = windowBits; // 5291
s.w_size = 1 << s.w_bits; // 5292
s.w_mask = s.w_size - 1; // 5293
// 5294
s.hash_bits = memLevel + 7; // 5295
s.hash_size = 1 << s.hash_bits; // 5296
s.hash_mask = s.hash_size - 1; // 5297
s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); // 5298
// 5299
s.window = new utils.Buf8(s.w_size * 2); // 5300
s.head = new utils.Buf16(s.hash_size); // 5301
s.prev = new utils.Buf16(s.w_size); // 5302
// 5303
// Don't need mem init magic for JS. // 5304
//s.high_water = 0; /* nothing written to s->window yet */ // 5305
// 5306
s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ // 5307
// 5308
s.pending_buf_size = s.lit_bufsize * 4; // 5309
s.pending_buf = new utils.Buf8(s.pending_buf_size); // 5310
// 5311
s.d_buf = s.lit_bufsize >> 1; // 5312
s.l_buf = (1 + 2) * s.lit_bufsize; // 5313
// 5314
s.level = level; // 5315
s.strategy = strategy; // 5316
s.method = method; // 5317
// 5318
return deflateReset(strm); // 5319
} // 5320
// 5321
function deflateInit(strm, level) { // 5322
return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); // 5323
} // 5324
// 5325
// 5326
function deflate(strm, flush) { // 5327
var old_flush, s; // 5328
var beg, val; // for gzip header write only // 5329
// 5330
if (!strm || !strm.state || // 5331
flush > Z_BLOCK || flush < 0) { // 5332
return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; // 5333
} // 5334
// 5335
s = strm.state; // 5336
// 5337
if (!strm.output || // 5338
(!strm.input && strm.avail_in !== 0) || // 5339
(s.status === FINISH_STATE && flush !== Z_FINISH)) { // 5340
return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); // 5341
} // 5342
// 5343
s.strm = strm; /* just in case */ // 5344
old_flush = s.last_flush; // 5345
s.last_flush = flush; // 5346
// 5347
/* Write the header */ // 5348
if (s.status === INIT_STATE) { // 5349
// 5350
if (s.wrap === 2) { // GZIP header // 5351
strm.adler = 0; //crc32(0L, Z_NULL, 0); // 5352
put_byte(s, 31); // 5353
put_byte(s, 139); // 5354
put_byte(s, 8); // 5355
if (!s.gzhead) { // s->gzhead == Z_NULL // 5356
put_byte(s, 0); // 5357
put_byte(s, 0); // 5358
put_byte(s, 0); // 5359
put_byte(s, 0); // 5360
put_byte(s, 0); // 5361
put_byte(s, s.level === 9 ? 2 : // 5362
(s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? // 5363
4 : 0)); // 5364
put_byte(s, OS_CODE); // 5365
s.status = BUSY_STATE; // 5366
} // 5367
else { // 5368
put_byte(s, (s.gzhead.text ? 1 : 0) + // 5369
(s.gzhead.hcrc ? 2 : 0) + // 5370
(!s.gzhead.extra ? 0 : 4) + // 5371
(!s.gzhead.name ? 0 : 8) + // 5372
(!s.gzhead.comment ? 0 : 16) // 5373
); // 5374
put_byte(s, s.gzhead.time & 0xff); // 5375
put_byte(s, (s.gzhead.time >> 8) & 0xff); // 5376
put_byte(s, (s.gzhead.time >> 16) & 0xff); // 5377
put_byte(s, (s.gzhead.time >> 24) & 0xff); // 5378
put_byte(s, s.level === 9 ? 2 : // 5379
(s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? // 5380
4 : 0)); // 5381
put_byte(s, s.gzhead.os & 0xff); // 5382
if (s.gzhead.extra && s.gzhead.extra.length) { // 5383
put_byte(s, s.gzhead.extra.length & 0xff); // 5384
put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); // 5385
} // 5386
if (s.gzhead.hcrc) { // 5387
strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); // 5388
} // 5389
s.gzindex = 0; // 5390
s.status = EXTRA_STATE; // 5391
} // 5392
} // 5393
else // DEFLATE header // 5394
{ // 5395
var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; // 5396
var level_flags = -1; // 5397
// 5398
if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { // 5399
level_flags = 0; // 5400
} else if (s.level < 6) { // 5401
level_flags = 1; // 5402
} else if (s.level === 6) { // 5403
level_flags = 2; // 5404
} else { // 5405
level_flags = 3; // 5406
} // 5407
header |= (level_flags << 6); // 5408
if (s.strstart !== 0) { header |= PRESET_DICT; } // 5409
header += 31 - (header % 31); // 5410
// 5411
s.status = BUSY_STATE; // 5412
putShortMSB(s, header); // 5413
// 5414
/* Save the adler32 of the preset dictionary: */ // 5415
if (s.strstart !== 0) { // 5416
putShortMSB(s, strm.adler >>> 16); // 5417
putShortMSB(s, strm.adler & 0xffff); // 5418
} // 5419
strm.adler = 1; // adler32(0L, Z_NULL, 0); // 5420
} // 5421
} // 5422
// 5423
//#ifdef GZIP // 5424
if (s.status === EXTRA_STATE) { // 5425
if (s.gzhead.extra/* != Z_NULL*/) { // 5426
beg = s.pending; /* start of bytes to update crc */ // 5427
// 5428
while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { // 5429
if (s.pending === s.pending_buf_size) { // 5430
if (s.gzhead.hcrc && s.pending > beg) { // 5431
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); // 5432
} // 5433
flush_pending(strm); // 5434
beg = s.pending; // 5435
if (s.pending === s.pending_buf_size) { // 5436
break; // 5437
} // 5438
} // 5439
put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); // 5440
s.gzindex++; // 5441
} // 5442
if (s.gzhead.hcrc && s.pending > beg) { // 5443
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); // 5444
} // 5445
if (s.gzindex === s.gzhead.extra.length) { // 5446
s.gzindex = 0; // 5447
s.status = NAME_STATE; // 5448
} // 5449
} // 5450
else { // 5451
s.status = NAME_STATE; // 5452
} // 5453
} // 5454
if (s.status === NAME_STATE) { // 5455
if (s.gzhead.name/* != Z_NULL*/) { // 5456
beg = s.pending; /* start of bytes to update crc */ // 5457
//int val; // 5458
// 5459
do { // 5460
if (s.pending === s.pending_buf_size) { // 5461
if (s.gzhead.hcrc && s.pending > beg) { // 5462
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); // 5463
} // 5464
flush_pending(strm); // 5465
beg = s.pending; // 5466
if (s.pending === s.pending_buf_size) { // 5467
val = 1; // 5468
break; // 5469
} // 5470
} // 5471
// JS specific: little magic to add zero terminator to end of string // 5472
if (s.gzindex < s.gzhead.name.length) { // 5473
val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; // 5474
} else { // 5475
val = 0; // 5476
} // 5477
put_byte(s, val); // 5478
} while (val !== 0); // 5479
// 5480
if (s.gzhead.hcrc && s.pending > beg){ // 5481
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); // 5482
} // 5483
if (val === 0) { // 5484
s.gzindex = 0; // 5485
s.status = COMMENT_STATE; // 5486
} // 5487
} // 5488
else { // 5489
s.status = COMMENT_STATE; // 5490
} // 5491
} // 5492
if (s.status === COMMENT_STATE) { // 5493
if (s.gzhead.comment/* != Z_NULL*/) { // 5494
beg = s.pending; /* start of bytes to update crc */ // 5495
//int val; // 5496
// 5497
do { // 5498
if (s.pending === s.pending_buf_size) { // 5499
if (s.gzhead.hcrc && s.pending > beg) { // 5500
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); // 5501
} // 5502
flush_pending(strm); // 5503
beg = s.pending; // 5504
if (s.pending === s.pending_buf_size) { // 5505
val = 1; // 5506
break; // 5507
} // 5508
} // 5509
// JS specific: little magic to add zero terminator to end of string // 5510
if (s.gzindex < s.gzhead.comment.length) { // 5511
val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; // 5512
} else { // 5513
val = 0; // 5514
} // 5515
put_byte(s, val); // 5516
} while (val !== 0); // 5517
// 5518
if (s.gzhead.hcrc && s.pending > beg) { // 5519
strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); // 5520
} // 5521
if (val === 0) { // 5522
s.status = HCRC_STATE; // 5523
} // 5524
} // 5525
else { // 5526
s.status = HCRC_STATE; // 5527
} // 5528
} // 5529
if (s.status === HCRC_STATE) { // 5530
if (s.gzhead.hcrc) { // 5531
if (s.pending + 2 > s.pending_buf_size) { // 5532
flush_pending(strm); // 5533
} // 5534
if (s.pending + 2 <= s.pending_buf_size) { // 5535
put_byte(s, strm.adler & 0xff); // 5536
put_byte(s, (strm.adler >> 8) & 0xff); // 5537
strm.adler = 0; //crc32(0L, Z_NULL, 0); // 5538
s.status = BUSY_STATE; // 5539
} // 5540
} // 5541
else { // 5542
s.status = BUSY_STATE; // 5543
} // 5544
} // 5545
//#endif // 5546
// 5547
/* Flush as much pending output as possible */ // 5548
if (s.pending !== 0) { // 5549
flush_pending(strm); // 5550
if (strm.avail_out === 0) { // 5551
/* Since avail_out is 0, deflate will be called again with // 5552
* more output space, but possibly with both pending and // 5553
* avail_in equal to zero. There won't be anything to do, // 5554
* but this is not an error situation so make sure we // 5555
* return OK instead of BUF_ERROR at next call of deflate: // 5556
*/ // 5557
s.last_flush = -1; // 5558
return Z_OK; // 5559
} // 5560
// 5561
/* Make sure there is something to do and avoid duplicate consecutive // 5562
* flushes. For repeated and useless calls with Z_FINISH, we keep // 5563
* returning Z_STREAM_END instead of Z_BUF_ERROR. // 5564
*/ // 5565
} else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && // 5566
flush !== Z_FINISH) { // 5567
return err(strm, Z_BUF_ERROR); // 5568
} // 5569
// 5570
/* User must not provide more input after the first FINISH: */ // 5571
if (s.status === FINISH_STATE && strm.avail_in !== 0) { // 5572
return err(strm, Z_BUF_ERROR); // 5573
} // 5574
// 5575
/* Start a new block or continue the current one. // 5576
*/ // 5577
if (strm.avail_in !== 0 || s.lookahead !== 0 || // 5578
(flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { // 5579
var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : // 5580
(s.strategy === Z_RLE ? deflate_rle(s, flush) : // 5581
configuration_table[s.level].func(s, flush)); // 5582
// 5583
if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { // 5584
s.status = FINISH_STATE; // 5585
} // 5586
if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { // 5587
if (strm.avail_out === 0) { // 5588
s.last_flush = -1; // 5589
/* avoid BUF_ERROR next call, see above */ // 5590
} // 5591
return Z_OK; // 5592
/* If flush != Z_NO_FLUSH && avail_out == 0, the next call // 5593
* of deflate should use the same flush parameter to make sure // 5594
* that the flush is complete. So we don't have to output an // 5595
* empty block here, this will be done at next call. This also // 5596
* ensures that for a very small output buffer, we emit at most // 5597
* one empty block. // 5598
*/ // 5599
} // 5600
if (bstate === BS_BLOCK_DONE) { // 5601
if (flush === Z_PARTIAL_FLUSH) { // 5602
trees._tr_align(s); // 5603
} // 5604
else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ // 5605
// 5606
trees._tr_stored_block(s, 0, 0, false); // 5607
/* For a full flush, this empty block will be recognized // 5608
* as a special marker by inflate_sync(). // 5609
*/ // 5610
if (flush === Z_FULL_FLUSH) { // 5611
/*** CLEAR_HASH(s); ***/ /* forget history */ // 5612
zero(s.head); // Fill with NIL (= 0); // 5613
// 5614
if (s.lookahead === 0) { // 5615
s.strstart = 0; // 5616
s.block_start = 0; // 5617
s.insert = 0; // 5618
} // 5619
} // 5620
} // 5621
flush_pending(strm); // 5622
if (strm.avail_out === 0) { // 5623
s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ // 5624
return Z_OK; // 5625
} // 5626
} // 5627
} // 5628
//Assert(strm->avail_out > 0, "bug2"); // 5629
//if (strm.avail_out <= 0) { throw new Error("bug2");} // 5630
// 5631
if (flush !== Z_FINISH) { return Z_OK; } // 5632
if (s.wrap <= 0) { return Z_STREAM_END; } // 5633
// 5634
/* Write the trailer */ // 5635
if (s.wrap === 2) { // 5636
put_byte(s, strm.adler & 0xff); // 5637
put_byte(s, (strm.adler >> 8) & 0xff); // 5638
put_byte(s, (strm.adler >> 16) & 0xff); // 5639
put_byte(s, (strm.adler >> 24) & 0xff); // 5640
put_byte(s, strm.total_in & 0xff); // 5641
put_byte(s, (strm.total_in >> 8) & 0xff); // 5642
put_byte(s, (strm.total_in >> 16) & 0xff); // 5643
put_byte(s, (strm.total_in >> 24) & 0xff); // 5644
} // 5645
else // 5646
{ // 5647
putShortMSB(s, strm.adler >>> 16); // 5648
putShortMSB(s, strm.adler & 0xffff); // 5649
} // 5650
// 5651
flush_pending(strm); // 5652
/* If avail_out is zero, the application will call deflate again // 5653
* to flush the rest. // 5654
*/ // 5655
if (s.wrap > 0) { s.wrap = -s.wrap; } // 5656
/* write the trailer only once! */ // 5657
return s.pending !== 0 ? Z_OK : Z_STREAM_END; // 5658
} // 5659
// 5660
function deflateEnd(strm) { // 5661
var status; // 5662
// 5663
if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { // 5664
return Z_STREAM_ERROR; // 5665
} // 5666
// 5667
status = strm.state.status; // 5668
if (status !== INIT_STATE && // 5669
status !== EXTRA_STATE && // 5670
status !== NAME_STATE && // 5671
status !== COMMENT_STATE && // 5672
status !== HCRC_STATE && // 5673
status !== BUSY_STATE && // 5674
status !== FINISH_STATE // 5675
) { // 5676
return err(strm, Z_STREAM_ERROR); // 5677
} // 5678
// 5679
strm.state = null; // 5680
// 5681
return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; // 5682
} // 5683
// 5684
/* ========================================================================= // 5685
* Copy the source state to the destination state // 5686
*/ // 5687
//function deflateCopy(dest, source) { // 5688
// // 5689
//} // 5690
// 5691
exports.deflateInit = deflateInit; // 5692
exports.deflateInit2 = deflateInit2; // 5693
exports.deflateReset = deflateReset; // 5694
exports.deflateResetKeep = deflateResetKeep; // 5695
exports.deflateSetHeader = deflateSetHeader; // 5696
exports.deflate = deflate; // 5697
exports.deflateEnd = deflateEnd; // 5698
exports.deflateInfo = 'pako deflate (from Nodeca project)'; // 5699
// 5700
/* Not implemented // 5701
exports.deflateBound = deflateBound; // 5702
exports.deflateCopy = deflateCopy; // 5703
exports.deflateSetDictionary = deflateSetDictionary; // 5704
exports.deflateParams = deflateParams; // 5705
exports.deflatePending = deflatePending; // 5706
exports.deflatePrime = deflatePrime; // 5707
exports.deflateTune = deflateTune; // 5708
*/ // 5709
},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
'use strict'; // 5711
// 5712
// 5713
function GZheader() { // 5714
/* true if compressed data believed to be text */ // 5715
this.text = 0; // 5716
/* modification time */ // 5717
this.time = 0; // 5718
/* extra flags (not used when writing a gzip file) */ // 5719
this.xflags = 0; // 5720
/* operating system */ // 5721
this.os = 0; // 5722
/* pointer to extra field or Z_NULL if none */ // 5723
this.extra = null; // 5724
/* extra field length (valid if extra != Z_NULL) */ // 5725
this.extra_len = 0; // Actually, we don't need it in JS, // 5726
// but leave for few code modifications // 5727
// 5728
// // 5729
// Setup limits is not necessary because in js we should not preallocate memory // 5730
// for inflate use constant limit in 65536 bytes // 5731
// // 5732
// 5733
/* space at extra (only when reading header) */ // 5734
// this.extra_max = 0; // 5735
/* pointer to zero-terminated file name or Z_NULL */ // 5736
this.name = ''; // 5737
/* space at name (only when reading header) */ // 5738
// this.name_max = 0; // 5739
/* pointer to zero-terminated comment or Z_NULL */ // 5740
this.comment = ''; // 5741
/* space at comment (only when reading header) */ // 5742
// this.comm_max = 0; // 5743
/* true if there was or will be a header crc */ // 5744
this.hcrc = 0; // 5745
/* true when done reading gzip header (not used when writing a gzip file) */ // 5746
this.done = false; // 5747
} // 5748
// 5749
module.exports = GZheader; // 5750
},{}],34:[function(_dereq_,module,exports){ // 5751
'use strict'; // 5752
// 5753
// See state defs from inflate.js // 5754
var BAD = 30; /* got a data error -- remain here until reset */ // 5755
var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ // 5756
// 5757
/* // 5758
Decode literal, length, and distance codes and write out the resulting // 5759
literal and match bytes until either not enough input or output is // 5760
available, an end-of-block is encountered, or a data error is encountered. // 5761
When large enough input and output buffers are supplied to inflate(), for // 5762
example, a 16K input buffer and a 64K output buffer, more than 95% of the // 5763
inflate execution time is spent in this routine. // 5764
// 5765
Entry assumptions: // 5766
// 5767
state.mode === LEN // 5768
strm.avail_in >= 6 // 5769
strm.avail_out >= 258 // 5770
start >= strm.avail_out // 5771
state.bits < 8 // 5772
// 5773
On return, state.mode is one of: // 5774
// 5775
LEN -- ran out of enough output space or enough available input // 5776
TYPE -- reached end of block code, inflate() to interpret next block // 5777
BAD -- error in block data // 5778
// 5779
Notes: // 5780
// 5781
- The maximum input bits used by a length/distance pair is 15 bits for the // 5782
length code, 5 bits for the length extra, 15 bits for the distance code, // 5783
and 13 bits for the distance extra. This totals 48 bits, or six bytes. // 5784
Therefore if strm.avail_in >= 6, then there is enough input to avoid // 5785
checking for available input while decoding. // 5786
// 5787
- The maximum bytes that a single length/distance pair can output is 258 // 5788
bytes, which is the maximum length that can be coded. inflate_fast() // 5789
requires strm.avail_out >= 258 for each loop to avoid checking for // 5790
output space. // 5791
*/ // 5792
module.exports = function inflate_fast(strm, start) { // 5793
var state; // 5794
var _in; /* local strm.input */ // 5795
var last; /* have enough input while in < last */ // 5796
var _out; /* local strm.output */ // 5797
var beg; /* inflate()'s initial strm.output */ // 5798
var end; /* while out < end, enough space available */ // 5799
//#ifdef INFLATE_STRICT // 5800
var dmax; /* maximum distance from zlib header */ // 5801
//#endif // 5802
var wsize; /* window size or zero if not using window */ // 5803
var whave; /* valid bytes in the window */ // 5804
var wnext; /* window write index */ // 5805
var window; /* allocated sliding window, if wsize != 0 */ // 5806
var hold; /* local strm.hold */ // 5807
var bits; /* local strm.bits */ // 5808
var lcode; /* local strm.lencode */ // 5809
var dcode; /* local strm.distcode */ // 5810
var lmask; /* mask for first level of length codes */ // 5811
var dmask; /* mask for first level of distance codes */ // 5812
var here; /* retrieved table entry */ // 5813
var op; /* code bits, operation, extra bits, or */ // 5814
/* window position, window bytes to copy */ // 5815
var len; /* match length, unused bytes */ // 5816
var dist; /* match distance */ // 5817
var from; /* where to copy match from */ // 5818
var from_source; // 5819
// 5820
// 5821
var input, output; // JS specific, because we have no pointers // 5822
// 5823
/* copy state to local variables */ // 5824
state = strm.state; // 5825
//here = state.here; // 5826
_in = strm.next_in; // 5827
input = strm.input; // 5828
last = _in + (strm.avail_in - 5); // 5829
_out = strm.next_out; // 5830
output = strm.output; // 5831
beg = _out - (start - strm.avail_out); // 5832
end = _out + (strm.avail_out - 257); // 5833
//#ifdef INFLATE_STRICT // 5834
dmax = state.dmax; // 5835
//#endif // 5836
wsize = state.wsize; // 5837
whave = state.whave; // 5838
wnext = state.wnext; // 5839
window = state.window; // 5840
hold = state.hold; // 5841
bits = state.bits; // 5842
lcode = state.lencode; // 5843
dcode = state.distcode; // 5844
lmask = (1 << state.lenbits) - 1; // 5845
dmask = (1 << state.distbits) - 1; // 5846
// 5847
// 5848
/* decode literals and length/distances until end-of-block or not enough // 5849
input data or output space */ // 5850
// 5851
top: // 5852
do { // 5853
if (bits < 15) { // 5854
hold += input[_in++] << bits; // 5855
bits += 8; // 5856
hold += input[_in++] << bits; // 5857
bits += 8; // 5858
} // 5859
// 5860
here = lcode[hold & lmask]; // 5861
// 5862
dolen: // 5863
for (;;) { // Goto emulation // 5864
op = here >>> 24/*here.bits*/; // 5865
hold >>>= op; // 5866
bits -= op; // 5867
op = (here >>> 16) & 0xff/*here.op*/; // 5868
if (op === 0) { /* literal */ // 5869
//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? // 5870
// "inflate: literal '%c'\n" : // 5871
// "inflate: literal 0x%02x\n", here.val)); // 5872
output[_out++] = here & 0xffff/*here.val*/; // 5873
} // 5874
else if (op & 16) { /* length base */ // 5875
len = here & 0xffff/*here.val*/; // 5876
op &= 15; /* number of extra bits */ // 5877
if (op) { // 5878
if (bits < op) { // 5879
hold += input[_in++] << bits; // 5880
bits += 8; // 5881
} // 5882
len += hold & ((1 << op) - 1); // 5883
hold >>>= op; // 5884
bits -= op; // 5885
} // 5886
//Tracevv((stderr, "inflate: length %u\n", len)); // 5887
if (bits < 15) { // 5888
hold += input[_in++] << bits; // 5889
bits += 8; // 5890
hold += input[_in++] << bits; // 5891
bits += 8; // 5892
} // 5893
here = dcode[hold & dmask]; // 5894
// 5895
dodist: // 5896
for (;;) { // goto emulation // 5897
op = here >>> 24/*here.bits*/; // 5898
hold >>>= op; // 5899
bits -= op; // 5900
op = (here >>> 16) & 0xff/*here.op*/; // 5901
// 5902
if (op & 16) { /* distance base */ // 5903
dist = here & 0xffff/*here.val*/; // 5904
op &= 15; /* number of extra bits */ // 5905
if (bits < op) { // 5906
hold += input[_in++] << bits; // 5907
bits += 8; // 5908
if (bits < op) { // 5909
hold += input[_in++] << bits; // 5910
bits += 8; // 5911
} // 5912
} // 5913
dist += hold & ((1 << op) - 1); // 5914
//#ifdef INFLATE_STRICT // 5915
if (dist > dmax) { // 5916
strm.msg = 'invalid distance too far back'; // 5917
state.mode = BAD; // 5918
break top; // 5919
} // 5920
//#endif // 5921
hold >>>= op; // 5922
bits -= op; // 5923
//Tracevv((stderr, "inflate: distance %u\n", dist)); // 5924
op = _out - beg; /* max distance in output */ // 5925
if (dist > op) { /* see if copy from window */ // 5926
op = dist - op; /* distance back in window */ // 5927
if (op > whave) { // 5928
if (state.sane) { // 5929
strm.msg = 'invalid distance too far back'; // 5930
state.mode = BAD; // 5931
break top; // 5932
} // 5933
// 5934
// (!) This block is disabled in zlib defailts, // 5935
// don't enable it for binary compatibility // 5936
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR // 5937
// if (len <= op - whave) { // 5938
// do { // 5939
// output[_out++] = 0; // 5940
// } while (--len); // 5941
// continue top; // 5942
// } // 5943
// len -= op - whave; // 5944
// do { // 5945
// output[_out++] = 0; // 5946
// } while (--op > whave); // 5947
// if (op === 0) { // 5948
// from = _out - dist; // 5949
// do { // 5950
// output[_out++] = output[from++]; // 5951
// } while (--len); // 5952
// continue top; // 5953
// } // 5954
//#endif // 5955
} // 5956
from = 0; // window index // 5957
from_source = window; // 5958
if (wnext === 0) { /* very common case */ // 5959
from += wsize - op; // 5960
if (op < len) { /* some from window */ // 5961
len -= op; // 5962
do { // 5963
output[_out++] = window[from++]; // 5964
} while (--op); // 5965
from = _out - dist; /* rest from output */ // 5966
from_source = output; // 5967
} // 5968
} // 5969
else if (wnext < op) { /* wrap around window */ // 5970
from += wsize + wnext - op; // 5971
op -= wnext; // 5972
if (op < len) { /* some from end of window */ // 5973
len -= op; // 5974
do { // 5975
output[_out++] = window[from++]; // 5976
} while (--op); // 5977
from = 0; // 5978
if (wnext < len) { /* some from start of window */ // 5979
op = wnext; // 5980
len -= op; // 5981
do { // 5982
output[_out++] = window[from++]; // 5983
} while (--op); // 5984
from = _out - dist; /* rest from output */ // 5985
from_source = output; // 5986
} // 5987
} // 5988
} // 5989
else { /* contiguous in window */ // 5990
from += wnext - op; // 5991
if (op < len) { /* some from window */ // 5992
len -= op; // 5993
do { // 5994
output[_out++] = window[from++]; // 5995
} while (--op); // 5996
from = _out - dist; /* rest from output */ // 5997
from_source = output; // 5998
} // 5999
} // 6000
while (len > 2) { // 6001
output[_out++] = from_source[from++]; // 6002
output[_out++] = from_source[from++]; // 6003
output[_out++] = from_source[from++]; // 6004
len -= 3; // 6005
} // 6006
if (len) { // 6007
output[_out++] = from_source[from++]; // 6008
if (len > 1) { // 6009
output[_out++] = from_source[from++]; // 6010
} // 6011
} // 6012
} // 6013
else { // 6014
from = _out - dist; /* copy direct from output */ // 6015
do { /* minimum length is three */ // 6016
output[_out++] = output[from++]; // 6017
output[_out++] = output[from++]; // 6018
output[_out++] = output[from++]; // 6019
len -= 3; // 6020
} while (len > 2); // 6021
if (len) { // 6022
output[_out++] = output[from++]; // 6023
if (len > 1) { // 6024
output[_out++] = output[from++]; // 6025
} // 6026
} // 6027
} // 6028
} // 6029
else if ((op & 64) === 0) { /* 2nd level distance code */ // 6030
here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; // 6031
continue dodist; // 6032
} // 6033
else { // 6034
strm.msg = 'invalid distance code'; // 6035
state.mode = BAD; // 6036
break top; // 6037
} // 6038
// 6039
break; // need to emulate goto via "continue" // 6040
} // 6041
} // 6042
else if ((op & 64) === 0) { /* 2nd level length code */ // 6043
here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; // 6044
continue dolen; // 6045
} // 6046
else if (op & 32) { /* end-of-block */ // 6047
//Tracevv((stderr, "inflate: end of block\n")); // 6048
state.mode = TYPE; // 6049
break top; // 6050
} // 6051
else { // 6052
strm.msg = 'invalid literal/length code'; // 6053
state.mode = BAD; // 6054
break top; // 6055
} // 6056
// 6057
break; // need to emulate goto via "continue" // 6058
} // 6059
} while (_in < last && _out < end); // 6060
// 6061
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */ // 6062
len = bits >> 3; // 6063
_in -= len; // 6064
bits -= len << 3; // 6065
hold &= (1 << bits) - 1; // 6066
// 6067
/* update state and return */ // 6068
strm.next_in = _in; // 6069
strm.next_out = _out; // 6070
strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); // 6071
strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); // 6072
state.hold = hold; // 6073
state.bits = bits; // 6074
return; // 6075
}; // 6076
// 6077
},{}],35:[function(_dereq_,module,exports){ // 6078
'use strict'; // 6079
// 6080
// 6081
var utils = _dereq_('../utils/common'); // 6082
var adler32 = _dereq_('./adler32'); // 6083
var crc32 = _dereq_('./crc32'); // 6084
var inflate_fast = _dereq_('./inffast'); // 6085
var inflate_table = _dereq_('./inftrees'); // 6086
// 6087
var CODES = 0; // 6088
var LENS = 1; // 6089
var DISTS = 2; // 6090
// 6091
/* Public constants ==========================================================*/ // 6092
/* ===========================================================================*/ // 6093
// 6094
// 6095
/* Allowed flush values; see deflate() and inflate() below for details */ // 6096
//var Z_NO_FLUSH = 0; // 6097
//var Z_PARTIAL_FLUSH = 1; // 6098
//var Z_SYNC_FLUSH = 2; // 6099
//var Z_FULL_FLUSH = 3; // 6100
var Z_FINISH = 4; // 6101
var Z_BLOCK = 5; // 6102
var Z_TREES = 6; // 6103
// 6104
// 6105
/* Return codes for the compression/decompression functions. Negative values // 6106
* are errors, positive values are used for special but normal events. // 6107
*/ // 6108
var Z_OK = 0; // 6109
var Z_STREAM_END = 1; // 6110
var Z_NEED_DICT = 2; // 6111
//var Z_ERRNO = -1; // 6112
var Z_STREAM_ERROR = -2; // 6113
var Z_DATA_ERROR = -3; // 6114
var Z_MEM_ERROR = -4; // 6115
var Z_BUF_ERROR = -5; // 6116
//var Z_VERSION_ERROR = -6; // 6117
// 6118
/* The deflate compression method */ // 6119
var Z_DEFLATED = 8; // 6120
// 6121
// 6122
/* STATES ====================================================================*/ // 6123
/* ===========================================================================*/ // 6124
// 6125
// 6126
var HEAD = 1; /* i: waiting for magic header */ // 6127
var FLAGS = 2; /* i: waiting for method and flags (gzip) */ // 6128
var TIME = 3; /* i: waiting for modification time (gzip) */ // 6129
var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ // 6130
var EXLEN = 5; /* i: waiting for extra length (gzip) */ // 6131
var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ // 6132
var NAME = 7; /* i: waiting for end of file name (gzip) */ // 6133
var COMMENT = 8; /* i: waiting for end of comment (gzip) */ // 6134
var HCRC = 9; /* i: waiting for header crc (gzip) */ // 6135
var DICTID = 10; /* i: waiting for dictionary check value */ // 6136
var DICT = 11; /* waiting for inflateSetDictionary() call */ // 6137
var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ // 6138
var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ // 6139
var STORED = 14; /* i: waiting for stored size (length and complement) */ // 6140
var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ // 6141
var COPY = 16; /* i/o: waiting for input or output to copy stored block */ // 6142
var TABLE = 17; /* i: waiting for dynamic block table lengths */ // 6143
var LENLENS = 18; /* i: waiting for code length code lengths */ // 6144
var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ // 6145
var LEN_ = 20; /* i: same as LEN below, but only first time in */ // 6146
var LEN = 21; /* i: waiting for length/lit/eob code */ // 6147
var LENEXT = 22; /* i: waiting for length extra bits */ // 6148
var DIST = 23; /* i: waiting for distance code */ // 6149
var DISTEXT = 24; /* i: waiting for distance extra bits */ // 6150
var MATCH = 25; /* o: waiting for output space to copy string */ // 6151
var LIT = 26; /* o: waiting for output space to write literal */ // 6152
var CHECK = 27; /* i: waiting for 32-bit check value */ // 6153
var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ // 6154
var DONE = 29; /* finished check, done -- remain here until reset */ // 6155
var BAD = 30; /* got a data error -- remain here until reset */ // 6156
var MEM = 31; /* got an inflate() memory error -- remain here until reset */ // 6157
var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ // 6158
// 6159
/* ===========================================================================*/ // 6160
// 6161
// 6162
// 6163
var ENOUGH_LENS = 852; // 6164
var ENOUGH_DISTS = 592; // 6165
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); // 6166
// 6167
var MAX_WBITS = 15; // 6168
/* 32K LZ77 window */ // 6169
var DEF_WBITS = MAX_WBITS; // 6170
// 6171
// 6172
function ZSWAP32(q) { // 6173
return (((q >>> 24) & 0xff) + // 6174
((q >>> 8) & 0xff00) + // 6175
((q & 0xff00) << 8) + // 6176
((q & 0xff) << 24)); // 6177
} // 6178
// 6179
// 6180
function InflateState() { // 6181
this.mode = 0; /* current inflate mode */ // 6182
this.last = false; /* true if processing last block */ // 6183
this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ // 6184
this.havedict = false; /* true if dictionary provided */ // 6185
this.flags = 0; /* gzip header method and flags (0 if zlib) */ // 6186
this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ // 6187
this.check = 0; /* protected copy of check value */ // 6188
this.total = 0; /* protected copy of output count */ // 6189
// TODO: may be {} // 6190
this.head = null; /* where to save gzip header information */ // 6191
// 6192
/* sliding window */ // 6193
this.wbits = 0; /* log base 2 of requested window size */ // 6194
this.wsize = 0; /* window size or zero if not using window */ // 6195
this.whave = 0; /* valid bytes in the window */ // 6196
this.wnext = 0; /* window write index */ // 6197
this.window = null; /* allocated sliding window, if needed */ // 6198
// 6199
/* bit accumulator */ // 6200
this.hold = 0; /* input bit accumulator */ // 6201
this.bits = 0; /* number of bits in "in" */ // 6202
// 6203
/* for string and stored block copying */ // 6204
this.length = 0; /* literal or length of data to copy */ // 6205
this.offset = 0; /* distance back to copy string from */ // 6206
// 6207
/* for table and code decoding */ // 6208
this.extra = 0; /* extra bits needed */ // 6209
// 6210
/* fixed and dynamic code tables */ // 6211
this.lencode = null; /* starting table for length/literal codes */ // 6212
this.distcode = null; /* starting table for distance codes */ // 6213
this.lenbits = 0; /* index bits for lencode */ // 6214
this.distbits = 0; /* index bits for distcode */ // 6215
// 6216
/* dynamic table building */ // 6217
this.ncode = 0; /* number of code length code lengths */ // 6218
this.nlen = 0; /* number of length code lengths */ // 6219
this.ndist = 0; /* number of distance code lengths */ // 6220
this.have = 0; /* number of code lengths in lens[] */ // 6221
this.next = null; /* next available space in codes[] */ // 6222
// 6223
this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ // 6224
this.work = new utils.Buf16(288); /* work area for code table building */ // 6225
// 6226
/* // 6227
because we don't have pointers in js, we use lencode and distcode directly // 6228
as buffers so we don't need codes // 6229
*/ // 6230
//this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ // 6231
this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ // 6232
this.distdyn = null; /* dynamic table for distance codes (JS specific) */ // 6233
this.sane = 0; /* if false, allow invalid distance too far */ // 6234
this.back = 0; /* bits back of last unprocessed length/lit */ // 6235
this.was = 0; /* initial length of match */ // 6236
} // 6237
// 6238
function inflateResetKeep(strm) { // 6239
var state; // 6240
// 6241
if (!strm || !strm.state) { return Z_STREAM_ERROR; } // 6242
state = strm.state; // 6243
strm.total_in = strm.total_out = state.total = 0; // 6244
strm.msg = ''; /*Z_NULL*/ // 6245
if (state.wrap) { /* to support ill-conceived Java test suite */ // 6246
strm.adler = state.wrap & 1; // 6247
} // 6248
state.mode = HEAD; // 6249
state.last = 0; // 6250
state.havedict = 0; // 6251
state.dmax = 32768; // 6252
state.head = null/*Z_NULL*/; // 6253
state.hold = 0; // 6254
state.bits = 0; // 6255
//state.lencode = state.distcode = state.next = state.codes; // 6256
state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); // 6257
state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); // 6258
// 6259
state.sane = 1; // 6260
state.back = -1; // 6261
//Tracev((stderr, "inflate: reset\n")); // 6262
return Z_OK; // 6263
} // 6264
// 6265
function inflateReset(strm) { // 6266
var state; // 6267
// 6268
if (!strm || !strm.state) { return Z_STREAM_ERROR; } // 6269
state = strm.state; // 6270
state.wsize = 0; // 6271
state.whave = 0; // 6272
state.wnext = 0; // 6273
return inflateResetKeep(strm); // 6274
// 6275
} // 6276
// 6277
function inflateReset2(strm, windowBits) { // 6278
var wrap; // 6279
var state; // 6280
// 6281
/* get the state */ // 6282
if (!strm || !strm.state) { return Z_STREAM_ERROR; } // 6283
state = strm.state; // 6284
// 6285
/* extract wrap request from windowBits parameter */ // 6286
if (windowBits < 0) { // 6287
wrap = 0; // 6288
windowBits = -windowBits; // 6289
} // 6290
else { // 6291
wrap = (windowBits >> 4) + 1; // 6292
if (windowBits < 48) { // 6293
windowBits &= 15; // 6294
} // 6295
} // 6296
// 6297
/* set number of window bits, free window if different */ // 6298
if (windowBits && (windowBits < 8 || windowBits > 15)) { // 6299
return Z_STREAM_ERROR; // 6300
} // 6301
if (state.window !== null && state.wbits !== windowBits) { // 6302
state.window = null; // 6303
} // 6304
// 6305
/* update state and reset the rest of it */ // 6306
state.wrap = wrap; // 6307
state.wbits = windowBits; // 6308
return inflateReset(strm); // 6309
} // 6310
// 6311
function inflateInit2(strm, windowBits) { // 6312
var ret; // 6313
var state; // 6314
// 6315
if (!strm) { return Z_STREAM_ERROR; } // 6316
//strm.msg = Z_NULL; /* in case we return an error */ // 6317
// 6318
state = new InflateState(); // 6319
// 6320
//if (state === Z_NULL) return Z_MEM_ERROR; // 6321
//Tracev((stderr, "inflate: allocated\n")); // 6322
strm.state = state; // 6323
state.window = null/*Z_NULL*/; // 6324
ret = inflateReset2(strm, windowBits); // 6325
if (ret !== Z_OK) { // 6326
strm.state = null/*Z_NULL*/; // 6327
} // 6328
return ret; // 6329
} // 6330
// 6331
function inflateInit(strm) { // 6332
return inflateInit2(strm, DEF_WBITS); // 6333
} // 6334
// 6335
// 6336
/* // 6337
Return state with length and distance decoding tables and index sizes set to // 6338
fixed code decoding. Normally this returns fixed tables from inffixed.h. // 6339
If BUILDFIXED is defined, then instead this routine builds the tables the // 6340
first time it's called, and returns those tables the first time and // 6341
thereafter. This reduces the size of the code by about 2K bytes, in // 6342
exchange for a little execution time. However, BUILDFIXED should not be // 6343
used for threaded applications, since the rewriting of the tables and virgin // 6344
may not be thread-safe. // 6345
*/ // 6346
var virgin = true; // 6347
// 6348
var lenfix, distfix; // We have no pointers in JS, so keep tables separate // 6349
// 6350
function fixedtables(state) { // 6351
/* build fixed huffman tables if first call (may not be thread safe) */ // 6352
if (virgin) { // 6353
var sym; // 6354
// 6355
lenfix = new utils.Buf32(512); // 6356
distfix = new utils.Buf32(32); // 6357
// 6358
/* literal/length table */ // 6359
sym = 0; // 6360
while (sym < 144) { state.lens[sym++] = 8; } // 6361
while (sym < 256) { state.lens[sym++] = 9; } // 6362
while (sym < 280) { state.lens[sym++] = 7; } // 6363
while (sym < 288) { state.lens[sym++] = 8; } // 6364
// 6365
inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9}); // 6366
// 6367
/* distance table */ // 6368
sym = 0; // 6369
while (sym < 32) { state.lens[sym++] = 5; } // 6370
// 6371
inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5}); // 6372
// 6373
/* do this just once */ // 6374
virgin = false; // 6375
} // 6376
// 6377
state.lencode = lenfix; // 6378
state.lenbits = 9; // 6379
state.distcode = distfix; // 6380
state.distbits = 5; // 6381
} // 6382
// 6383
// 6384
/* // 6385
Update the window with the last wsize (normally 32K) bytes written before // 6386
returning. If window does not exist yet, create it. This is only called // 6387
when a window is already in use, or when output has been written during this // 6388
inflate call, but the end of the deflate stream has not been reached yet. // 6389
It is also called to create a window for dictionary data when a dictionary // 6390
is loaded. // 6391
// 6392
Providing output buffers larger than 32K to inflate() should provide a speed // 6393
advantage, since only the last 32K of output is copied to the sliding window // 6394
upon return from inflate(), and since all distances after the first 32K of // 6395
output will fall in the output data, making match copies simpler and faster. // 6396
The advantage may be dependent on the size of the processor's data caches. // 6397
*/ // 6398
function updatewindow(strm, src, end, copy) { // 6399
var dist; // 6400
var state = strm.state; // 6401
// 6402
/* if it hasn't been done already, allocate space for the window */ // 6403
if (state.window === null) { // 6404
state.wsize = 1 << state.wbits; // 6405
state.wnext = 0; // 6406
state.whave = 0; // 6407
// 6408
state.window = new utils.Buf8(state.wsize); // 6409
} // 6410
// 6411
/* copy state->wsize or less output bytes into the circular window */ // 6412
if (copy >= state.wsize) { // 6413
utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0); // 6414
state.wnext = 0; // 6415
state.whave = state.wsize; // 6416
} // 6417
else { // 6418
dist = state.wsize - state.wnext; // 6419
if (dist > copy) { // 6420
dist = copy; // 6421
} // 6422
//zmemcpy(state->window + state->wnext, end - copy, dist); // 6423
utils.arraySet(state.window,src, end - copy, dist, state.wnext); // 6424
copy -= dist; // 6425
if (copy) { // 6426
//zmemcpy(state->window, end - copy, copy); // 6427
utils.arraySet(state.window,src, end - copy, copy, 0); // 6428
state.wnext = copy; // 6429
state.whave = state.wsize; // 6430
} // 6431
else { // 6432
state.wnext += dist; // 6433
if (state.wnext === state.wsize) { state.wnext = 0; } // 6434
if (state.whave < state.wsize) { state.whave += dist; } // 6435
} // 6436
} // 6437
return 0; // 6438
} // 6439
// 6440
function inflate(strm, flush) { // 6441
var state; // 6442
var input, output; // input/output buffers // 6443
var next; /* next input INDEX */ // 6444
var put; /* next output INDEX */ // 6445
var have, left; /* available input and output */ // 6446
var hold; /* bit buffer */ // 6447
var bits; /* bits in bit buffer */ // 6448
var _in, _out; /* save starting available input and output */ // 6449
var copy; /* number of stored or match bytes to copy */ // 6450
var from; /* where to copy match bytes from */ // 6451
var from_source; // 6452
var here = 0; /* current decoding table entry */ // 6453
var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) // 6454
//var last; /* parent table entry */ // 6455
var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) // 6456
var len; /* length to copy for repeats, bits to drop */ // 6457
var ret; /* return code */ // 6458
var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ // 6459
var opts; // 6460
// 6461
var n; // temporary var for NEED_BITS // 6462
// 6463
var order = /* permutation of code lengths */ // 6464
[16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; // 6465
// 6466
// 6467
if (!strm || !strm.state || !strm.output || // 6468
(!strm.input && strm.avail_in !== 0)) { // 6469
return Z_STREAM_ERROR; // 6470
} // 6471
// 6472
state = strm.state; // 6473
if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ // 6474
// 6475
// 6476
//--- LOAD() --- // 6477
put = strm.next_out; // 6478
output = strm.output; // 6479
left = strm.avail_out; // 6480
next = strm.next_in; // 6481
input = strm.input; // 6482
have = strm.avail_in; // 6483
hold = state.hold; // 6484
bits = state.bits; // 6485
//--- // 6486
// 6487
_in = have; // 6488
_out = left; // 6489
ret = Z_OK; // 6490
// 6491
inf_leave: // goto emulation // 6492
for (;;) { // 6493
switch (state.mode) { // 6494
case HEAD: // 6495
if (state.wrap === 0) { // 6496
state.mode = TYPEDO; // 6497
break; // 6498
} // 6499
//=== NEEDBITS(16); // 6500
while (bits < 16) { // 6501
if (have === 0) { break inf_leave; } // 6502
have--; // 6503
hold += input[next++] << bits; // 6504
bits += 8; // 6505
} // 6506
//===// // 6507
if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ // 6508
state.check = 0/*crc32(0L, Z_NULL, 0)*/; // 6509
//=== CRC2(state.check, hold); // 6510
hbuf[0] = hold & 0xff; // 6511
hbuf[1] = (hold >>> 8) & 0xff; // 6512
state.check = crc32(state.check, hbuf, 2, 0); // 6513
//===// // 6514
// 6515
//=== INITBITS(); // 6516
hold = 0; // 6517
bits = 0; // 6518
//===// // 6519
state.mode = FLAGS; // 6520
break; // 6521
} // 6522
state.flags = 0; /* expect zlib header */ // 6523
if (state.head) { // 6524
state.head.done = false; // 6525
} // 6526
if (!(state.wrap & 1) || /* check if zlib header allowed */ // 6527
(((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { // 6528
strm.msg = 'incorrect header check'; // 6529
state.mode = BAD; // 6530
break; // 6531
} // 6532
if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { // 6533
strm.msg = 'unknown compression method'; // 6534
state.mode = BAD; // 6535
break; // 6536
} // 6537
//--- DROPBITS(4) ---// // 6538
hold >>>= 4; // 6539
bits -= 4; // 6540
//---// // 6541
len = (hold & 0x0f)/*BITS(4)*/ + 8; // 6542
if (state.wbits === 0) { // 6543
state.wbits = len; // 6544
} // 6545
else if (len > state.wbits) { // 6546
strm.msg = 'invalid window size'; // 6547
state.mode = BAD; // 6548
break; // 6549
} // 6550
state.dmax = 1 << len; // 6551
//Tracev((stderr, "inflate: zlib header ok\n")); // 6552
strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; // 6553
state.mode = hold & 0x200 ? DICTID : TYPE; // 6554
//=== INITBITS(); // 6555
hold = 0; // 6556
bits = 0; // 6557
//===// // 6558
break; // 6559
case FLAGS: // 6560
//=== NEEDBITS(16); */ // 6561
while (bits < 16) { // 6562
if (have === 0) { break inf_leave; } // 6563
have--; // 6564
hold += input[next++] << bits; // 6565
bits += 8; // 6566
} // 6567
//===// // 6568
state.flags = hold; // 6569
if ((state.flags & 0xff) !== Z_DEFLATED) { // 6570
strm.msg = 'unknown compression method'; // 6571
state.mode = BAD; // 6572
break; // 6573
} // 6574
if (state.flags & 0xe000) { // 6575
strm.msg = 'unknown header flags set'; // 6576
state.mode = BAD; // 6577
break; // 6578
} // 6579
if (state.head) { // 6580
state.head.text = ((hold >> 8) & 1); // 6581
} // 6582
if (state.flags & 0x0200) { // 6583
//=== CRC2(state.check, hold); // 6584
hbuf[0] = hold & 0xff; // 6585
hbuf[1] = (hold >>> 8) & 0xff; // 6586
state.check = crc32(state.check, hbuf, 2, 0); // 6587
//===// // 6588
} // 6589
//=== INITBITS(); // 6590
hold = 0; // 6591
bits = 0; // 6592
//===// // 6593
state.mode = TIME; // 6594
/* falls through */ // 6595
case TIME: // 6596
//=== NEEDBITS(32); */ // 6597
while (bits < 32) { // 6598
if (have === 0) { break inf_leave; } // 6599
have--; // 6600
hold += input[next++] << bits; // 6601
bits += 8; // 6602
} // 6603
//===// // 6604
if (state.head) { // 6605
state.head.time = hold; // 6606
} // 6607
if (state.flags & 0x0200) { // 6608
//=== CRC4(state.check, hold) // 6609
hbuf[0] = hold & 0xff; // 6610
hbuf[1] = (hold >>> 8) & 0xff; // 6611
hbuf[2] = (hold >>> 16) & 0xff; // 6612
hbuf[3] = (hold >>> 24) & 0xff; // 6613
state.check = crc32(state.check, hbuf, 4, 0); // 6614
//=== // 6615
} // 6616
//=== INITBITS(); // 6617
hold = 0; // 6618
bits = 0; // 6619
//===// // 6620
state.mode = OS; // 6621
/* falls through */ // 6622
case OS: // 6623
//=== NEEDBITS(16); */ // 6624
while (bits < 16) { // 6625
if (have === 0) { break inf_leave; } // 6626
have--; // 6627
hold += input[next++] << bits; // 6628
bits += 8; // 6629
} // 6630
//===// // 6631
if (state.head) { // 6632
state.head.xflags = (hold & 0xff); // 6633
state.head.os = (hold >> 8); // 6634
} // 6635
if (state.flags & 0x0200) { // 6636
//=== CRC2(state.check, hold); // 6637
hbuf[0] = hold & 0xff; // 6638
hbuf[1] = (hold >>> 8) & 0xff; // 6639
state.check = crc32(state.check, hbuf, 2, 0); // 6640
//===// // 6641
} // 6642
//=== INITBITS(); // 6643
hold = 0; // 6644
bits = 0; // 6645
//===// // 6646
state.mode = EXLEN; // 6647
/* falls through */ // 6648
case EXLEN: // 6649
if (state.flags & 0x0400) { // 6650
//=== NEEDBITS(16); */ // 6651
while (bits < 16) { // 6652
if (have === 0) { break inf_leave; } // 6653
have--; // 6654
hold += input[next++] << bits; // 6655
bits += 8; // 6656
} // 6657
//===// // 6658
state.length = hold; // 6659
if (state.head) { // 6660
state.head.extra_len = hold; // 6661
} // 6662
if (state.flags & 0x0200) { // 6663
//=== CRC2(state.check, hold); // 6664
hbuf[0] = hold & 0xff; // 6665
hbuf[1] = (hold >>> 8) & 0xff; // 6666
state.check = crc32(state.check, hbuf, 2, 0); // 6667
//===// // 6668
} // 6669
//=== INITBITS(); // 6670
hold = 0; // 6671
bits = 0; // 6672
//===// // 6673
} // 6674
else if (state.head) { // 6675
state.head.extra = null/*Z_NULL*/; // 6676
} // 6677
state.mode = EXTRA; // 6678
/* falls through */ // 6679
case EXTRA: // 6680
if (state.flags & 0x0400) { // 6681
copy = state.length; // 6682
if (copy > have) { copy = have; } // 6683
if (copy) { // 6684
if (state.head) { // 6685
len = state.head.extra_len - state.length; // 6686
if (!state.head.extra) { // 6687
// Use untyped array for more conveniend processing later // 6688
state.head.extra = new Array(state.head.extra_len); // 6689
} // 6690
utils.arraySet( // 6691
state.head.extra, // 6692
input, // 6693
next, // 6694
// extra field is limited to 65536 bytes // 6695
// - no need for additional size check // 6696
copy, // 6697
/*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ // 6698
len // 6699
); // 6700
//zmemcpy(state.head.extra + len, next, // 6701
// len + copy > state.head.extra_max ? // 6702
// state.head.extra_max - len : copy); // 6703
} // 6704
if (state.flags & 0x0200) { // 6705
state.check = crc32(state.check, input, copy, next); // 6706
} // 6707
have -= copy; // 6708
next += copy; // 6709
state.length -= copy; // 6710
} // 6711
if (state.length) { break inf_leave; } // 6712
} // 6713
state.length = 0; // 6714
state.mode = NAME; // 6715
/* falls through */ // 6716
case NAME: // 6717
if (state.flags & 0x0800) { // 6718
if (have === 0) { break inf_leave; } // 6719
copy = 0; // 6720
do { // 6721
// TODO: 2 or 1 bytes? // 6722
len = input[next + copy++]; // 6723
/* use constant limit because in js we should not preallocate memory */ // 6724
if (state.head && len && // 6725
(state.length < 65536 /*state.head.name_max*/)) { // 6726
state.head.name += String.fromCharCode(len); // 6727
} // 6728
} while (len && copy < have); // 6729
// 6730
if (state.flags & 0x0200) { // 6731
state.check = crc32(state.check, input, copy, next); // 6732
} // 6733
have -= copy; // 6734
next += copy; // 6735
if (len) { break inf_leave; } // 6736
} // 6737
else if (state.head) { // 6738
state.head.name = null; // 6739
} // 6740
state.length = 0; // 6741
state.mode = COMMENT; // 6742
/* falls through */ // 6743
case COMMENT: // 6744
if (state.flags & 0x1000) { // 6745
if (have === 0) { break inf_leave; } // 6746
copy = 0; // 6747
do { // 6748
len = input[next + copy++]; // 6749
/* use constant limit because in js we should not preallocate memory */ // 6750
if (state.head && len && // 6751
(state.length < 65536 /*state.head.comm_max*/)) { // 6752
state.head.comment += String.fromCharCode(len); // 6753
} // 6754
} while (len && copy < have); // 6755
if (state.flags & 0x0200) { // 6756
state.check = crc32(state.check, input, copy, next); // 6757
} // 6758
have -= copy; // 6759
next += copy; // 6760
if (len) { break inf_leave; } // 6761
} // 6762
else if (state.head) { // 6763
state.head.comment = null; // 6764
} // 6765
state.mode = HCRC; // 6766
/* falls through */ // 6767
case HCRC: // 6768
if (state.flags & 0x0200) { // 6769
//=== NEEDBITS(16); */ // 6770
while (bits < 16) { // 6771
if (have === 0) { break inf_leave; } // 6772
have--; // 6773
hold += input[next++] << bits; // 6774
bits += 8; // 6775
} // 6776
//===// // 6777
if (hold !== (state.check & 0xffff)) { // 6778
strm.msg = 'header crc mismatch'; // 6779
state.mode = BAD; // 6780
break; // 6781
} // 6782
//=== INITBITS(); // 6783
hold = 0; // 6784
bits = 0; // 6785
//===// // 6786
} // 6787
if (state.head) { // 6788
state.head.hcrc = ((state.flags >> 9) & 1); // 6789
state.head.done = true; // 6790
} // 6791
strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/; // 6792
state.mode = TYPE; // 6793
break; // 6794
case DICTID: // 6795
//=== NEEDBITS(32); */ // 6796
while (bits < 32) { // 6797
if (have === 0) { break inf_leave; } // 6798
have--; // 6799
hold += input[next++] << bits; // 6800
bits += 8; // 6801
} // 6802
//===// // 6803
strm.adler = state.check = ZSWAP32(hold); // 6804
//=== INITBITS(); // 6805
hold = 0; // 6806
bits = 0; // 6807
//===// // 6808
state.mode = DICT; // 6809
/* falls through */ // 6810
case DICT: // 6811
if (state.havedict === 0) { // 6812
//--- RESTORE() --- // 6813
strm.next_out = put; // 6814
strm.avail_out = left; // 6815
strm.next_in = next; // 6816
strm.avail_in = have; // 6817
state.hold = hold; // 6818
state.bits = bits; // 6819
//--- // 6820
return Z_NEED_DICT; // 6821
} // 6822
strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; // 6823
state.mode = TYPE; // 6824
/* falls through */ // 6825
case TYPE: // 6826
if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } // 6827
/* falls through */ // 6828
case TYPEDO: // 6829
if (state.last) { // 6830
//--- BYTEBITS() ---// // 6831
hold >>>= bits & 7; // 6832
bits -= bits & 7; // 6833
//---// // 6834
state.mode = CHECK; // 6835
break; // 6836
} // 6837
//=== NEEDBITS(3); */ // 6838
while (bits < 3) { // 6839
if (have === 0) { break inf_leave; } // 6840
have--; // 6841
hold += input[next++] << bits; // 6842
bits += 8; // 6843
} // 6844
//===// // 6845
state.last = (hold & 0x01)/*BITS(1)*/; // 6846
//--- DROPBITS(1) ---// // 6847
hold >>>= 1; // 6848
bits -= 1; // 6849
//---// // 6850
// 6851
switch ((hold & 0x03)/*BITS(2)*/) { // 6852
case 0: /* stored block */ // 6853
//Tracev((stderr, "inflate: stored block%s\n", // 6854
// state.last ? " (last)" : "")); // 6855
state.mode = STORED; // 6856
break; // 6857
case 1: /* fixed block */ // 6858
fixedtables(state); // 6859
//Tracev((stderr, "inflate: fixed codes block%s\n", // 6860
// state.last ? " (last)" : "")); // 6861
state.mode = LEN_; /* decode codes */ // 6862
if (flush === Z_TREES) { // 6863
//--- DROPBITS(2) ---// // 6864
hold >>>= 2; // 6865
bits -= 2; // 6866
//---// // 6867
break inf_leave; // 6868
} // 6869
break; // 6870
case 2: /* dynamic block */ // 6871
//Tracev((stderr, "inflate: dynamic codes block%s\n", // 6872
// state.last ? " (last)" : "")); // 6873
state.mode = TABLE; // 6874
break; // 6875
case 3: // 6876
strm.msg = 'invalid block type'; // 6877
state.mode = BAD; // 6878
} // 6879
//--- DROPBITS(2) ---// // 6880
hold >>>= 2; // 6881
bits -= 2; // 6882
//---// // 6883
break; // 6884
case STORED: // 6885
//--- BYTEBITS() ---// /* go to byte boundary */ // 6886
hold >>>= bits & 7; // 6887
bits -= bits & 7; // 6888
//---// // 6889
//=== NEEDBITS(32); */ // 6890
while (bits < 32) { // 6891
if (have === 0) { break inf_leave; } // 6892
have--; // 6893
hold += input[next++] << bits; // 6894
bits += 8; // 6895
} // 6896
//===// // 6897
if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { // 6898
strm.msg = 'invalid stored block lengths'; // 6899
state.mode = BAD; // 6900
break; // 6901
} // 6902
state.length = hold & 0xffff; // 6903
//Tracev((stderr, "inflate: stored length %u\n", // 6904
// state.length)); // 6905
//=== INITBITS(); // 6906
hold = 0; // 6907
bits = 0; // 6908
//===// // 6909
state.mode = COPY_; // 6910
if (flush === Z_TREES) { break inf_leave; } // 6911
/* falls through */ // 6912
case COPY_: // 6913
state.mode = COPY; // 6914
/* falls through */ // 6915
case COPY: // 6916
copy = state.length; // 6917
if (copy) { // 6918
if (copy > have) { copy = have; } // 6919
if (copy > left) { copy = left; } // 6920
if (copy === 0) { break inf_leave; } // 6921
//--- zmemcpy(put, next, copy); --- // 6922
utils.arraySet(output, input, next, copy, put); // 6923
//---// // 6924
have -= copy; // 6925
next += copy; // 6926
left -= copy; // 6927
put += copy; // 6928
state.length -= copy; // 6929
break; // 6930
} // 6931
//Tracev((stderr, "inflate: stored end\n")); // 6932
state.mode = TYPE; // 6933
break; // 6934
case TABLE: // 6935
//=== NEEDBITS(14); */ // 6936
while (bits < 14) { // 6937
if (have === 0) { break inf_leave; } // 6938
have--; // 6939
hold += input[next++] << bits; // 6940
bits += 8; // 6941
} // 6942
//===// // 6943
state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; // 6944
//--- DROPBITS(5) ---// // 6945
hold >>>= 5; // 6946
bits -= 5; // 6947
//---// // 6948
state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; // 6949
//--- DROPBITS(5) ---// // 6950
hold >>>= 5; // 6951
bits -= 5; // 6952
//---// // 6953
state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; // 6954
//--- DROPBITS(4) ---// // 6955
hold >>>= 4; // 6956
bits -= 4; // 6957
//---// // 6958
//#ifndef PKZIP_BUG_WORKAROUND // 6959
if (state.nlen > 286 || state.ndist > 30) { // 6960
strm.msg = 'too many length or distance symbols'; // 6961
state.mode = BAD; // 6962
break; // 6963
} // 6964
//#endif // 6965
//Tracev((stderr, "inflate: table sizes ok\n")); // 6966
state.have = 0; // 6967
state.mode = LENLENS; // 6968
/* falls through */ // 6969
case LENLENS: // 6970
while (state.have < state.ncode) { // 6971
//=== NEEDBITS(3); // 6972
while (bits < 3) { // 6973
if (have === 0) { break inf_leave; } // 6974
have--; // 6975
hold += input[next++] << bits; // 6976
bits += 8; // 6977
} // 6978
//===// // 6979
state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); // 6980
//--- DROPBITS(3) ---// // 6981
hold >>>= 3; // 6982
bits -= 3; // 6983
//---// // 6984
} // 6985
while (state.have < 19) { // 6986
state.lens[order[state.have++]] = 0; // 6987
} // 6988
// We have separate tables & no pointers. 2 commented lines below not needed. // 6989
//state.next = state.codes; // 6990
//state.lencode = state.next; // 6991
// Switch to use dynamic table // 6992
state.lencode = state.lendyn; // 6993
state.lenbits = 7; // 6994
// 6995
opts = {bits: state.lenbits}; // 6996
ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); // 6997
state.lenbits = opts.bits; // 6998
// 6999
if (ret) { // 7000
strm.msg = 'invalid code lengths set'; // 7001
state.mode = BAD; // 7002
break; // 7003
} // 7004
//Tracev((stderr, "inflate: code lengths ok\n")); // 7005
state.have = 0; // 7006
state.mode = CODELENS; // 7007
/* falls through */ // 7008
case CODELENS: // 7009
while (state.have < state.nlen + state.ndist) { // 7010
for (;;) { // 7011
here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ // 7012
here_bits = here >>> 24; // 7013
here_op = (here >>> 16) & 0xff; // 7014
here_val = here & 0xffff; // 7015
// 7016
if ((here_bits) <= bits) { break; } // 7017
//--- PULLBYTE() ---// // 7018
if (have === 0) { break inf_leave; } // 7019
have--; // 7020
hold += input[next++] << bits; // 7021
bits += 8; // 7022
//---// // 7023
} // 7024
if (here_val < 16) { // 7025
//--- DROPBITS(here.bits) ---// // 7026
hold >>>= here_bits; // 7027
bits -= here_bits; // 7028
//---// // 7029
state.lens[state.have++] = here_val; // 7030
} // 7031
else { // 7032
if (here_val === 16) { // 7033
//=== NEEDBITS(here.bits + 2); // 7034
n = here_bits + 2; // 7035
while (bits < n) { // 7036
if (have === 0) { break inf_leave; } // 7037
have--; // 7038
hold += input[next++] << bits; // 7039
bits += 8; // 7040
} // 7041
//===// // 7042
//--- DROPBITS(here.bits) ---// // 7043
hold >>>= here_bits; // 7044
bits -= here_bits; // 7045
//---// // 7046
if (state.have === 0) { // 7047
strm.msg = 'invalid bit length repeat'; // 7048
state.mode = BAD; // 7049
break; // 7050
} // 7051
len = state.lens[state.have - 1]; // 7052
copy = 3 + (hold & 0x03);//BITS(2); // 7053
//--- DROPBITS(2) ---// // 7054
hold >>>= 2; // 7055
bits -= 2; // 7056
//---// // 7057
} // 7058
else if (here_val === 17) { // 7059
//=== NEEDBITS(here.bits + 3); // 7060
n = here_bits + 3; // 7061
while (bits < n) { // 7062
if (have === 0) { break inf_leave; } // 7063
have--; // 7064
hold += input[next++] << bits; // 7065
bits += 8; // 7066
} // 7067
//===// // 7068
//--- DROPBITS(here.bits) ---// // 7069
hold >>>= here_bits; // 7070
bits -= here_bits; // 7071
//---// // 7072
len = 0; // 7073
copy = 3 + (hold & 0x07);//BITS(3); // 7074
//--- DROPBITS(3) ---// // 7075
hold >>>= 3; // 7076
bits -= 3; // 7077
//---// // 7078
} // 7079
else { // 7080
//=== NEEDBITS(here.bits + 7); // 7081
n = here_bits + 7; // 7082
while (bits < n) { // 7083
if (have === 0) { break inf_leave; } // 7084
have--; // 7085
hold += input[next++] << bits; // 7086
bits += 8; // 7087
} // 7088
//===// // 7089
//--- DROPBITS(here.bits) ---// // 7090
hold >>>= here_bits; // 7091
bits -= here_bits; // 7092
//---// // 7093
len = 0; // 7094
copy = 11 + (hold & 0x7f);//BITS(7); // 7095
//--- DROPBITS(7) ---// // 7096
hold >>>= 7; // 7097
bits -= 7; // 7098
//---// // 7099
} // 7100
if (state.have + copy > state.nlen + state.ndist) { // 7101
strm.msg = 'invalid bit length repeat'; // 7102
state.mode = BAD; // 7103
break; // 7104
} // 7105
while (copy--) { // 7106
state.lens[state.have++] = len; // 7107
} // 7108
} // 7109
} // 7110
// 7111
/* handle error breaks in while */ // 7112
if (state.mode === BAD) { break; } // 7113
// 7114
/* check for end-of-block code (better have one) */ // 7115
if (state.lens[256] === 0) { // 7116
strm.msg = 'invalid code -- missing end-of-block'; // 7117
state.mode = BAD; // 7118
break; // 7119
} // 7120
// 7121
/* build code tables -- note: do not change the lenbits or distbits // 7122
values here (9 and 6) without reading the comments in inftrees.h // 7123
concerning the ENOUGH constants, which depend on those values */ // 7124
state.lenbits = 9; // 7125
// 7126
opts = {bits: state.lenbits}; // 7127
ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); // 7128
// We have separate tables & no pointers. 2 commented lines below not needed. // 7129
// state.next_index = opts.table_index; // 7130
state.lenbits = opts.bits; // 7131
// state.lencode = state.next; // 7132
// 7133
if (ret) { // 7134
strm.msg = 'invalid literal/lengths set'; // 7135
state.mode = BAD; // 7136
break; // 7137
} // 7138
// 7139
state.distbits = 6; // 7140
//state.distcode.copy(state.codes); // 7141
// Switch to use dynamic table // 7142
state.distcode = state.distdyn; // 7143
opts = {bits: state.distbits}; // 7144
ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); // 7145
// We have separate tables & no pointers. 2 commented lines below not needed. // 7146
// state.next_index = opts.table_index; // 7147
state.distbits = opts.bits; // 7148
// state.distcode = state.next; // 7149
// 7150
if (ret) { // 7151
strm.msg = 'invalid distances set'; // 7152
state.mode = BAD; // 7153
break; // 7154
} // 7155
//Tracev((stderr, 'inflate: codes ok\n')); // 7156
state.mode = LEN_; // 7157
if (flush === Z_TREES) { break inf_leave; } // 7158
/* falls through */ // 7159
case LEN_: // 7160
state.mode = LEN; // 7161
/* falls through */ // 7162
case LEN: // 7163
if (have >= 6 && left >= 258) { // 7164
//--- RESTORE() --- // 7165
strm.next_out = put; // 7166
strm.avail_out = left; // 7167
strm.next_in = next; // 7168
strm.avail_in = have; // 7169
state.hold = hold; // 7170
state.bits = bits; // 7171
//--- // 7172
inflate_fast(strm, _out); // 7173
//--- LOAD() --- // 7174
put = strm.next_out; // 7175
output = strm.output; // 7176
left = strm.avail_out; // 7177
next = strm.next_in; // 7178
input = strm.input; // 7179
have = strm.avail_in; // 7180
hold = state.hold; // 7181
bits = state.bits; // 7182
//--- // 7183
// 7184
if (state.mode === TYPE) { // 7185
state.back = -1; // 7186
} // 7187
break; // 7188
} // 7189
state.back = 0; // 7190
for (;;) { // 7191
here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/ // 7192
here_bits = here >>> 24; // 7193
here_op = (here >>> 16) & 0xff; // 7194
here_val = here & 0xffff; // 7195
// 7196
if (here_bits <= bits) { break; } // 7197
//--- PULLBYTE() ---// // 7198
if (have === 0) { break inf_leave; } // 7199
have--; // 7200
hold += input[next++] << bits; // 7201
bits += 8; // 7202
//---// // 7203
} // 7204
if (here_op && (here_op & 0xf0) === 0) { // 7205
last_bits = here_bits; // 7206
last_op = here_op; // 7207
last_val = here_val; // 7208
for (;;) { // 7209
here = state.lencode[last_val + // 7210
((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)]; // 7211
here_bits = here >>> 24; // 7212
here_op = (here >>> 16) & 0xff; // 7213
here_val = here & 0xffff; // 7214
// 7215
if ((last_bits + here_bits) <= bits) { break; } // 7216
//--- PULLBYTE() ---// // 7217
if (have === 0) { break inf_leave; } // 7218
have--; // 7219
hold += input[next++] << bits; // 7220
bits += 8; // 7221
//---// // 7222
} // 7223
//--- DROPBITS(last.bits) ---// // 7224
hold >>>= last_bits; // 7225
bits -= last_bits; // 7226
//---// // 7227
state.back += last_bits; // 7228
} // 7229
//--- DROPBITS(here.bits) ---// // 7230
hold >>>= here_bits; // 7231
bits -= here_bits; // 7232
//---// // 7233
state.back += here_bits; // 7234
state.length = here_val; // 7235
if (here_op === 0) { // 7236
//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? // 7237
// "inflate: literal '%c'\n" : // 7238
// "inflate: literal 0x%02x\n", here.val)); // 7239
state.mode = LIT; // 7240
break; // 7241
} // 7242
if (here_op & 32) { // 7243
//Tracevv((stderr, "inflate: end of block\n")); // 7244
state.back = -1; // 7245
state.mode = TYPE; // 7246
break; // 7247
} // 7248
if (here_op & 64) { // 7249
strm.msg = 'invalid literal/length code'; // 7250
state.mode = BAD; // 7251
break; // 7252
} // 7253
state.extra = here_op & 15; // 7254
state.mode = LENEXT; // 7255
/* falls through */ // 7256
case LENEXT: // 7257
if (state.extra) { // 7258
//=== NEEDBITS(state.extra); // 7259
n = state.extra; // 7260
while (bits < n) { // 7261
if (have === 0) { break inf_leave; } // 7262
have--; // 7263
hold += input[next++] << bits; // 7264
bits += 8; // 7265
} // 7266
//===// // 7267
state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/; // 7268
//--- DROPBITS(state.extra) ---// // 7269
hold >>>= state.extra; // 7270
bits -= state.extra; // 7271
//---// // 7272
state.back += state.extra; // 7273
} // 7274
//Tracevv((stderr, "inflate: length %u\n", state.length)); // 7275
state.was = state.length; // 7276
state.mode = DIST; // 7277
/* falls through */ // 7278
case DIST: // 7279
for (;;) { // 7280
here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/ // 7281
here_bits = here >>> 24; // 7282
here_op = (here >>> 16) & 0xff; // 7283
here_val = here & 0xffff; // 7284
// 7285
if ((here_bits) <= bits) { break; } // 7286
//--- PULLBYTE() ---// // 7287
if (have === 0) { break inf_leave; } // 7288
have--; // 7289
hold += input[next++] << bits; // 7290
bits += 8; // 7291
//---// // 7292
} // 7293
if ((here_op & 0xf0) === 0) { // 7294
last_bits = here_bits; // 7295
last_op = here_op; // 7296
last_val = here_val; // 7297
for (;;) { // 7298
here = state.distcode[last_val + // 7299
((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)]; // 7300
here_bits = here >>> 24; // 7301
here_op = (here >>> 16) & 0xff; // 7302
here_val = here & 0xffff; // 7303
// 7304
if ((last_bits + here_bits) <= bits) { break; } // 7305
//--- PULLBYTE() ---// // 7306
if (have === 0) { break inf_leave; } // 7307
have--; // 7308
hold += input[next++] << bits; // 7309
bits += 8; // 7310
//---// // 7311
} // 7312
//--- DROPBITS(last.bits) ---// // 7313
hold >>>= last_bits; // 7314
bits -= last_bits; // 7315
//---// // 7316
state.back += last_bits; // 7317
} // 7318
//--- DROPBITS(here.bits) ---// // 7319
hold >>>= here_bits; // 7320
bits -= here_bits; // 7321
//---// // 7322
state.back += here_bits; // 7323
if (here_op & 64) { // 7324
strm.msg = 'invalid distance code'; // 7325
state.mode = BAD; // 7326
break; // 7327
} // 7328
state.offset = here_val; // 7329
state.extra = (here_op) & 15; // 7330
state.mode = DISTEXT; // 7331
/* falls through */ // 7332
case DISTEXT: // 7333
if (state.extra) { // 7334
//=== NEEDBITS(state.extra); // 7335
n = state.extra; // 7336
while (bits < n) { // 7337
if (have === 0) { break inf_leave; } // 7338
have--; // 7339
hold += input[next++] << bits; // 7340
bits += 8; // 7341
} // 7342
//===// // 7343
state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/; // 7344
//--- DROPBITS(state.extra) ---// // 7345
hold >>>= state.extra; // 7346
bits -= state.extra; // 7347
//---// // 7348
state.back += state.extra; // 7349
} // 7350
//#ifdef INFLATE_STRICT // 7351
if (state.offset > state.dmax) { // 7352
strm.msg = 'invalid distance too far back'; // 7353
state.mode = BAD; // 7354
break; // 7355
} // 7356
//#endif // 7357
//Tracevv((stderr, "inflate: distance %u\n", state.offset)); // 7358
state.mode = MATCH; // 7359
/* falls through */ // 7360
case MATCH: // 7361
if (left === 0) { break inf_leave; } // 7362
copy = _out - left; // 7363
if (state.offset > copy) { /* copy from window */ // 7364
copy = state.offset - copy; // 7365
if (copy > state.whave) { // 7366
if (state.sane) { // 7367
strm.msg = 'invalid distance too far back'; // 7368
state.mode = BAD; // 7369
break; // 7370
} // 7371
// (!) This block is disabled in zlib defailts, // 7372
// don't enable it for binary compatibility // 7373
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR // 7374
// Trace((stderr, "inflate.c too far\n")); // 7375
// copy -= state.whave; // 7376
// if (copy > state.length) { copy = state.length; } // 7377
// if (copy > left) { copy = left; } // 7378
// left -= copy; // 7379
// state.length -= copy; // 7380
// do { // 7381
// output[put++] = 0; // 7382
// } while (--copy); // 7383
// if (state.length === 0) { state.mode = LEN; } // 7384
// break; // 7385
//#endif // 7386
} // 7387
if (copy > state.wnext) { // 7388
copy -= state.wnext; // 7389
from = state.wsize - copy; // 7390
} // 7391
else { // 7392
from = state.wnext - copy; // 7393
} // 7394
if (copy > state.length) { copy = state.length; } // 7395
from_source = state.window; // 7396
} // 7397
else { /* copy from output */ // 7398
from_source = output; // 7399
from = put - state.offset; // 7400
copy = state.length; // 7401
} // 7402
if (copy > left) { copy = left; } // 7403
left -= copy; // 7404
state.length -= copy; // 7405
do { // 7406
output[put++] = from_source[from++]; // 7407
} while (--copy); // 7408
if (state.length === 0) { state.mode = LEN; } // 7409
break; // 7410
case LIT: // 7411
if (left === 0) { break inf_leave; } // 7412
output[put++] = state.length; // 7413
left--; // 7414
state.mode = LEN; // 7415
break; // 7416
case CHECK: // 7417
if (state.wrap) { // 7418
//=== NEEDBITS(32); // 7419
while (bits < 32) { // 7420
if (have === 0) { break inf_leave; } // 7421
have--; // 7422
// Use '|' insdead of '+' to make sure that result is signed // 7423
hold |= input[next++] << bits; // 7424
bits += 8; // 7425
} // 7426
//===// // 7427
_out -= left; // 7428
strm.total_out += _out; // 7429
state.total += _out; // 7430
if (_out) { // 7431
strm.adler = state.check = // 7432
/*UPDATE(state.check, put - _out, _out);*/ // 7433
(state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
// 7435
} // 7436
_out = left; // 7437
// NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too // 7438
if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) { // 7439
strm.msg = 'incorrect data check'; // 7440
state.mode = BAD; // 7441
break; // 7442
} // 7443
//=== INITBITS(); // 7444
hold = 0; // 7445
bits = 0; // 7446
//===// // 7447
//Tracev((stderr, "inflate: check matches trailer\n")); // 7448
} // 7449
state.mode = LENGTH; // 7450
/* falls through */ // 7451
case LENGTH: // 7452
if (state.wrap && state.flags) { // 7453
//=== NEEDBITS(32); // 7454
while (bits < 32) { // 7455
if (have === 0) { break inf_leave; } // 7456
have--; // 7457
hold += input[next++] << bits; // 7458
bits += 8; // 7459
} // 7460
//===// // 7461
if (hold !== (state.total & 0xffffffff)) { // 7462
strm.msg = 'incorrect length check'; // 7463
state.mode = BAD; // 7464
break; // 7465
} // 7466
//=== INITBITS(); // 7467
hold = 0; // 7468
bits = 0; // 7469
//===// // 7470
//Tracev((stderr, "inflate: length matches trailer\n")); // 7471
} // 7472
state.mode = DONE; // 7473
/* falls through */ // 7474
case DONE: // 7475
ret = Z_STREAM_END; // 7476
break inf_leave; // 7477
case BAD: // 7478
ret = Z_DATA_ERROR; // 7479
break inf_leave; // 7480
case MEM: // 7481
return Z_MEM_ERROR; // 7482
case SYNC: // 7483
/* falls through */ // 7484
default: // 7485
return Z_STREAM_ERROR; // 7486
} // 7487
} // 7488
// 7489
// inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" // 7490
// 7491
/* // 7492
Return from inflate(), updating the total counts and the check value. // 7493
If there was no progress during the inflate() call, return a buffer // 7494
error. Call updatewindow() to create and/or update the window state. // 7495
Note: a memory error from inflate() is non-recoverable. // 7496
*/ // 7497
// 7498
//--- RESTORE() --- // 7499
strm.next_out = put; // 7500
strm.avail_out = left; // 7501
strm.next_in = next; // 7502
strm.avail_in = have; // 7503
state.hold = hold; // 7504
state.bits = bits; // 7505
//--- // 7506
// 7507
if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && // 7508
(state.mode < CHECK || flush !== Z_FINISH))) { // 7509
if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { // 7510
state.mode = MEM; // 7511
return Z_MEM_ERROR; // 7512
} // 7513
} // 7514
_in -= strm.avail_in; // 7515
_out -= strm.avail_out; // 7516
strm.total_in += _in; // 7517
strm.total_out += _out; // 7518
state.total += _out; // 7519
if (state.wrap && _out) { // 7520
strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ // 7521
(state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
} // 7523
strm.data_type = state.bits + (state.last ? 64 : 0) + // 7524
(state.mode === TYPE ? 128 : 0) + // 7525
(state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); // 7526
if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { // 7527
ret = Z_BUF_ERROR; // 7528
} // 7529
return ret; // 7530
} // 7531
// 7532
function inflateEnd(strm) { // 7533
// 7534
if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { // 7535
return Z_STREAM_ERROR; // 7536
} // 7537
// 7538
var state = strm.state; // 7539
if (state.window) { // 7540
state.window = null; // 7541
} // 7542
strm.state = null; // 7543
return Z_OK; // 7544
} // 7545
// 7546
function inflateGetHeader(strm, head) { // 7547
var state; // 7548
// 7549
/* check state */ // 7550
if (!strm || !strm.state) { return Z_STREAM_ERROR; } // 7551
state = strm.state; // 7552
if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } // 7553
// 7554
/* save header structure */ // 7555
state.head = head; // 7556
head.done = false; // 7557
return Z_OK; // 7558
} // 7559
// 7560
// 7561
exports.inflateReset = inflateReset; // 7562
exports.inflateReset2 = inflateReset2; // 7563
exports.inflateResetKeep = inflateResetKeep; // 7564
exports.inflateInit = inflateInit; // 7565
exports.inflateInit2 = inflateInit2; // 7566
exports.inflate = inflate; // 7567
exports.inflateEnd = inflateEnd; // 7568
exports.inflateGetHeader = inflateGetHeader; // 7569
exports.inflateInfo = 'pako inflate (from Nodeca project)'; // 7570
// 7571
/* Not implemented // 7572
exports.inflateCopy = inflateCopy; // 7573
exports.inflateGetDictionary = inflateGetDictionary; // 7574
exports.inflateMark = inflateMark; // 7575
exports.inflatePrime = inflatePrime; // 7576
exports.inflateSetDictionary = inflateSetDictionary; // 7577
exports.inflateSync = inflateSync; // 7578
exports.inflateSyncPoint = inflateSyncPoint; // 7579
exports.inflateUndermine = inflateUndermine; // 7580
*/ // 7581
},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
'use strict'; // 7583
// 7584
// 7585
var utils = _dereq_('../utils/common'); // 7586
// 7587
var MAXBITS = 15; // 7588
var ENOUGH_LENS = 852; // 7589
var ENOUGH_DISTS = 592; // 7590
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); // 7591
// 7592
var CODES = 0; // 7593
var LENS = 1; // 7594
var DISTS = 2; // 7595
// 7596
var lbase = [ /* Length codes 257..285 base */ // 7597
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, // 7598
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 // 7599
]; // 7600
// 7601
var lext = [ /* Length codes 257..285 extra */ // 7602
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, // 7603
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 // 7604
]; // 7605
// 7606
var dbase = [ /* Distance codes 0..29 base */ // 7607
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, // 7608
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, // 7609
8193, 12289, 16385, 24577, 0, 0 // 7610
]; // 7611
// 7612
var dext = [ /* Distance codes 0..29 extra */ // 7613
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, // 7614
23, 23, 24, 24, 25, 25, 26, 26, 27, 27, // 7615
28, 28, 29, 29, 64, 64 // 7616
]; // 7617
// 7618
module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) // 7619
{ // 7620
var bits = opts.bits; // 7621
//here = opts.here; /* table entry for duplication */ // 7622
// 7623
var len = 0; /* a code's length in bits */ // 7624
var sym = 0; /* index of code symbols */ // 7625
var min = 0, max = 0; /* minimum and maximum code lengths */ // 7626
var root = 0; /* number of index bits for root table */ // 7627
var curr = 0; /* number of index bits for current table */ // 7628
var drop = 0; /* code bits to drop for sub-table */ // 7629
var left = 0; /* number of prefix codes available */ // 7630
var used = 0; /* code entries in table used */ // 7631
var huff = 0; /* Huffman code */ // 7632
var incr; /* for incrementing code, index */ // 7633
var fill; /* index for replicating entries */ // 7634
var low; /* low bits for current root entry */ // 7635
var mask; /* mask for low root bits */ // 7636
var next; /* next available space in table */ // 7637
var base = null; /* base value table to use */ // 7638
var base_index = 0; // 7639
// var shoextra; /* extra bits table to use */ // 7640
var end; /* use base and extra for symbol > end */ // 7641
var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */ // 7642
var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */ // 7643
var extra = null; // 7644
var extra_index = 0; // 7645
// 7646
var here_bits, here_op, here_val; // 7647
// 7648
/* // 7649
Process a set of code lengths to create a canonical Huffman code. The // 7650
code lengths are lens[0..codes-1]. Each length corresponds to the // 7651
symbols 0..codes-1. The Huffman code is generated by first sorting the // 7652
symbols by length from short to long, and retaining the symbol order // 7653
for codes with equal lengths. Then the code starts with all zero bits // 7654
for the first code of the shortest length, and the codes are integer // 7655
increments for the same length, and zeros are appended as the length // 7656
increases. For the deflate format, these bits are stored backwards // 7657
from their more natural integer increment ordering, and so when the // 7658
decoding tables are built in the large loop below, the integer codes // 7659
are incremented backwards. // 7660
// 7661
This routine assumes, but does not check, that all of the entries in // 7662
lens[] are in the range 0..MAXBITS. The caller must assure this. // 7663
1..MAXBITS is interpreted as that code length. zero means that that // 7664
symbol does not occur in this code. // 7665
// 7666
The codes are sorted by computing a count of codes for each length, // 7667
creating from that a table of starting indices for each length in the // 7668
sorted table, and then entering the symbols in order in the sorted // 7669
table. The sorted table is work[], with that space being provided by // 7670
the caller. // 7671
// 7672
The length counts are used for other purposes as well, i.e. finding // 7673
the minimum and maximum length codes, determining if there are any // 7674
codes at all, checking for a valid set of lengths, and looking ahead // 7675
at length counts to determine sub-table sizes when building the // 7676
decoding tables. // 7677
*/ // 7678
// 7679
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ // 7680
for (len = 0; len <= MAXBITS; len++) { // 7681
count[len] = 0; // 7682
} // 7683
for (sym = 0; sym < codes; sym++) { // 7684
count[lens[lens_index + sym]]++; // 7685
} // 7686
// 7687
/* bound code lengths, force root to be within code lengths */ // 7688
root = bits; // 7689
for (max = MAXBITS; max >= 1; max--) { // 7690
if (count[max] !== 0) { break; } // 7691
} // 7692
if (root > max) { // 7693
root = max; // 7694
} // 7695
if (max === 0) { /* no symbols to code at all */ // 7696
//table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ // 7697
//table.bits[opts.table_index] = 1; //here.bits = (var char)1; // 7698
//table.val[opts.table_index++] = 0; //here.val = (var short)0; // 7699
table[table_index++] = (1 << 24) | (64 << 16) | 0; // 7700
// 7701
// 7702
//table.op[opts.table_index] = 64; // 7703
//table.bits[opts.table_index] = 1; // 7704
//table.val[opts.table_index++] = 0; // 7705
table[table_index++] = (1 << 24) | (64 << 16) | 0; // 7706
// 7707
opts.bits = 1; // 7708
return 0; /* no symbols, but wait for decoding to report error */ // 7709
} // 7710
for (min = 1; min < max; min++) { // 7711
if (count[min] !== 0) { break; } // 7712
} // 7713
if (root < min) { // 7714
root = min; // 7715
} // 7716
// 7717
/* check for an over-subscribed or incomplete set of lengths */ // 7718
left = 1; // 7719
for (len = 1; len <= MAXBITS; len++) { // 7720
left <<= 1; // 7721
left -= count[len]; // 7722
if (left < 0) { // 7723
return -1; // 7724
} /* over-subscribed */ // 7725
} // 7726
if (left > 0 && (type === CODES || max !== 1)) { // 7727
return -1; /* incomplete set */ // 7728
} // 7729
// 7730
/* generate offsets into symbol table for each length for sorting */ // 7731
offs[1] = 0; // 7732
for (len = 1; len < MAXBITS; len++) { // 7733
offs[len + 1] = offs[len] + count[len]; // 7734
} // 7735
// 7736
/* sort symbols by length, by symbol order within each length */ // 7737
for (sym = 0; sym < codes; sym++) { // 7738
if (lens[lens_index + sym] !== 0) { // 7739
work[offs[lens[lens_index + sym]]++] = sym; // 7740
} // 7741
} // 7742
// 7743
/* // 7744
Create and fill in decoding tables. In this loop, the table being // 7745
filled is at next and has curr index bits. The code being used is huff // 7746
with length len. That code is converted to an index by dropping drop // 7747
bits off of the bottom. For codes where len is less than drop + curr, // 7748
those top drop + curr - len bits are incremented through all values to // 7749
fill the table with replicated entries. // 7750
// 7751
root is the number of index bits for the root table. When len exceeds // 7752
root, sub-tables are created pointed to by the root entry with an index // 7753
of the low root bits of huff. This is saved in low to check for when a // 7754
new sub-table should be started. drop is zero when the root table is // 7755
being filled, and drop is root when sub-tables are being filled. // 7756
// 7757
When a new sub-table is needed, it is necessary to look ahead in the // 7758
code lengths to determine what size sub-table is needed. The length // 7759
counts are used for this, and so count[] is decremented as codes are // 7760
entered in the tables. // 7761
// 7762
used keeps track of how many table entries have been allocated from the // 7763
provided *table space. It is checked for LENS and DIST tables against // 7764
the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in // 7765
the initial root table size constants. See the comments in inftrees.h // 7766
for more information. // 7767
// 7768
sym increments through all symbols, and the loop terminates when // 7769
all codes of length max, i.e. all codes, have been processed. This // 7770
routine permits incomplete codes, so another loop after this one fills // 7771
in the rest of the decoding tables with invalid code markers. // 7772
*/ // 7773
// 7774
/* set up for code type */ // 7775
// poor man optimization - use if-else instead of switch, // 7776
// to avoid deopts in old v8 // 7777
if (type === CODES) { // 7778
base = extra = work; /* dummy value--not used */ // 7779
end = 19; // 7780
} else if (type === LENS) { // 7781
base = lbase; // 7782
base_index -= 257; // 7783
extra = lext; // 7784
extra_index -= 257; // 7785
end = 256; // 7786
} else { /* DISTS */ // 7787
base = dbase; // 7788
extra = dext; // 7789
end = -1; // 7790
} // 7791
// 7792
/* initialize opts for loop */ // 7793
huff = 0; /* starting code */ // 7794
sym = 0; /* starting code symbol */ // 7795
len = min; /* starting code length */ // 7796
next = table_index; /* current table to fill in */ // 7797
curr = root; /* current table index bits */ // 7798
drop = 0; /* current bits to drop from code for index */ // 7799
low = -1; /* trigger new sub-table when len > root */ // 7800
used = 1 << root; /* use root table entries */ // 7801
mask = used - 1; /* mask for comparing low */ // 7802
// 7803
/* check available table space */ // 7804
if ((type === LENS && used > ENOUGH_LENS) || // 7805
(type === DISTS && used > ENOUGH_DISTS)) { // 7806
return 1; // 7807
} // 7808
// 7809
var i=0; // 7810
/* process all codes and make table entries */ // 7811
for (;;) { // 7812
i++; // 7813
/* create table entry */ // 7814
here_bits = len - drop; // 7815
if (work[sym] < end) { // 7816
here_op = 0; // 7817
here_val = work[sym]; // 7818
} // 7819
else if (work[sym] > end) { // 7820
here_op = extra[extra_index + work[sym]]; // 7821
here_val = base[base_index + work[sym]]; // 7822
} // 7823
else { // 7824
here_op = 32 + 64; /* end of block */ // 7825
here_val = 0; // 7826
} // 7827
// 7828
/* replicate for those indices with low len bits equal to huff */ // 7829
incr = 1 << (len - drop); // 7830
fill = 1 << curr; // 7831
min = fill; /* save offset to next table */ // 7832
do { // 7833
fill -= incr; // 7834
table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; // 7835
} while (fill !== 0); // 7836
// 7837
/* backwards increment the len-bit code huff */ // 7838
incr = 1 << (len - 1); // 7839
while (huff & incr) { // 7840
incr >>= 1; // 7841
} // 7842
if (incr !== 0) { // 7843
huff &= incr - 1; // 7844
huff += incr; // 7845
} else { // 7846
huff = 0; // 7847
} // 7848
// 7849
/* go to next symbol, update count, len */ // 7850
sym++; // 7851
if (--count[len] === 0) { // 7852
if (len === max) { break; } // 7853
len = lens[lens_index + work[sym]]; // 7854
} // 7855
// 7856
/* create new sub-table if needed */ // 7857
if (len > root && (huff & mask) !== low) { // 7858
/* if first time, transition to sub-tables */ // 7859
if (drop === 0) { // 7860
drop = root; // 7861
} // 7862
// 7863
/* increment past last table */ // 7864
next += min; /* here min is 1 << curr */ // 7865
// 7866
/* determine length of next table */ // 7867
curr = len - drop; // 7868
left = 1 << curr; // 7869
while (curr + drop < max) { // 7870
left -= count[curr + drop]; // 7871
if (left <= 0) { break; } // 7872
curr++; // 7873
left <<= 1; // 7874
} // 7875
// 7876
/* check for enough space */ // 7877
used += 1 << curr; // 7878
if ((type === LENS && used > ENOUGH_LENS) || // 7879
(type === DISTS && used > ENOUGH_DISTS)) { // 7880
return 1; // 7881
} // 7882
// 7883
/* point entry in root table to sub-table */ // 7884
low = huff & mask; // 7885
/*table.op[low] = curr; // 7886
table.bits[low] = root; // 7887
table.val[low] = next - opts.table_index;*/ // 7888
table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; // 7889
} // 7890
} // 7891
// 7892
/* fill in remaining table entry if code is incomplete (guaranteed to have // 7893
at most one remaining entry, since if the code is incomplete, the // 7894
maximum code length that was allowed to get this far is one bit) */ // 7895
if (huff !== 0) { // 7896
//table.op[next + huff] = 64; /* invalid code marker */ // 7897
//table.bits[next + huff] = len - drop; // 7898
//table.val[next + huff] = 0; // 7899
table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; // 7900
} // 7901
// 7902
/* set return parameters */ // 7903
//opts.table_index += used; // 7904
opts.bits = root; // 7905
return 0; // 7906
}; // 7907
// 7908
},{"../utils/common":27}],37:[function(_dereq_,module,exports){ // 7909
'use strict'; // 7910
// 7911
module.exports = { // 7912
'2': 'need dictionary', /* Z_NEED_DICT 2 */ // 7913
'1': 'stream end', /* Z_STREAM_END 1 */ // 7914
'0': '', /* Z_OK 0 */ // 7915
'-1': 'file error', /* Z_ERRNO (-1) */ // 7916
'-2': 'stream error', /* Z_STREAM_ERROR (-2) */ // 7917
'-3': 'data error', /* Z_DATA_ERROR (-3) */ // 7918
'-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ // 7919
'-5': 'buffer error', /* Z_BUF_ERROR (-5) */ // 7920
'-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ // 7921
}; // 7922
},{}],38:[function(_dereq_,module,exports){ // 7923
'use strict'; // 7924
// 7925
// 7926
var utils = _dereq_('../utils/common'); // 7927
// 7928
/* Public constants ==========================================================*/ // 7929
/* ===========================================================================*/ // 7930
// 7931
// 7932
//var Z_FILTERED = 1; // 7933
//var Z_HUFFMAN_ONLY = 2; // 7934
//var Z_RLE = 3; // 7935
var Z_FIXED = 4; // 7936
//var Z_DEFAULT_STRATEGY = 0; // 7937
// 7938
/* Possible values of the data_type field (though see inflate()) */ // 7939
var Z_BINARY = 0; // 7940
var Z_TEXT = 1; // 7941
//var Z_ASCII = 1; // = Z_TEXT // 7942
var Z_UNKNOWN = 2; // 7943
// 7944
/*============================================================================*/ // 7945
// 7946
// 7947
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } // 7948
// 7949
// From zutil.h // 7950
// 7951
var STORED_BLOCK = 0; // 7952
var STATIC_TREES = 1; // 7953
var DYN_TREES = 2; // 7954
/* The three kinds of block type */ // 7955
// 7956
var MIN_MATCH = 3; // 7957
var MAX_MATCH = 258; // 7958
/* The minimum and maximum match lengths */ // 7959
// 7960
// From deflate.h // 7961
/* =========================================================================== // 7962
* Internal compression state. // 7963
*/ // 7964
// 7965
var LENGTH_CODES = 29; // 7966
/* number of length codes, not counting the special END_BLOCK code */ // 7967
// 7968
var LITERALS = 256; // 7969
/* number of literal bytes 0..255 */ // 7970
// 7971
var L_CODES = LITERALS + 1 + LENGTH_CODES; // 7972
/* number of Literal or Length codes, including the END_BLOCK code */ // 7973
// 7974
var D_CODES = 30; // 7975
/* number of distance codes */ // 7976
// 7977
var BL_CODES = 19; // 7978
/* number of codes used to transfer the bit lengths */ // 7979
// 7980
var HEAP_SIZE = 2*L_CODES + 1; // 7981
/* maximum heap size */ // 7982
// 7983
var MAX_BITS = 15; // 7984
/* All codes must not exceed MAX_BITS bits */ // 7985
// 7986
var Buf_size = 16; // 7987
/* size of bit buffer in bi_buf */ // 7988
// 7989
// 7990
/* =========================================================================== // 7991
* Constants // 7992
*/ // 7993
// 7994
var MAX_BL_BITS = 7; // 7995
/* Bit length codes must not exceed MAX_BL_BITS bits */ // 7996
// 7997
var END_BLOCK = 256; // 7998
/* end of block literal code */ // 7999
// 8000
var REP_3_6 = 16; // 8001
/* repeat previous bit length 3-6 times (2 bits of repeat count) */ // 8002
// 8003
var REPZ_3_10 = 17; // 8004
/* repeat a zero length 3-10 times (3 bits of repeat count) */ // 8005
// 8006
var REPZ_11_138 = 18; // 8007
/* repeat a zero length 11-138 times (7 bits of repeat count) */ // 8008
// 8009
var extra_lbits = /* extra bits for each length code */ // 8010
[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; // 8011
// 8012
var extra_dbits = /* extra bits for each distance code */ // 8013
[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; // 8014
// 8015
var extra_blbits = /* extra bits for each bit length code */ // 8016
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; // 8017
// 8018
var bl_order = // 8019
[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; // 8020
/* The lengths of the bit length codes are sent in order of decreasing // 8021
* probability, to avoid transmitting the lengths for unused bit length codes. // 8022
*/ // 8023
// 8024
/* =========================================================================== // 8025
* Local data. These are initialized only once. // 8026
*/ // 8027
// 8028
// We pre-fill arrays with 0 to avoid uninitialized gaps // 8029
// 8030
var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ // 8031
// 8032
// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 // 8033
var static_ltree = new Array((L_CODES+2) * 2); // 8034
zero(static_ltree); // 8035
/* The static literal tree. Since the bit lengths are imposed, there is no // 8036
* need for the L_CODES extra codes used during heap construction. However // 8037
* The codes 286 and 287 are needed to build a canonical tree (see _tr_init // 8038
* below). // 8039
*/ // 8040
// 8041
var static_dtree = new Array(D_CODES * 2); // 8042
zero(static_dtree); // 8043
/* The static distance tree. (Actually a trivial tree since all codes use // 8044
* 5 bits.) // 8045
*/ // 8046
// 8047
var _dist_code = new Array(DIST_CODE_LEN); // 8048
zero(_dist_code); // 8049
/* Distance codes. The first 256 values correspond to the distances // 8050
* 3 .. 258, the last 256 values correspond to the top 8 bits of // 8051
* the 15 bit distances. // 8052
*/ // 8053
// 8054
var _length_code = new Array(MAX_MATCH-MIN_MATCH+1); // 8055
zero(_length_code); // 8056
/* length code for each normalized match length (0 == MIN_MATCH) */ // 8057
// 8058
var base_length = new Array(LENGTH_CODES); // 8059
zero(base_length); // 8060
/* First normalized length for each code (0 = MIN_MATCH) */ // 8061
// 8062
var base_dist = new Array(D_CODES); // 8063
zero(base_dist); // 8064
/* First normalized distance for each code (0 = distance of 1) */ // 8065
// 8066
// 8067
var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) { // 8068
// 8069
this.static_tree = static_tree; /* static tree or NULL */ // 8070
this.extra_bits = extra_bits; /* extra bits for each code or NULL */ // 8071
this.extra_base = extra_base; /* base index for extra_bits */ // 8072
this.elems = elems; /* max number of elements in the tree */ // 8073
this.max_length = max_length; /* max bit length for the codes */ // 8074
// 8075
// show if `static_tree` has data or dummy - needed for monomorphic objects // 8076
this.has_stree = static_tree && static_tree.length; // 8077
}; // 8078
// 8079
// 8080
var static_l_desc; // 8081
var static_d_desc; // 8082
var static_bl_desc; // 8083
// 8084
// 8085
var TreeDesc = function(dyn_tree, stat_desc) { // 8086
this.dyn_tree = dyn_tree; /* the dynamic tree */ // 8087
this.max_code = 0; /* largest code with non zero frequency */ // 8088
this.stat_desc = stat_desc; /* the corresponding static tree */ // 8089
}; // 8090
// 8091
// 8092
// 8093
function d_code(dist) { // 8094
return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; // 8095
} // 8096
// 8097
// 8098
/* =========================================================================== // 8099
* Output a short LSB first on the stream. // 8100
* IN assertion: there is enough room in pendingBuf. // 8101
*/ // 8102
function put_short (s, w) { // 8103
// put_byte(s, (uch)((w) & 0xff)); // 8104
// put_byte(s, (uch)((ush)(w) >> 8)); // 8105
s.pending_buf[s.pending++] = (w) & 0xff; // 8106
s.pending_buf[s.pending++] = (w >>> 8) & 0xff; // 8107
} // 8108
// 8109
// 8110
/* =========================================================================== // 8111
* Send a value on a given number of bits. // 8112
* IN assertion: length <= 16 and value fits in length bits. // 8113
*/ // 8114
function send_bits(s, value, length) { // 8115
if (s.bi_valid > (Buf_size - length)) { // 8116
s.bi_buf |= (value << s.bi_valid) & 0xffff; // 8117
put_short(s, s.bi_buf); // 8118
s.bi_buf = value >> (Buf_size - s.bi_valid); // 8119
s.bi_valid += length - Buf_size; // 8120
} else { // 8121
s.bi_buf |= (value << s.bi_valid) & 0xffff; // 8122
s.bi_valid += length; // 8123
} // 8124
} // 8125
// 8126
// 8127
function send_code(s, c, tree) { // 8128
send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/); // 8129
} // 8130
// 8131
// 8132
/* =========================================================================== // 8133
* Reverse the first len bits of a code, using straightforward code (a faster // 8134
* method would use a table) // 8135
* IN assertion: 1 <= len <= 15 // 8136
*/ // 8137
function bi_reverse(code, len) { // 8138
var res = 0; // 8139
do { // 8140
res |= code & 1; // 8141
code >>>= 1; // 8142
res <<= 1; // 8143
} while (--len > 0); // 8144
return res >>> 1; // 8145
} // 8146
// 8147
// 8148
/* =========================================================================== // 8149
* Flush the bit buffer, keeping at most 7 bits in it. // 8150
*/ // 8151
function bi_flush(s) { // 8152
if (s.bi_valid === 16) { // 8153
put_short(s, s.bi_buf); // 8154
s.bi_buf = 0; // 8155
s.bi_valid = 0; // 8156
// 8157
} else if (s.bi_valid >= 8) { // 8158
s.pending_buf[s.pending++] = s.bi_buf & 0xff; // 8159
s.bi_buf >>= 8; // 8160
s.bi_valid -= 8; // 8161
} // 8162
} // 8163
// 8164
// 8165
/* =========================================================================== // 8166
* Compute the optimal bit lengths for a tree and update the total bit length // 8167
* for the current block. // 8168
* IN assertion: the fields freq and dad are set, heap[heap_max] and // 8169
* above are the tree nodes sorted by increasing frequency. // 8170
* OUT assertions: the field len is set to the optimal bit length, the // 8171
* array bl_count contains the frequencies for each bit length. // 8172
* The length opt_len is updated; static_len is also updated if stree is // 8173
* not null. // 8174
*/ // 8175
function gen_bitlen(s, desc) // 8176
// deflate_state *s; // 8177
// tree_desc *desc; /* the tree descriptor */ // 8178
{ // 8179
var tree = desc.dyn_tree; // 8180
var max_code = desc.max_code; // 8181
var stree = desc.stat_desc.static_tree; // 8182
var has_stree = desc.stat_desc.has_stree; // 8183
var extra = desc.stat_desc.extra_bits; // 8184
var base = desc.stat_desc.extra_base; // 8185
var max_length = desc.stat_desc.max_length; // 8186
var h; /* heap index */ // 8187
var n, m; /* iterate over the tree elements */ // 8188
var bits; /* bit length */ // 8189
var xbits; /* extra bits */ // 8190
var f; /* frequency */ // 8191
var overflow = 0; /* number of elements with bit length too large */ // 8192
// 8193
for (bits = 0; bits <= MAX_BITS; bits++) { // 8194
s.bl_count[bits] = 0; // 8195
} // 8196
// 8197
/* In a first pass, compute the optimal bit lengths (which may // 8198
* overflow in the case of the bit length tree). // 8199
*/ // 8200
tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */ // 8201
// 8202
for (h = s.heap_max+1; h < HEAP_SIZE; h++) { // 8203
n = s.heap[h]; // 8204
bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; // 8205
if (bits > max_length) { // 8206
bits = max_length; // 8207
overflow++; // 8208
} // 8209
tree[n*2 + 1]/*.Len*/ = bits; // 8210
/* We overwrite tree[n].Dad which is no longer needed */ // 8211
// 8212
if (n > max_code) { continue; } /* not a leaf node */ // 8213
// 8214
s.bl_count[bits]++; // 8215
xbits = 0; // 8216
if (n >= base) { // 8217
xbits = extra[n-base]; // 8218
} // 8219
f = tree[n * 2]/*.Freq*/; // 8220
s.opt_len += f * (bits + xbits); // 8221
if (has_stree) { // 8222
s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits); // 8223
} // 8224
} // 8225
if (overflow === 0) { return; } // 8226
// 8227
// Trace((stderr,"\nbit length overflow\n")); // 8228
/* This happens for example on obj2 and pic of the Calgary corpus */ // 8229
// 8230
/* Find the first bit length which could increase: */ // 8231
do { // 8232
bits = max_length-1; // 8233
while (s.bl_count[bits] === 0) { bits--; } // 8234
s.bl_count[bits]--; /* move one leaf down the tree */ // 8235
s.bl_count[bits+1] += 2; /* move one overflow item as its brother */ // 8236
s.bl_count[max_length]--; // 8237
/* The brother of the overflow item also moves one step up, // 8238
* but this does not affect bl_count[max_length] // 8239
*/ // 8240
overflow -= 2; // 8241
} while (overflow > 0); // 8242
// 8243
/* Now recompute all bit lengths, scanning in increasing frequency. // 8244
* h is still equal to HEAP_SIZE. (It is simpler to reconstruct all // 8245
* lengths instead of fixing only the wrong ones. This idea is taken // 8246
* from 'ar' written by Haruhiko Okumura.) // 8247
*/ // 8248
for (bits = max_length; bits !== 0; bits--) { // 8249
n = s.bl_count[bits]; // 8250
while (n !== 0) { // 8251
m = s.heap[--h]; // 8252
if (m > max_code) { continue; } // 8253
if (tree[m*2 + 1]/*.Len*/ !== bits) { // 8254
// Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); // 8255
s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/; // 8256
tree[m*2 + 1]/*.Len*/ = bits; // 8257
} // 8258
n--; // 8259
} // 8260
} // 8261
} // 8262
// 8263
// 8264
/* =========================================================================== // 8265
* Generate the codes for a given tree and bit counts (which need not be // 8266
* optimal). // 8267
* IN assertion: the array bl_count contains the bit length statistics for // 8268
* the given tree and the field len is set for all tree elements. // 8269
* OUT assertion: the field code is set for all tree elements of non // 8270
* zero code length. // 8271
*/ // 8272
function gen_codes(tree, max_code, bl_count) // 8273
// ct_data *tree; /* the tree to decorate */ // 8274
// int max_code; /* largest code with non zero frequency */ // 8275
// ushf *bl_count; /* number of codes at each bit length */ // 8276
{ // 8277
var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */ // 8278
var code = 0; /* running code value */ // 8279
var bits; /* bit index */ // 8280
var n; /* code index */ // 8281
// 8282
/* The distribution counts are first used to generate the code values // 8283
* without bit reversal. // 8284
*/ // 8285
for (bits = 1; bits <= MAX_BITS; bits++) { // 8286
next_code[bits] = code = (code + bl_count[bits-1]) << 1; // 8287
} // 8288
/* Check that the bit counts in bl_count are consistent. The last code // 8289
* must be all ones. // 8290
*/ // 8291
//Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, // 8292
// "inconsistent bit counts"); // 8293
//Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); // 8294
// 8295
for (n = 0; n <= max_code; n++) { // 8296
var len = tree[n*2 + 1]/*.Len*/; // 8297
if (len === 0) { continue; } // 8298
/* Now reverse the bits */ // 8299
tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len); // 8300
// 8301
//Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", // 8302
// n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); // 8303
} // 8304
} // 8305
// 8306
// 8307
/* =========================================================================== // 8308
* Initialize the various 'constant' tables. // 8309
*/ // 8310
function tr_static_init() { // 8311
var n; /* iterates over tree elements */ // 8312
var bits; /* bit counter */ // 8313
var length; /* length value */ // 8314
var code; /* code value */ // 8315
var dist; /* distance index */ // 8316
var bl_count = new Array(MAX_BITS+1); // 8317
/* number of codes at each bit length for an optimal tree */ // 8318
// 8319
// do check in _tr_init() // 8320
//if (static_init_done) return; // 8321
// 8322
/* For some embedded targets, global variables are not initialized: */ // 8323
/*#ifdef NO_INIT_GLOBAL_POINTERS // 8324
static_l_desc.static_tree = static_ltree; // 8325
static_l_desc.extra_bits = extra_lbits; // 8326
static_d_desc.static_tree = static_dtree; // 8327
static_d_desc.extra_bits = extra_dbits; // 8328
static_bl_desc.extra_bits = extra_blbits; // 8329
#endif*/ // 8330
// 8331
/* Initialize the mapping length (0..255) -> length code (0..28) */ // 8332
length = 0; // 8333
for (code = 0; code < LENGTH_CODES-1; code++) { // 8334
base_length[code] = length; // 8335
for (n = 0; n < (1<<extra_lbits[code]); n++) { // 8336
_length_code[length++] = code; // 8337
} // 8338
} // 8339
//Assert (length == 256, "tr_static_init: length != 256"); // 8340
/* Note that the length 255 (match length 258) can be represented // 8341
* in two different ways: code 284 + 5 bits or code 285, so we // 8342
* overwrite length_code[255] to use the best encoding: // 8343
*/ // 8344
_length_code[length-1] = code; // 8345
// 8346
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */ // 8347
dist = 0; // 8348
for (code = 0 ; code < 16; code++) { // 8349
base_dist[code] = dist; // 8350
for (n = 0; n < (1<<extra_dbits[code]); n++) { // 8351
_dist_code[dist++] = code; // 8352
} // 8353
} // 8354
//Assert (dist == 256, "tr_static_init: dist != 256"); // 8355
dist >>= 7; /* from now on, all distances are divided by 128 */ // 8356
for ( ; code < D_CODES; code++) { // 8357
base_dist[code] = dist << 7; // 8358
for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { // 8359
_dist_code[256 + dist++] = code; // 8360
} // 8361
} // 8362
//Assert (dist == 256, "tr_static_init: 256+dist != 512"); // 8363
// 8364
/* Construct the codes of the static literal tree */ // 8365
for (bits = 0; bits <= MAX_BITS; bits++) { // 8366
bl_count[bits] = 0; // 8367
} // 8368
// 8369
n = 0; // 8370
while (n <= 143) { // 8371
static_ltree[n*2 + 1]/*.Len*/ = 8; // 8372
n++; // 8373
bl_count[8]++; // 8374
} // 8375
while (n <= 255) { // 8376
static_ltree[n*2 + 1]/*.Len*/ = 9; // 8377
n++; // 8378
bl_count[9]++; // 8379
} // 8380
while (n <= 279) { // 8381
static_ltree[n*2 + 1]/*.Len*/ = 7; // 8382
n++; // 8383
bl_count[7]++; // 8384
} // 8385
while (n <= 287) { // 8386
static_ltree[n*2 + 1]/*.Len*/ = 8; // 8387
n++; // 8388
bl_count[8]++; // 8389
} // 8390
/* Codes 286 and 287 do not exist, but we must include them in the // 8391
* tree construction to get a canonical Huffman tree (longest code // 8392
* all ones) // 8393
*/ // 8394
gen_codes(static_ltree, L_CODES+1, bl_count); // 8395
// 8396
/* The static distance tree is trivial: */ // 8397
for (n = 0; n < D_CODES; n++) { // 8398
static_dtree[n*2 + 1]/*.Len*/ = 5; // 8399
static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5); // 8400
} // 8401
// 8402
// Now data ready and we can init static trees // 8403
static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS); // 8404
static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); // 8405
static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); // 8406
// 8407
//static_init_done = true; // 8408
} // 8409
// 8410
// 8411
/* =========================================================================== // 8412
* Initialize a new block. // 8413
*/ // 8414
function init_block(s) { // 8415
var n; /* iterates over tree elements */ // 8416
// 8417
/* Initialize the trees. */ // 8418
for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; } // 8419
for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; } // 8420
for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; } // 8421
// 8422
s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1; // 8423
s.opt_len = s.static_len = 0; // 8424
s.last_lit = s.matches = 0; // 8425
} // 8426
// 8427
// 8428
/* =========================================================================== // 8429
* Flush the bit buffer and align the output on a byte boundary // 8430
*/ // 8431
function bi_windup(s) // 8432
{ // 8433
if (s.bi_valid > 8) { // 8434
put_short(s, s.bi_buf); // 8435
} else if (s.bi_valid > 0) { // 8436
//put_byte(s, (Byte)s->bi_buf); // 8437
s.pending_buf[s.pending++] = s.bi_buf; // 8438
} // 8439
s.bi_buf = 0; // 8440
s.bi_valid = 0; // 8441
} // 8442
// 8443
/* =========================================================================== // 8444
* Copy a stored block, storing first the length and its // 8445
* one's complement if requested. // 8446
*/ // 8447
function copy_block(s, buf, len, header) // 8448
//DeflateState *s; // 8449
//charf *buf; /* the input data */ // 8450
//unsigned len; /* its length */ // 8451
//int header; /* true if block header must be written */ // 8452
{ // 8453
bi_windup(s); /* align on byte boundary */ // 8454
// 8455
if (header) { // 8456
put_short(s, len); // 8457
put_short(s, ~len); // 8458
} // 8459
// while (len--) { // 8460
// put_byte(s, *buf++); // 8461
// } // 8462
utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); // 8463
s.pending += len; // 8464
} // 8465
// 8466
/* =========================================================================== // 8467
* Compares to subtrees, using the tree depth as tie breaker when // 8468
* the subtrees have equal frequency. This minimizes the worst case length. // 8469
*/ // 8470
function smaller(tree, n, m, depth) { // 8471
var _n2 = n*2; // 8472
var _m2 = m*2; // 8473
return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || // 8474
(tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); // 8475
} // 8476
// 8477
/* =========================================================================== // 8478
* Restore the heap property by moving down the tree starting at node k, // 8479
* exchanging a node with the smallest of its two sons if necessary, stopping // 8480
* when the heap property is re-established (each father smaller than its // 8481
* two sons). // 8482
*/ // 8483
function pqdownheap(s, tree, k) // 8484
// deflate_state *s; // 8485
// ct_data *tree; /* the tree to restore */ // 8486
// int k; /* node to move down */ // 8487
{ // 8488
var v = s.heap[k]; // 8489
var j = k << 1; /* left son of k */ // 8490
while (j <= s.heap_len) { // 8491
/* Set j to the smallest of the two sons: */ // 8492
if (j < s.heap_len && // 8493
smaller(tree, s.heap[j+1], s.heap[j], s.depth)) { // 8494
j++; // 8495
} // 8496
/* Exit if v is smaller than both sons */ // 8497
if (smaller(tree, v, s.heap[j], s.depth)) { break; } // 8498
// 8499
/* Exchange v with the smallest son */ // 8500
s.heap[k] = s.heap[j]; // 8501
k = j; // 8502
// 8503
/* And continue down the tree, setting j to the left son of k */ // 8504
j <<= 1; // 8505
} // 8506
s.heap[k] = v; // 8507
} // 8508
// 8509
// 8510
// inlined manually // 8511
// var SMALLEST = 1; // 8512
// 8513
/* =========================================================================== // 8514
* Send the block data compressed using the given Huffman trees // 8515
*/ // 8516
function compress_block(s, ltree, dtree) // 8517
// deflate_state *s; // 8518
// const ct_data *ltree; /* literal tree */ // 8519
// const ct_data *dtree; /* distance tree */ // 8520
{ // 8521
var dist; /* distance of matched string */ // 8522
var lc; /* match length or unmatched char (if dist == 0) */ // 8523
var lx = 0; /* running index in l_buf */ // 8524
var code; /* the code to send */ // 8525
var extra; /* number of extra bits to send */ // 8526
// 8527
if (s.last_lit !== 0) { // 8528
do { // 8529
dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]); // 8530
lc = s.pending_buf[s.l_buf + lx]; // 8531
lx++; // 8532
// 8533
if (dist === 0) { // 8534
send_code(s, lc, ltree); /* send a literal byte */ // 8535
//Tracecv(isgraph(lc), (stderr," '%c' ", lc)); // 8536
} else { // 8537
/* Here, lc is the match length - MIN_MATCH */ // 8538
code = _length_code[lc]; // 8539
send_code(s, code+LITERALS+1, ltree); /* send the length code */ // 8540
extra = extra_lbits[code]; // 8541
if (extra !== 0) { // 8542
lc -= base_length[code]; // 8543
send_bits(s, lc, extra); /* send the extra length bits */ // 8544
} // 8545
dist--; /* dist is now the match distance - 1 */ // 8546
code = d_code(dist); // 8547
//Assert (code < D_CODES, "bad d_code"); // 8548
// 8549
send_code(s, code, dtree); /* send the distance code */ // 8550
extra = extra_dbits[code]; // 8551
if (extra !== 0) { // 8552
dist -= base_dist[code]; // 8553
send_bits(s, dist, extra); /* send the extra distance bits */ // 8554
} // 8555
} /* literal or match pair ? */ // 8556
// 8557
/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ // 8558
//Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, // 8559
// "pendingBuf overflow"); // 8560
// 8561
} while (lx < s.last_lit); // 8562
} // 8563
// 8564
send_code(s, END_BLOCK, ltree); // 8565
} // 8566
// 8567
// 8568
/* =========================================================================== // 8569
* Construct one Huffman tree and assigns the code bit strings and lengths. // 8570
* Update the total bit length for the current block. // 8571
* IN assertion: the field freq is set for all tree elements. // 8572
* OUT assertions: the fields len and code are set to the optimal bit length // 8573
* and corresponding code. The length opt_len is updated; static_len is // 8574
* also updated if stree is not null. The field max_code is set. // 8575
*/ // 8576
function build_tree(s, desc) // 8577
// deflate_state *s; // 8578
// tree_desc *desc; /* the tree descriptor */ // 8579
{ // 8580
var tree = desc.dyn_tree; // 8581
var stree = desc.stat_desc.static_tree; // 8582
var has_stree = desc.stat_desc.has_stree; // 8583
var elems = desc.stat_desc.elems; // 8584
var n, m; /* iterate over heap elements */ // 8585
var max_code = -1; /* largest code with non zero frequency */ // 8586
var node; /* new node being created */ // 8587
// 8588
/* Construct the initial heap, with least frequent element in // 8589
* heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. // 8590
* heap[0] is not used. // 8591
*/ // 8592
s.heap_len = 0; // 8593
s.heap_max = HEAP_SIZE; // 8594
// 8595
for (n = 0; n < elems; n++) { // 8596
if (tree[n * 2]/*.Freq*/ !== 0) { // 8597
s.heap[++s.heap_len] = max_code = n; // 8598
s.depth[n] = 0; // 8599
// 8600
} else { // 8601
tree[n*2 + 1]/*.Len*/ = 0; // 8602
} // 8603
} // 8604
// 8605
/* The pkzip format requires that at least one distance code exists, // 8606
* and that at least one bit should be sent even if there is only one // 8607
* possible code. So to avoid special checks later on we force at least // 8608
* two codes of non zero frequency. // 8609
*/ // 8610
while (s.heap_len < 2) { // 8611
node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); // 8612
tree[node * 2]/*.Freq*/ = 1; // 8613
s.depth[node] = 0; // 8614
s.opt_len--; // 8615
// 8616
if (has_stree) { // 8617
s.static_len -= stree[node*2 + 1]/*.Len*/; // 8618
} // 8619
/* node is 0 or 1 so it does not have extra bits */ // 8620
} // 8621
desc.max_code = max_code; // 8622
// 8623
/* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, // 8624
* establish sub-heaps of increasing lengths: // 8625
*/ // 8626
for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } // 8627
// 8628
/* Construct the Huffman tree by repeatedly combining the least two // 8629
* frequent nodes. // 8630
*/ // 8631
node = elems; /* next internal node of the tree */ // 8632
do { // 8633
//pqremove(s, tree, n); /* n = node of least frequency */ // 8634
/*** pqremove ***/ // 8635
n = s.heap[1/*SMALLEST*/]; // 8636
s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; // 8637
pqdownheap(s, tree, 1/*SMALLEST*/); // 8638
/***/ // 8639
// 8640
m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ // 8641
// 8642
s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ // 8643
s.heap[--s.heap_max] = m; // 8644
// 8645
/* Create a new node father of n and m */ // 8646
tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; // 8647
s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; // 8648
tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node; // 8649
// 8650
/* and insert the new node in the heap */ // 8651
s.heap[1/*SMALLEST*/] = node++; // 8652
pqdownheap(s, tree, 1/*SMALLEST*/); // 8653
// 8654
} while (s.heap_len >= 2); // 8655
// 8656
s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; // 8657
// 8658
/* At this point, the fields freq and dad are set. We can now // 8659
* generate the bit lengths. // 8660
*/ // 8661
gen_bitlen(s, desc); // 8662
// 8663
/* The field len is now set, we can generate the bit codes */ // 8664
gen_codes(tree, max_code, s.bl_count); // 8665
} // 8666
// 8667
// 8668
/* =========================================================================== // 8669
* Scan a literal or distance tree to determine the frequencies of the codes // 8670
* in the bit length tree. // 8671
*/ // 8672
function scan_tree(s, tree, max_code) // 8673
// deflate_state *s; // 8674
// ct_data *tree; /* the tree to be scanned */ // 8675
// int max_code; /* and its largest code of non zero frequency */ // 8676
{ // 8677
var n; /* iterates over all tree elements */ // 8678
var prevlen = -1; /* last emitted length */ // 8679
var curlen; /* length of current code */ // 8680
// 8681
var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */ // 8682
// 8683
var count = 0; /* repeat count of the current code */ // 8684
var max_count = 7; /* max repeat count */ // 8685
var min_count = 4; /* min repeat count */ // 8686
// 8687
if (nextlen === 0) { // 8688
max_count = 138; // 8689
min_count = 3; // 8690
} // 8691
tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */ // 8692
// 8693
for (n = 0; n <= max_code; n++) { // 8694
curlen = nextlen; // 8695
nextlen = tree[(n+1)*2 + 1]/*.Len*/; // 8696
// 8697
if (++count < max_count && curlen === nextlen) { // 8698
continue; // 8699
// 8700
} else if (count < min_count) { // 8701
s.bl_tree[curlen * 2]/*.Freq*/ += count; // 8702
// 8703
} else if (curlen !== 0) { // 8704
// 8705
if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } // 8706
s.bl_tree[REP_3_6*2]/*.Freq*/++; // 8707
// 8708
} else if (count <= 10) { // 8709
s.bl_tree[REPZ_3_10*2]/*.Freq*/++; // 8710
// 8711
} else { // 8712
s.bl_tree[REPZ_11_138*2]/*.Freq*/++; // 8713
} // 8714
// 8715
count = 0; // 8716
prevlen = curlen; // 8717
// 8718
if (nextlen === 0) { // 8719
max_count = 138; // 8720
min_count = 3; // 8721
// 8722
} else if (curlen === nextlen) { // 8723
max_count = 6; // 8724
min_count = 3; // 8725
// 8726
} else { // 8727
max_count = 7; // 8728
min_count = 4; // 8729
} // 8730
} // 8731
} // 8732
// 8733
// 8734
/* =========================================================================== // 8735
* Send a literal or distance tree in compressed form, using the codes in // 8736
* bl_tree. // 8737
*/ // 8738
function send_tree(s, tree, max_code) // 8739
// deflate_state *s; // 8740
// ct_data *tree; /* the tree to be scanned */ // 8741
// int max_code; /* and its largest code of non zero frequency */ // 8742
{ // 8743
var n; /* iterates over all tree elements */ // 8744
var prevlen = -1; /* last emitted length */ // 8745
var curlen; /* length of current code */ // 8746
// 8747
var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */ // 8748
// 8749
var count = 0; /* repeat count of the current code */ // 8750
var max_count = 7; /* max repeat count */ // 8751
var min_count = 4; /* min repeat count */ // 8752
// 8753
/* tree[max_code+1].Len = -1; */ /* guard already set */ // 8754
if (nextlen === 0) { // 8755
max_count = 138; // 8756
min_count = 3; // 8757
} // 8758
// 8759
for (n = 0; n <= max_code; n++) { // 8760
curlen = nextlen; // 8761
nextlen = tree[(n+1)*2 + 1]/*.Len*/; // 8762
// 8763
if (++count < max_count && curlen === nextlen) { // 8764
continue; // 8765
// 8766
} else if (count < min_count) { // 8767
do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); // 8768
// 8769
} else if (curlen !== 0) { // 8770
if (curlen !== prevlen) { // 8771
send_code(s, curlen, s.bl_tree); // 8772
count--; // 8773
} // 8774
//Assert(count >= 3 && count <= 6, " 3_6?"); // 8775
send_code(s, REP_3_6, s.bl_tree); // 8776
send_bits(s, count-3, 2); // 8777
// 8778
} else if (count <= 10) { // 8779
send_code(s, REPZ_3_10, s.bl_tree); // 8780
send_bits(s, count-3, 3); // 8781
// 8782
} else { // 8783
send_code(s, REPZ_11_138, s.bl_tree); // 8784
send_bits(s, count-11, 7); // 8785
} // 8786
// 8787
count = 0; // 8788
prevlen = curlen; // 8789
if (nextlen === 0) { // 8790
max_count = 138; // 8791
min_count = 3; // 8792
// 8793
} else if (curlen === nextlen) { // 8794
max_count = 6; // 8795
min_count = 3; // 8796
// 8797
} else { // 8798
max_count = 7; // 8799
min_count = 4; // 8800
} // 8801
} // 8802
} // 8803
// 8804
// 8805
/* =========================================================================== // 8806
* Construct the Huffman tree for the bit lengths and return the index in // 8807
* bl_order of the last bit length code to send. // 8808
*/ // 8809
function build_bl_tree(s) { // 8810
var max_blindex; /* index of last bit length code of non zero freq */ // 8811
// 8812
/* Determine the bit length frequencies for literal and distance trees */ // 8813
scan_tree(s, s.dyn_ltree, s.l_desc.max_code); // 8814
scan_tree(s, s.dyn_dtree, s.d_desc.max_code); // 8815
// 8816
/* Build the bit length tree: */ // 8817
build_tree(s, s.bl_desc); // 8818
/* opt_len now includes the length of the tree representations, except // 8819
* the lengths of the bit lengths codes and the 5+5+4 bits for the counts. // 8820
*/ // 8821
// 8822
/* Determine the number of bit length codes to send. The pkzip format // 8823
* requires that at least 4 bit length codes be sent. (appnote.txt says // 8824
* 3 but the actual value used is 4.) // 8825
*/ // 8826
for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { // 8827
if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) { // 8828
break; // 8829
} // 8830
} // 8831
/* Update opt_len to include the bit length tree and counts */ // 8832
s.opt_len += 3*(max_blindex+1) + 5+5+4; // 8833
//Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", // 8834
// s->opt_len, s->static_len)); // 8835
// 8836
return max_blindex; // 8837
} // 8838
// 8839
// 8840
/* =========================================================================== // 8841
* Send the header for a block using dynamic Huffman trees: the counts, the // 8842
* lengths of the bit length codes, the literal tree and the distance tree. // 8843
* IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. // 8844
*/ // 8845
function send_all_trees(s, lcodes, dcodes, blcodes) // 8846
// deflate_state *s; // 8847
// int lcodes, dcodes, blcodes; /* number of codes for each tree */ // 8848
{ // 8849
var rank; /* index in bl_order */ // 8850
// 8851
//Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); // 8852
//Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, // 8853
// "too many codes"); // 8854
//Tracev((stderr, "\nbl counts: ")); // 8855
send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ // 8856
send_bits(s, dcodes-1, 5); // 8857
send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ // 8858
for (rank = 0; rank < blcodes; rank++) { // 8859
//Tracev((stderr, "\nbl code %2d ", bl_order[rank])); // 8860
send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3); // 8861
} // 8862
//Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); // 8863
// 8864
send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */ // 8865
//Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); // 8866
// 8867
send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */ // 8868
//Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); // 8869
} // 8870
// 8871
// 8872
/* =========================================================================== // 8873
* Check if the data type is TEXT or BINARY, using the following algorithm: // 8874
* - TEXT if the two conditions below are satisfied: // 8875
* a) There are no non-portable control characters belonging to the // 8876
* "black list" (0..6, 14..25, 28..31). // 8877
* b) There is at least one printable character belonging to the // 8878
* "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). // 8879
* - BINARY otherwise. // 8880
* - The following partially-portable control characters form a // 8881
* "gray list" that is ignored in this detection algorithm: // 8882
* (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). // 8883
* IN assertion: the fields Freq of dyn_ltree are set. // 8884
*/ // 8885
function detect_data_type(s) { // 8886
/* black_mask is the bit mask of black-listed bytes // 8887
* set bits 0..6, 14..25, and 28..31 // 8888
* 0xf3ffc07f = binary 11110011111111111100000001111111 // 8889
*/ // 8890
var black_mask = 0xf3ffc07f; // 8891
var n; // 8892
// 8893
/* Check for non-textual ("black-listed") bytes. */ // 8894
for (n = 0; n <= 31; n++, black_mask >>>= 1) { // 8895
if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) { // 8896
return Z_BINARY; // 8897
} // 8898
} // 8899
// 8900
/* Check for textual ("white-listed") bytes. */ // 8901
if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || // 8902
s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { // 8903
return Z_TEXT; // 8904
} // 8905
for (n = 32; n < LITERALS; n++) { // 8906
if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { // 8907
return Z_TEXT; // 8908
} // 8909
} // 8910
// 8911
/* There are no "black-listed" or "white-listed" bytes: // 8912
* this stream either is empty or has tolerated ("gray-listed") bytes only. // 8913
*/ // 8914
return Z_BINARY; // 8915
} // 8916
// 8917
// 8918
var static_init_done = false; // 8919
// 8920
/* =========================================================================== // 8921
* Initialize the tree data structures for a new zlib stream. // 8922
*/ // 8923
function _tr_init(s) // 8924
{ // 8925
// 8926
if (!static_init_done) { // 8927
tr_static_init(); // 8928
static_init_done = true; // 8929
} // 8930
// 8931
s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); // 8932
s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); // 8933
s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); // 8934
// 8935
s.bi_buf = 0; // 8936
s.bi_valid = 0; // 8937
// 8938
/* Initialize the first block of the first file: */ // 8939
init_block(s); // 8940
} // 8941
// 8942
// 8943
/* =========================================================================== // 8944
* Send a stored block // 8945
*/ // 8946
function _tr_stored_block(s, buf, stored_len, last) // 8947
//DeflateState *s; // 8948
//charf *buf; /* input block */ // 8949
//ulg stored_len; /* length of input block */ // 8950
//int last; /* one if this is the last block for a file */ // 8951
{ // 8952
send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */ // 8953
copy_block(s, buf, stored_len, true); /* with header */ // 8954
} // 8955
// 8956
// 8957
/* =========================================================================== // 8958
* Send one empty static block to give enough lookahead for inflate. // 8959
* This takes 10 bits, of which 7 may remain in the bit buffer. // 8960
*/ // 8961
function _tr_align(s) { // 8962
send_bits(s, STATIC_TREES<<1, 3); // 8963
send_code(s, END_BLOCK, static_ltree); // 8964
bi_flush(s); // 8965
} // 8966
// 8967
// 8968
/* =========================================================================== // 8969
* Determine the best encoding for the current block: dynamic trees, static // 8970
* trees or store, and output the encoded block to the zip file. // 8971
*/ // 8972
function _tr_flush_block(s, buf, stored_len, last) // 8973
//DeflateState *s; // 8974
//charf *buf; /* input block, or NULL if too old */ // 8975
//ulg stored_len; /* length of input block */ // 8976
//int last; /* one if this is the last block for a file */ // 8977
{ // 8978
var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ // 8979
var max_blindex = 0; /* index of last bit length code of non zero freq */ // 8980
// 8981
/* Build the Huffman trees unless a stored block is forced */ // 8982
if (s.level > 0) { // 8983
// 8984
/* Check if the file is binary or text */ // 8985
if (s.strm.data_type === Z_UNKNOWN) { // 8986
s.strm.data_type = detect_data_type(s); // 8987
} // 8988
// 8989
/* Construct the literal and distance trees */ // 8990
build_tree(s, s.l_desc); // 8991
// Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, // 8992
// s->static_len)); // 8993
// 8994
build_tree(s, s.d_desc); // 8995
// Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, // 8996
// s->static_len)); // 8997
/* At this point, opt_len and static_len are the total bit lengths of // 8998
* the compressed block data, excluding the tree representations. // 8999
*/ // 9000
// 9001
/* Build the bit length tree for the above two trees, and get the index // 9002
* in bl_order of the last bit length code to send. // 9003
*/ // 9004
max_blindex = build_bl_tree(s); // 9005
// 9006
/* Determine the best encoding. Compute the block lengths in bytes. */ // 9007
opt_lenb = (s.opt_len+3+7) >>> 3; // 9008
static_lenb = (s.static_len+3+7) >>> 3; // 9009
// 9010
// Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", // 9011
// opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, // 9012
// s->last_lit)); // 9013
// 9014
if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } // 9015
// 9016
} else { // 9017
// Assert(buf != (char*)0, "lost buf"); // 9018
opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ // 9019
} // 9020
// 9021
if ((stored_len+4 <= opt_lenb) && (buf !== -1)) { // 9022
/* 4: two words for the lengths */ // 9023
// 9024
/* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. // 9025
* Otherwise we can't have processed more than WSIZE input bytes since // 9026
* the last block flush, because compression would have been // 9027
* successful. If LIT_BUFSIZE <= WSIZE, it is never too late to // 9028
* transform a block into a stored block. // 9029
*/ // 9030
_tr_stored_block(s, buf, stored_len, last); // 9031
// 9032
} else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { // 9033
// 9034
send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3); // 9035
compress_block(s, static_ltree, static_dtree); // 9036
// 9037
} else { // 9038
send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3); // 9039
send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1); // 9040
compress_block(s, s.dyn_ltree, s.dyn_dtree); // 9041
} // 9042
// Assert (s->compressed_len == s->bits_sent, "bad compressed size"); // 9043
/* The above check is made mod 2^32, for files larger than 512 MB // 9044
* and uLong implemented on 32 bits. // 9045
*/ // 9046
init_block(s); // 9047
// 9048
if (last) { // 9049
bi_windup(s); // 9050
} // 9051
// Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, // 9052
// s->compressed_len-7*last)); // 9053
} // 9054
// 9055
/* =========================================================================== // 9056
* Save the match info and tally the frequency counts. Return true if // 9057
* the current block must be flushed. // 9058
*/ // 9059
function _tr_tally(s, dist, lc) // 9060
// deflate_state *s; // 9061
// unsigned dist; /* distance of matched string */ // 9062
// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ // 9063
{ // 9064
//var out_length, in_length, dcode; // 9065
// 9066
s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; // 9067
s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; // 9068
// 9069
s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; // 9070
s.last_lit++; // 9071
// 9072
if (dist === 0) { // 9073
/* lc is the unmatched char */ // 9074
s.dyn_ltree[lc*2]/*.Freq*/++; // 9075
} else { // 9076
s.matches++; // 9077
/* Here, lc is the match length - MIN_MATCH */ // 9078
dist--; /* dist = match distance - 1 */ // 9079
//Assert((ush)dist < (ush)MAX_DIST(s) && // 9080
// (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && // 9081
// (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); // 9082
// 9083
s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++; // 9084
s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; // 9085
} // 9086
// 9087
// (!) This block is disabled in zlib defailts, // 9088
// don't enable it for binary compatibility // 9089
// 9090
//#ifdef TRUNCATE_BLOCK // 9091
// /* Try to guess if it is profitable to stop the current block here */ // 9092
// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { // 9093
// /* Compute an upper bound for the compressed length */ // 9094
// out_length = s.last_lit*8; // 9095
// in_length = s.strstart - s.block_start; // 9096
// // 9097
// for (dcode = 0; dcode < D_CODES; dcode++) { // 9098
// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); // 9099
// } // 9100
// out_length >>>= 3; // 9101
// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", // 9102
// // s->last_lit, in_length, out_length, // 9103
// // 100L - out_length*100L/in_length)); // 9104
// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { // 9105
// return true; // 9106
// } // 9107
// } // 9108
//#endif // 9109
// 9110
return (s.last_lit === s.lit_bufsize-1); // 9111
/* We avoid equality with lit_bufsize because of wraparound at 64K // 9112
* on 16 bit machines and because stored blocks are restricted to // 9113
* 64K-1 bytes. // 9114
*/ // 9115
} // 9116
// 9117
exports._tr_init = _tr_init; // 9118
exports._tr_stored_block = _tr_stored_block; // 9119
exports._tr_flush_block = _tr_flush_block; // 9120
exports._tr_tally = _tr_tally; // 9121
exports._tr_align = _tr_align; // 9122
},{"../utils/common":27}],39:[function(_dereq_,module,exports){ // 9123
'use strict'; // 9124
// 9125
// 9126
function ZStream() { // 9127
/* next input byte */ // 9128
this.input = null; // JS specific, because we have no pointers // 9129
this.next_in = 0; // 9130
/* number of bytes available at input */ // 9131
this.avail_in = 0; // 9132
/* total number of input bytes read so far */ // 9133
this.total_in = 0; // 9134
/* next output byte should be put there */ // 9135
this.output = null; // JS specific, because we have no pointers // 9136
this.next_out = 0; // 9137
/* remaining free space at output */ // 9138
this.avail_out = 0; // 9139
/* total number of bytes output so far */ // 9140
this.total_out = 0; // 9141
/* last error message, NULL if no error */ // 9142
this.msg = ''/*Z_NULL*/; // 9143
/* not visible by applications */ // 9144
this.state = null; // 9145
/* best guess about the data type: binary or text */ // 9146
this.data_type = 2/*Z_UNKNOWN*/; // 9147
/* adler32 value of the uncompressed data */ // 9148
this.adler = 0; // 9149
} // 9150
// 9151
module.exports = ZStream; // 9152
},{}]},{},[9]) // 9153
(9) // 9154
}); // 9155
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function () {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/silentcicero:jszip/lib/saveas.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
/* FileSaver.js // 1
* A saveAs() FileSaver implementation. // 2
* 2015-05-07.2 // 3
* // 4
* By Eli Grey, http://eligrey.com // 5
* License: X11/MIT // 6
* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md // 7
*/ // 8
// 9
/*global self */ // 10
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ // 11
// 12
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ // 13
// 14
var saveAs = saveAs = window.saveAs || (function(view) { // 15
"use strict"; // 16
// IE <10 is explicitly unsupported // 17
if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { // 18
return; // 19
} // 20
var // 21
doc = view.document // 22
// only get URL when necessary in case Blob.js hasn't overridden it yet // 23
, get_URL = function() { // 24
return view.URL || view.webkitURL || view; // 25
} // 26
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") // 27
, can_use_save_link = "download" in save_link // 28
, click = function(node) { // 29
var event = doc.createEvent("MouseEvents"); // 30
event.initMouseEvent( // 31
"click", true, false, view, 0, 0, 0, 0, 0 // 32
, false, false, false, false, 0, null // 33
); // 34
node.dispatchEvent(event); // 35
} // 36
, webkit_req_fs = view.webkitRequestFileSystem // 37
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem // 38
, throw_outside = function(ex) { // 39
(view.setImmediate || view.setTimeout)(function() { // 40
throw ex; // 41
}, 0); // 42
} // 43
, force_saveable_type = "application/octet-stream" // 44
, fs_min_size = 0 // 45
// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and // 46
// https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047 // 47
// for the reasoning behind the timeout and revocation flow // 48
, arbitrary_revoke_timeout = 500 // in ms // 49
, revoke = function(file) { // 50
var revoker = function() { // 51
if (typeof file === "string") { // file is an object URL // 52
get_URL().revokeObjectURL(file); // 53
} else { // file is a File // 54
file.remove(); // 55
} // 56
}; // 57
if (view.chrome) { // 58
revoker(); // 59
} else { // 60
setTimeout(revoker, arbitrary_revoke_timeout); // 61
} // 62
} // 63
, dispatch = function(filesaver, event_types, event) { // 64
event_types = [].concat(event_types); // 65
var i = event_types.length; // 66
while (i--) { // 67
var listener = filesaver["on" + event_types[i]]; // 68
if (typeof listener === "function") { // 69
try { // 70
listener.call(filesaver, event || filesaver); // 71
} catch (ex) { // 72
throw_outside(ex); // 73
} // 74
} // 75
} // 76
} // 77
, auto_bom = function(blob) { // 78
// prepend BOM for UTF-8 XML and text/* types (including HTML) // 79
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { // 80
return new Blob(["\ufeff", blob], {type: blob.type}); // 81
} // 82
return blob; // 83
} // 84
, FileSaver = function(blob, name) { // 85
blob = auto_bom(blob); // 86
// First try a.download, then web filesystem, then object URLs // 87
var // 88
filesaver = this // 89
, type = blob.type // 90
, blob_changed = false // 91
, object_url // 92
, target_view // 93
, dispatch_all = function() { // 94
dispatch(filesaver, "writestart progress write writeend".split(" ")); // 95
} // 96
// on any filesys errors revert to saving with object URLs // 97
, fs_error = function() { // 98
// don't create more object URLs than needed // 99
if (blob_changed || !object_url) { // 100
object_url = get_URL().createObjectURL(blob); // 101
} // 102
if (target_view) { // 103
target_view.location.href = object_url; // 104
} else { // 105
var new_tab = view.open(object_url, "_blank"); // 106
if (new_tab == undefined && typeof safari !== "undefined") { // 107
//Apple do not allow window.open, see http://bit.ly/1kZffRI // 108
view.location.href = object_url // 109
} // 110
} // 111
filesaver.readyState = filesaver.DONE; // 112
dispatch_all(); // 113
revoke(object_url); // 114
} // 115
, abortable = function(func) { // 116
return function() { // 117
if (filesaver.readyState !== filesaver.DONE) { // 118
return func.apply(this, arguments); // 119
} // 120
}; // 121
} // 122
, create_if_not_found = {create: true, exclusive: false} // 123
, slice // 124
; // 125
filesaver.readyState = filesaver.INIT; // 126
if (!name) { // 127
name = "download"; // 128
} // 129
if (can_use_save_link) { // 130
object_url = get_URL().createObjectURL(blob); // 131
save_link.href = object_url; // 132
save_link.download = name; // 133
click(save_link); // 134
filesaver.readyState = filesaver.DONE; // 135
dispatch_all(); // 136
revoke(object_url); // 137
return; // 138
} // 139
// Object and web filesystem URLs have a problem saving in Google Chrome when // 140
// viewed in a tab, so I force save with application/octet-stream // 141
// http://code.google.com/p/chromium/issues/detail?id=91158 // 142
// Update: Google errantly closed 91158, I submitted it again: // 143
// https://code.google.com/p/chromium/issues/detail?id=389642 // 144
if (view.chrome && type && type !== force_saveable_type) { // 145
slice = blob.slice || blob.webkitSlice; // 146
blob = slice.call(blob, 0, blob.size, force_saveable_type); // 147
blob_changed = true; // 148
} // 149
// Since I can't be sure that the guessed media type will trigger a download // 150
// in WebKit, I append .download to the filename. // 151
// https://bugs.webkit.org/show_bug.cgi?id=65440 // 152
if (webkit_req_fs && name !== "download") { // 153
name += ".download"; // 154
} // 155
if (type === force_saveable_type || webkit_req_fs) { // 156
target_view = view; // 157
} // 158
if (!req_fs) { // 159
fs_error(); // 160
return; // 161
} // 162
fs_min_size += blob.size; // 163
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) { // 164
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) { // 165
var save = function() { // 166
dir.getFile(name, create_if_not_found, abortable(function(file) { // 167
file.createWriter(abortable(function(writer) { // 168
writer.onwriteend = function(event) { // 169
target_view.location.href = file.toURL(); // 170
filesaver.readyState = filesaver.DONE; // 171
dispatch(filesaver, "writeend", event); // 172
revoke(file); // 173
}; // 174
writer.onerror = function() { // 175
var error = writer.error; // 176
if (error.code !== error.ABORT_ERR) { // 177
fs_error(); // 178
} // 179
}; // 180
"writestart progress write abort".split(" ").forEach(function(event) { // 181
writer["on" + event] = filesaver["on" + event]; // 182
}); // 183
writer.write(blob); // 184
filesaver.abort = function() { // 185
writer.abort(); // 186
filesaver.readyState = filesaver.DONE; // 187
}; // 188
filesaver.readyState = filesaver.WRITING; // 189
}), fs_error); // 190
}), fs_error); // 191
}; // 192
dir.getFile(name, {create: false}, abortable(function(file) { // 193
// delete file if it already exists // 194
file.remove(); // 195
save(); // 196
}), abortable(function(ex) { // 197
if (ex.code === ex.NOT_FOUND_ERR) { // 198
save(); // 199
} else { // 200
fs_error(); // 201
} // 202
})); // 203
}), fs_error); // 204
}), fs_error); // 205
} // 206
, FS_proto = FileSaver.prototype // 207
, saveAs = function(blob, name) { // 208
return new FileSaver(blob, name); // 209
} // 210
; // 211
// IE 10+ (native saveAs) // 212
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { // 213
return function(blob, name) { // 214
return navigator.msSaveOrOpenBlob(auto_bom(blob), name); // 215
}; // 216
} // 217
// 218
FS_proto.abort = function() { // 219
var filesaver = this; // 220
filesaver.readyState = filesaver.DONE; // 221
dispatch(filesaver, "abort"); // 222
}; // 223
FS_proto.readyState = FS_proto.INIT = 0; // 224
FS_proto.WRITING = 1; // 225
FS_proto.DONE = 2; // 226
// 227
FS_proto.error = // 228
FS_proto.onwritestart = // 229
FS_proto.onprogress = // 230
FS_proto.onwrite = // 231
FS_proto.onabort = // 232
FS_proto.onerror = // 233
FS_proto.onwriteend = // 234
null; // 235
// 236
return saveAs; // 237
}( // 238
typeof self !== "undefined" && self // 239
|| typeof window !== "undefined" && window // 240
|| this.content // 241
)); // 242
// `self` is undefined in Firefox for Android content script context // 243
// while `this` is nsIContentFrameMessageManager // 244
// with an attribute `content` that corresponds to the window // 245
// 246
if (typeof module !== "undefined" && module.exports) { // 247
module.exports.saveAs = saveAs = window.saveAs; // 248
} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) { // 249
define([], function() { // 250
return saveAs; // 251
}); // 252
} // 253
// 254
window.saveAs = saveAs; // 255
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function () {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/silentcicero:jszip/package-init.js //
// //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Browser environment // 1
if(typeof window !== 'undefined') { // 2
JSZip = (typeof window.JSZip !== 'undefined') ? window.JSZip : require('JSZip'); // 3
} // 4
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
//////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("silentcicero:jszip", {
JSZip: JSZip
});
})();