Statistiques
| Révision:

fr_b02 / petri / doc / jquery / jszip / dist / jszip.js @ 5

Historique | Voir | Annoter | Télécharger (357,643 ko)

1
/*!
2

3
JSZip v3.2.1 - A JavaScript class for generating and reading zip files
4
<http://stuartk.com/jszip>
5

6
(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>
7
Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
8

9
JSZip uses the library pako released under the MIT license :
10
https://github.com/nodeca/pako/blob/master/LICENSE
11
*/
12

    
13
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSZip = f()}})(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);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.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(require,module,exports){
14
'use strict';
15
var utils = require('./utils');
16
var support = require('./support');
17
// private property
18
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
19

    
20

    
21
// public method for encoding
22
exports.encode = function(input) {
23
    var output = [];
24
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
25
    var i = 0, len = input.length, remainingBytes = len;
26

    
27
    var isArray = utils.getTypeOf(input) !== "string";
28
    while (i < input.length) {
29
        remainingBytes = len - i;
30

    
31
        if (!isArray) {
32
            chr1 = input.charCodeAt(i++);
33
            chr2 = i < len ? input.charCodeAt(i++) : 0;
34
            chr3 = i < len ? input.charCodeAt(i++) : 0;
35
        } else {
36
            chr1 = input[i++];
37
            chr2 = i < len ? input[i++] : 0;
38
            chr3 = i < len ? input[i++] : 0;
39
        }
40

    
41
        enc1 = chr1 >> 2;
42
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
43
        enc3 = remainingBytes > 1 ? (((chr2 & 15) << 2) | (chr3 >> 6)) : 64;
44
        enc4 = remainingBytes > 2 ? (chr3 & 63) : 64;
45

    
46
        output.push(_keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4));
47

    
48
    }
49

    
50
    return output.join("");
51
};
52

    
53
// public method for decoding
54
exports.decode = function(input) {
55
    var chr1, chr2, chr3;
56
    var enc1, enc2, enc3, enc4;
57
    var i = 0, resultIndex = 0;
58

    
59
    var dataUrlPrefix = "data:";
60

    
61
    if (input.substr(0, dataUrlPrefix.length) === dataUrlPrefix) {
62
        // This is a common error: people give a data url
63
        // (data:image/png;base64,iVBOR...) with a {base64: true} and
64
        // wonders why things don't work.
65
        // We can detect that the string input looks like a data url but we
66
        // *can't* be sure it is one: removing everything up to the comma would
67
        // be too dangerous.
68
        throw new Error("Invalid base64 input, it looks like a data url.");
69
    }
70

    
71
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
72

    
73
    var totalLength = input.length * 3 / 4;
74
    if(input.charAt(input.length - 1) === _keyStr.charAt(64)) {
75
        totalLength--;
76
    }
77
    if(input.charAt(input.length - 2) === _keyStr.charAt(64)) {
78
        totalLength--;
79
    }
80
    if (totalLength % 1 !== 0) {
81
        // totalLength is not an integer, the length does not match a valid
82
        // base64 content. That can happen if:
83
        // - the input is not a base64 content
84
        // - the input is *almost* a base64 content, with a extra chars at the
85
        //   beginning or at the end
86
        // - the input uses a base64 variant (base64url for example)
87
        throw new Error("Invalid base64 input, bad content length.");
88
    }
89
    var output;
90
    if (support.uint8array) {
91
        output = new Uint8Array(totalLength|0);
92
    } else {
93
        output = new Array(totalLength|0);
94
    }
95

    
96
    while (i < input.length) {
97

    
98
        enc1 = _keyStr.indexOf(input.charAt(i++));
99
        enc2 = _keyStr.indexOf(input.charAt(i++));
100
        enc3 = _keyStr.indexOf(input.charAt(i++));
101
        enc4 = _keyStr.indexOf(input.charAt(i++));
102

    
103
        chr1 = (enc1 << 2) | (enc2 >> 4);
104
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
105
        chr3 = ((enc3 & 3) << 6) | enc4;
106

    
107
        output[resultIndex++] = chr1;
108

    
109
        if (enc3 !== 64) {
110
            output[resultIndex++] = chr2;
111
        }
112
        if (enc4 !== 64) {
113
            output[resultIndex++] = chr3;
114
        }
115

    
116
    }
117

    
118
    return output;
119
};
120

    
121
},{"./support":30,"./utils":32}],2:[function(require,module,exports){
122
'use strict';
123

    
124
var external = require("./external");
125
var DataWorker = require('./stream/DataWorker');
126
var DataLengthProbe = require('./stream/DataLengthProbe');
127
var Crc32Probe = require('./stream/Crc32Probe');
128
var DataLengthProbe = require('./stream/DataLengthProbe');
129

    
130
/**
131
 * Represent a compressed object, with everything needed to decompress it.
132
 * @constructor
133
 * @param {number} compressedSize the size of the data compressed.
134
 * @param {number} uncompressedSize the size of the data after decompression.
135
 * @param {number} crc32 the crc32 of the decompressed file.
136
 * @param {object} compression the type of compression, see lib/compressions.js.
137
 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the compressed data.
138
 */
139
function CompressedObject(compressedSize, uncompressedSize, crc32, compression, data) {
140
    this.compressedSize = compressedSize;
141
    this.uncompressedSize = uncompressedSize;
142
    this.crc32 = crc32;
143
    this.compression = compression;
144
    this.compressedContent = data;
145
}
146

    
147
CompressedObject.prototype = {
148
    /**
149
     * Create a worker to get the uncompressed content.
150
     * @return {GenericWorker} the worker.
151
     */
152
    getContentWorker : function () {
153
        var worker = new DataWorker(external.Promise.resolve(this.compressedContent))
154
        .pipe(this.compression.uncompressWorker())
155
        .pipe(new DataLengthProbe("data_length"));
156

    
157
        var that = this;
158
        worker.on("end", function () {
159
            if(this.streamInfo['data_length'] !== that.uncompressedSize) {
160
                throw new Error("Bug : uncompressed data size mismatch");
161
            }
162
        });
163
        return worker;
164
    },
165
    /**
166
     * Create a worker to get the compressed content.
167
     * @return {GenericWorker} the worker.
168
     */
169
    getCompressedWorker : function () {
170
        return new DataWorker(external.Promise.resolve(this.compressedContent))
171
        .withStreamInfo("compressedSize", this.compressedSize)
172
        .withStreamInfo("uncompressedSize", this.uncompressedSize)
173
        .withStreamInfo("crc32", this.crc32)
174
        .withStreamInfo("compression", this.compression)
175
        ;
176
    }
177
};
178

    
179
/**
180
 * Chain the given worker with other workers to compress the content with the
181
 * given compresion.
182
 * @param {GenericWorker} uncompressedWorker the worker to pipe.
183
 * @param {Object} compression the compression object.
184
 * @param {Object} compressionOptions the options to use when compressing.
185
 * @return {GenericWorker} the new worker compressing the content.
186
 */
187
CompressedObject.createWorkerFrom = function (uncompressedWorker, compression, compressionOptions) {
188
    return uncompressedWorker
189
    .pipe(new Crc32Probe())
190
    .pipe(new DataLengthProbe("uncompressedSize"))
191
    .pipe(compression.compressWorker(compressionOptions))
192
    .pipe(new DataLengthProbe("compressedSize"))
193
    .withStreamInfo("compression", compression);
194
};
195

    
196
module.exports = CompressedObject;
197

    
198
},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(require,module,exports){
199
'use strict';
200

    
201
var GenericWorker = require("./stream/GenericWorker");
202

    
203
exports.STORE = {
204
    magic: "\x00\x00",
205
    compressWorker : function (compressionOptions) {
206
        return new GenericWorker("STORE compression");
207
    },
208
    uncompressWorker : function () {
209
        return new GenericWorker("STORE decompression");
210
    }
211
};
212
exports.DEFLATE = require('./flate');
213

    
214
},{"./flate":7,"./stream/GenericWorker":28}],4:[function(require,module,exports){
215
'use strict';
216

    
217
var utils = require('./utils');
218

    
219
/**
220
 * The following functions come from pako, from pako/lib/zlib/crc32.js
221
 * released under the MIT license, see pako https://github.com/nodeca/pako/
222
 */
223

    
224
// Use ordinary array, since untyped makes no boost here
225
function makeTable() {
226
    var c, table = [];
227

    
228
    for(var n =0; n < 256; n++){
229
        c = n;
230
        for(var k =0; k < 8; k++){
231
            c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
232
        }
233
        table[n] = c;
234
    }
235

    
236
    return table;
237
}
238

    
239
// Create table on load. Just 255 signed longs. Not a problem.
240
var crcTable = makeTable();
241

    
242

    
243
function crc32(crc, buf, len, pos) {
244
    var t = crcTable, end = pos + len;
245

    
246
    crc = crc ^ (-1);
247

    
248
    for (var i = pos; i < end; i++ ) {
249
        crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
250
    }
251

    
252
    return (crc ^ (-1)); // >>> 0;
253
}
254

    
255
// That's all for the pako functions.
256

    
257
/**
258
 * Compute the crc32 of a string.
259
 * This is almost the same as the function crc32, but for strings. Using the
260
 * same function for the two use cases leads to horrible performances.
261
 * @param {Number} crc the starting value of the crc.
262
 * @param {String} str the string to use.
263
 * @param {Number} len the length of the string.
264
 * @param {Number} pos the starting position for the crc32 computation.
265
 * @return {Number} the computed crc32.
266
 */
267
function crc32str(crc, str, len, pos) {
268
    var t = crcTable, end = pos + len;
269

    
270
    crc = crc ^ (-1);
271

    
272
    for (var i = pos; i < end; i++ ) {
273
        crc = (crc >>> 8) ^ t[(crc ^ str.charCodeAt(i)) & 0xFF];
274
    }
275

    
276
    return (crc ^ (-1)); // >>> 0;
277
}
278

    
279
module.exports = function crc32wrapper(input, crc) {
280
    if (typeof input === "undefined" || !input.length) {
281
        return 0;
282
    }
283

    
284
    var isArray = utils.getTypeOf(input) !== "string";
285

    
286
    if(isArray) {
287
        return crc32(crc|0, input, input.length, 0);
288
    } else {
289
        return crc32str(crc|0, input, input.length, 0);
290
    }
291
};
292

    
293
},{"./utils":32}],5:[function(require,module,exports){
294
'use strict';
295
exports.base64 = false;
296
exports.binary = false;
297
exports.dir = false;
298
exports.createFolders = true;
299
exports.date = null;
300
exports.compression = null;
301
exports.compressionOptions = null;
302
exports.comment = null;
303
exports.unixPermissions = null;
304
exports.dosPermissions = null;
305

    
306
},{}],6:[function(require,module,exports){
307
/* global Promise */
308
'use strict';
309

    
310
// load the global object first:
311
// - it should be better integrated in the system (unhandledRejection in node)
312
// - the environment may have a custom Promise implementation (see zone.js)
313
var ES6Promise = null;
314
if (typeof Promise !== "undefined") {
315
    ES6Promise = Promise;
316
} else {
317
    ES6Promise = require("lie");
318
}
319

    
320
/**
321
 * Let the user use/change some implementations.
322
 */
323
module.exports = {
324
    Promise: ES6Promise
325
};
326

    
327
},{"lie":37}],7:[function(require,module,exports){
328
'use strict';
329
var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
330

    
331
var pako = require("pako");
332
var utils = require("./utils");
333
var GenericWorker = require("./stream/GenericWorker");
334

    
335
var ARRAY_TYPE = USE_TYPEDARRAY ? "uint8array" : "array";
336

    
337
exports.magic = "\x08\x00";
338

    
339
/**
340
 * Create a worker that uses pako to inflate/deflate.
341
 * @constructor
342
 * @param {String} action the name of the pako function to call : either "Deflate" or "Inflate".
343
 * @param {Object} options the options to use when (de)compressing.
344
 */
345
function FlateWorker(action, options) {
346
    GenericWorker.call(this, "FlateWorker/" + action);
347

    
348
    this._pako = null;
349
    this._pakoAction = action;
350
    this._pakoOptions = options;
351
    // the `meta` object from the last chunk received
352
    // this allow this worker to pass around metadata
353
    this.meta = {};
354
}
355

    
356
utils.inherits(FlateWorker, GenericWorker);
357

    
358
/**
359
 * @see GenericWorker.processChunk
360
 */
361
FlateWorker.prototype.processChunk = function (chunk) {
362
    this.meta = chunk.meta;
363
    if (this._pako === null) {
364
        this._createPako();
365
    }
366
    this._pako.push(utils.transformTo(ARRAY_TYPE, chunk.data), false);
367
};
368

    
369
/**
370
 * @see GenericWorker.flush
371
 */
372
FlateWorker.prototype.flush = function () {
373
    GenericWorker.prototype.flush.call(this);
374
    if (this._pako === null) {
375
        this._createPako();
376
    }
377
    this._pako.push([], true);
378
};
379
/**
380
 * @see GenericWorker.cleanUp
381
 */
382
FlateWorker.prototype.cleanUp = function () {
383
    GenericWorker.prototype.cleanUp.call(this);
384
    this._pako = null;
385
};
386

    
387
/**
388
 * Create the _pako object.
389
 * TODO: lazy-loading this object isn't the best solution but it's the
390
 * quickest. The best solution is to lazy-load the worker list. See also the
391
 * issue #446.
392
 */
393
FlateWorker.prototype._createPako = function () {
394
    this._pako = new pako[this._pakoAction]({
395
        raw: true,
396
        level: this._pakoOptions.level || -1 // default compression
397
    });
398
    var self = this;
399
    this._pako.onData = function(data) {
400
        self.push({
401
            data : data,
402
            meta : self.meta
403
        });
404
    };
405
};
406

    
407
exports.compressWorker = function (compressionOptions) {
408
    return new FlateWorker("Deflate", compressionOptions);
409
};
410
exports.uncompressWorker = function () {
411
    return new FlateWorker("Inflate", {});
412
};
413

    
414
},{"./stream/GenericWorker":28,"./utils":32,"pako":38}],8:[function(require,module,exports){
415
'use strict';
416

    
417
var utils = require('../utils');
418
var GenericWorker = require('../stream/GenericWorker');
419
var utf8 = require('../utf8');
420
var crc32 = require('../crc32');
421
var signature = require('../signature');
422

    
423
/**
424
 * Transform an integer into a string in hexadecimal.
425
 * @private
426
 * @param {number} dec the number to convert.
427
 * @param {number} bytes the number of bytes to generate.
428
 * @returns {string} the result.
429
 */
430
var decToHex = function(dec, bytes) {
431
    var hex = "", i;
432
    for (i = 0; i < bytes; i++) {
433
        hex += String.fromCharCode(dec & 0xff);
434
        dec = dec >>> 8;
435
    }
436
    return hex;
437
};
438

    
439
/**
440
 * Generate the UNIX part of the external file attributes.
441
 * @param {Object} unixPermissions the unix permissions or null.
442
 * @param {Boolean} isDir true if the entry is a directory, false otherwise.
443
 * @return {Number} a 32 bit integer.
444
 *
445
 * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :
446
 *
447
 * TTTTsstrwxrwxrwx0000000000ADVSHR
448
 * ^^^^____________________________ file type, see zipinfo.c (UNX_*)
449
 *     ^^^_________________________ setuid, setgid, sticky
450
 *        ^^^^^^^^^________________ permissions
451
 *                 ^^^^^^^^^^______ not used ?
452
 *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only
453
 */
454
var generateUnixExternalFileAttr = function (unixPermissions, isDir) {
455

    
456
    var result = unixPermissions;
457
    if (!unixPermissions) {
458
        // I can't use octal values in strict mode, hence the hexa.
459
        //  040775 => 0x41fd
460
        // 0100664 => 0x81b4
461
        result = isDir ? 0x41fd : 0x81b4;
462
    }
463
    return (result & 0xFFFF) << 16;
464
};
465

    
466
/**
467
 * Generate the DOS part of the external file attributes.
468
 * @param {Object} dosPermissions the dos permissions or null.
469
 * @param {Boolean} isDir true if the entry is a directory, false otherwise.
470
 * @return {Number} a 32 bit integer.
471
 *
472
 * Bit 0     Read-Only
473
 * Bit 1     Hidden
474
 * Bit 2     System
475
 * Bit 3     Volume Label
476
 * Bit 4     Directory
477
 * Bit 5     Archive
478
 */
479
var generateDosExternalFileAttr = function (dosPermissions, isDir) {
480

    
481
    // the dir flag is already set for compatibility
482
    return (dosPermissions || 0)  & 0x3F;
483
};
484

    
485
/**
486
 * Generate the various parts used in the construction of the final zip file.
487
 * @param {Object} streamInfo the hash with informations about the compressed file.
488
 * @param {Boolean} streamedContent is the content streamed ?
489
 * @param {Boolean} streamingEnded is the stream finished ?
490
 * @param {number} offset the current offset from the start of the zip file.
491
 * @param {String} platform let's pretend we are this platform (change platform dependents fields)
492
 * @param {Function} encodeFileName the function to encode the file name / comment.
493
 * @return {Object} the zip parts.
494
 */
495
var generateZipParts = function(streamInfo, streamedContent, streamingEnded, offset, platform, encodeFileName) {
496
    var file = streamInfo['file'],
497
    compression = streamInfo['compression'],
498
    useCustomEncoding = encodeFileName !== utf8.utf8encode,
499
    encodedFileName = utils.transformTo("string", encodeFileName(file.name)),
500
    utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
501
    comment = file.comment,
502
    encodedComment = utils.transformTo("string", encodeFileName(comment)),
503
    utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
504
    useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
505
    useUTF8ForComment = utfEncodedComment.length !== comment.length,
506
    dosTime,
507
    dosDate,
508
    extraFields = "",
509
    unicodePathExtraField = "",
510
    unicodeCommentExtraField = "",
511
    dir = file.dir,
512
    date = file.date;
513

    
514

    
515
    var dataInfo = {
516
        crc32 : 0,
517
        compressedSize : 0,
518
        uncompressedSize : 0
519
    };
520

    
521
    // if the content is streamed, the sizes/crc32 are only available AFTER
522
    // the end of the stream.
523
    if (!streamedContent || streamingEnded) {
524
        dataInfo.crc32 = streamInfo['crc32'];
525
        dataInfo.compressedSize = streamInfo['compressedSize'];
526
        dataInfo.uncompressedSize = streamInfo['uncompressedSize'];
527
    }
528

    
529
    var bitflag = 0;
530
    if (streamedContent) {
531
        // Bit 3: the sizes/crc32 are set to zero in the local header.
532
        // The correct values are put in the data descriptor immediately
533
        // following the compressed data.
534
        bitflag |= 0x0008;
535
    }
536
    if (!useCustomEncoding && (useUTF8ForFileName || useUTF8ForComment)) {
537
        // Bit 11: Language encoding flag (EFS).
538
        bitflag |= 0x0800;
539
    }
540

    
541

    
542
    var extFileAttr = 0;
543
    var versionMadeBy = 0;
544
    if (dir) {
545
        // dos or unix, we set the dos dir flag
546
        extFileAttr |= 0x00010;
547
    }
548
    if(platform === "UNIX") {
549
        versionMadeBy = 0x031E; // UNIX, version 3.0
550
        extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);
551
    } else { // DOS or other, fallback to DOS
552
        versionMadeBy = 0x0014; // DOS, version 2.0
553
        extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);
554
    }
555

    
556
    // date
557
    // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html
558
    // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html
559
    // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html
560

    
561
    dosTime = date.getUTCHours();
562
    dosTime = dosTime << 6;
563
    dosTime = dosTime | date.getUTCMinutes();
564
    dosTime = dosTime << 5;
565
    dosTime = dosTime | date.getUTCSeconds() / 2;
566

    
567
    dosDate = date.getUTCFullYear() - 1980;
568
    dosDate = dosDate << 4;
569
    dosDate = dosDate | (date.getUTCMonth() + 1);
570
    dosDate = dosDate << 5;
571
    dosDate = dosDate | date.getUTCDate();
572

    
573
    if (useUTF8ForFileName) {
574
        // set the unicode path extra field. unzip needs at least one extra
575
        // field to correctly handle unicode path, so using the path is as good
576
        // as any other information. This could improve the situation with
577
        // other archive managers too.
578
        // This field is usually used without the utf8 flag, with a non
579
        // unicode path in the header (winrar, winzip). This helps (a bit)
580
        // with the messy Windows' default compressed folders feature but
581
        // breaks on p7zip which doesn't seek the unicode path extra field.
582
        // So for now, UTF-8 everywhere !
583
        unicodePathExtraField =
584
            // Version
585
            decToHex(1, 1) +
586
            // NameCRC32
587
            decToHex(crc32(encodedFileName), 4) +
588
            // UnicodeName
589
            utfEncodedFileName;
590

    
591
        extraFields +=
592
            // Info-ZIP Unicode Path Extra Field
593
            "\x75\x70" +
594
            // size
595
            decToHex(unicodePathExtraField.length, 2) +
596
            // content
597
            unicodePathExtraField;
598
    }
599

    
600
    if(useUTF8ForComment) {
601

    
602
        unicodeCommentExtraField =
603
            // Version
604
            decToHex(1, 1) +
605
            // CommentCRC32
606
            decToHex(crc32(encodedComment), 4) +
607
            // UnicodeName
608
            utfEncodedComment;
609

    
610
        extraFields +=
611
            // Info-ZIP Unicode Path Extra Field
612
            "\x75\x63" +
613
            // size
614
            decToHex(unicodeCommentExtraField.length, 2) +
615
            // content
616
            unicodeCommentExtraField;
617
    }
618

    
619
    var header = "";
620

    
621
    // version needed to extract
622
    header += "\x0A\x00";
623
    // general purpose bit flag
624
    header += decToHex(bitflag, 2);
625
    // compression method
626
    header += compression.magic;
627
    // last mod file time
628
    header += decToHex(dosTime, 2);
629
    // last mod file date
630
    header += decToHex(dosDate, 2);
631
    // crc-32
632
    header += decToHex(dataInfo.crc32, 4);
633
    // compressed size
634
    header += decToHex(dataInfo.compressedSize, 4);
635
    // uncompressed size
636
    header += decToHex(dataInfo.uncompressedSize, 4);
637
    // file name length
638
    header += decToHex(encodedFileName.length, 2);
639
    // extra field length
640
    header += decToHex(extraFields.length, 2);
641

    
642

    
643
    var fileRecord = signature.LOCAL_FILE_HEADER + header + encodedFileName + extraFields;
644

    
645
    var dirRecord = signature.CENTRAL_FILE_HEADER +
646
        // version made by (00: DOS)
647
        decToHex(versionMadeBy, 2) +
648
        // file header (common to file and central directory)
649
        header +
650
        // file comment length
651
        decToHex(encodedComment.length, 2) +
652
        // disk number start
653
        "\x00\x00" +
654
        // internal file attributes TODO
655
        "\x00\x00" +
656
        // external file attributes
657
        decToHex(extFileAttr, 4) +
658
        // relative offset of local header
659
        decToHex(offset, 4) +
660
        // file name
661
        encodedFileName +
662
        // extra field
663
        extraFields +
664
        // file comment
665
        encodedComment;
666

    
667
    return {
668
        fileRecord: fileRecord,
669
        dirRecord: dirRecord
670
    };
671
};
672

    
673
/**
674
 * Generate the EOCD record.
675
 * @param {Number} entriesCount the number of entries in the zip file.
676
 * @param {Number} centralDirLength the length (in bytes) of the central dir.
677
 * @param {Number} localDirLength the length (in bytes) of the local dir.
678
 * @param {String} comment the zip file comment as a binary string.
679
 * @param {Function} encodeFileName the function to encode the comment.
680
 * @return {String} the EOCD record.
681
 */
682
var generateCentralDirectoryEnd = function (entriesCount, centralDirLength, localDirLength, comment, encodeFileName) {
683
    var dirEnd = "";
684
    var encodedComment = utils.transformTo("string", encodeFileName(comment));
685

    
686
    // end of central dir signature
687
    dirEnd = signature.CENTRAL_DIRECTORY_END +
688
        // number of this disk
689
        "\x00\x00" +
690
        // number of the disk with the start of the central directory
691
        "\x00\x00" +
692
        // total number of entries in the central directory on this disk
693
        decToHex(entriesCount, 2) +
694
        // total number of entries in the central directory
695
        decToHex(entriesCount, 2) +
696
        // size of the central directory   4 bytes
697
        decToHex(centralDirLength, 4) +
698
        // offset of start of central directory with respect to the starting disk number
699
        decToHex(localDirLength, 4) +
700
        // .ZIP file comment length
701
        decToHex(encodedComment.length, 2) +
702
        // .ZIP file comment
703
        encodedComment;
704

    
705
    return dirEnd;
706
};
707

    
708
/**
709
 * Generate data descriptors for a file entry.
710
 * @param {Object} streamInfo the hash generated by a worker, containing informations
711
 * on the file entry.
712
 * @return {String} the data descriptors.
713
 */
714
var generateDataDescriptors = function (streamInfo) {
715
    var descriptor = "";
716
    descriptor = signature.DATA_DESCRIPTOR +
717
        // crc-32                          4 bytes
718
        decToHex(streamInfo['crc32'], 4) +
719
        // compressed size                 4 bytes
720
        decToHex(streamInfo['compressedSize'], 4) +
721
        // uncompressed size               4 bytes
722
        decToHex(streamInfo['uncompressedSize'], 4);
723

    
724
    return descriptor;
725
};
726

    
727

    
728
/**
729
 * A worker to concatenate other workers to create a zip file.
730
 * @param {Boolean} streamFiles `true` to stream the content of the files,
731
 * `false` to accumulate it.
732
 * @param {String} comment the comment to use.
733
 * @param {String} platform the platform to use, "UNIX" or "DOS".
734
 * @param {Function} encodeFileName the function to encode file names and comments.
735
 */
736
function ZipFileWorker(streamFiles, comment, platform, encodeFileName) {
737
    GenericWorker.call(this, "ZipFileWorker");
738
    // The number of bytes written so far. This doesn't count accumulated chunks.
739
    this.bytesWritten = 0;
740
    // The comment of the zip file
741
    this.zipComment = comment;
742
    // The platform "generating" the zip file.
743
    this.zipPlatform = platform;
744
    // the function to encode file names and comments.
745
    this.encodeFileName = encodeFileName;
746
    // Should we stream the content of the files ?
747
    this.streamFiles = streamFiles;
748
    // If `streamFiles` is false, we will need to accumulate the content of the
749
    // files to calculate sizes / crc32 (and write them *before* the content).
750
    // This boolean indicates if we are accumulating chunks (it will change a lot
751
    // during the lifetime of this worker).
752
    this.accumulate = false;
753
    // The buffer receiving chunks when accumulating content.
754
    this.contentBuffer = [];
755
    // The list of generated directory records.
756
    this.dirRecords = [];
757
    // The offset (in bytes) from the beginning of the zip file for the current source.
758
    this.currentSourceOffset = 0;
759
    // The total number of entries in this zip file.
760
    this.entriesCount = 0;
761
    // the name of the file currently being added, null when handling the end of the zip file.
762
    // Used for the emited metadata.
763
    this.currentFile = null;
764

    
765

    
766

    
767
    this._sources = [];
768
}
769
utils.inherits(ZipFileWorker, GenericWorker);
770

    
771
/**
772
 * @see GenericWorker.push
773
 */
774
ZipFileWorker.prototype.push = function (chunk) {
775

    
776
    var currentFilePercent = chunk.meta.percent || 0;
777
    var entriesCount = this.entriesCount;
778
    var remainingFiles = this._sources.length;
779

    
780
    if(this.accumulate) {
781
        this.contentBuffer.push(chunk);
782
    } else {
783
        this.bytesWritten += chunk.data.length;
784

    
785
        GenericWorker.prototype.push.call(this, {
786
            data : chunk.data,
787
            meta : {
788
                currentFile : this.currentFile,
789
                percent : entriesCount ? (currentFilePercent + 100 * (entriesCount - remainingFiles - 1)) / entriesCount : 100
790
            }
791
        });
792
    }
793
};
794

    
795
/**
796
 * The worker started a new source (an other worker).
797
 * @param {Object} streamInfo the streamInfo object from the new source.
798
 */
799
ZipFileWorker.prototype.openedSource = function (streamInfo) {
800
    this.currentSourceOffset = this.bytesWritten;
801
    this.currentFile = streamInfo['file'].name;
802

    
803
    var streamedContent = this.streamFiles && !streamInfo['file'].dir;
804

    
805
    // don't stream folders (because they don't have any content)
806
    if(streamedContent) {
807
        var record = generateZipParts(streamInfo, streamedContent, false, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
808
        this.push({
809
            data : record.fileRecord,
810
            meta : {percent:0}
811
        });
812
    } else {
813
        // we need to wait for the whole file before pushing anything
814
        this.accumulate = true;
815
    }
816
};
817

    
818
/**
819
 * The worker finished a source (an other worker).
820
 * @param {Object} streamInfo the streamInfo object from the finished source.
821
 */
822
ZipFileWorker.prototype.closedSource = function (streamInfo) {
823
    this.accumulate = false;
824
    var streamedContent = this.streamFiles && !streamInfo['file'].dir;
825
    var record = generateZipParts(streamInfo, streamedContent, true, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
826

    
827
    this.dirRecords.push(record.dirRecord);
828
    if(streamedContent) {
829
        // after the streamed file, we put data descriptors
830
        this.push({
831
            data : generateDataDescriptors(streamInfo),
832
            meta : {percent:100}
833
        });
834
    } else {
835
        // the content wasn't streamed, we need to push everything now
836
        // first the file record, then the content
837
        this.push({
838
            data : record.fileRecord,
839
            meta : {percent:0}
840
        });
841
        while(this.contentBuffer.length) {
842
            this.push(this.contentBuffer.shift());
843
        }
844
    }
845
    this.currentFile = null;
846
};
847

    
848
/**
849
 * @see GenericWorker.flush
850
 */
851
ZipFileWorker.prototype.flush = function () {
852

    
853
    var localDirLength = this.bytesWritten;
854
    for(var i = 0; i < this.dirRecords.length; i++) {
855
        this.push({
856
            data : this.dirRecords[i],
857
            meta : {percent:100}
858
        });
859
    }
860
    var centralDirLength = this.bytesWritten - localDirLength;
861

    
862
    var dirEnd = generateCentralDirectoryEnd(this.dirRecords.length, centralDirLength, localDirLength, this.zipComment, this.encodeFileName);
863

    
864
    this.push({
865
        data : dirEnd,
866
        meta : {percent:100}
867
    });
868
};
869

    
870
/**
871
 * Prepare the next source to be read.
872
 */
873
ZipFileWorker.prototype.prepareNextSource = function () {
874
    this.previous = this._sources.shift();
875
    this.openedSource(this.previous.streamInfo);
876
    if (this.isPaused) {
877
        this.previous.pause();
878
    } else {
879
        this.previous.resume();
880
    }
881
};
882

    
883
/**
884
 * @see GenericWorker.registerPrevious
885
 */
886
ZipFileWorker.prototype.registerPrevious = function (previous) {
887
    this._sources.push(previous);
888
    var self = this;
889

    
890
    previous.on('data', function (chunk) {
891
        self.processChunk(chunk);
892
    });
893
    previous.on('end', function () {
894
        self.closedSource(self.previous.streamInfo);
895
        if(self._sources.length) {
896
            self.prepareNextSource();
897
        } else {
898
            self.end();
899
        }
900
    });
901
    previous.on('error', function (e) {
902
        self.error(e);
903
    });
904
    return this;
905
};
906

    
907
/**
908
 * @see GenericWorker.resume
909
 */
910
ZipFileWorker.prototype.resume = function () {
911
    if(!GenericWorker.prototype.resume.call(this)) {
912
        return false;
913
    }
914

    
915
    if (!this.previous && this._sources.length) {
916
        this.prepareNextSource();
917
        return true;
918
    }
919
    if (!this.previous && !this._sources.length && !this.generatedError) {
920
        this.end();
921
        return true;
922
    }
923
};
924

    
925
/**
926
 * @see GenericWorker.error
927
 */
928
ZipFileWorker.prototype.error = function (e) {
929
    var sources = this._sources;
930
    if(!GenericWorker.prototype.error.call(this, e)) {
931
        return false;
932
    }
933
    for(var i = 0; i < sources.length; i++) {
934
        try {
935
            sources[i].error(e);
936
        } catch(e) {
937
            // the `error` exploded, nothing to do
938
        }
939
    }
940
    return true;
941
};
942

    
943
/**
944
 * @see GenericWorker.lock
945
 */
946
ZipFileWorker.prototype.lock = function () {
947
    GenericWorker.prototype.lock.call(this);
948
    var sources = this._sources;
949
    for(var i = 0; i < sources.length; i++) {
950
        sources[i].lock();
951
    }
952
};
953

    
954
module.exports = ZipFileWorker;
955

    
956
},{"../crc32":4,"../signature":23,"../stream/GenericWorker":28,"../utf8":31,"../utils":32}],9:[function(require,module,exports){
957
'use strict';
958

    
959
var compressions = require('../compressions');
960
var ZipFileWorker = require('./ZipFileWorker');
961

    
962
/**
963
 * Find the compression to use.
964
 * @param {String} fileCompression the compression defined at the file level, if any.
965
 * @param {String} zipCompression the compression defined at the load() level.
966
 * @return {Object} the compression object to use.
967
 */
968
var getCompression = function (fileCompression, zipCompression) {
969

    
970
    var compressionName = fileCompression || zipCompression;
971
    var compression = compressions[compressionName];
972
    if (!compression) {
973
        throw new Error(compressionName + " is not a valid compression method !");
974
    }
975
    return compression;
976
};
977

    
978
/**
979
 * Create a worker to generate a zip file.
980
 * @param {JSZip} zip the JSZip instance at the right root level.
981
 * @param {Object} options to generate the zip file.
982
 * @param {String} comment the comment to use.
983
 */
984
exports.generateWorker = function (zip, options, comment) {
985

    
986
    var zipFileWorker = new ZipFileWorker(options.streamFiles, comment, options.platform, options.encodeFileName);
987
    var entriesCount = 0;
988
    try {
989

    
990
        zip.forEach(function (relativePath, file) {
991
            entriesCount++;
992
            var compression = getCompression(file.options.compression, options.compression);
993
            var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};
994
            var dir = file.dir, date = file.date;
995

    
996
            file._compressWorker(compression, compressionOptions)
997
            .withStreamInfo("file", {
998
                name : relativePath,
999
                dir : dir,
1000
                date : date,
1001
                comment : file.comment || "",
1002
                unixPermissions : file.unixPermissions,
1003
                dosPermissions : file.dosPermissions
1004
            })
1005
            .pipe(zipFileWorker);
1006
        });
1007
        zipFileWorker.entriesCount = entriesCount;
1008
    } catch (e) {
1009
        zipFileWorker.error(e);
1010
    }
1011

    
1012
    return zipFileWorker;
1013
};
1014

    
1015
},{"../compressions":3,"./ZipFileWorker":8}],10:[function(require,module,exports){
1016
'use strict';
1017

    
1018
/**
1019
 * Representation a of zip file in js
1020
 * @constructor
1021
 */
1022
function JSZip() {
1023
    // if this constructor is used without `new`, it adds `new` before itself:
1024
    if(!(this instanceof JSZip)) {
1025
        return new JSZip();
1026
    }
1027

    
1028
    if(arguments.length) {
1029
        throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
1030
    }
1031

    
1032
    // object containing the files :
1033
    // {
1034
    //   "folder/" : {...},
1035
    //   "folder/data.txt" : {...}
1036
    // }
1037
    this.files = {};
1038

    
1039
    this.comment = null;
1040

    
1041
    // Where we are in the hierarchy
1042
    this.root = "";
1043
    this.clone = function() {
1044
        var newObj = new JSZip();
1045
        for (var i in this) {
1046
            if (typeof this[i] !== "function") {
1047
                newObj[i] = this[i];
1048
            }
1049
        }
1050
        return newObj;
1051
    };
1052
}
1053
JSZip.prototype = require('./object');
1054
JSZip.prototype.loadAsync = require('./load');
1055
JSZip.support = require('./support');
1056
JSZip.defaults = require('./defaults');
1057

    
1058
// TODO find a better way to handle this version,
1059
// a require('package.json').version doesn't work with webpack, see #327
1060
JSZip.version = "3.2.0";
1061

    
1062
JSZip.loadAsync = function (content, options) {
1063
    return new JSZip().loadAsync(content, options);
1064
};
1065

    
1066
JSZip.external = require("./external");
1067
module.exports = JSZip;
1068

    
1069
},{"./defaults":5,"./external":6,"./load":11,"./object":15,"./support":30}],11:[function(require,module,exports){
1070
'use strict';
1071
var utils = require('./utils');
1072
var external = require("./external");
1073
var utf8 = require('./utf8');
1074
var utils = require('./utils');
1075
var ZipEntries = require('./zipEntries');
1076
var Crc32Probe = require('./stream/Crc32Probe');
1077
var nodejsUtils = require("./nodejsUtils");
1078

    
1079
/**
1080
 * Check the CRC32 of an entry.
1081
 * @param {ZipEntry} zipEntry the zip entry to check.
1082
 * @return {Promise} the result.
1083
 */
1084
function checkEntryCRC32(zipEntry) {
1085
    return new external.Promise(function (resolve, reject) {
1086
        var worker = zipEntry.decompressed.getContentWorker().pipe(new Crc32Probe());
1087
        worker.on("error", function (e) {
1088
            reject(e);
1089
        })
1090
        .on("end", function () {
1091
            if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) {
1092
                reject(new Error("Corrupted zip : CRC32 mismatch"));
1093
            } else {
1094
                resolve();
1095
            }
1096
        })
1097
        .resume();
1098
    });
1099
}
1100

    
1101
module.exports = function(data, options) {
1102
    var zip = this;
1103
    options = utils.extend(options || {}, {
1104
        base64: false,
1105
        checkCRC32: false,
1106
        optimizedBinaryString: false,
1107
        createFolders: false,
1108
        decodeFileName: utf8.utf8decode
1109
    });
1110

    
1111
    if (nodejsUtils.isNode && nodejsUtils.isStream(data)) {
1112
        return external.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file."));
1113
    }
1114

    
1115
    return utils.prepareContent("the loaded zip file", data, true, options.optimizedBinaryString, options.base64)
1116
    .then(function(data) {
1117
        var zipEntries = new ZipEntries(options);
1118
        zipEntries.load(data);
1119
        return zipEntries;
1120
    }).then(function checkCRC32(zipEntries) {
1121
        var promises = [external.Promise.resolve(zipEntries)];
1122
        var files = zipEntries.files;
1123
        if (options.checkCRC32) {
1124
            for (var i = 0; i < files.length; i++) {
1125
                promises.push(checkEntryCRC32(files[i]));
1126
            }
1127
        }
1128
        return external.Promise.all(promises);
1129
    }).then(function addFiles(results) {
1130
        var zipEntries = results.shift();
1131
        var files = zipEntries.files;
1132
        for (var i = 0; i < files.length; i++) {
1133
            var input = files[i];
1134
            zip.file(input.fileNameStr, input.decompressed, {
1135
                binary: true,
1136
                optimizedBinaryString: true,
1137
                date: input.date,
1138
                dir: input.dir,
1139
                comment : input.fileCommentStr.length ? input.fileCommentStr : null,
1140
                unixPermissions : input.unixPermissions,
1141
                dosPermissions : input.dosPermissions,
1142
                createFolders: options.createFolders
1143
            });
1144
        }
1145
        if (zipEntries.zipComment.length) {
1146
            zip.comment = zipEntries.zipComment;
1147
        }
1148

    
1149
        return zip;
1150
    });
1151
};
1152

    
1153
},{"./external":6,"./nodejsUtils":14,"./stream/Crc32Probe":25,"./utf8":31,"./utils":32,"./zipEntries":33}],12:[function(require,module,exports){
1154
"use strict";
1155

    
1156
var utils = require('../utils');
1157
var GenericWorker = require('../stream/GenericWorker');
1158

    
1159
/**
1160
 * A worker that use a nodejs stream as source.
1161
 * @constructor
1162
 * @param {String} filename the name of the file entry for this stream.
1163
 * @param {Readable} stream the nodejs stream.
1164
 */
1165
function NodejsStreamInputAdapter(filename, stream) {
1166
    GenericWorker.call(this, "Nodejs stream input adapter for " + filename);
1167
    this._upstreamEnded = false;
1168
    this._bindStream(stream);
1169
}
1170

    
1171
utils.inherits(NodejsStreamInputAdapter, GenericWorker);
1172

    
1173
/**
1174
 * Prepare the stream and bind the callbacks on it.
1175
 * Do this ASAP on node 0.10 ! A lazy binding doesn't always work.
1176
 * @param {Stream} stream the nodejs stream to use.
1177
 */
1178
NodejsStreamInputAdapter.prototype._bindStream = function (stream) {
1179
    var self = this;
1180
    this._stream = stream;
1181
    stream.pause();
1182
    stream
1183
    .on("data", function (chunk) {
1184
        self.push({
1185
            data: chunk,
1186
            meta : {
1187
                percent : 0
1188
            }
1189
        });
1190
    })
1191
    .on("error", function (e) {
1192
        if(self.isPaused) {
1193
            this.generatedError = e;
1194
        } else {
1195
            self.error(e);
1196
        }
1197
    })
1198
    .on("end", function () {
1199
        if(self.isPaused) {
1200
            self._upstreamEnded = true;
1201
        } else {
1202
            self.end();
1203
        }
1204
    });
1205
};
1206
NodejsStreamInputAdapter.prototype.pause = function () {
1207
    if(!GenericWorker.prototype.pause.call(this)) {
1208
        return false;
1209
    }
1210
    this._stream.pause();
1211
    return true;
1212
};
1213
NodejsStreamInputAdapter.prototype.resume = function () {
1214
    if(!GenericWorker.prototype.resume.call(this)) {
1215
        return false;
1216
    }
1217

    
1218
    if(this._upstreamEnded) {
1219
        this.end();
1220
    } else {
1221
        this._stream.resume();
1222
    }
1223

    
1224
    return true;
1225
};
1226

    
1227
module.exports = NodejsStreamInputAdapter;
1228

    
1229
},{"../stream/GenericWorker":28,"../utils":32}],13:[function(require,module,exports){
1230
'use strict';
1231

    
1232
var Readable = require('readable-stream').Readable;
1233

    
1234
var utils = require('../utils');
1235
utils.inherits(NodejsStreamOutputAdapter, Readable);
1236

    
1237
/**
1238
* A nodejs stream using a worker as source.
1239
* @see the SourceWrapper in http://nodejs.org/api/stream.html
1240
* @constructor
1241
* @param {StreamHelper} helper the helper wrapping the worker
1242
* @param {Object} options the nodejs stream options
1243
* @param {Function} updateCb the update callback.
1244
*/
1245
function NodejsStreamOutputAdapter(helper, options, updateCb) {
1246
    Readable.call(this, options);
1247
    this._helper = helper;
1248

    
1249
    var self = this;
1250
    helper.on("data", function (data, meta) {
1251
        if (!self.push(data)) {
1252
            self._helper.pause();
1253
        }
1254
        if(updateCb) {
1255
            updateCb(meta);
1256
        }
1257
    })
1258
    .on("error", function(e) {
1259
        self.emit('error', e);
1260
    })
1261
    .on("end", function () {
1262
        self.push(null);
1263
    });
1264
}
1265

    
1266

    
1267
NodejsStreamOutputAdapter.prototype._read = function() {
1268
    this._helper.resume();
1269
};
1270

    
1271
module.exports = NodejsStreamOutputAdapter;
1272

    
1273
},{"../utils":32,"readable-stream":16}],14:[function(require,module,exports){
1274
'use strict';
1275

    
1276
module.exports = {
1277
    /**
1278
     * True if this is running in Nodejs, will be undefined in a browser.
1279
     * In a browser, browserify won't include this file and the whole module
1280
     * will be resolved an empty object.
1281
     */
1282
    isNode : typeof Buffer !== "undefined",
1283
    /**
1284
     * Create a new nodejs Buffer from an existing content.
1285
     * @param {Object} data the data to pass to the constructor.
1286
     * @param {String} encoding the encoding to use.
1287
     * @return {Buffer} a new Buffer.
1288
     */
1289
    newBufferFrom: function(data, encoding) {
1290
        if (Buffer.from && Buffer.from !== Uint8Array.from) {
1291
            return Buffer.from(data, encoding);
1292
        } else {
1293
            if (typeof data === "number") {
1294
                // Safeguard for old Node.js versions. On newer versions,
1295
                // Buffer.from(number) / Buffer(number, encoding) already throw.
1296
                throw new Error("The \"data\" argument must not be a number");
1297
            }
1298
            return new Buffer(data, encoding);
1299
        }
1300
    },
1301
    /**
1302
     * Create a new nodejs Buffer with the specified size.
1303
     * @param {Integer} size the size of the buffer.
1304
     * @return {Buffer} a new Buffer.
1305
     */
1306
    allocBuffer: function (size) {
1307
        if (Buffer.alloc) {
1308
            return Buffer.alloc(size);
1309
        } else {
1310
            var buf = new Buffer(size);
1311
            buf.fill(0);
1312
            return buf;
1313
        }
1314
    },
1315
    /**
1316
     * Find out if an object is a Buffer.
1317
     * @param {Object} b the object to test.
1318
     * @return {Boolean} true if the object is a Buffer, false otherwise.
1319
     */
1320
    isBuffer : function(b){
1321
        return Buffer.isBuffer(b);
1322
    },
1323

    
1324
    isStream : function (obj) {
1325
        return obj &&
1326
            typeof obj.on === "function" &&
1327
            typeof obj.pause === "function" &&
1328
            typeof obj.resume === "function";
1329
    }
1330
};
1331

    
1332
},{}],15:[function(require,module,exports){
1333
'use strict';
1334
var utf8 = require('./utf8');
1335
var utils = require('./utils');
1336
var GenericWorker = require('./stream/GenericWorker');
1337
var StreamHelper = require('./stream/StreamHelper');
1338
var defaults = require('./defaults');
1339
var CompressedObject = require('./compressedObject');
1340
var ZipObject = require('./zipObject');
1341
var generate = require("./generate");
1342
var nodejsUtils = require("./nodejsUtils");
1343
var NodejsStreamInputAdapter = require("./nodejs/NodejsStreamInputAdapter");
1344

    
1345

    
1346
/**
1347
 * Add a file in the current folder.
1348
 * @private
1349
 * @param {string} name the name of the file
1350
 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
1351
 * @param {Object} originalOptions the options of the file
1352
 * @return {Object} the new file.
1353
 */
1354
var fileAdd = function(name, data, originalOptions) {
1355
    // be sure sub folders exist
1356
    var dataType = utils.getTypeOf(data),
1357
        parent;
1358

    
1359

    
1360
    /*
1361
     * Correct options.
1362
     */
1363

    
1364
    var o = utils.extend(originalOptions || {}, defaults);
1365
    o.date = o.date || new Date();
1366
    if (o.compression !== null) {
1367
        o.compression = o.compression.toUpperCase();
1368
    }
1369

    
1370
    if (typeof o.unixPermissions === "string") {
1371
        o.unixPermissions = parseInt(o.unixPermissions, 8);
1372
    }
1373

    
1374
    // UNX_IFDIR  0040000 see zipinfo.c
1375
    if (o.unixPermissions && (o.unixPermissions & 0x4000)) {
1376
        o.dir = true;
1377
    }
1378
    // Bit 4    Directory
1379
    if (o.dosPermissions && (o.dosPermissions & 0x0010)) {
1380
        o.dir = true;
1381
    }
1382

    
1383
    if (o.dir) {
1384
        name = forceTrailingSlash(name);
1385
    }
1386
    if (o.createFolders && (parent = parentFolder(name))) {
1387
        folderAdd.call(this, parent, true);
1388
    }
1389

    
1390
    var isUnicodeString = dataType === "string" && o.binary === false && o.base64 === false;
1391
    if (!originalOptions || typeof originalOptions.binary === "undefined") {
1392
        o.binary = !isUnicodeString;
1393
    }
1394

    
1395

    
1396
    var isCompressedEmpty = (data instanceof CompressedObject) && data.uncompressedSize === 0;
1397

    
1398
    if (isCompressedEmpty || o.dir || !data || data.length === 0) {
1399
        o.base64 = false;
1400
        o.binary = true;
1401
        data = "";
1402
        o.compression = "STORE";
1403
        dataType = "string";
1404
    }
1405

    
1406
    /*
1407
     * Convert content to fit.
1408
     */
1409

    
1410
    var zipObjectContent = null;
1411
    if (data instanceof CompressedObject || data instanceof GenericWorker) {
1412
        zipObjectContent = data;
1413
    } else if (nodejsUtils.isNode && nodejsUtils.isStream(data)) {
1414
        zipObjectContent = new NodejsStreamInputAdapter(name, data);
1415
    } else {
1416
        zipObjectContent = utils.prepareContent(name, data, o.binary, o.optimizedBinaryString, o.base64);
1417
    }
1418

    
1419
    var object = new ZipObject(name, zipObjectContent, o);
1420
    this.files[name] = object;
1421
    /*
1422
    TODO: we can't throw an exception because we have async promises
1423
    (we can have a promise of a Date() for example) but returning a
1424
    promise is useless because file(name, data) returns the JSZip
1425
    object for chaining. Should we break that to allow the user
1426
    to catch the error ?
1427

1428
    return external.Promise.resolve(zipObjectContent)
1429
    .then(function () {
1430
        return object;
1431
    });
1432
    */
1433
};
1434

    
1435
/**
1436
 * Find the parent folder of the path.
1437
 * @private
1438
 * @param {string} path the path to use
1439
 * @return {string} the parent folder, or ""
1440
 */
1441
var parentFolder = function (path) {
1442
    if (path.slice(-1) === '/') {
1443
        path = path.substring(0, path.length - 1);
1444
    }
1445
    var lastSlash = path.lastIndexOf('/');
1446
    return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
1447
};
1448

    
1449
/**
1450
 * Returns the path with a slash at the end.
1451
 * @private
1452
 * @param {String} path the path to check.
1453
 * @return {String} the path with a trailing slash.
1454
 */
1455
var forceTrailingSlash = function(path) {
1456
    // Check the name ends with a /
1457
    if (path.slice(-1) !== "/") {
1458
        path += "/"; // IE doesn't like substr(-1)
1459
    }
1460
    return path;
1461
};
1462

    
1463
/**
1464
 * Add a (sub) folder in the current folder.
1465
 * @private
1466
 * @param {string} name the folder's name
1467
 * @param {boolean=} [createFolders] If true, automatically create sub
1468
 *  folders. Defaults to false.
1469
 * @return {Object} the new folder.
1470
 */
1471
var folderAdd = function(name, createFolders) {
1472
    createFolders = (typeof createFolders !== 'undefined') ? createFolders : defaults.createFolders;
1473

    
1474
    name = forceTrailingSlash(name);
1475

    
1476
    // Does this folder already exist?
1477
    if (!this.files[name]) {
1478
        fileAdd.call(this, name, null, {
1479
            dir: true,
1480
            createFolders: createFolders
1481
        });
1482
    }
1483
    return this.files[name];
1484
};
1485

    
1486
/**
1487
* Cross-window, cross-Node-context regular expression detection
1488
* @param  {Object}  object Anything
1489
* @return {Boolean}        true if the object is a regular expression,
1490
* false otherwise
1491
*/
1492
function isRegExp(object) {
1493
    return Object.prototype.toString.call(object) === "[object RegExp]";
1494
}
1495

    
1496
// return the actual prototype of JSZip
1497
var out = {
1498
    /**
1499
     * @see loadAsync
1500
     */
1501
    load: function() {
1502
        throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
1503
    },
1504

    
1505

    
1506
    /**
1507
     * Call a callback function for each entry at this folder level.
1508
     * @param {Function} cb the callback function:
1509
     * function (relativePath, file) {...}
1510
     * It takes 2 arguments : the relative path and the file.
1511
     */
1512
    forEach: function(cb) {
1513
        var filename, relativePath, file;
1514
        for (filename in this.files) {
1515
            if (!this.files.hasOwnProperty(filename)) {
1516
                continue;
1517
            }
1518
            file = this.files[filename];
1519
            relativePath = filename.slice(this.root.length, filename.length);
1520
            if (relativePath && filename.slice(0, this.root.length) === this.root) { // the file is in the current root
1521
                cb(relativePath, file); // TODO reverse the parameters ? need to be clean AND consistent with the filter search fn...
1522
            }
1523
        }
1524
    },
1525

    
1526
    /**
1527
     * Filter nested files/folders with the specified function.
1528
     * @param {Function} search the predicate to use :
1529
     * function (relativePath, file) {...}
1530
     * It takes 2 arguments : the relative path and the file.
1531
     * @return {Array} An array of matching elements.
1532
     */
1533
    filter: function(search) {
1534
        var result = [];
1535
        this.forEach(function (relativePath, entry) {
1536
            if (search(relativePath, entry)) { // the file matches the function
1537
                result.push(entry);
1538
            }
1539

    
1540
        });
1541
        return result;
1542
    },
1543

    
1544
    /**
1545
     * Add a file to the zip file, or search a file.
1546
     * @param   {string|RegExp} name The name of the file to add (if data is defined),
1547
     * the name of the file to find (if no data) or a regex to match files.
1548
     * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded
1549
     * @param   {Object} o     File options
1550
     * @return  {JSZip|Object|Array} this JSZip object (when adding a file),
1551
     * a file (when searching by string) or an array of files (when searching by regex).
1552
     */
1553
    file: function(name, data, o) {
1554
        if (arguments.length === 1) {
1555
            if (isRegExp(name)) {
1556
                var regexp = name;
1557
                return this.filter(function(relativePath, file) {
1558
                    return !file.dir && regexp.test(relativePath);
1559
                });
1560
            }
1561
            else { // text
1562
                var obj = this.files[this.root + name];
1563
                if (obj && !obj.dir) {
1564
                    return obj;
1565
                } else {
1566
                    return null;
1567
                }
1568
            }
1569
        }
1570
        else { // more than one argument : we have data !
1571
            name = this.root + name;
1572
            fileAdd.call(this, name, data, o);
1573
        }
1574
        return this;
1575
    },
1576

    
1577
    /**
1578
     * Add a directory to the zip file, or search.
1579
     * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.
1580
     * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.
1581
     */
1582
    folder: function(arg) {
1583
        if (!arg) {
1584
            return this;
1585
        }
1586

    
1587
        if (isRegExp(arg)) {
1588
            return this.filter(function(relativePath, file) {
1589
                return file.dir && arg.test(relativePath);
1590
            });
1591
        }
1592

    
1593
        // else, name is a new folder
1594
        var name = this.root + arg;
1595
        var newFolder = folderAdd.call(this, name);
1596

    
1597
        // Allow chaining by returning a new object with this folder as the root
1598
        var ret = this.clone();
1599
        ret.root = newFolder.name;
1600
        return ret;
1601
    },
1602

    
1603
    /**
1604
     * Delete a file, or a directory and all sub-files, from the zip
1605
     * @param {string} name the name of the file to delete
1606
     * @return {JSZip} this JSZip object
1607
     */
1608
    remove: function(name) {
1609
        name = this.root + name;
1610
        var file = this.files[name];
1611
        if (!file) {
1612
            // Look for any folders
1613
            if (name.slice(-1) !== "/") {
1614
                name += "/";
1615
            }
1616
            file = this.files[name];
1617
        }
1618

    
1619
        if (file && !file.dir) {
1620
            // file
1621
            delete this.files[name];
1622
        } else {
1623
            // maybe a folder, delete recursively
1624
            var kids = this.filter(function(relativePath, file) {
1625
                return file.name.slice(0, name.length) === name;
1626
            });
1627
            for (var i = 0; i < kids.length; i++) {
1628
                delete this.files[kids[i].name];
1629
            }
1630
        }
1631

    
1632
        return this;
1633
    },
1634

    
1635
    /**
1636
     * Generate the complete zip file
1637
     * @param {Object} options the options to generate the zip file :
1638
     * - compression, "STORE" by default.
1639
     * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
1640
     * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
1641
     */
1642
    generate: function(options) {
1643
        throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
1644
    },
1645

    
1646
    /**
1647
     * Generate the complete zip file as an internal stream.
1648
     * @param {Object} options the options to generate the zip file :
1649
     * - compression, "STORE" by default.
1650
     * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
1651
     * @return {StreamHelper} the streamed zip file.
1652
     */
1653
    generateInternalStream: function(options) {
1654
      var worker, opts = {};
1655
      try {
1656
          opts = utils.extend(options || {}, {
1657
              streamFiles: false,
1658
              compression: "STORE",
1659
              compressionOptions : null,
1660
              type: "",
1661
              platform: "DOS",
1662
              comment: null,
1663
              mimeType: 'application/zip',
1664
              encodeFileName: utf8.utf8encode
1665
          });
1666

    
1667
          opts.type = opts.type.toLowerCase();
1668
          opts.compression = opts.compression.toUpperCase();
1669

    
1670
          // "binarystring" is prefered but the internals use "string".
1671
          if(opts.type === "binarystring") {
1672
            opts.type = "string";
1673
          }
1674

    
1675
          if (!opts.type) {
1676
            throw new Error("No output type specified.");
1677
          }
1678

    
1679
          utils.checkSupport(opts.type);
1680

    
1681
          // accept nodejs `process.platform`
1682
          if(
1683
              opts.platform === 'darwin' ||
1684
              opts.platform === 'freebsd' ||
1685
              opts.platform === 'linux' ||
1686
              opts.platform === 'sunos'
1687
          ) {
1688
              opts.platform = "UNIX";
1689
          }
1690
          if (opts.platform === 'win32') {
1691
              opts.platform = "DOS";
1692
          }
1693

    
1694
          var comment = opts.comment || this.comment || "";
1695
          worker = generate.generateWorker(this, opts, comment);
1696
      } catch (e) {
1697
        worker = new GenericWorker("error");
1698
        worker.error(e);
1699
      }
1700
      return new StreamHelper(worker, opts.type || "string", opts.mimeType);
1701
    },
1702
    /**
1703
     * Generate the complete zip file asynchronously.
1704
     * @see generateInternalStream
1705
     */
1706
    generateAsync: function(options, onUpdate) {
1707
        return this.generateInternalStream(options).accumulate(onUpdate);
1708
    },
1709
    /**
1710
     * Generate the complete zip file asynchronously.
1711
     * @see generateInternalStream
1712
     */
1713
    generateNodeStream: function(options, onUpdate) {
1714
        options = options || {};
1715
        if (!options.type) {
1716
            options.type = "nodebuffer";
1717
        }
1718
        return this.generateInternalStream(options).toNodejsStream(onUpdate);
1719
    }
1720
};
1721
module.exports = out;
1722

    
1723
},{"./compressedObject":2,"./defaults":5,"./generate":9,"./nodejs/NodejsStreamInputAdapter":12,"./nodejsUtils":14,"./stream/GenericWorker":28,"./stream/StreamHelper":29,"./utf8":31,"./utils":32,"./zipObject":35}],16:[function(require,module,exports){
1724
/*
1725
 * This file is used by module bundlers (browserify/webpack/etc) when
1726
 * including a stream implementation. We use "readable-stream" to get a
1727
 * consistent behavior between nodejs versions but bundlers often have a shim
1728
 * for "stream". Using this shim greatly improve the compatibility and greatly
1729
 * reduce the final size of the bundle (only one stream implementation, not
1730
 * two).
1731
 */
1732
module.exports = require("stream");
1733

    
1734
},{"stream":undefined}],17:[function(require,module,exports){
1735
'use strict';
1736
var DataReader = require('./DataReader');
1737
var utils = require('../utils');
1738

    
1739
function ArrayReader(data) {
1740
    DataReader.call(this, data);
1741
        for(var i = 0; i < this.data.length; i++) {
1742
                data[i] = data[i] & 0xFF;
1743
        }
1744
}
1745
utils.inherits(ArrayReader, DataReader);
1746
/**
1747
 * @see DataReader.byteAt
1748
 */
1749
ArrayReader.prototype.byteAt = function(i) {
1750
    return this.data[this.zero + i];
1751
};
1752
/**
1753
 * @see DataReader.lastIndexOfSignature
1754
 */
1755
ArrayReader.prototype.lastIndexOfSignature = function(sig) {
1756
    var sig0 = sig.charCodeAt(0),
1757
        sig1 = sig.charCodeAt(1),
1758
        sig2 = sig.charCodeAt(2),
1759
        sig3 = sig.charCodeAt(3);
1760
    for (var i = this.length - 4; i >= 0; --i) {
1761
        if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
1762
            return i - this.zero;
1763
        }
1764
    }
1765

    
1766
    return -1;
1767
};
1768
/**
1769
 * @see DataReader.readAndCheckSignature
1770
 */
1771
ArrayReader.prototype.readAndCheckSignature = function (sig) {
1772
    var sig0 = sig.charCodeAt(0),
1773
        sig1 = sig.charCodeAt(1),
1774
        sig2 = sig.charCodeAt(2),
1775
        sig3 = sig.charCodeAt(3),
1776
        data = this.readData(4);
1777
    return sig0 === data[0] && sig1 === data[1] && sig2 === data[2] && sig3 === data[3];
1778
};
1779
/**
1780
 * @see DataReader.readData
1781
 */
1782
ArrayReader.prototype.readData = function(size) {
1783
    this.checkOffset(size);
1784
    if(size === 0) {
1785
        return [];
1786
    }
1787
    var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);
1788
    this.index += size;
1789
    return result;
1790
};
1791
module.exports = ArrayReader;
1792

    
1793
},{"../utils":32,"./DataReader":18}],18:[function(require,module,exports){
1794
'use strict';
1795
var utils = require('../utils');
1796

    
1797
function DataReader(data) {
1798
    this.data = data; // type : see implementation
1799
    this.length = data.length;
1800
    this.index = 0;
1801
    this.zero = 0;
1802
}
1803
DataReader.prototype = {
1804
    /**
1805
     * Check that the offset will not go too far.
1806
     * @param {string} offset the additional offset to check.
1807
     * @throws {Error} an Error if the offset is out of bounds.
1808
     */
1809
    checkOffset: function(offset) {
1810
        this.checkIndex(this.index + offset);
1811
    },
1812
    /**
1813
     * Check that the specified index will not be too far.
1814
     * @param {string} newIndex the index to check.
1815
     * @throws {Error} an Error if the index is out of bounds.
1816
     */
1817
    checkIndex: function(newIndex) {
1818
        if (this.length < this.zero + newIndex || newIndex < 0) {
1819
            throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
1820
        }
1821
    },
1822
    /**
1823
     * Change the index.
1824
     * @param {number} newIndex The new index.
1825
     * @throws {Error} if the new index is out of the data.
1826
     */
1827
    setIndex: function(newIndex) {
1828
        this.checkIndex(newIndex);
1829
        this.index = newIndex;
1830
    },
1831
    /**
1832
     * Skip the next n bytes.
1833
     * @param {number} n the number of bytes to skip.
1834
     * @throws {Error} if the new index is out of the data.
1835
     */
1836
    skip: function(n) {
1837
        this.setIndex(this.index + n);
1838
    },
1839
    /**
1840
     * Get the byte at the specified index.
1841
     * @param {number} i the index to use.
1842
     * @return {number} a byte.
1843
     */
1844
    byteAt: function(i) {
1845
        // see implementations
1846
    },
1847
    /**
1848
     * Get the next number with a given byte size.
1849
     * @param {number} size the number of bytes to read.
1850
     * @return {number} the corresponding number.
1851
     */
1852
    readInt: function(size) {
1853
        var result = 0,
1854
            i;
1855
        this.checkOffset(size);
1856
        for (i = this.index + size - 1; i >= this.index; i--) {
1857
            result = (result << 8) + this.byteAt(i);
1858
        }
1859
        this.index += size;
1860
        return result;
1861
    },
1862
    /**
1863
     * Get the next string with a given byte size.
1864
     * @param {number} size the number of bytes to read.
1865
     * @return {string} the corresponding string.
1866
     */
1867
    readString: function(size) {
1868
        return utils.transformTo("string", this.readData(size));
1869
    },
1870
    /**
1871
     * Get raw data without conversion, <size> bytes.
1872
     * @param {number} size the number of bytes to read.
1873
     * @return {Object} the raw data, implementation specific.
1874
     */
1875
    readData: function(size) {
1876
        // see implementations
1877
    },
1878
    /**
1879
     * Find the last occurence of a zip signature (4 bytes).
1880
     * @param {string} sig the signature to find.
1881
     * @return {number} the index of the last occurence, -1 if not found.
1882
     */
1883
    lastIndexOfSignature: function(sig) {
1884
        // see implementations
1885
    },
1886
    /**
1887
     * Read the signature (4 bytes) at the current position and compare it with sig.
1888
     * @param {string} sig the expected signature
1889
     * @return {boolean} true if the signature matches, false otherwise.
1890
     */
1891
    readAndCheckSignature: function(sig) {
1892
        // see implementations
1893
    },
1894
    /**
1895
     * Get the next date.
1896
     * @return {Date} the date.
1897
     */
1898
    readDate: function() {
1899
        var dostime = this.readInt(4);
1900
        return new Date(Date.UTC(
1901
        ((dostime >> 25) & 0x7f) + 1980, // year
1902
        ((dostime >> 21) & 0x0f) - 1, // month
1903
        (dostime >> 16) & 0x1f, // day
1904
        (dostime >> 11) & 0x1f, // hour
1905
        (dostime >> 5) & 0x3f, // minute
1906
        (dostime & 0x1f) << 1)); // second
1907
    }
1908
};
1909
module.exports = DataReader;
1910

    
1911
},{"../utils":32}],19:[function(require,module,exports){
1912
'use strict';
1913
var Uint8ArrayReader = require('./Uint8ArrayReader');
1914
var utils = require('../utils');
1915

    
1916
function NodeBufferReader(data) {
1917
    Uint8ArrayReader.call(this, data);
1918
}
1919
utils.inherits(NodeBufferReader, Uint8ArrayReader);
1920

    
1921
/**
1922
 * @see DataReader.readData
1923
 */
1924
NodeBufferReader.prototype.readData = function(size) {
1925
    this.checkOffset(size);
1926
    var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);
1927
    this.index += size;
1928
    return result;
1929
};
1930
module.exports = NodeBufferReader;
1931

    
1932
},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(require,module,exports){
1933
'use strict';
1934
var DataReader = require('./DataReader');
1935
var utils = require('../utils');
1936

    
1937
function StringReader(data) {
1938
    DataReader.call(this, data);
1939
}
1940
utils.inherits(StringReader, DataReader);
1941
/**
1942
 * @see DataReader.byteAt
1943
 */
1944
StringReader.prototype.byteAt = function(i) {
1945
    return this.data.charCodeAt(this.zero + i);
1946
};
1947
/**
1948
 * @see DataReader.lastIndexOfSignature
1949
 */
1950
StringReader.prototype.lastIndexOfSignature = function(sig) {
1951
    return this.data.lastIndexOf(sig) - this.zero;
1952
};
1953
/**
1954
 * @see DataReader.readAndCheckSignature
1955
 */
1956
StringReader.prototype.readAndCheckSignature = function (sig) {
1957
    var data = this.readData(4);
1958
    return sig === data;
1959
};
1960
/**
1961
 * @see DataReader.readData
1962
 */
1963
StringReader.prototype.readData = function(size) {
1964
    this.checkOffset(size);
1965
    // this will work because the constructor applied the "& 0xff" mask.
1966
    var result = this.data.slice(this.zero + this.index, this.zero + this.index + size);
1967
    this.index += size;
1968
    return result;
1969
};
1970
module.exports = StringReader;
1971

    
1972
},{"../utils":32,"./DataReader":18}],21:[function(require,module,exports){
1973
'use strict';
1974
var ArrayReader = require('./ArrayReader');
1975
var utils = require('../utils');
1976

    
1977
function Uint8ArrayReader(data) {
1978
    ArrayReader.call(this, data);
1979
}
1980
utils.inherits(Uint8ArrayReader, ArrayReader);
1981
/**
1982
 * @see DataReader.readData
1983
 */
1984
Uint8ArrayReader.prototype.readData = function(size) {
1985
    this.checkOffset(size);
1986
    if(size === 0) {
1987
        // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
1988
        return new Uint8Array(0);
1989
    }
1990
    var result = this.data.subarray(this.zero + this.index, this.zero + this.index + size);
1991
    this.index += size;
1992
    return result;
1993
};
1994
module.exports = Uint8ArrayReader;
1995

    
1996
},{"../utils":32,"./ArrayReader":17}],22:[function(require,module,exports){
1997
'use strict';
1998

    
1999
var utils = require('../utils');
2000
var support = require('../support');
2001
var ArrayReader = require('./ArrayReader');
2002
var StringReader = require('./StringReader');
2003
var NodeBufferReader = require('./NodeBufferReader');
2004
var Uint8ArrayReader = require('./Uint8ArrayReader');
2005

    
2006
/**
2007
 * Create a reader adapted to the data.
2008
 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data to read.
2009
 * @return {DataReader} the data reader.
2010
 */
2011
module.exports = function (data) {
2012
    var type = utils.getTypeOf(data);
2013
    utils.checkSupport(type);
2014
    if (type === "string" && !support.uint8array) {
2015
        return new StringReader(data);
2016
    }
2017
    if (type === "nodebuffer") {
2018
        return new NodeBufferReader(data);
2019
    }
2020
    if (support.uint8array) {
2021
        return new Uint8ArrayReader(utils.transformTo("uint8array", data));
2022
    }
2023
    return new ArrayReader(utils.transformTo("array", data));
2024
};
2025

    
2026
},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(require,module,exports){
2027
'use strict';
2028
exports.LOCAL_FILE_HEADER = "PK\x03\x04";
2029
exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
2030
exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
2031
exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
2032
exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
2033
exports.DATA_DESCRIPTOR = "PK\x07\x08";
2034

    
2035
},{}],24:[function(require,module,exports){
2036
'use strict';
2037

    
2038
var GenericWorker = require('./GenericWorker');
2039
var utils = require('../utils');
2040

    
2041
/**
2042
 * A worker which convert chunks to a specified type.
2043
 * @constructor
2044
 * @param {String} destType the destination type.
2045
 */
2046
function ConvertWorker(destType) {
2047
    GenericWorker.call(this, "ConvertWorker to " + destType);
2048
    this.destType = destType;
2049
}
2050
utils.inherits(ConvertWorker, GenericWorker);
2051

    
2052
/**
2053
 * @see GenericWorker.processChunk
2054
 */
2055
ConvertWorker.prototype.processChunk = function (chunk) {
2056
    this.push({
2057
        data : utils.transformTo(this.destType, chunk.data),
2058
        meta : chunk.meta
2059
    });
2060
};
2061
module.exports = ConvertWorker;
2062

    
2063
},{"../utils":32,"./GenericWorker":28}],25:[function(require,module,exports){
2064
'use strict';
2065

    
2066
var GenericWorker = require('./GenericWorker');
2067
var crc32 = require('../crc32');
2068
var utils = require('../utils');
2069

    
2070
/**
2071
 * A worker which calculate the crc32 of the data flowing through.
2072
 * @constructor
2073
 */
2074
function Crc32Probe() {
2075
    GenericWorker.call(this, "Crc32Probe");
2076
    this.withStreamInfo("crc32", 0);
2077
}
2078
utils.inherits(Crc32Probe, GenericWorker);
2079

    
2080
/**
2081
 * @see GenericWorker.processChunk
2082
 */
2083
Crc32Probe.prototype.processChunk = function (chunk) {
2084
    this.streamInfo.crc32 = crc32(chunk.data, this.streamInfo.crc32 || 0);
2085
    this.push(chunk);
2086
};
2087
module.exports = Crc32Probe;
2088

    
2089
},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(require,module,exports){
2090
'use strict';
2091

    
2092
var utils = require('../utils');
2093
var GenericWorker = require('./GenericWorker');
2094

    
2095
/**
2096
 * A worker which calculate the total length of the data flowing through.
2097
 * @constructor
2098
 * @param {String} propName the name used to expose the length
2099
 */
2100
function DataLengthProbe(propName) {
2101
    GenericWorker.call(this, "DataLengthProbe for " + propName);
2102
    this.propName = propName;
2103
    this.withStreamInfo(propName, 0);
2104
}
2105
utils.inherits(DataLengthProbe, GenericWorker);
2106

    
2107
/**
2108
 * @see GenericWorker.processChunk
2109
 */
2110
DataLengthProbe.prototype.processChunk = function (chunk) {
2111
    if(chunk) {
2112
        var length = this.streamInfo[this.propName] || 0;
2113
        this.streamInfo[this.propName] = length + chunk.data.length;
2114
    }
2115
    GenericWorker.prototype.processChunk.call(this, chunk);
2116
};
2117
module.exports = DataLengthProbe;
2118

    
2119

    
2120
},{"../utils":32,"./GenericWorker":28}],27:[function(require,module,exports){
2121
'use strict';
2122

    
2123
var utils = require('../utils');
2124
var GenericWorker = require('./GenericWorker');
2125

    
2126
// the size of the generated chunks
2127
// TODO expose this as a public variable
2128
var DEFAULT_BLOCK_SIZE = 16 * 1024;
2129

    
2130
/**
2131
 * A worker that reads a content and emits chunks.
2132
 * @constructor
2133
 * @param {Promise} dataP the promise of the data to split
2134
 */
2135
function DataWorker(dataP) {
2136
    GenericWorker.call(this, "DataWorker");
2137
    var self = this;
2138
    this.dataIsReady = false;
2139
    this.index = 0;
2140
    this.max = 0;
2141
    this.data = null;
2142
    this.type = "";
2143

    
2144
    this._tickScheduled = false;
2145

    
2146
    dataP.then(function (data) {
2147
        self.dataIsReady = true;
2148
        self.data = data;
2149
        self.max = data && data.length || 0;
2150
        self.type = utils.getTypeOf(data);
2151
        if(!self.isPaused) {
2152
            self._tickAndRepeat();
2153
        }
2154
    }, function (e) {
2155
        self.error(e);
2156
    });
2157
}
2158

    
2159
utils.inherits(DataWorker, GenericWorker);
2160

    
2161
/**
2162
 * @see GenericWorker.cleanUp
2163
 */
2164
DataWorker.prototype.cleanUp = function () {
2165
    GenericWorker.prototype.cleanUp.call(this);
2166
    this.data = null;
2167
};
2168

    
2169
/**
2170
 * @see GenericWorker.resume
2171
 */
2172
DataWorker.prototype.resume = function () {
2173
    if(!GenericWorker.prototype.resume.call(this)) {
2174
        return false;
2175
    }
2176

    
2177
    if (!this._tickScheduled && this.dataIsReady) {
2178
        this._tickScheduled = true;
2179
        utils.delay(this._tickAndRepeat, [], this);
2180
    }
2181
    return true;
2182
};
2183

    
2184
/**
2185
 * Trigger a tick a schedule an other call to this function.
2186
 */
2187
DataWorker.prototype._tickAndRepeat = function() {
2188
    this._tickScheduled = false;
2189
    if(this.isPaused || this.isFinished) {
2190
        return;
2191
    }
2192
    this._tick();
2193
    if(!this.isFinished) {
2194
        utils.delay(this._tickAndRepeat, [], this);
2195
        this._tickScheduled = true;
2196
    }
2197
};
2198

    
2199
/**
2200
 * Read and push a chunk.
2201
 */
2202
DataWorker.prototype._tick = function() {
2203

    
2204
    if(this.isPaused || this.isFinished) {
2205
        return false;
2206
    }
2207

    
2208
    var size = DEFAULT_BLOCK_SIZE;
2209
    var data = null, nextIndex = Math.min(this.max, this.index + size);
2210
    if (this.index >= this.max) {
2211
        // EOF
2212
        return this.end();
2213
    } else {
2214
        switch(this.type) {
2215
            case "string":
2216
                data = this.data.substring(this.index, nextIndex);
2217
            break;
2218
            case "uint8array":
2219
                data = this.data.subarray(this.index, nextIndex);
2220
            break;
2221
            case "array":
2222
            case "nodebuffer":
2223
                data = this.data.slice(this.index, nextIndex);
2224
            break;
2225
        }
2226
        this.index = nextIndex;
2227
        return this.push({
2228
            data : data,
2229
            meta : {
2230
                percent : this.max ? this.index / this.max * 100 : 0
2231
            }
2232
        });
2233
    }
2234
};
2235

    
2236
module.exports = DataWorker;
2237

    
2238
},{"../utils":32,"./GenericWorker":28}],28:[function(require,module,exports){
2239
'use strict';
2240

    
2241
/**
2242
 * A worker that does nothing but passing chunks to the next one. This is like
2243
 * a nodejs stream but with some differences. On the good side :
2244
 * - it works on IE 6-9 without any issue / polyfill
2245
 * - it weights less than the full dependencies bundled with browserify
2246
 * - it forwards errors (no need to declare an error handler EVERYWHERE)
2247
 *
2248
 * A chunk is an object with 2 attributes : `meta` and `data`. The former is an
2249
 * object containing anything (`percent` for example), see each worker for more
2250
 * details. The latter is the real data (String, Uint8Array, etc).
2251
 *
2252
 * @constructor
2253
 * @param {String} name the name of the stream (mainly used for debugging purposes)
2254
 */
2255
function GenericWorker(name) {
2256
    // the name of the worker
2257
    this.name = name || "default";
2258
    // an object containing metadata about the workers chain
2259
    this.streamInfo = {};
2260
    // an error which happened when the worker was paused
2261
    this.generatedError = null;
2262
    // an object containing metadata to be merged by this worker into the general metadata
2263
    this.extraStreamInfo = {};
2264
    // true if the stream is paused (and should not do anything), false otherwise
2265
    this.isPaused = true;
2266
    // true if the stream is finished (and should not do anything), false otherwise
2267
    this.isFinished = false;
2268
    // true if the stream is locked to prevent further structure updates (pipe), false otherwise
2269
    this.isLocked = false;
2270
    // the event listeners
2271
    this._listeners = {
2272
        'data':[],
2273
        'end':[],
2274
        'error':[]
2275
    };
2276
    // the previous worker, if any
2277
    this.previous = null;
2278
}
2279

    
2280
GenericWorker.prototype = {
2281
    /**
2282
     * Push a chunk to the next workers.
2283
     * @param {Object} chunk the chunk to push
2284
     */
2285
    push : function (chunk) {
2286
        this.emit("data", chunk);
2287
    },
2288
    /**
2289
     * End the stream.
2290
     * @return {Boolean} true if this call ended the worker, false otherwise.
2291
     */
2292
    end : function () {
2293
        if (this.isFinished) {
2294
            return false;
2295
        }
2296

    
2297
        this.flush();
2298
        try {
2299
            this.emit("end");
2300
            this.cleanUp();
2301
            this.isFinished = true;
2302
        } catch (e) {
2303
            this.emit("error", e);
2304
        }
2305
        return true;
2306
    },
2307
    /**
2308
     * End the stream with an error.
2309
     * @param {Error} e the error which caused the premature end.
2310
     * @return {Boolean} true if this call ended the worker with an error, false otherwise.
2311
     */
2312
    error : function (e) {
2313
        if (this.isFinished) {
2314
            return false;
2315
        }
2316

    
2317
        if(this.isPaused) {
2318
            this.generatedError = e;
2319
        } else {
2320
            this.isFinished = true;
2321

    
2322
            this.emit("error", e);
2323

    
2324
            // in the workers chain exploded in the middle of the chain,
2325
            // the error event will go downward but we also need to notify
2326
            // workers upward that there has been an error.
2327
            if(this.previous) {
2328
                this.previous.error(e);
2329
            }
2330

    
2331
            this.cleanUp();
2332
        }
2333
        return true;
2334
    },
2335
    /**
2336
     * Add a callback on an event.
2337
     * @param {String} name the name of the event (data, end, error)
2338
     * @param {Function} listener the function to call when the event is triggered
2339
     * @return {GenericWorker} the current object for chainability
2340
     */
2341
    on : function (name, listener) {
2342
        this._listeners[name].push(listener);
2343
        return this;
2344
    },
2345
    /**
2346
     * Clean any references when a worker is ending.
2347
     */
2348
    cleanUp : function () {
2349
        this.streamInfo = this.generatedError = this.extraStreamInfo = null;
2350
        this._listeners = [];
2351
    },
2352
    /**
2353
     * Trigger an event. This will call registered callback with the provided arg.
2354
     * @param {String} name the name of the event (data, end, error)
2355
     * @param {Object} arg the argument to call the callback with.
2356
     */
2357
    emit : function (name, arg) {
2358
        if (this._listeners[name]) {
2359
            for(var i = 0; i < this._listeners[name].length; i++) {
2360
                this._listeners[name][i].call(this, arg);
2361
            }
2362
        }
2363
    },
2364
    /**
2365
     * Chain a worker with an other.
2366
     * @param {Worker} next the worker receiving events from the current one.
2367
     * @return {worker} the next worker for chainability
2368
     */
2369
    pipe : function (next) {
2370
        return next.registerPrevious(this);
2371
    },
2372
    /**
2373
     * Same as `pipe` in the other direction.
2374
     * Using an API with `pipe(next)` is very easy.
2375
     * Implementing the API with the point of view of the next one registering
2376
     * a source is easier, see the ZipFileWorker.
2377
     * @param {Worker} previous the previous worker, sending events to this one
2378
     * @return {Worker} the current worker for chainability
2379
     */
2380
    registerPrevious : function (previous) {
2381
        if (this.isLocked) {
2382
            throw new Error("The stream '" + this + "' has already been used.");
2383
        }
2384

    
2385
        // sharing the streamInfo...
2386
        this.streamInfo = previous.streamInfo;
2387
        // ... and adding our own bits
2388
        this.mergeStreamInfo();
2389
        this.previous =  previous;
2390
        var self = this;
2391
        previous.on('data', function (chunk) {
2392
            self.processChunk(chunk);
2393
        });
2394
        previous.on('end', function () {
2395
            self.end();
2396
        });
2397
        previous.on('error', function (e) {
2398
            self.error(e);
2399
        });
2400
        return this;
2401
    },
2402
    /**
2403
     * Pause the stream so it doesn't send events anymore.
2404
     * @return {Boolean} true if this call paused the worker, false otherwise.
2405
     */
2406
    pause : function () {
2407
        if(this.isPaused || this.isFinished) {
2408
            return false;
2409
        }
2410
        this.isPaused = true;
2411

    
2412
        if(this.previous) {
2413
            this.previous.pause();
2414
        }
2415
        return true;
2416
    },
2417
    /**
2418
     * Resume a paused stream.
2419
     * @return {Boolean} true if this call resumed the worker, false otherwise.
2420
     */
2421
    resume : function () {
2422
        if(!this.isPaused || this.isFinished) {
2423
            return false;
2424
        }
2425
        this.isPaused = false;
2426

    
2427
        // if true, the worker tried to resume but failed
2428
        var withError = false;
2429
        if(this.generatedError) {
2430
            this.error(this.generatedError);
2431
            withError = true;
2432
        }
2433
        if(this.previous) {
2434
            this.previous.resume();
2435
        }
2436

    
2437
        return !withError;
2438
    },
2439
    /**
2440
     * Flush any remaining bytes as the stream is ending.
2441
     */
2442
    flush : function () {},
2443
    /**
2444
     * Process a chunk. This is usually the method overridden.
2445
     * @param {Object} chunk the chunk to process.
2446
     */
2447
    processChunk : function(chunk) {
2448
        this.push(chunk);
2449
    },
2450
    /**
2451
     * Add a key/value to be added in the workers chain streamInfo once activated.
2452
     * @param {String} key the key to use
2453
     * @param {Object} value the associated value
2454
     * @return {Worker} the current worker for chainability
2455
     */
2456
    withStreamInfo : function (key, value) {
2457
        this.extraStreamInfo[key] = value;
2458
        this.mergeStreamInfo();
2459
        return this;
2460
    },
2461
    /**
2462
     * Merge this worker's streamInfo into the chain's streamInfo.
2463
     */
2464
    mergeStreamInfo : function () {
2465
        for(var key in this.extraStreamInfo) {
2466
            if (!this.extraStreamInfo.hasOwnProperty(key)) {
2467
                continue;
2468
            }
2469
            this.streamInfo[key] = this.extraStreamInfo[key];
2470
        }
2471
    },
2472

    
2473
    /**
2474
     * Lock the stream to prevent further updates on the workers chain.
2475
     * After calling this method, all calls to pipe will fail.
2476
     */
2477
    lock: function () {
2478
        if (this.isLocked) {
2479
            throw new Error("The stream '" + this + "' has already been used.");
2480
        }
2481
        this.isLocked = true;
2482
        if (this.previous) {
2483
            this.previous.lock();
2484
        }
2485
    },
2486

    
2487
    /**
2488
     *
2489
     * Pretty print the workers chain.
2490
     */
2491
    toString : function () {
2492
        var me = "Worker " + this.name;
2493
        if (this.previous) {
2494
            return this.previous + " -> " + me;
2495
        } else {
2496
            return me;
2497
        }
2498
    }
2499
};
2500

    
2501
module.exports = GenericWorker;
2502

    
2503
},{}],29:[function(require,module,exports){
2504
'use strict';
2505

    
2506
var utils = require('../utils');
2507
var ConvertWorker = require('./ConvertWorker');
2508
var GenericWorker = require('./GenericWorker');
2509
var base64 = require('../base64');
2510
var support = require("../support");
2511
var external = require("../external");
2512

    
2513
var NodejsStreamOutputAdapter = null;
2514
if (support.nodestream) {
2515
    try {
2516
        NodejsStreamOutputAdapter = require('../nodejs/NodejsStreamOutputAdapter');
2517
    } catch(e) {}
2518
}
2519

    
2520
/**
2521
 * Apply the final transformation of the data. If the user wants a Blob for
2522
 * example, it's easier to work with an U8intArray and finally do the
2523
 * ArrayBuffer/Blob conversion.
2524
 * @param {String} type the name of the final type
2525
 * @param {String|Uint8Array|Buffer} content the content to transform
2526
 * @param {String} mimeType the mime type of the content, if applicable.
2527
 * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the content in the right format.
2528
 */
2529
function transformZipOutput(type, content, mimeType) {
2530
    switch(type) {
2531
        case "blob" :
2532
            return utils.newBlob(utils.transformTo("arraybuffer", content), mimeType);
2533
        case "base64" :
2534
            return base64.encode(content);
2535
        default :
2536
            return utils.transformTo(type, content);
2537
    }
2538
}
2539

    
2540
/**
2541
 * Concatenate an array of data of the given type.
2542
 * @param {String} type the type of the data in the given array.
2543
 * @param {Array} dataArray the array containing the data chunks to concatenate
2544
 * @return {String|Uint8Array|Buffer} the concatenated data
2545
 * @throws Error if the asked type is unsupported
2546
 */
2547
function concat (type, dataArray) {
2548
    var i, index = 0, res = null, totalLength = 0;
2549
    for(i = 0; i < dataArray.length; i++) {
2550
        totalLength += dataArray[i].length;
2551
    }
2552
    switch(type) {
2553
        case "string":
2554
            return dataArray.join("");
2555
          case "array":
2556
            return Array.prototype.concat.apply([], dataArray);
2557
        case "uint8array":
2558
            res = new Uint8Array(totalLength);
2559
            for(i = 0; i < dataArray.length; i++) {
2560
                res.set(dataArray[i], index);
2561
                index += dataArray[i].length;
2562
            }
2563
            return res;
2564
        case "nodebuffer":
2565
            return Buffer.concat(dataArray);
2566
        default:
2567
            throw new Error("concat : unsupported type '"  + type + "'");
2568
    }
2569
}
2570

    
2571
/**
2572
 * Listen a StreamHelper, accumulate its content and concatenate it into a
2573
 * complete block.
2574
 * @param {StreamHelper} helper the helper to use.
2575
 * @param {Function} updateCallback a callback called on each update. Called
2576
 * with one arg :
2577
 * - the metadata linked to the update received.
2578
 * @return Promise the promise for the accumulation.
2579
 */
2580
function accumulate(helper, updateCallback) {
2581
    return new external.Promise(function (resolve, reject){
2582
        var dataArray = [];
2583
        var chunkType = helper._internalType,
2584
            resultType = helper._outputType,
2585
            mimeType = helper._mimeType;
2586
        helper
2587
        .on('data', function (data, meta) {
2588
            dataArray.push(data);
2589
            if(updateCallback) {
2590
                updateCallback(meta);
2591
            }
2592
        })
2593
        .on('error', function(err) {
2594
            dataArray = [];
2595
            reject(err);
2596
        })
2597
        .on('end', function (){
2598
            try {
2599
                var result = transformZipOutput(resultType, concat(chunkType, dataArray), mimeType);
2600
                resolve(result);
2601
            } catch (e) {
2602
                reject(e);
2603
            }
2604
            dataArray = [];
2605
        })
2606
        .resume();
2607
    });
2608
}
2609

    
2610
/**
2611
 * An helper to easily use workers outside of JSZip.
2612
 * @constructor
2613
 * @param {Worker} worker the worker to wrap
2614
 * @param {String} outputType the type of data expected by the use
2615
 * @param {String} mimeType the mime type of the content, if applicable.
2616
 */
2617
function StreamHelper(worker, outputType, mimeType) {
2618
    var internalType = outputType;
2619
    switch(outputType) {
2620
        case "blob":
2621
        case "arraybuffer":
2622
            internalType = "uint8array";
2623
        break;
2624
        case "base64":
2625
            internalType = "string";
2626
        break;
2627
    }
2628

    
2629
    try {
2630
        // the type used internally
2631
        this._internalType = internalType;
2632
        // the type used to output results
2633
        this._outputType = outputType;
2634
        // the mime type
2635
        this._mimeType = mimeType;
2636
        utils.checkSupport(internalType);
2637
        this._worker = worker.pipe(new ConvertWorker(internalType));
2638
        // the last workers can be rewired without issues but we need to
2639
        // prevent any updates on previous workers.
2640
        worker.lock();
2641
    } catch(e) {
2642
        this._worker = new GenericWorker("error");
2643
        this._worker.error(e);
2644
    }
2645
}
2646

    
2647
StreamHelper.prototype = {
2648
    /**
2649
     * Listen a StreamHelper, accumulate its content and concatenate it into a
2650
     * complete block.
2651
     * @param {Function} updateCb the update callback.
2652
     * @return Promise the promise for the accumulation.
2653
     */
2654
    accumulate : function (updateCb) {
2655
        return accumulate(this, updateCb);
2656
    },
2657
    /**
2658
     * Add a listener on an event triggered on a stream.
2659
     * @param {String} evt the name of the event
2660
     * @param {Function} fn the listener
2661
     * @return {StreamHelper} the current helper.
2662
     */
2663
    on : function (evt, fn) {
2664
        var self = this;
2665

    
2666
        if(evt === "data") {
2667
            this._worker.on(evt, function (chunk) {
2668
                fn.call(self, chunk.data, chunk.meta);
2669
            });
2670
        } else {
2671
            this._worker.on(evt, function () {
2672
                utils.delay(fn, arguments, self);
2673
            });
2674
        }
2675
        return this;
2676
    },
2677
    /**
2678
     * Resume the flow of chunks.
2679
     * @return {StreamHelper} the current helper.
2680
     */
2681
    resume : function () {
2682
        utils.delay(this._worker.resume, [], this._worker);
2683
        return this;
2684
    },
2685
    /**
2686
     * Pause the flow of chunks.
2687
     * @return {StreamHelper} the current helper.
2688
     */
2689
    pause : function () {
2690
        this._worker.pause();
2691
        return this;
2692
    },
2693
    /**
2694
     * Return a nodejs stream for this helper.
2695
     * @param {Function} updateCb the update callback.
2696
     * @return {NodejsStreamOutputAdapter} the nodejs stream.
2697
     */
2698
    toNodejsStream : function (updateCb) {
2699
        utils.checkSupport("nodestream");
2700
        if (this._outputType !== "nodebuffer") {
2701
            // an object stream containing blob/arraybuffer/uint8array/string
2702
            // is strange and I don't know if it would be useful.
2703
            // I you find this comment and have a good usecase, please open a
2704
            // bug report !
2705
            throw new Error(this._outputType + " is not supported by this method");
2706
        }
2707

    
2708
        return new NodejsStreamOutputAdapter(this, {
2709
            objectMode : this._outputType !== "nodebuffer"
2710
        }, updateCb);
2711
    }
2712
};
2713

    
2714

    
2715
module.exports = StreamHelper;
2716

    
2717
},{"../base64":1,"../external":6,"../nodejs/NodejsStreamOutputAdapter":13,"../support":30,"../utils":32,"./ConvertWorker":24,"./GenericWorker":28}],30:[function(require,module,exports){
2718
'use strict';
2719

    
2720
exports.base64 = true;
2721
exports.array = true;
2722
exports.string = true;
2723
exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
2724
exports.nodebuffer = typeof Buffer !== "undefined";
2725
// contains true if JSZip can read/generate Uint8Array, false otherwise.
2726
exports.uint8array = typeof Uint8Array !== "undefined";
2727

    
2728
if (typeof ArrayBuffer === "undefined") {
2729
    exports.blob = false;
2730
}
2731
else {
2732
    var buffer = new ArrayBuffer(0);
2733
    try {
2734
        exports.blob = new Blob([buffer], {
2735
            type: "application/zip"
2736
        }).size === 0;
2737
    }
2738
    catch (e) {
2739
        try {
2740
            var Builder = self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder;
2741
            var builder = new Builder();
2742
            builder.append(buffer);
2743
            exports.blob = builder.getBlob('application/zip').size === 0;
2744
        }
2745
        catch (e) {
2746
            exports.blob = false;
2747
        }
2748
    }
2749
}
2750

    
2751
try {
2752
    exports.nodestream = !!require('readable-stream').Readable;
2753
} catch(e) {
2754
    exports.nodestream = false;
2755
}
2756

    
2757
},{"readable-stream":16}],31:[function(require,module,exports){
2758
'use strict';
2759

    
2760
var utils = require('./utils');
2761
var support = require('./support');
2762
var nodejsUtils = require('./nodejsUtils');
2763
var GenericWorker = require('./stream/GenericWorker');
2764

    
2765
/**
2766
 * The following functions come from pako, from pako/lib/utils/strings
2767
 * released under the MIT license, see pako https://github.com/nodeca/pako/
2768
 */
2769

    
2770
// Table with utf8 lengths (calculated by first byte of sequence)
2771
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
2772
// because max possible codepoint is 0x10ffff
2773
var _utf8len = new Array(256);
2774
for (var i=0; i<256; i++) {
2775
  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
2776
}
2777
_utf8len[254]=_utf8len[254]=1; // Invalid sequence start
2778

    
2779
// convert string to array (typed, when possible)
2780
var string2buf = function (str) {
2781
    var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
2782

    
2783
    // count binary size
2784
    for (m_pos = 0; m_pos < str_len; m_pos++) {
2785
        c = str.charCodeAt(m_pos);
2786
        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
2787
            c2 = str.charCodeAt(m_pos+1);
2788
            if ((c2 & 0xfc00) === 0xdc00) {
2789
                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
2790
                m_pos++;
2791
            }
2792
        }
2793
        buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
2794
    }
2795

    
2796
    // allocate buffer
2797
    if (support.uint8array) {
2798
        buf = new Uint8Array(buf_len);
2799
    } else {
2800
        buf = new Array(buf_len);
2801
    }
2802

    
2803
    // convert
2804
    for (i=0, m_pos = 0; i < buf_len; m_pos++) {
2805
        c = str.charCodeAt(m_pos);
2806
        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
2807
            c2 = str.charCodeAt(m_pos+1);
2808
            if ((c2 & 0xfc00) === 0xdc00) {
2809
                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
2810
                m_pos++;
2811
            }
2812
        }
2813
        if (c < 0x80) {
2814
            /* one byte */
2815
            buf[i++] = c;
2816
        } else if (c < 0x800) {
2817
            /* two bytes */
2818
            buf[i++] = 0xC0 | (c >>> 6);
2819
            buf[i++] = 0x80 | (c & 0x3f);
2820
        } else if (c < 0x10000) {
2821
            /* three bytes */
2822
            buf[i++] = 0xE0 | (c >>> 12);
2823
            buf[i++] = 0x80 | (c >>> 6 & 0x3f);
2824
            buf[i++] = 0x80 | (c & 0x3f);
2825
        } else {
2826
            /* four bytes */
2827
            buf[i++] = 0xf0 | (c >>> 18);
2828
            buf[i++] = 0x80 | (c >>> 12 & 0x3f);
2829
            buf[i++] = 0x80 | (c >>> 6 & 0x3f);
2830
            buf[i++] = 0x80 | (c & 0x3f);
2831
        }
2832
    }
2833

    
2834
    return buf;
2835
};
2836

    
2837
// Calculate max possible position in utf8 buffer,
2838
// that will not break sequence. If that's not possible
2839
// - (very small limits) return max size as is.
2840
//
2841
// buf[] - utf8 bytes array
2842
// max   - length limit (mandatory);
2843
var utf8border = function(buf, max) {
2844
    var pos;
2845

    
2846
    max = max || buf.length;
2847
    if (max > buf.length) { max = buf.length; }
2848

    
2849
    // go back from last position, until start of sequence found
2850
    pos = max-1;
2851
    while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
2852

    
2853
    // Fuckup - very small and broken sequence,
2854
    // return max, because we should return something anyway.
2855
    if (pos < 0) { return max; }
2856

    
2857
    // If we came to start of buffer - that means vuffer is too small,
2858
    // return max too.
2859
    if (pos === 0) { return max; }
2860

    
2861
    return (pos + _utf8len[buf[pos]] > max) ? pos : max;
2862
};
2863

    
2864
// convert array to string
2865
var buf2string = function (buf) {
2866
    var str, i, out, c, c_len;
2867
    var len = buf.length;
2868

    
2869
    // Reserve max possible length (2 words per char)
2870
    // NB: by unknown reasons, Array is significantly faster for
2871
    //     String.fromCharCode.apply than Uint16Array.
2872
    var utf16buf = new Array(len*2);
2873

    
2874
    for (out=0, i=0; i<len;) {
2875
        c = buf[i++];
2876
        // quick process ascii
2877
        if (c < 0x80) { utf16buf[out++] = c; continue; }
2878

    
2879
        c_len = _utf8len[c];
2880
        // skip 5 & 6 byte codes
2881
        if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
2882

    
2883
        // apply mask on first byte
2884
        c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
2885
        // join the rest
2886
        while (c_len > 1 && i < len) {
2887
            c = (c << 6) | (buf[i++] & 0x3f);
2888
            c_len--;
2889
        }
2890

    
2891
        // terminated by end of string?
2892
        if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
2893

    
2894
        if (c < 0x10000) {
2895
            utf16buf[out++] = c;
2896
        } else {
2897
            c -= 0x10000;
2898
            utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
2899
            utf16buf[out++] = 0xdc00 | (c & 0x3ff);
2900
        }
2901
    }
2902

    
2903
    // shrinkBuf(utf16buf, out)
2904
    if (utf16buf.length !== out) {
2905
        if(utf16buf.subarray) {
2906
            utf16buf = utf16buf.subarray(0, out);
2907
        } else {
2908
            utf16buf.length = out;
2909
        }
2910
    }
2911

    
2912
    // return String.fromCharCode.apply(null, utf16buf);
2913
    return utils.applyFromCharCode(utf16buf);
2914
};
2915

    
2916

    
2917
// That's all for the pako functions.
2918

    
2919

    
2920
/**
2921
 * Transform a javascript string into an array (typed if possible) of bytes,
2922
 * UTF-8 encoded.
2923
 * @param {String} str the string to encode
2924
 * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
2925
 */
2926
exports.utf8encode = function utf8encode(str) {
2927
    if (support.nodebuffer) {
2928
        return nodejsUtils.newBufferFrom(str, "utf-8");
2929
    }
2930

    
2931
    return string2buf(str);
2932
};
2933

    
2934

    
2935
/**
2936
 * Transform a bytes array (or a representation) representing an UTF-8 encoded
2937
 * string into a javascript string.
2938
 * @param {Array|Uint8Array|Buffer} buf the data de decode
2939
 * @return {String} the decoded string.
2940
 */
2941
exports.utf8decode = function utf8decode(buf) {
2942
    if (support.nodebuffer) {
2943
        return utils.transformTo("nodebuffer", buf).toString("utf-8");
2944
    }
2945

    
2946
    buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
2947

    
2948
    return buf2string(buf);
2949
};
2950

    
2951
/**
2952
 * A worker to decode utf8 encoded binary chunks into string chunks.
2953
 * @constructor
2954
 */
2955
function Utf8DecodeWorker() {
2956
    GenericWorker.call(this, "utf-8 decode");
2957
    // the last bytes if a chunk didn't end with a complete codepoint.
2958
    this.leftOver = null;
2959
}
2960
utils.inherits(Utf8DecodeWorker, GenericWorker);
2961

    
2962
/**
2963
 * @see GenericWorker.processChunk
2964
 */
2965
Utf8DecodeWorker.prototype.processChunk = function (chunk) {
2966

    
2967
    var data = utils.transformTo(support.uint8array ? "uint8array" : "array", chunk.data);
2968

    
2969
    // 1st step, re-use what's left of the previous chunk
2970
    if (this.leftOver && this.leftOver.length) {
2971
        if(support.uint8array) {
2972
            var previousData = data;
2973
            data = new Uint8Array(previousData.length + this.leftOver.length);
2974
            data.set(this.leftOver, 0);
2975
            data.set(previousData, this.leftOver.length);
2976
        } else {
2977
            data = this.leftOver.concat(data);
2978
        }
2979
        this.leftOver = null;
2980
    }
2981

    
2982
    var nextBoundary = utf8border(data);
2983
    var usableData = data;
2984
    if (nextBoundary !== data.length) {
2985
        if (support.uint8array) {
2986
            usableData = data.subarray(0, nextBoundary);
2987
            this.leftOver = data.subarray(nextBoundary, data.length);
2988
        } else {
2989
            usableData = data.slice(0, nextBoundary);
2990
            this.leftOver = data.slice(nextBoundary, data.length);
2991
        }
2992
    }
2993

    
2994
    this.push({
2995
        data : exports.utf8decode(usableData),
2996
        meta : chunk.meta
2997
    });
2998
};
2999

    
3000
/**
3001
 * @see GenericWorker.flush
3002
 */
3003
Utf8DecodeWorker.prototype.flush = function () {
3004
    if(this.leftOver && this.leftOver.length) {
3005
        this.push({
3006
            data : exports.utf8decode(this.leftOver),
3007
            meta : {}
3008
        });
3009
        this.leftOver = null;
3010
    }
3011
};
3012
exports.Utf8DecodeWorker = Utf8DecodeWorker;
3013

    
3014
/**
3015
 * A worker to endcode string chunks into utf8 encoded binary chunks.
3016
 * @constructor
3017
 */
3018
function Utf8EncodeWorker() {
3019
    GenericWorker.call(this, "utf-8 encode");
3020
}
3021
utils.inherits(Utf8EncodeWorker, GenericWorker);
3022

    
3023
/**
3024
 * @see GenericWorker.processChunk
3025
 */
3026
Utf8EncodeWorker.prototype.processChunk = function (chunk) {
3027
    this.push({
3028
        data : exports.utf8encode(chunk.data),
3029
        meta : chunk.meta
3030
    });
3031
};
3032
exports.Utf8EncodeWorker = Utf8EncodeWorker;
3033

    
3034
},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(require,module,exports){
3035
'use strict';
3036

    
3037
var support = require('./support');
3038
var base64 = require('./base64');
3039
var nodejsUtils = require('./nodejsUtils');
3040
var setImmediate = require('set-immediate-shim');
3041
var external = require("./external");
3042

    
3043

    
3044
/**
3045
 * Convert a string that pass as a "binary string": it should represent a byte
3046
 * array but may have > 255 char codes. Be sure to take only the first byte
3047
 * and returns the byte array.
3048
 * @param {String} str the string to transform.
3049
 * @return {Array|Uint8Array} the string in a binary format.
3050
 */
3051
function string2binary(str) {
3052
    var result = null;
3053
    if (support.uint8array) {
3054
      result = new Uint8Array(str.length);
3055
    } else {
3056
      result = new Array(str.length);
3057
    }
3058
    return stringToArrayLike(str, result);
3059
}
3060

    
3061
/**
3062
 * Create a new blob with the given content and the given type.
3063
 * @param {String|ArrayBuffer} part the content to put in the blob. DO NOT use
3064
 * an Uint8Array because the stock browser of android 4 won't accept it (it
3065
 * will be silently converted to a string, "[object Uint8Array]").
3066
 *
3067
 * Use only ONE part to build the blob to avoid a memory leak in IE11 / Edge:
3068
 * when a large amount of Array is used to create the Blob, the amount of
3069
 * memory consumed is nearly 100 times the original data amount.
3070
 *
3071
 * @param {String} type the mime type of the blob.
3072
 * @return {Blob} the created blob.
3073
 */
3074
exports.newBlob = function(part, type) {
3075
    exports.checkSupport("blob");
3076

    
3077
    try {
3078
        // Blob constructor
3079
        return new Blob([part], {
3080
            type: type
3081
        });
3082
    }
3083
    catch (e) {
3084

    
3085
        try {
3086
            // deprecated, browser only, old way
3087
            var Builder = self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder;
3088
            var builder = new Builder();
3089
            builder.append(part);
3090
            return builder.getBlob(type);
3091
        }
3092
        catch (e) {
3093

    
3094
            // well, fuck ?!
3095
            throw new Error("Bug : can't construct the Blob.");
3096
        }
3097
    }
3098

    
3099

    
3100
};
3101
/**
3102
 * The identity function.
3103
 * @param {Object} input the input.
3104
 * @return {Object} the same input.
3105
 */
3106
function identity(input) {
3107
    return input;
3108
}
3109

    
3110
/**
3111
 * Fill in an array with a string.
3112
 * @param {String} str the string to use.
3113
 * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
3114
 * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
3115
 */
3116
function stringToArrayLike(str, array) {
3117
    for (var i = 0; i < str.length; ++i) {
3118
        array[i] = str.charCodeAt(i) & 0xFF;
3119
    }
3120
    return array;
3121
}
3122

    
3123
/**
3124
 * An helper for the function arrayLikeToString.
3125
 * This contains static informations and functions that
3126
 * can be optimized by the browser JIT compiler.
3127
 */
3128
var arrayToStringHelper = {
3129
    /**
3130
     * Transform an array of int into a string, chunk by chunk.
3131
     * See the performances notes on arrayLikeToString.
3132
     * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
3133
     * @param {String} type the type of the array.
3134
     * @param {Integer} chunk the chunk size.
3135
     * @return {String} the resulting string.
3136
     * @throws Error if the chunk is too big for the stack.
3137
     */
3138
    stringifyByChunk: function(array, type, chunk) {
3139
        var result = [], k = 0, len = array.length;
3140
        // shortcut
3141
        if (len <= chunk) {
3142
            return String.fromCharCode.apply(null, array);
3143
        }
3144
        while (k < len) {
3145
            if (type === "array" || type === "nodebuffer") {
3146
                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
3147
            }
3148
            else {
3149
                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
3150
            }
3151
            k += chunk;
3152
        }
3153
        return result.join("");
3154
    },
3155
    /**
3156
     * Call String.fromCharCode on every item in the array.
3157
     * This is the naive implementation, which generate A LOT of intermediate string.
3158
     * This should be used when everything else fail.
3159
     * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
3160
     * @return {String} the result.
3161
     */
3162
    stringifyByChar: function(array){
3163
        var resultStr = "";
3164
        for(var i = 0; i < array.length; i++) {
3165
            resultStr += String.fromCharCode(array[i]);
3166
        }
3167
        return resultStr;
3168
    },
3169
    applyCanBeUsed : {
3170
        /**
3171
         * true if the browser accepts to use String.fromCharCode on Uint8Array
3172
         */
3173
        uint8array : (function () {
3174
            try {
3175
                return support.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
3176
            } catch (e) {
3177
                return false;
3178
            }
3179
        })(),
3180
        /**
3181
         * true if the browser accepts to use String.fromCharCode on nodejs Buffer.
3182
         */
3183
        nodebuffer : (function () {
3184
            try {
3185
                return support.nodebuffer && String.fromCharCode.apply(null, nodejsUtils.allocBuffer(1)).length === 1;
3186
            } catch (e) {
3187
                return false;
3188
            }
3189
        })()
3190
    }
3191
};
3192

    
3193
/**
3194
 * Transform an array-like object to a string.
3195
 * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
3196
 * @return {String} the result.
3197
 */
3198
function arrayLikeToString(array) {
3199
    // Performances notes :
3200
    // --------------------
3201
    // String.fromCharCode.apply(null, array) is the fastest, see
3202
    // see http://jsperf.com/converting-a-uint8array-to-a-string/2
3203
    // but the stack is limited (and we can get huge arrays !).
3204
    //
3205
    // result += String.fromCharCode(array[i]); generate too many strings !
3206
    //
3207
    // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
3208
    // TODO : we now have workers that split the work. Do we still need that ?
3209
    var chunk = 65536,
3210
        type = exports.getTypeOf(array),
3211
        canUseApply = true;
3212
    if (type === "uint8array") {
3213
        canUseApply = arrayToStringHelper.applyCanBeUsed.uint8array;
3214
    } else if (type === "nodebuffer") {
3215
        canUseApply = arrayToStringHelper.applyCanBeUsed.nodebuffer;
3216
    }
3217

    
3218
    if (canUseApply) {
3219
        while (chunk > 1) {
3220
            try {
3221
                return arrayToStringHelper.stringifyByChunk(array, type, chunk);
3222
            } catch (e) {
3223
                chunk = Math.floor(chunk / 2);
3224
            }
3225
        }
3226
    }
3227

    
3228
    // no apply or chunk error : slow and painful algorithm
3229
    // default browser on android 4.*
3230
    return arrayToStringHelper.stringifyByChar(array);
3231
}
3232

    
3233
exports.applyFromCharCode = arrayLikeToString;
3234

    
3235

    
3236
/**
3237
 * Copy the data from an array-like to an other array-like.
3238
 * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
3239
 * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
3240
 * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
3241
 */
3242
function arrayLikeToArrayLike(arrayFrom, arrayTo) {
3243
    for (var i = 0; i < arrayFrom.length; i++) {
3244
        arrayTo[i] = arrayFrom[i];
3245
    }
3246
    return arrayTo;
3247
}
3248

    
3249
// a matrix containing functions to transform everything into everything.
3250
var transform = {};
3251

    
3252
// string to ?
3253
transform["string"] = {
3254
    "string": identity,
3255
    "array": function(input) {
3256
        return stringToArrayLike(input, new Array(input.length));
3257
    },
3258
    "arraybuffer": function(input) {
3259
        return transform["string"]["uint8array"](input).buffer;
3260
    },
3261
    "uint8array": function(input) {
3262
        return stringToArrayLike(input, new Uint8Array(input.length));
3263
    },
3264
    "nodebuffer": function(input) {
3265
        return stringToArrayLike(input, nodejsUtils.allocBuffer(input.length));
3266
    }
3267
};
3268

    
3269
// array to ?
3270
transform["array"] = {
3271
    "string": arrayLikeToString,
3272
    "array": identity,
3273
    "arraybuffer": function(input) {
3274
        return (new Uint8Array(input)).buffer;
3275
    },
3276
    "uint8array": function(input) {
3277
        return new Uint8Array(input);
3278
    },
3279
    "nodebuffer": function(input) {
3280
        return nodejsUtils.newBufferFrom(input);
3281
    }
3282
};
3283

    
3284
// arraybuffer to ?
3285
transform["arraybuffer"] = {
3286
    "string": function(input) {
3287
        return arrayLikeToString(new Uint8Array(input));
3288
    },
3289
    "array": function(input) {
3290
        return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
3291
    },
3292
    "arraybuffer": identity,
3293
    "uint8array": function(input) {
3294
        return new Uint8Array(input);
3295
    },
3296
    "nodebuffer": function(input) {
3297
        return nodejsUtils.newBufferFrom(new Uint8Array(input));
3298
    }
3299
};
3300

    
3301
// uint8array to ?
3302
transform["uint8array"] = {
3303
    "string": arrayLikeToString,
3304
    "array": function(input) {
3305
        return arrayLikeToArrayLike(input, new Array(input.length));
3306
    },
3307
    "arraybuffer": function(input) {
3308
        return input.buffer;
3309
    },
3310
    "uint8array": identity,
3311
    "nodebuffer": function(input) {
3312
        return nodejsUtils.newBufferFrom(input);
3313
    }
3314
};
3315

    
3316
// nodebuffer to ?
3317
transform["nodebuffer"] = {
3318
    "string": arrayLikeToString,
3319
    "array": function(input) {
3320
        return arrayLikeToArrayLike(input, new Array(input.length));
3321
    },
3322
    "arraybuffer": function(input) {
3323
        return transform["nodebuffer"]["uint8array"](input).buffer;
3324
    },
3325
    "uint8array": function(input) {
3326
        return arrayLikeToArrayLike(input, new Uint8Array(input.length));
3327
    },
3328
    "nodebuffer": identity
3329
};
3330

    
3331
/**
3332
 * Transform an input into any type.
3333
 * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
3334
 * If no output type is specified, the unmodified input will be returned.
3335
 * @param {String} outputType the output type.
3336
 * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
3337
 * @throws {Error} an Error if the browser doesn't support the requested output type.
3338
 */
3339
exports.transformTo = function(outputType, input) {
3340
    if (!input) {
3341
        // undefined, null, etc
3342
        // an empty string won't harm.
3343
        input = "";
3344
    }
3345
    if (!outputType) {
3346
        return input;
3347
    }
3348
    exports.checkSupport(outputType);
3349
    var inputType = exports.getTypeOf(input);
3350
    var result = transform[inputType][outputType](input);
3351
    return result;
3352
};
3353

    
3354
/**
3355
 * Return the type of the input.
3356
 * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
3357
 * @param {Object} input the input to identify.
3358
 * @return {String} the (lowercase) type of the input.
3359
 */
3360
exports.getTypeOf = function(input) {
3361
    if (typeof input === "string") {
3362
        return "string";
3363
    }
3364
    if (Object.prototype.toString.call(input) === "[object Array]") {
3365
        return "array";
3366
    }
3367
    if (support.nodebuffer && nodejsUtils.isBuffer(input)) {
3368
        return "nodebuffer";
3369
    }
3370
    if (support.uint8array && input instanceof Uint8Array) {
3371
        return "uint8array";
3372
    }
3373
    if (support.arraybuffer && input instanceof ArrayBuffer) {
3374
        return "arraybuffer";
3375
    }
3376
};
3377

    
3378
/**
3379
 * Throw an exception if the type is not supported.
3380
 * @param {String} type the type to check.
3381
 * @throws {Error} an Error if the browser doesn't support the requested type.
3382
 */
3383
exports.checkSupport = function(type) {
3384
    var supported = support[type.toLowerCase()];
3385
    if (!supported) {
3386
        throw new Error(type + " is not supported by this platform");
3387
    }
3388
};
3389

    
3390
exports.MAX_VALUE_16BITS = 65535;
3391
exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
3392

    
3393
/**
3394
 * Prettify a string read as binary.
3395
 * @param {string} str the string to prettify.
3396
 * @return {string} a pretty string.
3397
 */
3398
exports.pretty = function(str) {
3399
    var res = '',
3400
        code, i;
3401
    for (i = 0; i < (str || "").length; i++) {
3402
        code = str.charCodeAt(i);
3403
        res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
3404
    }
3405
    return res;
3406
};
3407

    
3408
/**
3409
 * Defer the call of a function.
3410
 * @param {Function} callback the function to call asynchronously.
3411
 * @param {Array} args the arguments to give to the callback.
3412
 */
3413
exports.delay = function(callback, args, self) {
3414
    setImmediate(function () {
3415
        callback.apply(self || null, args || []);
3416
    });
3417
};
3418

    
3419
/**
3420
 * Extends a prototype with an other, without calling a constructor with
3421
 * side effects. Inspired by nodejs' `utils.inherits`
3422
 * @param {Function} ctor the constructor to augment
3423
 * @param {Function} superCtor the parent constructor to use
3424
 */
3425
exports.inherits = function (ctor, superCtor) {
3426
    var Obj = function() {};
3427
    Obj.prototype = superCtor.prototype;
3428
    ctor.prototype = new Obj();
3429
};
3430

    
3431
/**
3432
 * Merge the objects passed as parameters into a new one.
3433
 * @private
3434
 * @param {...Object} var_args All objects to merge.
3435
 * @return {Object} a new object with the data of the others.
3436
 */
3437
exports.extend = function() {
3438
    var result = {}, i, attr;
3439
    for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
3440
        for (attr in arguments[i]) {
3441
            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
3442
                result[attr] = arguments[i][attr];
3443
            }
3444
        }
3445
    }
3446
    return result;
3447
};
3448

    
3449
/**
3450
 * Transform arbitrary content into a Promise.
3451
 * @param {String} name a name for the content being processed.
3452
 * @param {Object} inputData the content to process.
3453
 * @param {Boolean} isBinary true if the content is not an unicode string
3454
 * @param {Boolean} isOptimizedBinaryString true if the string content only has one byte per character.
3455
 * @param {Boolean} isBase64 true if the string content is encoded with base64.
3456
 * @return {Promise} a promise in a format usable by JSZip.
3457
 */
3458
exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinaryString, isBase64) {
3459

    
3460
    // if inputData is already a promise, this flatten it.
3461
    var promise = external.Promise.resolve(inputData).then(function(data) {
3462
        
3463
        
3464
        var isBlob = support.blob && (data instanceof Blob || ['[object File]', '[object Blob]'].indexOf(Object.prototype.toString.call(data)) !== -1);
3465

    
3466
        if (isBlob && typeof FileReader !== "undefined") {
3467
            return new external.Promise(function (resolve, reject) {
3468
                var reader = new FileReader();
3469

    
3470
                reader.onload = function(e) {
3471
                    resolve(e.target.result);
3472
                };
3473
                reader.onerror = function(e) {
3474
                    reject(e.target.error);
3475
                };
3476
                reader.readAsArrayBuffer(data);
3477
            });
3478
        } else {
3479
            return data;
3480
        }
3481
    });
3482

    
3483
    return promise.then(function(data) {
3484
        var dataType = exports.getTypeOf(data);
3485

    
3486
        if (!dataType) {
3487
            return external.Promise.reject(
3488
                new Error("Can't read the data of '" + name + "'. Is it " +
3489
                          "in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?")
3490
            );
3491
        }
3492
        // special case : it's way easier to work with Uint8Array than with ArrayBuffer
3493
        if (dataType === "arraybuffer") {
3494
            data = exports.transformTo("uint8array", data);
3495
        } else if (dataType === "string") {
3496
            if (isBase64) {
3497
                data = base64.decode(data);
3498
            }
3499
            else if (isBinary) {
3500
                // optimizedBinaryString === true means that the file has already been filtered with a 0xFF mask
3501
                if (isOptimizedBinaryString !== true) {
3502
                    // this is a string, not in a base64 format.
3503
                    // Be sure that this is a correct "binary string"
3504
                    data = string2binary(data);
3505
                }
3506
            }
3507
        }
3508
        return data;
3509
    });
3510
};
3511

    
3512
},{"./base64":1,"./external":6,"./nodejsUtils":14,"./support":30,"set-immediate-shim":54}],33:[function(require,module,exports){
3513
'use strict';
3514
var readerFor = require('./reader/readerFor');
3515
var utils = require('./utils');
3516
var sig = require('./signature');
3517
var ZipEntry = require('./zipEntry');
3518
var utf8 = require('./utf8');
3519
var support = require('./support');
3520
//  class ZipEntries {{{
3521
/**
3522
 * All the entries in the zip file.
3523
 * @constructor
3524
 * @param {Object} loadOptions Options for loading the stream.
3525
 */
3526
function ZipEntries(loadOptions) {
3527
    this.files = [];
3528
    this.loadOptions = loadOptions;
3529
}
3530
ZipEntries.prototype = {
3531
    /**
3532
     * Check that the reader is on the specified signature.
3533
     * @param {string} expectedSignature the expected signature.
3534
     * @throws {Error} if it is an other signature.
3535
     */
3536
    checkSignature: function(expectedSignature) {
3537
        if (!this.reader.readAndCheckSignature(expectedSignature)) {
3538
            this.reader.index -= 4;
3539
            var signature = this.reader.readString(4);
3540
            throw new Error("Corrupted zip or bug: unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
3541
        }
3542
    },
3543
    /**
3544
     * Check if the given signature is at the given index.
3545
     * @param {number} askedIndex the index to check.
3546
     * @param {string} expectedSignature the signature to expect.
3547
     * @return {boolean} true if the signature is here, false otherwise.
3548
     */
3549
    isSignature: function(askedIndex, expectedSignature) {
3550
        var currentIndex = this.reader.index;
3551
        this.reader.setIndex(askedIndex);
3552
        var signature = this.reader.readString(4);
3553
        var result = signature === expectedSignature;
3554
        this.reader.setIndex(currentIndex);
3555
        return result;
3556
    },
3557
    /**
3558
     * Read the end of the central directory.
3559
     */
3560
    readBlockEndOfCentral: function() {
3561
        this.diskNumber = this.reader.readInt(2);
3562
        this.diskWithCentralDirStart = this.reader.readInt(2);
3563
        this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
3564
        this.centralDirRecords = this.reader.readInt(2);
3565
        this.centralDirSize = this.reader.readInt(4);
3566
        this.centralDirOffset = this.reader.readInt(4);
3567

    
3568
        this.zipCommentLength = this.reader.readInt(2);
3569
        // warning : the encoding depends of the system locale
3570
        // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
3571
        // On a windows machine, this field is encoded with the localized windows code page.
3572
        var zipComment = this.reader.readData(this.zipCommentLength);
3573
        var decodeParamType = support.uint8array ? "uint8array" : "array";
3574
        // To get consistent behavior with the generation part, we will assume that
3575
        // this is utf8 encoded unless specified otherwise.
3576
        var decodeContent = utils.transformTo(decodeParamType, zipComment);
3577
        this.zipComment = this.loadOptions.decodeFileName(decodeContent);
3578
    },
3579
    /**
3580
     * Read the end of the Zip 64 central directory.
3581
     * Not merged with the method readEndOfCentral :
3582
     * The end of central can coexist with its Zip64 brother,
3583
     * I don't want to read the wrong number of bytes !
3584
     */
3585
    readBlockZip64EndOfCentral: function() {
3586
        this.zip64EndOfCentralSize = this.reader.readInt(8);
3587
        this.reader.skip(4);
3588
        // this.versionMadeBy = this.reader.readString(2);
3589
        // this.versionNeeded = this.reader.readInt(2);
3590
        this.diskNumber = this.reader.readInt(4);
3591
        this.diskWithCentralDirStart = this.reader.readInt(4);
3592
        this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
3593
        this.centralDirRecords = this.reader.readInt(8);
3594
        this.centralDirSize = this.reader.readInt(8);
3595
        this.centralDirOffset = this.reader.readInt(8);
3596

    
3597
        this.zip64ExtensibleData = {};
3598
        var extraDataSize = this.zip64EndOfCentralSize - 44,
3599
            index = 0,
3600
            extraFieldId,
3601
            extraFieldLength,
3602
            extraFieldValue;
3603
        while (index < extraDataSize) {
3604
            extraFieldId = this.reader.readInt(2);
3605
            extraFieldLength = this.reader.readInt(4);
3606
            extraFieldValue = this.reader.readData(extraFieldLength);
3607
            this.zip64ExtensibleData[extraFieldId] = {
3608
                id: extraFieldId,
3609
                length: extraFieldLength,
3610
                value: extraFieldValue
3611
            };
3612
        }
3613
    },
3614
    /**
3615
     * Read the end of the Zip 64 central directory locator.
3616
     */
3617
    readBlockZip64EndOfCentralLocator: function() {
3618
        this.diskWithZip64CentralDirStart = this.reader.readInt(4);
3619
        this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
3620
        this.disksCount = this.reader.readInt(4);
3621
        if (this.disksCount > 1) {
3622
            throw new Error("Multi-volumes zip are not supported");
3623
        }
3624
    },
3625
    /**
3626
     * Read the local files, based on the offset read in the central part.
3627
     */
3628
    readLocalFiles: function() {
3629
        var i, file;
3630
        for (i = 0; i < this.files.length; i++) {
3631
            file = this.files[i];
3632
            this.reader.setIndex(file.localHeaderOffset);
3633
            this.checkSignature(sig.LOCAL_FILE_HEADER);
3634
            file.readLocalPart(this.reader);
3635
            file.handleUTF8();
3636
            file.processAttributes();
3637
        }
3638
    },
3639
    /**
3640
     * Read the central directory.
3641
     */
3642
    readCentralDir: function() {
3643
        var file;
3644

    
3645
        this.reader.setIndex(this.centralDirOffset);
3646
        while (this.reader.readAndCheckSignature(sig.CENTRAL_FILE_HEADER)) {
3647
            file = new ZipEntry({
3648
                zip64: this.zip64
3649
            }, this.loadOptions);
3650
            file.readCentralPart(this.reader);
3651
            this.files.push(file);
3652
        }
3653

    
3654
        if (this.centralDirRecords !== this.files.length) {
3655
            if (this.centralDirRecords !== 0 && this.files.length === 0) {
3656
                // We expected some records but couldn't find ANY.
3657
                // This is really suspicious, as if something went wrong.
3658
                throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
3659
            } else {
3660
                // We found some records but not all.
3661
                // Something is wrong but we got something for the user: no error here.
3662
                // console.warn("expected", this.centralDirRecords, "records in central dir, got", this.files.length);
3663
            }
3664
        }
3665
    },
3666
    /**
3667
     * Read the end of central directory.
3668
     */
3669
    readEndOfCentral: function() {
3670
        var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
3671
        if (offset < 0) {
3672
            // Check if the content is a truncated zip or complete garbage.
3673
            // A "LOCAL_FILE_HEADER" is not required at the beginning (auto
3674
            // extractible zip for example) but it can give a good hint.
3675
            // If an ajax request was used without responseType, we will also
3676
            // get unreadable data.
3677
            var isGarbage = !this.isSignature(0, sig.LOCAL_FILE_HEADER);
3678

    
3679
            if (isGarbage) {
3680
                throw new Error("Can't find end of central directory : is this a zip file ? " +
3681
                                "If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
3682
            } else {
3683
                throw new Error("Corrupted zip: can't find end of central directory");
3684
            }
3685

    
3686
        }
3687
        this.reader.setIndex(offset);
3688
        var endOfCentralDirOffset = offset;
3689
        this.checkSignature(sig.CENTRAL_DIRECTORY_END);
3690
        this.readBlockEndOfCentral();
3691

    
3692

    
3693
        /* extract from the zip spec :
3694
            4)  If one of the fields in the end of central directory
3695
                record is too small to hold required data, the field
3696
                should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
3697
                ZIP64 format record should be created.
3698
            5)  The end of central directory record and the
3699
                Zip64 end of central directory locator record must
3700
                reside on the same disk when splitting or spanning
3701
                an archive.
3702
         */
3703
        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) {
3704
            this.zip64 = true;
3705

    
3706
            /*
3707
            Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
3708
            the zip file can fit into a 32bits integer. This cannot be solved : JavaScript represents
3709
            all numbers as 64-bit double precision IEEE 754 floating point numbers.
3710
            So, we have 53bits for integers and bitwise operations treat everything as 32bits.
3711
            see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
3712
            and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
3713
            */
3714

    
3715
            // should look for a zip64 EOCD locator
3716
            offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
3717
            if (offset < 0) {
3718
                throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
3719
            }
3720
            this.reader.setIndex(offset);
3721
            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
3722
            this.readBlockZip64EndOfCentralLocator();
3723

    
3724
            // now the zip64 EOCD record
3725
            if (!this.isSignature(this.relativeOffsetEndOfZip64CentralDir, sig.ZIP64_CENTRAL_DIRECTORY_END)) {
3726
                // console.warn("ZIP64 end of central directory not where expected.");
3727
                this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
3728
                if (this.relativeOffsetEndOfZip64CentralDir < 0) {
3729
                    throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
3730
                }
3731
            }
3732
            this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
3733
            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
3734
            this.readBlockZip64EndOfCentral();
3735
        }
3736

    
3737
        var expectedEndOfCentralDirOffset = this.centralDirOffset + this.centralDirSize;
3738
        if (this.zip64) {
3739
            expectedEndOfCentralDirOffset += 20; // end of central dir 64 locator
3740
            expectedEndOfCentralDirOffset += 12 /* should not include the leading 12 bytes */ + this.zip64EndOfCentralSize;
3741
        }
3742

    
3743
        var extraBytes = endOfCentralDirOffset - expectedEndOfCentralDirOffset;
3744

    
3745
        if (extraBytes > 0) {
3746
            // console.warn(extraBytes, "extra bytes at beginning or within zipfile");
3747
            if (this.isSignature(endOfCentralDirOffset, sig.CENTRAL_FILE_HEADER)) {
3748
                // The offsets seem wrong, but we have something at the specified offset.
3749
                // So… we keep it.
3750
            } else {
3751
                // the offset is wrong, update the "zero" of the reader
3752
                // this happens if data has been prepended (crx files for example)
3753
                this.reader.zero = extraBytes;
3754
            }
3755
        } else if (extraBytes < 0) {
3756
            throw new Error("Corrupted zip: missing " + Math.abs(extraBytes) + " bytes.");
3757
        }
3758
    },
3759
    prepareReader: function(data) {
3760
        this.reader = readerFor(data);
3761
    },
3762
    /**
3763
     * Read a zip file and create ZipEntries.
3764
     * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
3765
     */
3766
    load: function(data) {
3767
        this.prepareReader(data);
3768
        this.readEndOfCentral();
3769
        this.readCentralDir();
3770
        this.readLocalFiles();
3771
    }
3772
};
3773
// }}} end of ZipEntries
3774
module.exports = ZipEntries;
3775

    
3776
},{"./reader/readerFor":22,"./signature":23,"./support":30,"./utf8":31,"./utils":32,"./zipEntry":34}],34:[function(require,module,exports){
3777
'use strict';
3778
var readerFor = require('./reader/readerFor');
3779
var utils = require('./utils');
3780
var CompressedObject = require('./compressedObject');
3781
var crc32fn = require('./crc32');
3782
var utf8 = require('./utf8');
3783
var compressions = require('./compressions');
3784
var support = require('./support');
3785

    
3786
var MADE_BY_DOS = 0x00;
3787
var MADE_BY_UNIX = 0x03;
3788

    
3789
/**
3790
 * Find a compression registered in JSZip.
3791
 * @param {string} compressionMethod the method magic to find.
3792
 * @return {Object|null} the JSZip compression object, null if none found.
3793
 */
3794
var findCompression = function(compressionMethod) {
3795
    for (var method in compressions) {
3796
        if (!compressions.hasOwnProperty(method)) {
3797
            continue;
3798
        }
3799
        if (compressions[method].magic === compressionMethod) {
3800
            return compressions[method];
3801
        }
3802
    }
3803
    return null;
3804
};
3805

    
3806
// class ZipEntry {{{
3807
/**
3808
 * An entry in the zip file.
3809
 * @constructor
3810
 * @param {Object} options Options of the current file.
3811
 * @param {Object} loadOptions Options for loading the stream.
3812
 */
3813
function ZipEntry(options, loadOptions) {
3814
    this.options = options;
3815
    this.loadOptions = loadOptions;
3816
}
3817
ZipEntry.prototype = {
3818
    /**
3819
     * say if the file is encrypted.
3820
     * @return {boolean} true if the file is encrypted, false otherwise.
3821
     */
3822
    isEncrypted: function() {
3823
        // bit 1 is set
3824
        return (this.bitFlag & 0x0001) === 0x0001;
3825
    },
3826
    /**
3827
     * say if the file has utf-8 filename/comment.
3828
     * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
3829
     */
3830
    useUTF8: function() {
3831
        // bit 11 is set
3832
        return (this.bitFlag & 0x0800) === 0x0800;
3833
    },
3834
    /**
3835
     * Read the local part of a zip file and add the info in this object.
3836
     * @param {DataReader} reader the reader to use.
3837
     */
3838
    readLocalPart: function(reader) {
3839
        var compression, localExtraFieldsLength;
3840

    
3841
        // we already know everything from the central dir !
3842
        // If the central dir data are false, we are doomed.
3843
        // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.
3844
        // The less data we get here, the more reliable this should be.
3845
        // Let's skip the whole header and dash to the data !
3846
        reader.skip(22);
3847
        // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
3848
        // Strangely, the filename here is OK.
3849
        // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
3850
        // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
3851
        // Search "unzip mismatching "local" filename continuing with "central" filename version" on
3852
        // the internet.
3853
        //
3854
        // I think I see the logic here : the central directory is used to display
3855
        // content and the local directory is used to extract the files. Mixing / and \
3856
        // may be used to display \ to windows users and use / when extracting the files.
3857
        // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
3858
        this.fileNameLength = reader.readInt(2);
3859
        localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
3860
        // the fileName is stored as binary data, the handleUTF8 method will take care of the encoding.
3861
        this.fileName = reader.readData(this.fileNameLength);
3862
        reader.skip(localExtraFieldsLength);
3863

    
3864
        if (this.compressedSize === -1 || this.uncompressedSize === -1) {
3865
            throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize === -1 || uncompressedSize === -1)");
3866
        }
3867

    
3868
        compression = findCompression(this.compressionMethod);
3869
        if (compression === null) { // no compression found
3870
            throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + utils.transformTo("string", this.fileName) + ")");
3871
        }
3872
        this.decompressed = new CompressedObject(this.compressedSize, this.uncompressedSize, this.crc32, compression, reader.readData(this.compressedSize));
3873
    },
3874

    
3875
    /**
3876
     * Read the central part of a zip file and add the info in this object.
3877
     * @param {DataReader} reader the reader to use.
3878
     */
3879
    readCentralPart: function(reader) {
3880
        this.versionMadeBy = reader.readInt(2);
3881
        reader.skip(2);
3882
        // this.versionNeeded = reader.readInt(2);
3883
        this.bitFlag = reader.readInt(2);
3884
        this.compressionMethod = reader.readString(2);
3885
        this.date = reader.readDate();
3886
        this.crc32 = reader.readInt(4);
3887
        this.compressedSize = reader.readInt(4);
3888
        this.uncompressedSize = reader.readInt(4);
3889
        var fileNameLength = reader.readInt(2);
3890
        this.extraFieldsLength = reader.readInt(2);
3891
        this.fileCommentLength = reader.readInt(2);
3892
        this.diskNumberStart = reader.readInt(2);
3893
        this.internalFileAttributes = reader.readInt(2);
3894
        this.externalFileAttributes = reader.readInt(4);
3895
        this.localHeaderOffset = reader.readInt(4);
3896

    
3897
        if (this.isEncrypted()) {
3898
            throw new Error("Encrypted zip are not supported");
3899
        }
3900

    
3901
        // will be read in the local part, see the comments there
3902
        reader.skip(fileNameLength);
3903
        this.readExtraFields(reader);
3904
        this.parseZIP64ExtraField(reader);
3905
        this.fileComment = reader.readData(this.fileCommentLength);
3906
    },
3907

    
3908
    /**
3909
     * Parse the external file attributes and get the unix/dos permissions.
3910
     */
3911
    processAttributes: function () {
3912
        this.unixPermissions = null;
3913
        this.dosPermissions = null;
3914
        var madeBy = this.versionMadeBy >> 8;
3915

    
3916
        // Check if we have the DOS directory flag set.
3917
        // We look for it in the DOS and UNIX permissions
3918
        // but some unknown platform could set it as a compatibility flag.
3919
        this.dir = this.externalFileAttributes & 0x0010 ? true : false;
3920

    
3921
        if(madeBy === MADE_BY_DOS) {
3922
            // first 6 bits (0 to 5)
3923
            this.dosPermissions = this.externalFileAttributes & 0x3F;
3924
        }
3925

    
3926
        if(madeBy === MADE_BY_UNIX) {
3927
            this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;
3928
            // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);
3929
        }
3930

    
3931
        // fail safe : if the name ends with a / it probably means a folder
3932
        if (!this.dir && this.fileNameStr.slice(-1) === '/') {
3933
            this.dir = true;
3934
        }
3935
    },
3936

    
3937
    /**
3938
     * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
3939
     * @param {DataReader} reader the reader to use.
3940
     */
3941
    parseZIP64ExtraField: function(reader) {
3942

    
3943
        if (!this.extraFields[0x0001]) {
3944
            return;
3945
        }
3946

    
3947
        // should be something, preparing the extra reader
3948
        var extraReader = readerFor(this.extraFields[0x0001].value);
3949

    
3950
        // I really hope that these 64bits integer can fit in 32 bits integer, because js
3951
        // won't let us have more.
3952
        if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
3953
            this.uncompressedSize = extraReader.readInt(8);
3954
        }
3955
        if (this.compressedSize === utils.MAX_VALUE_32BITS) {
3956
            this.compressedSize = extraReader.readInt(8);
3957
        }
3958
        if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
3959
            this.localHeaderOffset = extraReader.readInt(8);
3960
        }
3961
        if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
3962
            this.diskNumberStart = extraReader.readInt(4);
3963
        }
3964
    },
3965
    /**
3966
     * Read the central part of a zip file and add the info in this object.
3967
     * @param {DataReader} reader the reader to use.
3968
     */
3969
    readExtraFields: function(reader) {
3970
        var end = reader.index + this.extraFieldsLength,
3971
            extraFieldId,
3972
            extraFieldLength,
3973
            extraFieldValue;
3974

    
3975
        if (!this.extraFields) {
3976
            this.extraFields = {};
3977
        }
3978

    
3979
        while (reader.index < end) {
3980
            extraFieldId = reader.readInt(2);
3981
            extraFieldLength = reader.readInt(2);
3982
            extraFieldValue = reader.readData(extraFieldLength);
3983

    
3984
            this.extraFields[extraFieldId] = {
3985
                id: extraFieldId,
3986
                length: extraFieldLength,
3987
                value: extraFieldValue
3988
            };
3989
        }
3990
    },
3991
    /**
3992
     * Apply an UTF8 transformation if needed.
3993
     */
3994
    handleUTF8: function() {
3995
        var decodeParamType = support.uint8array ? "uint8array" : "array";
3996
        if (this.useUTF8()) {
3997
            this.fileNameStr = utf8.utf8decode(this.fileName);
3998
            this.fileCommentStr = utf8.utf8decode(this.fileComment);
3999
        } else {
4000
            var upath = this.findExtraFieldUnicodePath();
4001
            if (upath !== null) {
4002
                this.fileNameStr = upath;
4003
            } else {
4004
                // ASCII text or unsupported code page
4005
                var fileNameByteArray =  utils.transformTo(decodeParamType, this.fileName);
4006
                this.fileNameStr = this.loadOptions.decodeFileName(fileNameByteArray);
4007
            }
4008

    
4009
            var ucomment = this.findExtraFieldUnicodeComment();
4010
            if (ucomment !== null) {
4011
                this.fileCommentStr = ucomment;
4012
            } else {
4013
                // ASCII text or unsupported code page
4014
                var commentByteArray =  utils.transformTo(decodeParamType, this.fileComment);
4015
                this.fileCommentStr = this.loadOptions.decodeFileName(commentByteArray);
4016
            }
4017
        }
4018
    },
4019

    
4020
    /**
4021
     * Find the unicode path declared in the extra field, if any.
4022
     * @return {String} the unicode path, null otherwise.
4023
     */
4024
    findExtraFieldUnicodePath: function() {
4025
        var upathField = this.extraFields[0x7075];
4026
        if (upathField) {
4027
            var extraReader = readerFor(upathField.value);
4028

    
4029
            // wrong version
4030
            if (extraReader.readInt(1) !== 1) {
4031
                return null;
4032
            }
4033

    
4034
            // the crc of the filename changed, this field is out of date.
4035
            if (crc32fn(this.fileName) !== extraReader.readInt(4)) {
4036
                return null;
4037
            }
4038

    
4039
            return utf8.utf8decode(extraReader.readData(upathField.length - 5));
4040
        }
4041
        return null;
4042
    },
4043

    
4044
    /**
4045
     * Find the unicode comment declared in the extra field, if any.
4046
     * @return {String} the unicode comment, null otherwise.
4047
     */
4048
    findExtraFieldUnicodeComment: function() {
4049
        var ucommentField = this.extraFields[0x6375];
4050
        if (ucommentField) {
4051
            var extraReader = readerFor(ucommentField.value);
4052

    
4053
            // wrong version
4054
            if (extraReader.readInt(1) !== 1) {
4055
                return null;
4056
            }
4057

    
4058
            // the crc of the comment changed, this field is out of date.
4059
            if (crc32fn(this.fileComment) !== extraReader.readInt(4)) {
4060
                return null;
4061
            }
4062

    
4063
            return utf8.utf8decode(extraReader.readData(ucommentField.length - 5));
4064
        }
4065
        return null;
4066
    }
4067
};
4068
module.exports = ZipEntry;
4069

    
4070
},{"./compressedObject":2,"./compressions":3,"./crc32":4,"./reader/readerFor":22,"./support":30,"./utf8":31,"./utils":32}],35:[function(require,module,exports){
4071
'use strict';
4072

    
4073
var StreamHelper = require('./stream/StreamHelper');
4074
var DataWorker = require('./stream/DataWorker');
4075
var utf8 = require('./utf8');
4076
var CompressedObject = require('./compressedObject');
4077
var GenericWorker = require('./stream/GenericWorker');
4078

    
4079
/**
4080
 * A simple object representing a file in the zip file.
4081
 * @constructor
4082
 * @param {string} name the name of the file
4083
 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
4084
 * @param {Object} options the options of the file
4085
 */
4086
var ZipObject = function(name, data, options) {
4087
    this.name = name;
4088
    this.dir = options.dir;
4089
    this.date = options.date;
4090
    this.comment = options.comment;
4091
    this.unixPermissions = options.unixPermissions;
4092
    this.dosPermissions = options.dosPermissions;
4093

    
4094
    this._data = data;
4095
    this._dataBinary = options.binary;
4096
    // keep only the compression
4097
    this.options = {
4098
        compression : options.compression,
4099
        compressionOptions : options.compressionOptions
4100
    };
4101
};
4102

    
4103
ZipObject.prototype = {
4104
    /**
4105
     * Create an internal stream for the content of this object.
4106
     * @param {String} type the type of each chunk.
4107
     * @return StreamHelper the stream.
4108
     */
4109
    internalStream: function (type) {
4110
        var result = null, outputType = "string";
4111
        try {
4112
            if (!type) {
4113
                throw new Error("No output type specified.");
4114
            }
4115
            outputType = type.toLowerCase();
4116
            var askUnicodeString = outputType === "string" || outputType === "text";
4117
            if (outputType === "binarystring" || outputType === "text") {
4118
                outputType = "string";
4119
            }
4120
            result = this._decompressWorker();
4121

    
4122
            var isUnicodeString = !this._dataBinary;
4123

    
4124
            if (isUnicodeString && !askUnicodeString) {
4125
                result = result.pipe(new utf8.Utf8EncodeWorker());
4126
            }
4127
            if (!isUnicodeString && askUnicodeString) {
4128
                result = result.pipe(new utf8.Utf8DecodeWorker());
4129
            }
4130
        } catch (e) {
4131
            result = new GenericWorker("error");
4132
            result.error(e);
4133
        }
4134

    
4135
        return new StreamHelper(result, outputType, "");
4136
    },
4137

    
4138
    /**
4139
     * Prepare the content in the asked type.
4140
     * @param {String} type the type of the result.
4141
     * @param {Function} onUpdate a function to call on each internal update.
4142
     * @return Promise the promise of the result.
4143
     */
4144
    async: function (type, onUpdate) {
4145
        return this.internalStream(type).accumulate(onUpdate);
4146
    },
4147

    
4148
    /**
4149
     * Prepare the content as a nodejs stream.
4150
     * @param {String} type the type of each chunk.
4151
     * @param {Function} onUpdate a function to call on each internal update.
4152
     * @return Stream the stream.
4153
     */
4154
    nodeStream: function (type, onUpdate) {
4155
        return this.internalStream(type || "nodebuffer").toNodejsStream(onUpdate);
4156
    },
4157

    
4158
    /**
4159
     * Return a worker for the compressed content.
4160
     * @private
4161
     * @param {Object} compression the compression object to use.
4162
     * @param {Object} compressionOptions the options to use when compressing.
4163
     * @return Worker the worker.
4164
     */
4165
    _compressWorker: function (compression, compressionOptions) {
4166
        if (
4167
            this._data instanceof CompressedObject &&
4168
            this._data.compression.magic === compression.magic
4169
        ) {
4170
            return this._data.getCompressedWorker();
4171
        } else {
4172
            var result = this._decompressWorker();
4173
            if(!this._dataBinary) {
4174
                result = result.pipe(new utf8.Utf8EncodeWorker());
4175
            }
4176
            return CompressedObject.createWorkerFrom(result, compression, compressionOptions);
4177
        }
4178
    },
4179
    /**
4180
     * Return a worker for the decompressed content.
4181
     * @private
4182
     * @return Worker the worker.
4183
     */
4184
    _decompressWorker : function () {
4185
        if (this._data instanceof CompressedObject) {
4186
            return this._data.getContentWorker();
4187
        } else if (this._data instanceof GenericWorker) {
4188
            return this._data;
4189
        } else {
4190
            return new DataWorker(this._data);
4191
        }
4192
    }
4193
};
4194

    
4195
var removedMethods = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"];
4196
var removedFn = function () {
4197
    throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
4198
};
4199

    
4200
for(var i = 0; i < removedMethods.length; i++) {
4201
    ZipObject.prototype[removedMethods[i]] = removedFn;
4202
}
4203
module.exports = ZipObject;
4204

    
4205
},{"./compressedObject":2,"./stream/DataWorker":27,"./stream/GenericWorker":28,"./stream/StreamHelper":29,"./utf8":31}],36:[function(require,module,exports){
4206
(function (global){
4207
'use strict';
4208
var Mutation = global.MutationObserver || global.WebKitMutationObserver;
4209

    
4210
var scheduleDrain;
4211

    
4212
{
4213
  if (Mutation) {
4214
    var called = 0;
4215
    var observer = new Mutation(nextTick);
4216
    var element = global.document.createTextNode('');
4217
    observer.observe(element, {
4218
      characterData: true
4219
    });
4220
    scheduleDrain = function () {
4221
      element.data = (called = ++called % 2);
4222
    };
4223
  } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {
4224
    var channel = new global.MessageChannel();
4225
    channel.port1.onmessage = nextTick;
4226
    scheduleDrain = function () {
4227
      channel.port2.postMessage(0);
4228
    };
4229
  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {
4230
    scheduleDrain = function () {
4231

    
4232
      // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
4233
      // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
4234
      var scriptEl = global.document.createElement('script');
4235
      scriptEl.onreadystatechange = function () {
4236
        nextTick();
4237

    
4238
        scriptEl.onreadystatechange = null;
4239
        scriptEl.parentNode.removeChild(scriptEl);
4240
        scriptEl = null;
4241
      };
4242
      global.document.documentElement.appendChild(scriptEl);
4243
    };
4244
  } else {
4245
    scheduleDrain = function () {
4246
      setTimeout(nextTick, 0);
4247
    };
4248
  }
4249
}
4250

    
4251
var draining;
4252
var queue = [];
4253
//named nextTick for less confusing stack traces
4254
function nextTick() {
4255
  draining = true;
4256
  var i, oldQueue;
4257
  var len = queue.length;
4258
  while (len) {
4259
    oldQueue = queue;
4260
    queue = [];
4261
    i = -1;
4262
    while (++i < len) {
4263
      oldQueue[i]();
4264
    }
4265
    len = queue.length;
4266
  }
4267
  draining = false;
4268
}
4269

    
4270
module.exports = immediate;
4271
function immediate(task) {
4272
  if (queue.push(task) === 1 && !draining) {
4273
    scheduleDrain();
4274
  }
4275
}
4276

    
4277
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
4278
},{}],37:[function(require,module,exports){
4279
'use strict';
4280
var immediate = require('immediate');
4281

    
4282
/* istanbul ignore next */
4283
function INTERNAL() {}
4284

    
4285
var handlers = {};
4286

    
4287
var REJECTED = ['REJECTED'];
4288
var FULFILLED = ['FULFILLED'];
4289
var PENDING = ['PENDING'];
4290

    
4291
module.exports = Promise;
4292

    
4293
function Promise(resolver) {
4294
  if (typeof resolver !== 'function') {
4295
    throw new TypeError('resolver must be a function');
4296
  }
4297
  this.state = PENDING;
4298
  this.queue = [];
4299
  this.outcome = void 0;
4300
  if (resolver !== INTERNAL) {
4301
    safelyResolveThenable(this, resolver);
4302
  }
4303
}
4304

    
4305
Promise.prototype["finally"] = function (callback) {
4306
  if (typeof callback !== 'function') {
4307
    return this;
4308
  }
4309
  var p = this.constructor;
4310
  return this.then(resolve, reject);
4311

    
4312
  function resolve(value) {
4313
    function yes () {
4314
      return value;
4315
    }
4316
    return p.resolve(callback()).then(yes);
4317
  }
4318
  function reject(reason) {
4319
    function no () {
4320
      throw reason;
4321
    }
4322
    return p.resolve(callback()).then(no);
4323
  }
4324
};
4325
Promise.prototype["catch"] = function (onRejected) {
4326
  return this.then(null, onRejected);
4327
};
4328
Promise.prototype.then = function (onFulfilled, onRejected) {
4329
  if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||
4330
    typeof onRejected !== 'function' && this.state === REJECTED) {
4331
    return this;
4332
  }
4333
  var promise = new this.constructor(INTERNAL);
4334
  if (this.state !== PENDING) {
4335
    var resolver = this.state === FULFILLED ? onFulfilled : onRejected;
4336
    unwrap(promise, resolver, this.outcome);
4337
  } else {
4338
    this.queue.push(new QueueItem(promise, onFulfilled, onRejected));
4339
  }
4340

    
4341
  return promise;
4342
};
4343
function QueueItem(promise, onFulfilled, onRejected) {
4344
  this.promise = promise;
4345
  if (typeof onFulfilled === 'function') {
4346
    this.onFulfilled = onFulfilled;
4347
    this.callFulfilled = this.otherCallFulfilled;
4348
  }
4349
  if (typeof onRejected === 'function') {
4350
    this.onRejected = onRejected;
4351
    this.callRejected = this.otherCallRejected;
4352
  }
4353
}
4354
QueueItem.prototype.callFulfilled = function (value) {
4355
  handlers.resolve(this.promise, value);
4356
};
4357
QueueItem.prototype.otherCallFulfilled = function (value) {
4358
  unwrap(this.promise, this.onFulfilled, value);
4359
};
4360
QueueItem.prototype.callRejected = function (value) {
4361
  handlers.reject(this.promise, value);
4362
};
4363
QueueItem.prototype.otherCallRejected = function (value) {
4364
  unwrap(this.promise, this.onRejected, value);
4365
};
4366

    
4367
function unwrap(promise, func, value) {
4368
  immediate(function () {
4369
    var returnValue;
4370
    try {
4371
      returnValue = func(value);
4372
    } catch (e) {
4373
      return handlers.reject(promise, e);
4374
    }
4375
    if (returnValue === promise) {
4376
      handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));
4377
    } else {
4378
      handlers.resolve(promise, returnValue);
4379
    }
4380
  });
4381
}
4382

    
4383
handlers.resolve = function (self, value) {
4384
  var result = tryCatch(getThen, value);
4385
  if (result.status === 'error') {
4386
    return handlers.reject(self, result.value);
4387
  }
4388
  var thenable = result.value;
4389

    
4390
  if (thenable) {
4391
    safelyResolveThenable(self, thenable);
4392
  } else {
4393
    self.state = FULFILLED;
4394
    self.outcome = value;
4395
    var i = -1;
4396
    var len = self.queue.length;
4397
    while (++i < len) {
4398
      self.queue[i].callFulfilled(value);
4399
    }
4400
  }
4401
  return self;
4402
};
4403
handlers.reject = function (self, error) {
4404
  self.state = REJECTED;
4405
  self.outcome = error;
4406
  var i = -1;
4407
  var len = self.queue.length;
4408
  while (++i < len) {
4409
    self.queue[i].callRejected(error);
4410
  }
4411
  return self;
4412
};
4413

    
4414
function getThen(obj) {
4415
  // Make sure we only access the accessor once as required by the spec
4416
  var then = obj && obj.then;
4417
  if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {
4418
    return function appyThen() {
4419
      then.apply(obj, arguments);
4420
    };
4421
  }
4422
}
4423

    
4424
function safelyResolveThenable(self, thenable) {
4425
  // Either fulfill, reject or reject with error
4426
  var called = false;
4427
  function onError(value) {
4428
    if (called) {
4429
      return;
4430
    }
4431
    called = true;
4432
    handlers.reject(self, value);
4433
  }
4434

    
4435
  function onSuccess(value) {
4436
    if (called) {
4437
      return;
4438
    }
4439
    called = true;
4440
    handlers.resolve(self, value);
4441
  }
4442

    
4443
  function tryToUnwrap() {
4444
    thenable(onSuccess, onError);
4445
  }
4446

    
4447
  var result = tryCatch(tryToUnwrap);
4448
  if (result.status === 'error') {
4449
    onError(result.value);
4450
  }
4451
}
4452

    
4453
function tryCatch(func, value) {
4454
  var out = {};
4455
  try {
4456
    out.value = func(value);
4457
    out.status = 'success';
4458
  } catch (e) {
4459
    out.status = 'error';
4460
    out.value = e;
4461
  }
4462
  return out;
4463
}
4464

    
4465
Promise.resolve = resolve;
4466
function resolve(value) {
4467
  if (value instanceof this) {
4468
    return value;
4469
  }
4470
  return handlers.resolve(new this(INTERNAL), value);
4471
}
4472

    
4473
Promise.reject = reject;
4474
function reject(reason) {
4475
  var promise = new this(INTERNAL);
4476
  return handlers.reject(promise, reason);
4477
}
4478

    
4479
Promise.all = all;
4480
function all(iterable) {
4481
  var self = this;
4482
  if (Object.prototype.toString.call(iterable) !== '[object Array]') {
4483
    return this.reject(new TypeError('must be an array'));
4484
  }
4485

    
4486
  var len = iterable.length;
4487
  var called = false;
4488
  if (!len) {
4489
    return this.resolve([]);
4490
  }
4491

    
4492
  var values = new Array(len);
4493
  var resolved = 0;
4494
  var i = -1;
4495
  var promise = new this(INTERNAL);
4496

    
4497
  while (++i < len) {
4498
    allResolver(iterable[i], i);
4499
  }
4500
  return promise;
4501
  function allResolver(value, i) {
4502
    self.resolve(value).then(resolveFromAll, function (error) {
4503
      if (!called) {
4504
        called = true;
4505
        handlers.reject(promise, error);
4506
      }
4507
    });
4508
    function resolveFromAll(outValue) {
4509
      values[i] = outValue;
4510
      if (++resolved === len && !called) {
4511
        called = true;
4512
        handlers.resolve(promise, values);
4513
      }
4514
    }
4515
  }
4516
}
4517

    
4518
Promise.race = race;
4519
function race(iterable) {
4520
  var self = this;
4521
  if (Object.prototype.toString.call(iterable) !== '[object Array]') {
4522
    return this.reject(new TypeError('must be an array'));
4523
  }
4524

    
4525
  var len = iterable.length;
4526
  var called = false;
4527
  if (!len) {
4528
    return this.resolve([]);
4529
  }
4530

    
4531
  var i = -1;
4532
  var promise = new this(INTERNAL);
4533

    
4534
  while (++i < len) {
4535
    resolver(iterable[i]);
4536
  }
4537
  return promise;
4538
  function resolver(value) {
4539
    self.resolve(value).then(function (response) {
4540
      if (!called) {
4541
        called = true;
4542
        handlers.resolve(promise, response);
4543
      }
4544
    }, function (error) {
4545
      if (!called) {
4546
        called = true;
4547
        handlers.reject(promise, error);
4548
      }
4549
    });
4550
  }
4551
}
4552

    
4553
},{"immediate":36}],38:[function(require,module,exports){
4554
// Top level file is just a mixin of submodules & constants
4555
'use strict';
4556

    
4557
var assign    = require('./lib/utils/common').assign;
4558

    
4559
var deflate   = require('./lib/deflate');
4560
var inflate   = require('./lib/inflate');
4561
var constants = require('./lib/zlib/constants');
4562

    
4563
var pako = {};
4564

    
4565
assign(pako, deflate, inflate, constants);
4566

    
4567
module.exports = pako;
4568

    
4569
},{"./lib/deflate":39,"./lib/inflate":40,"./lib/utils/common":41,"./lib/zlib/constants":44}],39:[function(require,module,exports){
4570
'use strict';
4571

    
4572

    
4573
var zlib_deflate = require('./zlib/deflate');
4574
var utils        = require('./utils/common');
4575
var strings      = require('./utils/strings');
4576
var msg          = require('./zlib/messages');
4577
var ZStream      = require('./zlib/zstream');
4578

    
4579
var toString = Object.prototype.toString;
4580

    
4581
/* Public constants ==========================================================*/
4582
/* ===========================================================================*/
4583

    
4584
var Z_NO_FLUSH      = 0;
4585
var Z_FINISH        = 4;
4586

    
4587
var Z_OK            = 0;
4588
var Z_STREAM_END    = 1;
4589
var Z_SYNC_FLUSH    = 2;
4590

    
4591
var Z_DEFAULT_COMPRESSION = -1;
4592

    
4593
var Z_DEFAULT_STRATEGY    = 0;
4594

    
4595
var Z_DEFLATED  = 8;
4596

    
4597
/* ===========================================================================*/
4598

    
4599

    
4600
/**
4601
 * class Deflate
4602
 *
4603
 * Generic JS-style wrapper for zlib calls. If you don't need
4604
 * streaming behaviour - use more simple functions: [[deflate]],
4605
 * [[deflateRaw]] and [[gzip]].
4606
 **/
4607

    
4608
/* internal
4609
 * Deflate.chunks -> Array
4610
 *
4611
 * Chunks of output data, if [[Deflate#onData]] not overriden.
4612
 **/
4613

    
4614
/**
4615
 * Deflate.result -> Uint8Array|Array
4616
 *
4617
 * Compressed result, generated by default [[Deflate#onData]]
4618
 * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
4619
 * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you
4620
 * push a chunk with explicit flush (call [[Deflate#push]] with
4621
 * `Z_SYNC_FLUSH` param).
4622
 **/
4623

    
4624
/**
4625
 * Deflate.err -> Number
4626
 *
4627
 * Error code after deflate finished. 0 (Z_OK) on success.
4628
 * You will not need it in real life, because deflate errors
4629
 * are possible only on wrong options or bad `onData` / `onEnd`
4630
 * custom handlers.
4631
 **/
4632

    
4633
/**
4634
 * Deflate.msg -> String
4635
 *
4636
 * Error message, if [[Deflate.err]] != 0
4637
 **/
4638

    
4639

    
4640
/**
4641
 * new Deflate(options)
4642
 * - options (Object): zlib deflate options.
4643
 *
4644
 * Creates new deflator instance with specified params. Throws exception
4645
 * on bad params. Supported options:
4646
 *
4647
 * - `level`
4648
 * - `windowBits`
4649
 * - `memLevel`
4650
 * - `strategy`
4651
 * - `dictionary`
4652
 *
4653
 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
4654
 * for more information on these.
4655
 *
4656
 * Additional options, for internal needs:
4657
 *
4658
 * - `chunkSize` - size of generated data chunks (16K by default)
4659
 * - `raw` (Boolean) - do raw deflate
4660
 * - `gzip` (Boolean) - create gzip wrapper
4661
 * - `to` (String) - if equal to 'string', then result will be "binary string"
4662
 *    (each char code [0..255])
4663
 * - `header` (Object) - custom header for gzip
4664
 *   - `text` (Boolean) - true if compressed data believed to be text
4665
 *   - `time` (Number) - modification time, unix timestamp
4666
 *   - `os` (Number) - operation system code
4667
 *   - `extra` (Array) - array of bytes with extra data (max 65536)
4668
 *   - `name` (String) - file name (binary string)
4669
 *   - `comment` (String) - comment (binary string)
4670
 *   - `hcrc` (Boolean) - true if header crc should be added
4671
 *
4672
 * ##### Example:
4673
 *
4674
 * ```javascript
4675
 * var pako = require('pako')
4676
 *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
4677
 *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
4678
 *
4679
 * var deflate = new pako.Deflate({ level: 3});
4680
 *
4681
 * deflate.push(chunk1, false);
4682
 * deflate.push(chunk2, true);  // true -> last chunk
4683
 *
4684
 * if (deflate.err) { throw new Error(deflate.err); }
4685
 *
4686
 * console.log(deflate.result);
4687
 * ```
4688
 **/
4689
function Deflate(options) {
4690
  if (!(this instanceof Deflate)) return new Deflate(options);
4691

    
4692
  this.options = utils.assign({
4693
    level: Z_DEFAULT_COMPRESSION,
4694
    method: Z_DEFLATED,
4695
    chunkSize: 16384,
4696
    windowBits: 15,
4697
    memLevel: 8,
4698
    strategy: Z_DEFAULT_STRATEGY,
4699
    to: ''
4700
  }, options || {});
4701

    
4702
  var opt = this.options;
4703

    
4704
  if (opt.raw && (opt.windowBits > 0)) {
4705
    opt.windowBits = -opt.windowBits;
4706
  }
4707

    
4708
  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
4709
    opt.windowBits += 16;
4710
  }
4711

    
4712
  this.err    = 0;      // error code, if happens (0 = Z_OK)
4713
  this.msg    = '';     // error message
4714
  this.ended  = false;  // used to avoid multiple onEnd() calls
4715
  this.chunks = [];     // chunks of compressed data
4716

    
4717
  this.strm = new ZStream();
4718
  this.strm.avail_out = 0;
4719

    
4720
  var status = zlib_deflate.deflateInit2(
4721
    this.strm,
4722
    opt.level,
4723
    opt.method,
4724
    opt.windowBits,
4725
    opt.memLevel,
4726
    opt.strategy
4727
  );
4728

    
4729
  if (status !== Z_OK) {
4730
    throw new Error(msg[status]);
4731
  }
4732

    
4733
  if (opt.header) {
4734
    zlib_deflate.deflateSetHeader(this.strm, opt.header);
4735
  }
4736

    
4737
  if (opt.dictionary) {
4738
    var dict;
4739
    // Convert data if needed
4740
    if (typeof opt.dictionary === 'string') {
4741
      // If we need to compress text, change encoding to utf8.
4742
      dict = strings.string2buf(opt.dictionary);
4743
    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
4744
      dict = new Uint8Array(opt.dictionary);
4745
    } else {
4746
      dict = opt.dictionary;
4747
    }
4748

    
4749
    status = zlib_deflate.deflateSetDictionary(this.strm, dict);
4750

    
4751
    if (status !== Z_OK) {
4752
      throw new Error(msg[status]);
4753
    }
4754

    
4755
    this._dict_set = true;
4756
  }
4757
}
4758

    
4759
/**
4760
 * Deflate#push(data[, mode]) -> Boolean
4761
 * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be
4762
 *   converted to utf8 byte sequence.
4763
 * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
4764
 *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
4765
 *
4766
 * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
4767
 * new compressed chunks. Returns `true` on success. The last data block must have
4768
 * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
4769
 * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you
4770
 * can use mode Z_SYNC_FLUSH, keeping the compression context.
4771
 *
4772
 * On fail call [[Deflate#onEnd]] with error code and return false.
4773
 *
4774
 * We strongly recommend to use `Uint8Array` on input for best speed (output
4775
 * array format is detected automatically). Also, don't skip last param and always
4776
 * use the same type in your code (boolean or number). That will improve JS speed.
4777
 *
4778
 * For regular `Array`-s make sure all elements are [0..255].
4779
 *
4780
 * ##### Example
4781
 *
4782
 * ```javascript
4783
 * push(chunk, false); // push one of data chunks
4784
 * ...
4785
 * push(chunk, true);  // push last chunk
4786
 * ```
4787
 **/
4788
Deflate.prototype.push = function (data, mode) {
4789
  var strm = this.strm;
4790
  var chunkSize = this.options.chunkSize;
4791
  var status, _mode;
4792

    
4793
  if (this.ended) { return false; }
4794

    
4795
  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
4796

    
4797
  // Convert data if needed
4798
  if (typeof data === 'string') {
4799
    // If we need to compress text, change encoding to utf8.
4800
    strm.input = strings.string2buf(data);
4801
  } else if (toString.call(data) === '[object ArrayBuffer]') {
4802
    strm.input = new Uint8Array(data);
4803
  } else {
4804
    strm.input = data;
4805
  }
4806

    
4807
  strm.next_in = 0;
4808
  strm.avail_in = strm.input.length;
4809

    
4810
  do {
4811
    if (strm.avail_out === 0) {
4812
      strm.output = new utils.Buf8(chunkSize);
4813
      strm.next_out = 0;
4814
      strm.avail_out = chunkSize;
4815
    }
4816
    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
4817

    
4818
    if (status !== Z_STREAM_END && status !== Z_OK) {
4819
      this.onEnd(status);
4820
      this.ended = true;
4821
      return false;
4822
    }
4823
    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {
4824
      if (this.options.to === 'string') {
4825
        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
4826
      } else {
4827
        this.onData(utils.shrinkBuf(strm.output, strm.next_out));
4828
      }
4829
    }
4830
  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
4831

    
4832
  // Finalize on the last chunk.
4833
  if (_mode === Z_FINISH) {
4834
    status = zlib_deflate.deflateEnd(this.strm);
4835
    this.onEnd(status);
4836
    this.ended = true;
4837
    return status === Z_OK;
4838
  }
4839

    
4840
  // callback interim results if Z_SYNC_FLUSH.
4841
  if (_mode === Z_SYNC_FLUSH) {
4842
    this.onEnd(Z_OK);
4843
    strm.avail_out = 0;
4844
    return true;
4845
  }
4846

    
4847
  return true;
4848
};
4849

    
4850

    
4851
/**
4852
 * Deflate#onData(chunk) -> Void
4853
 * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
4854
 *   on js engine support. When string output requested, each chunk
4855
 *   will be string.
4856
 *
4857
 * By default, stores data blocks in `chunks[]` property and glue
4858
 * those in `onEnd`. Override this handler, if you need another behaviour.
4859
 **/
4860
Deflate.prototype.onData = function (chunk) {
4861
  this.chunks.push(chunk);
4862
};
4863

    
4864

    
4865
/**
4866
 * Deflate#onEnd(status) -> Void
4867
 * - status (Number): deflate status. 0 (Z_OK) on success,
4868
 *   other if not.
4869
 *
4870
 * Called once after you tell deflate that the input stream is
4871
 * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
4872
 * or if an error happened. By default - join collected chunks,
4873
 * free memory and fill `results` / `err` properties.
4874
 **/
4875
Deflate.prototype.onEnd = function (status) {
4876
  // On success - join
4877
  if (status === Z_OK) {
4878
    if (this.options.to === 'string') {
4879
      this.result = this.chunks.join('');
4880
    } else {
4881
      this.result = utils.flattenChunks(this.chunks);
4882
    }
4883
  }
4884
  this.chunks = [];
4885
  this.err = status;
4886
  this.msg = this.strm.msg;
4887
};
4888

    
4889

    
4890
/**
4891
 * deflate(data[, options]) -> Uint8Array|Array|String
4892
 * - data (Uint8Array|Array|String): input data to compress.
4893
 * - options (Object): zlib deflate options.
4894
 *
4895
 * Compress `data` with deflate algorithm and `options`.
4896
 *
4897
 * Supported options are:
4898
 *
4899
 * - level
4900
 * - windowBits
4901
 * - memLevel
4902
 * - strategy
4903
 * - dictionary
4904
 *
4905
 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
4906
 * for more information on these.
4907
 *
4908
 * Sugar (options):
4909
 *
4910
 * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
4911
 *   negative windowBits implicitly.
4912
 * - `to` (String) - if equal to 'string', then result will be "binary string"
4913
 *    (each char code [0..255])
4914
 *
4915
 * ##### Example:
4916
 *
4917
 * ```javascript
4918
 * var pako = require('pako')
4919
 *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
4920
 *
4921
 * console.log(pako.deflate(data));
4922
 * ```
4923
 **/
4924
function deflate(input, options) {
4925
  var deflator = new Deflate(options);
4926

    
4927
  deflator.push(input, true);
4928

    
4929
  // That will never happens, if you don't cheat with options :)
4930
  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }
4931

    
4932
  return deflator.result;
4933
}
4934

    
4935

    
4936
/**
4937
 * deflateRaw(data[, options]) -> Uint8Array|Array|String
4938
 * - data (Uint8Array|Array|String): input data to compress.
4939
 * - options (Object): zlib deflate options.
4940
 *
4941
 * The same as [[deflate]], but creates raw data, without wrapper
4942
 * (header and adler32 crc).
4943
 **/
4944
function deflateRaw(input, options) {
4945
  options = options || {};
4946
  options.raw = true;
4947
  return deflate(input, options);
4948
}
4949

    
4950

    
4951
/**
4952
 * gzip(data[, options]) -> Uint8Array|Array|String
4953
 * - data (Uint8Array|Array|String): input data to compress.
4954
 * - options (Object): zlib deflate options.
4955
 *
4956
 * The same as [[deflate]], but create gzip wrapper instead of
4957
 * deflate one.
4958
 **/
4959
function gzip(input, options) {
4960
  options = options || {};
4961
  options.gzip = true;
4962
  return deflate(input, options);
4963
}
4964

    
4965

    
4966
exports.Deflate = Deflate;
4967
exports.deflate = deflate;
4968
exports.deflateRaw = deflateRaw;
4969
exports.gzip = gzip;
4970

    
4971
},{"./utils/common":41,"./utils/strings":42,"./zlib/deflate":46,"./zlib/messages":51,"./zlib/zstream":53}],40:[function(require,module,exports){
4972
'use strict';
4973

    
4974

    
4975
var zlib_inflate = require('./zlib/inflate');
4976
var utils        = require('./utils/common');
4977
var strings      = require('./utils/strings');
4978
var c            = require('./zlib/constants');
4979
var msg          = require('./zlib/messages');
4980
var ZStream      = require('./zlib/zstream');
4981
var GZheader     = require('./zlib/gzheader');
4982

    
4983
var toString = Object.prototype.toString;
4984

    
4985
/**
4986
 * class Inflate
4987
 *
4988
 * Generic JS-style wrapper for zlib calls. If you don't need
4989
 * streaming behaviour - use more simple functions: [[inflate]]
4990
 * and [[inflateRaw]].
4991
 **/
4992

    
4993
/* internal
4994
 * inflate.chunks -> Array
4995
 *
4996
 * Chunks of output data, if [[Inflate#onData]] not overriden.
4997
 **/
4998

    
4999
/**
5000
 * Inflate.result -> Uint8Array|Array|String
5001
 *
5002
 * Uncompressed result, generated by default [[Inflate#onData]]
5003
 * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
5004
 * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you
5005
 * push a chunk with explicit flush (call [[Inflate#push]] with
5006
 * `Z_SYNC_FLUSH` param).
5007
 **/
5008

    
5009
/**
5010
 * Inflate.err -> Number
5011
 *
5012
 * Error code after inflate finished. 0 (Z_OK) on success.
5013
 * Should be checked if broken data possible.
5014
 **/
5015

    
5016
/**
5017
 * Inflate.msg -> String
5018
 *
5019
 * Error message, if [[Inflate.err]] != 0
5020
 **/
5021

    
5022

    
5023
/**
5024
 * new Inflate(options)
5025
 * - options (Object): zlib inflate options.
5026
 *
5027
 * Creates new inflator instance with specified params. Throws exception
5028
 * on bad params. Supported options:
5029
 *
5030
 * - `windowBits`
5031
 * - `dictionary`
5032
 *
5033
 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
5034
 * for more information on these.
5035
 *
5036
 * Additional options, for internal needs:
5037
 *
5038
 * - `chunkSize` - size of generated data chunks (16K by default)
5039
 * - `raw` (Boolean) - do raw inflate
5040
 * - `to` (String) - if equal to 'string', then result will be converted
5041
 *   from utf8 to utf16 (javascript) string. When string output requested,
5042
 *   chunk length can differ from `chunkSize`, depending on content.
5043
 *
5044
 * By default, when no options set, autodetect deflate/gzip data format via
5045
 * wrapper header.
5046
 *
5047
 * ##### Example:
5048
 *
5049
 * ```javascript
5050
 * var pako = require('pako')
5051
 *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
5052
 *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
5053
 *
5054
 * var inflate = new pako.Inflate({ level: 3});
5055
 *
5056
 * inflate.push(chunk1, false);
5057
 * inflate.push(chunk2, true);  // true -> last chunk
5058
 *
5059
 * if (inflate.err) { throw new Error(inflate.err); }
5060
 *
5061
 * console.log(inflate.result);
5062
 * ```
5063
 **/
5064
function Inflate(options) {
5065
  if (!(this instanceof Inflate)) return new Inflate(options);
5066

    
5067
  this.options = utils.assign({
5068
    chunkSize: 16384,
5069
    windowBits: 0,
5070
    to: ''
5071
  }, options || {});
5072

    
5073
  var opt = this.options;
5074

    
5075
  // Force window size for `raw` data, if not set directly,
5076
  // because we have no header for autodetect.
5077
  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
5078
    opt.windowBits = -opt.windowBits;
5079
    if (opt.windowBits === 0) { opt.windowBits = -15; }
5080
  }
5081

    
5082
  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
5083
  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
5084
      !(options && options.windowBits)) {
5085
    opt.windowBits += 32;
5086
  }
5087

    
5088
  // Gzip header has no info about windows size, we can do autodetect only
5089
  // for deflate. So, if window size not set, force it to max when gzip possible
5090
  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
5091
    // bit 3 (16) -> gzipped data
5092
    // bit 4 (32) -> autodetect gzip/deflate
5093
    if ((opt.windowBits & 15) === 0) {
5094
      opt.windowBits |= 15;
5095
    }
5096
  }
5097

    
5098
  this.err    = 0;      // error code, if happens (0 = Z_OK)
5099
  this.msg    = '';     // error message
5100
  this.ended  = false;  // used to avoid multiple onEnd() calls
5101
  this.chunks = [];     // chunks of compressed data
5102

    
5103
  this.strm   = new ZStream();
5104
  this.strm.avail_out = 0;
5105

    
5106
  var status  = zlib_inflate.inflateInit2(
5107
    this.strm,
5108
    opt.windowBits
5109
  );
5110

    
5111
  if (status !== c.Z_OK) {
5112
    throw new Error(msg[status]);
5113
  }
5114

    
5115
  this.header = new GZheader();
5116

    
5117
  zlib_inflate.inflateGetHeader(this.strm, this.header);
5118
}
5119

    
5120
/**
5121
 * Inflate#push(data[, mode]) -> Boolean
5122
 * - data (Uint8Array|Array|ArrayBuffer|String): input data
5123
 * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
5124
 *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
5125
 *
5126
 * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
5127
 * new output chunks. Returns `true` on success. The last data block must have
5128
 * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
5129
 * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you
5130
 * can use mode Z_SYNC_FLUSH, keeping the decompression context.
5131
 *
5132
 * On fail call [[Inflate#onEnd]] with error code and return false.
5133
 *
5134
 * We strongly recommend to use `Uint8Array` on input for best speed (output
5135
 * format is detected automatically). Also, don't skip last param and always
5136
 * use the same type in your code (boolean or number). That will improve JS speed.
5137
 *
5138
 * For regular `Array`-s make sure all elements are [0..255].
5139
 *
5140
 * ##### Example
5141
 *
5142
 * ```javascript
5143
 * push(chunk, false); // push one of data chunks
5144
 * ...
5145
 * push(chunk, true);  // push last chunk
5146
 * ```
5147
 **/
5148
Inflate.prototype.push = function (data, mode) {
5149
  var strm = this.strm;
5150
  var chunkSize = this.options.chunkSize;
5151
  var dictionary = this.options.dictionary;
5152
  var status, _mode;
5153
  var next_out_utf8, tail, utf8str;
5154
  var dict;
5155

    
5156
  // Flag to properly process Z_BUF_ERROR on testing inflate call
5157
  // when we check that all output data was flushed.
5158
  var allowBufError = false;
5159

    
5160
  if (this.ended) { return false; }
5161
  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
5162

    
5163
  // Convert data if needed
5164
  if (typeof data === 'string') {
5165
    // Only binary strings can be decompressed on practice
5166
    strm.input = strings.binstring2buf(data);
5167
  } else if (toString.call(data) === '[object ArrayBuffer]') {
5168
    strm.input = new Uint8Array(data);
5169
  } else {
5170
    strm.input = data;
5171
  }
5172

    
5173
  strm.next_in = 0;
5174
  strm.avail_in = strm.input.length;
5175

    
5176
  do {
5177
    if (strm.avail_out === 0) {
5178
      strm.output = new utils.Buf8(chunkSize);
5179
      strm.next_out = 0;
5180
      strm.avail_out = chunkSize;
5181
    }
5182

    
5183
    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
5184

    
5185
    if (status === c.Z_NEED_DICT && dictionary) {
5186
      // Convert data if needed
5187
      if (typeof dictionary === 'string') {
5188
        dict = strings.string2buf(dictionary);
5189
      } else if (toString.call(dictionary) === '[object ArrayBuffer]') {
5190
        dict = new Uint8Array(dictionary);
5191
      } else {
5192
        dict = dictionary;
5193
      }
5194

    
5195
      status = zlib_inflate.inflateSetDictionary(this.strm, dict);
5196

    
5197
    }
5198

    
5199
    if (status === c.Z_BUF_ERROR && allowBufError === true) {
5200
      status = c.Z_OK;
5201
      allowBufError = false;
5202
    }
5203

    
5204
    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
5205
      this.onEnd(status);
5206
      this.ended = true;
5207
      return false;
5208
    }
5209

    
5210
    if (strm.next_out) {
5211
      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {
5212

    
5213
        if (this.options.to === 'string') {
5214

    
5215
          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
5216

    
5217
          tail = strm.next_out - next_out_utf8;
5218
          utf8str = strings.buf2string(strm.output, next_out_utf8);
5219

    
5220
          // move tail
5221
          strm.next_out = tail;
5222
          strm.avail_out = chunkSize - tail;
5223
          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
5224

    
5225
          this.onData(utf8str);
5226

    
5227
        } else {
5228
          this.onData(utils.shrinkBuf(strm.output, strm.next_out));
5229
        }
5230
      }
5231
    }
5232

    
5233
    // When no more input data, we should check that internal inflate buffers
5234
    // are flushed. The only way to do it when avail_out = 0 - run one more
5235
    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.
5236
    // Here we set flag to process this error properly.
5237
    //
5238
    // NOTE. Deflate does not return error in this case and does not needs such
5239
    // logic.
5240
    if (strm.avail_in === 0 && strm.avail_out === 0) {
5241
      allowBufError = true;
5242
    }
5243

    
5244
  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);
5245

    
5246
  if (status === c.Z_STREAM_END) {
5247
    _mode = c.Z_FINISH;
5248
  }
5249

    
5250
  // Finalize on the last chunk.
5251
  if (_mode === c.Z_FINISH) {
5252
    status = zlib_inflate.inflateEnd(this.strm);
5253
    this.onEnd(status);
5254
    this.ended = true;
5255
    return status === c.Z_OK;
5256
  }
5257

    
5258
  // callback interim results if Z_SYNC_FLUSH.
5259
  if (_mode === c.Z_SYNC_FLUSH) {
5260
    this.onEnd(c.Z_OK);
5261
    strm.avail_out = 0;
5262
    return true;
5263
  }
5264

    
5265
  return true;
5266
};
5267

    
5268

    
5269
/**
5270
 * Inflate#onData(chunk) -> Void
5271
 * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
5272
 *   on js engine support. When string output requested, each chunk
5273
 *   will be string.
5274
 *
5275
 * By default, stores data blocks in `chunks[]` property and glue
5276
 * those in `onEnd`. Override this handler, if you need another behaviour.
5277
 **/
5278
Inflate.prototype.onData = function (chunk) {
5279
  this.chunks.push(chunk);
5280
};
5281

    
5282

    
5283
/**
5284
 * Inflate#onEnd(status) -> Void
5285
 * - status (Number): inflate status. 0 (Z_OK) on success,
5286
 *   other if not.
5287
 *
5288
 * Called either after you tell inflate that the input stream is
5289
 * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
5290
 * or if an error happened. By default - join collected chunks,
5291
 * free memory and fill `results` / `err` properties.
5292
 **/
5293
Inflate.prototype.onEnd = function (status) {
5294
  // On success - join
5295
  if (status === c.Z_OK) {
5296
    if (this.options.to === 'string') {
5297
      // Glue & convert here, until we teach pako to send
5298
      // utf8 alligned strings to onData
5299
      this.result = this.chunks.join('');
5300
    } else {
5301
      this.result = utils.flattenChunks(this.chunks);
5302
    }
5303
  }
5304
  this.chunks = [];
5305
  this.err = status;
5306
  this.msg = this.strm.msg;
5307
};
5308

    
5309

    
5310
/**
5311
 * inflate(data[, options]) -> Uint8Array|Array|String
5312
 * - data (Uint8Array|Array|String): input data to decompress.
5313
 * - options (Object): zlib inflate options.
5314
 *
5315
 * Decompress `data` with inflate/ungzip and `options`. Autodetect
5316
 * format via wrapper header by default. That's why we don't provide
5317
 * separate `ungzip` method.
5318
 *
5319
 * Supported options are:
5320
 *
5321
 * - windowBits
5322
 *
5323
 * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
5324
 * for more information.
5325
 *
5326
 * Sugar (options):
5327
 *
5328
 * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
5329
 *   negative windowBits implicitly.
5330
 * - `to` (String) - if equal to 'string', then result will be converted
5331
 *   from utf8 to utf16 (javascript) string. When string output requested,
5332
 *   chunk length can differ from `chunkSize`, depending on content.
5333
 *
5334
 *
5335
 * ##### Example:
5336
 *
5337
 * ```javascript
5338
 * var pako = require('pako')
5339
 *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
5340
 *   , output;
5341
 *
5342
 * try {
5343
 *   output = pako.inflate(input);
5344
 * } catch (err)
5345
 *   console.log(err);
5346
 * }
5347
 * ```
5348
 **/
5349
function inflate(input, options) {
5350
  var inflator = new Inflate(options);
5351

    
5352
  inflator.push(input, true);
5353

    
5354
  // That will never happens, if you don't cheat with options :)
5355
  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }
5356

    
5357
  return inflator.result;
5358
}
5359

    
5360

    
5361
/**
5362
 * inflateRaw(data[, options]) -> Uint8Array|Array|String
5363
 * - data (Uint8Array|Array|String): input data to decompress.
5364
 * - options (Object): zlib inflate options.
5365
 *
5366
 * The same as [[inflate]], but creates raw data, without wrapper
5367
 * (header and adler32 crc).
5368
 **/
5369
function inflateRaw(input, options) {
5370
  options = options || {};
5371
  options.raw = true;
5372
  return inflate(input, options);
5373
}
5374

    
5375

    
5376
/**
5377
 * ungzip(data[, options]) -> Uint8Array|Array|String
5378
 * - data (Uint8Array|Array|String): input data to decompress.
5379
 * - options (Object): zlib inflate options.
5380
 *
5381
 * Just shortcut to [[inflate]], because it autodetects format
5382
 * by header.content. Done for convenience.
5383
 **/
5384

    
5385

    
5386
exports.Inflate = Inflate;
5387
exports.inflate = inflate;
5388
exports.inflateRaw = inflateRaw;
5389
exports.ungzip  = inflate;
5390

    
5391
},{"./utils/common":41,"./utils/strings":42,"./zlib/constants":44,"./zlib/gzheader":47,"./zlib/inflate":49,"./zlib/messages":51,"./zlib/zstream":53}],41:[function(require,module,exports){
5392
'use strict';
5393

    
5394

    
5395
var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
5396
                (typeof Uint16Array !== 'undefined') &&
5397
                (typeof Int32Array !== 'undefined');
5398

    
5399

    
5400
exports.assign = function (obj /*from1, from2, from3, ...*/) {
5401
  var sources = Array.prototype.slice.call(arguments, 1);
5402
  while (sources.length) {
5403
    var source = sources.shift();
5404
    if (!source) { continue; }
5405

    
5406
    if (typeof source !== 'object') {
5407
      throw new TypeError(source + 'must be non-object');
5408
    }
5409

    
5410
    for (var p in source) {
5411
      if (source.hasOwnProperty(p)) {
5412
        obj[p] = source[p];
5413
      }
5414
    }
5415
  }
5416

    
5417
  return obj;
5418
};
5419

    
5420

    
5421
// reduce buffer size, avoiding mem copy
5422
exports.shrinkBuf = function (buf, size) {
5423
  if (buf.length === size) { return buf; }
5424
  if (buf.subarray) { return buf.subarray(0, size); }
5425
  buf.length = size;
5426
  return buf;
5427
};
5428

    
5429

    
5430
var fnTyped = {
5431
  arraySet: function (dest, src, src_offs, len, dest_offs) {
5432
    if (src.subarray && dest.subarray) {
5433
      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
5434
      return;
5435
    }
5436
    // Fallback to ordinary array
5437
    for (var i = 0; i < len; i++) {
5438
      dest[dest_offs + i] = src[src_offs + i];
5439
    }
5440
  },
5441
  // Join array of chunks to single array.
5442
  flattenChunks: function (chunks) {
5443
    var i, l, len, pos, chunk, result;
5444

    
5445
    // calculate data length
5446
    len = 0;
5447
    for (i = 0, l = chunks.length; i < l; i++) {
5448
      len += chunks[i].length;
5449
    }
5450

    
5451
    // join chunks
5452
    result = new Uint8Array(len);
5453
    pos = 0;
5454
    for (i = 0, l = chunks.length; i < l; i++) {
5455
      chunk = chunks[i];
5456
      result.set(chunk, pos);
5457
      pos += chunk.length;
5458
    }
5459

    
5460
    return result;
5461
  }
5462
};
5463

    
5464
var fnUntyped = {
5465
  arraySet: function (dest, src, src_offs, len, dest_offs) {
5466
    for (var i = 0; i < len; i++) {
5467
      dest[dest_offs + i] = src[src_offs + i];
5468
    }
5469
  },
5470
  // Join array of chunks to single array.
5471
  flattenChunks: function (chunks) {
5472
    return [].concat.apply([], chunks);
5473
  }
5474
};
5475

    
5476

    
5477
// Enable/Disable typed arrays use, for testing
5478
//
5479
exports.setTyped = function (on) {
5480
  if (on) {
5481
    exports.Buf8  = Uint8Array;
5482
    exports.Buf16 = Uint16Array;
5483
    exports.Buf32 = Int32Array;
5484
    exports.assign(exports, fnTyped);
5485
  } else {
5486
    exports.Buf8  = Array;
5487
    exports.Buf16 = Array;
5488
    exports.Buf32 = Array;
5489
    exports.assign(exports, fnUntyped);
5490
  }
5491
};
5492

    
5493
exports.setTyped(TYPED_OK);
5494

    
5495
},{}],42:[function(require,module,exports){
5496
// String encode/decode helpers
5497
'use strict';
5498

    
5499

    
5500
var utils = require('./common');
5501

    
5502

    
5503
// Quick check if we can use fast array to bin string conversion
5504
//
5505
// - apply(Array) can fail on Android 2.2
5506
// - apply(Uint8Array) can fail on iOS 5.1 Safary
5507
//
5508
var STR_APPLY_OK = true;
5509
var STR_APPLY_UIA_OK = true;
5510

    
5511
try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }
5512
try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
5513

    
5514

    
5515
// Table with utf8 lengths (calculated by first byte of sequence)
5516
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
5517
// because max possible codepoint is 0x10ffff
5518
var _utf8len = new utils.Buf8(256);
5519
for (var q = 0; q < 256; q++) {
5520
  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
5521
}
5522
_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
5523

    
5524

    
5525
// convert string to array (typed, when possible)
5526
exports.string2buf = function (str) {
5527
  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
5528

    
5529
  // count binary size
5530
  for (m_pos = 0; m_pos < str_len; m_pos++) {
5531
    c = str.charCodeAt(m_pos);
5532
    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
5533
      c2 = str.charCodeAt(m_pos + 1);
5534
      if ((c2 & 0xfc00) === 0xdc00) {
5535
        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
5536
        m_pos++;
5537
      }
5538
    }
5539
    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
5540
  }
5541

    
5542
  // allocate buffer
5543
  buf = new utils.Buf8(buf_len);
5544

    
5545
  // convert
5546
  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
5547
    c = str.charCodeAt(m_pos);
5548
    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
5549
      c2 = str.charCodeAt(m_pos + 1);
5550
      if ((c2 & 0xfc00) === 0xdc00) {
5551
        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
5552
        m_pos++;
5553
      }
5554
    }
5555
    if (c < 0x80) {
5556
      /* one byte */
5557
      buf[i++] = c;
5558
    } else if (c < 0x800) {
5559
      /* two bytes */
5560
      buf[i++] = 0xC0 | (c >>> 6);
5561
      buf[i++] = 0x80 | (c & 0x3f);
5562
    } else if (c < 0x10000) {
5563
      /* three bytes */
5564
      buf[i++] = 0xE0 | (c >>> 12);
5565
      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
5566
      buf[i++] = 0x80 | (c & 0x3f);
5567
    } else {
5568
      /* four bytes */
5569
      buf[i++] = 0xf0 | (c >>> 18);
5570
      buf[i++] = 0x80 | (c >>> 12 & 0x3f);
5571
      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
5572
      buf[i++] = 0x80 | (c & 0x3f);
5573
    }
5574
  }
5575

    
5576
  return buf;
5577
};
5578

    
5579
// Helper (used in 2 places)
5580
function buf2binstring(buf, len) {
5581
  // use fallback for big arrays to avoid stack overflow
5582
  if (len < 65537) {
5583
    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
5584
      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
5585
    }
5586
  }
5587

    
5588
  var result = '';
5589
  for (var i = 0; i < len; i++) {
5590
    result += String.fromCharCode(buf[i]);
5591
  }
5592
  return result;
5593
}
5594

    
5595

    
5596
// Convert byte array to binary string
5597
exports.buf2binstring = function (buf) {
5598
  return buf2binstring(buf, buf.length);
5599
};
5600

    
5601

    
5602
// Convert binary string (typed, when possible)
5603
exports.binstring2buf = function (str) {
5604
  var buf = new utils.Buf8(str.length);
5605
  for (var i = 0, len = buf.length; i < len; i++) {
5606
    buf[i] = str.charCodeAt(i);
5607
  }
5608
  return buf;
5609
};
5610

    
5611

    
5612
// convert array to string
5613
exports.buf2string = function (buf, max) {
5614
  var i, out, c, c_len;
5615
  var len = max || buf.length;
5616

    
5617
  // Reserve max possible length (2 words per char)
5618
  // NB: by unknown reasons, Array is significantly faster for
5619
  //     String.fromCharCode.apply than Uint16Array.
5620
  var utf16buf = new Array(len * 2);
5621

    
5622
  for (out = 0, i = 0; i < len;) {
5623
    c = buf[i++];
5624
    // quick process ascii
5625
    if (c < 0x80) { utf16buf[out++] = c; continue; }
5626

    
5627
    c_len = _utf8len[c];
5628
    // skip 5 & 6 byte codes
5629
    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
5630

    
5631
    // apply mask on first byte
5632
    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
5633
    // join the rest
5634
    while (c_len > 1 && i < len) {
5635
      c = (c << 6) | (buf[i++] & 0x3f);
5636
      c_len--;
5637
    }
5638

    
5639
    // terminated by end of string?
5640
    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
5641

    
5642
    if (c < 0x10000) {
5643
      utf16buf[out++] = c;
5644
    } else {
5645
      c -= 0x10000;
5646
      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
5647
      utf16buf[out++] = 0xdc00 | (c & 0x3ff);
5648
    }
5649
  }
5650

    
5651
  return buf2binstring(utf16buf, out);
5652
};
5653

    
5654

    
5655
// Calculate max possible position in utf8 buffer,
5656
// that will not break sequence. If that's not possible
5657
// - (very small limits) return max size as is.
5658
//
5659
// buf[] - utf8 bytes array
5660
// max   - length limit (mandatory);
5661
exports.utf8border = function (buf, max) {
5662
  var pos;
5663

    
5664
  max = max || buf.length;
5665
  if (max > buf.length) { max = buf.length; }
5666

    
5667
  // go back from last position, until start of sequence found
5668
  pos = max - 1;
5669
  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
5670

    
5671
  // Fuckup - very small and broken sequence,
5672
  // return max, because we should return something anyway.
5673
  if (pos < 0) { return max; }
5674

    
5675
  // If we came to start of buffer - that means vuffer is too small,
5676
  // return max too.
5677
  if (pos === 0) { return max; }
5678

    
5679
  return (pos + _utf8len[buf[pos]] > max) ? pos : max;
5680
};
5681

    
5682
},{"./common":41}],43:[function(require,module,exports){
5683
'use strict';
5684

    
5685
// Note: adler32 takes 12% for level 0 and 2% for level 6.
5686
// It doesn't worth to make additional optimizationa as in original.
5687
// Small size is preferable.
5688

    
5689
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
5690
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
5691
//
5692
// This software is provided 'as-is', without any express or implied
5693
// warranty. In no event will the authors be held liable for any damages
5694
// arising from the use of this software.
5695
//
5696
// Permission is granted to anyone to use this software for any purpose,
5697
// including commercial applications, and to alter it and redistribute it
5698
// freely, subject to the following restrictions:
5699
//
5700
// 1. The origin of this software must not be misrepresented; you must not
5701
//   claim that you wrote the original software. If you use this software
5702
//   in a product, an acknowledgment in the product documentation would be
5703
//   appreciated but is not required.
5704
// 2. Altered source versions must be plainly marked as such, and must not be
5705
//   misrepresented as being the original software.
5706
// 3. This notice may not be removed or altered from any source distribution.
5707

    
5708
function adler32(adler, buf, len, pos) {
5709
  var s1 = (adler & 0xffff) |0,
5710
      s2 = ((adler >>> 16) & 0xffff) |0,
5711
      n = 0;
5712

    
5713
  while (len !== 0) {
5714
    // Set limit ~ twice less than 5552, to keep
5715
    // s2 in 31-bits, because we force signed ints.
5716
    // in other case %= will fail.
5717
    n = len > 2000 ? 2000 : len;
5718
    len -= n;
5719

    
5720
    do {
5721
      s1 = (s1 + buf[pos++]) |0;
5722
      s2 = (s2 + s1) |0;
5723
    } while (--n);
5724

    
5725
    s1 %= 65521;
5726
    s2 %= 65521;
5727
  }
5728

    
5729
  return (s1 | (s2 << 16)) |0;
5730
}
5731

    
5732

    
5733
module.exports = adler32;
5734

    
5735
},{}],44:[function(require,module,exports){
5736
'use strict';
5737

    
5738
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
5739
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
5740
//
5741
// This software is provided 'as-is', without any express or implied
5742
// warranty. In no event will the authors be held liable for any damages
5743
// arising from the use of this software.
5744
//
5745
// Permission is granted to anyone to use this software for any purpose,
5746
// including commercial applications, and to alter it and redistribute it
5747
// freely, subject to the following restrictions:
5748
//
5749
// 1. The origin of this software must not be misrepresented; you must not
5750
//   claim that you wrote the original software. If you use this software
5751
//   in a product, an acknowledgment in the product documentation would be
5752
//   appreciated but is not required.
5753
// 2. Altered source versions must be plainly marked as such, and must not be
5754
//   misrepresented as being the original software.
5755
// 3. This notice may not be removed or altered from any source distribution.
5756

    
5757
module.exports = {
5758

    
5759
  /* Allowed flush values; see deflate() and inflate() below for details */
5760
  Z_NO_FLUSH:         0,
5761
  Z_PARTIAL_FLUSH:    1,
5762
  Z_SYNC_FLUSH:       2,
5763
  Z_FULL_FLUSH:       3,
5764
  Z_FINISH:           4,
5765
  Z_BLOCK:            5,
5766
  Z_TREES:            6,
5767

    
5768
  /* Return codes for the compression/decompression functions. Negative values
5769
  * are errors, positive values are used for special but normal events.
5770
  */
5771
  Z_OK:               0,
5772
  Z_STREAM_END:       1,
5773
  Z_NEED_DICT:        2,
5774
  Z_ERRNO:           -1,
5775
  Z_STREAM_ERROR:    -2,
5776
  Z_DATA_ERROR:      -3,
5777
  //Z_MEM_ERROR:     -4,
5778
  Z_BUF_ERROR:       -5,
5779
  //Z_VERSION_ERROR: -6,
5780

    
5781
  /* compression levels */
5782
  Z_NO_COMPRESSION:         0,
5783
  Z_BEST_SPEED:             1,
5784
  Z_BEST_COMPRESSION:       9,
5785
  Z_DEFAULT_COMPRESSION:   -1,
5786

    
5787

    
5788
  Z_FILTERED:               1,
5789
  Z_HUFFMAN_ONLY:           2,
5790
  Z_RLE:                    3,
5791
  Z_FIXED:                  4,
5792
  Z_DEFAULT_STRATEGY:       0,
5793

    
5794
  /* Possible values of the data_type field (though see inflate()) */
5795
  Z_BINARY:                 0,
5796
  Z_TEXT:                   1,
5797
  //Z_ASCII:                1, // = Z_TEXT (deprecated)
5798
  Z_UNKNOWN:                2,
5799

    
5800
  /* The deflate compression method */
5801
  Z_DEFLATED:               8
5802
  //Z_NULL:                 null // Use -1 or null inline, depending on var type
5803
};
5804

    
5805
},{}],45:[function(require,module,exports){
5806
'use strict';
5807

    
5808
// Note: we can't get significant speed boost here.
5809
// So write code to minimize size - no pregenerated tables
5810
// and array tools dependencies.
5811

    
5812
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
5813
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
5814
//
5815
// This software is provided 'as-is', without any express or implied
5816
// warranty. In no event will the authors be held liable for any damages
5817
// arising from the use of this software.
5818
//
5819
// Permission is granted to anyone to use this software for any purpose,
5820
// including commercial applications, and to alter it and redistribute it
5821
// freely, subject to the following restrictions:
5822
//
5823
// 1. The origin of this software must not be misrepresented; you must not
5824
//   claim that you wrote the original software. If you use this software
5825
//   in a product, an acknowledgment in the product documentation would be
5826
//   appreciated but is not required.
5827
// 2. Altered source versions must be plainly marked as such, and must not be
5828
//   misrepresented as being the original software.
5829
// 3. This notice may not be removed or altered from any source distribution.
5830

    
5831
// Use ordinary array, since untyped makes no boost here
5832
function makeTable() {
5833
  var c, table = [];
5834

    
5835
  for (var n = 0; n < 256; n++) {
5836
    c = n;
5837
    for (var k = 0; k < 8; k++) {
5838
      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
5839
    }
5840
    table[n] = c;
5841
  }
5842

    
5843
  return table;
5844
}
5845

    
5846
// Create table on load. Just 255 signed longs. Not a problem.
5847
var crcTable = makeTable();
5848

    
5849

    
5850
function crc32(crc, buf, len, pos) {
5851
  var t = crcTable,
5852
      end = pos + len;
5853

    
5854
  crc ^= -1;
5855

    
5856
  for (var i = pos; i < end; i++) {
5857
    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
5858
  }
5859

    
5860
  return (crc ^ (-1)); // >>> 0;
5861
}
5862

    
5863

    
5864
module.exports = crc32;
5865

    
5866
},{}],46:[function(require,module,exports){
5867
'use strict';
5868

    
5869
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
5870
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
5871
//
5872
// This software is provided 'as-is', without any express or implied
5873
// warranty. In no event will the authors be held liable for any damages
5874
// arising from the use of this software.
5875
//
5876
// Permission is granted to anyone to use this software for any purpose,
5877
// including commercial applications, and to alter it and redistribute it
5878
// freely, subject to the following restrictions:
5879
//
5880
// 1. The origin of this software must not be misrepresented; you must not
5881
//   claim that you wrote the original software. If you use this software
5882
//   in a product, an acknowledgment in the product documentation would be
5883
//   appreciated but is not required.
5884
// 2. Altered source versions must be plainly marked as such, and must not be
5885
//   misrepresented as being the original software.
5886
// 3. This notice may not be removed or altered from any source distribution.
5887

    
5888
var utils   = require('../utils/common');
5889
var trees   = require('./trees');
5890
var adler32 = require('./adler32');
5891
var crc32   = require('./crc32');
5892
var msg     = require('./messages');
5893

    
5894
/* Public constants ==========================================================*/
5895
/* ===========================================================================*/
5896

    
5897

    
5898
/* Allowed flush values; see deflate() and inflate() below for details */
5899
var Z_NO_FLUSH      = 0;
5900
var Z_PARTIAL_FLUSH = 1;
5901
//var Z_SYNC_FLUSH    = 2;
5902
var Z_FULL_FLUSH    = 3;
5903
var Z_FINISH        = 4;
5904
var Z_BLOCK         = 5;
5905
//var Z_TREES         = 6;
5906

    
5907

    
5908
/* Return codes for the compression/decompression functions. Negative values
5909
 * are errors, positive values are used for special but normal events.
5910
 */
5911
var Z_OK            = 0;
5912
var Z_STREAM_END    = 1;
5913
//var Z_NEED_DICT     = 2;
5914
//var Z_ERRNO         = -1;
5915
var Z_STREAM_ERROR  = -2;
5916
var Z_DATA_ERROR    = -3;
5917
//var Z_MEM_ERROR     = -4;
5918
var Z_BUF_ERROR     = -5;
5919
//var Z_VERSION_ERROR = -6;
5920

    
5921

    
5922
/* compression levels */
5923
//var Z_NO_COMPRESSION      = 0;
5924
//var Z_BEST_SPEED          = 1;
5925
//var Z_BEST_COMPRESSION    = 9;
5926
var Z_DEFAULT_COMPRESSION = -1;
5927

    
5928

    
5929
var Z_FILTERED            = 1;
5930
var Z_HUFFMAN_ONLY        = 2;
5931
var Z_RLE                 = 3;
5932
var Z_FIXED               = 4;
5933
var Z_DEFAULT_STRATEGY    = 0;
5934

    
5935
/* Possible values of the data_type field (though see inflate()) */
5936
//var Z_BINARY              = 0;
5937
//var Z_TEXT                = 1;
5938
//var Z_ASCII               = 1; // = Z_TEXT
5939
var Z_UNKNOWN             = 2;
5940

    
5941

    
5942
/* The deflate compression method */
5943
var Z_DEFLATED  = 8;
5944

    
5945
/*============================================================================*/
5946

    
5947

    
5948
var MAX_MEM_LEVEL = 9;
5949
/* Maximum value for memLevel in deflateInit2 */
5950
var MAX_WBITS = 15;
5951
/* 32K LZ77 window */
5952
var DEF_MEM_LEVEL = 8;
5953

    
5954

    
5955
var LENGTH_CODES  = 29;
5956
/* number of length codes, not counting the special END_BLOCK code */
5957
var LITERALS      = 256;
5958
/* number of literal bytes 0..255 */
5959
var L_CODES       = LITERALS + 1 + LENGTH_CODES;
5960
/* number of Literal or Length codes, including the END_BLOCK code */
5961
var D_CODES       = 30;
5962
/* number of distance codes */
5963
var BL_CODES      = 19;
5964
/* number of codes used to transfer the bit lengths */
5965
var HEAP_SIZE     = 2 * L_CODES + 1;
5966
/* maximum heap size */
5967
var MAX_BITS  = 15;
5968
/* All codes must not exceed MAX_BITS bits */
5969

    
5970
var MIN_MATCH = 3;
5971
var MAX_MATCH = 258;
5972
var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
5973

    
5974
var PRESET_DICT = 0x20;
5975

    
5976
var INIT_STATE = 42;
5977
var EXTRA_STATE = 69;
5978
var NAME_STATE = 73;
5979
var COMMENT_STATE = 91;
5980
var HCRC_STATE = 103;
5981
var BUSY_STATE = 113;
5982
var FINISH_STATE = 666;
5983

    
5984
var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
5985
var BS_BLOCK_DONE     = 2; /* block flush performed */
5986
var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
5987
var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
5988

    
5989
var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
5990

    
5991
function err(strm, errorCode) {
5992
  strm.msg = msg[errorCode];
5993
  return errorCode;
5994
}
5995

    
5996
function rank(f) {
5997
  return ((f) << 1) - ((f) > 4 ? 9 : 0);
5998
}
5999

    
6000
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
6001

    
6002

    
6003
/* =========================================================================
6004
 * Flush as much pending output as possible. All deflate() output goes
6005
 * through this function so some applications may wish to modify it
6006
 * to avoid allocating a large strm->output buffer and copying into it.
6007
 * (See also read_buf()).
6008
 */
6009
function flush_pending(strm) {
6010
  var s = strm.state;
6011

    
6012
  //_tr_flush_bits(s);
6013
  var len = s.pending;
6014
  if (len > strm.avail_out) {
6015
    len = strm.avail_out;
6016
  }
6017
  if (len === 0) { return; }
6018

    
6019
  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
6020
  strm.next_out += len;
6021
  s.pending_out += len;
6022
  strm.total_out += len;
6023
  strm.avail_out -= len;
6024
  s.pending -= len;
6025
  if (s.pending === 0) {
6026
    s.pending_out = 0;
6027
  }
6028
}
6029

    
6030

    
6031
function flush_block_only(s, last) {
6032
  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
6033
  s.block_start = s.strstart;
6034
  flush_pending(s.strm);
6035
}
6036

    
6037

    
6038
function put_byte(s, b) {
6039
  s.pending_buf[s.pending++] = b;
6040
}
6041

    
6042

    
6043
/* =========================================================================
6044
 * Put a short in the pending buffer. The 16-bit value is put in MSB order.
6045
 * IN assertion: the stream state is correct and there is enough room in
6046
 * pending_buf.
6047
 */
6048
function putShortMSB(s, b) {
6049
//  put_byte(s, (Byte)(b >> 8));
6050
//  put_byte(s, (Byte)(b & 0xff));
6051
  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
6052
  s.pending_buf[s.pending++] = b & 0xff;
6053
}
6054

    
6055

    
6056
/* ===========================================================================
6057
 * Read a new buffer from the current input stream, update the adler32
6058
 * and total number of bytes read.  All deflate() input goes through
6059
 * this function so some applications may wish to modify it to avoid
6060
 * allocating a large strm->input buffer and copying from it.
6061
 * (See also flush_pending()).
6062
 */
6063
function read_buf(strm, buf, start, size) {
6064
  var len = strm.avail_in;
6065

    
6066
  if (len > size) { len = size; }
6067
  if (len === 0) { return 0; }
6068

    
6069
  strm.avail_in -= len;
6070

    
6071
  // zmemcpy(buf, strm->next_in, len);
6072
  utils.arraySet(buf, strm.input, strm.next_in, len, start);
6073
  if (strm.state.wrap === 1) {
6074
    strm.adler = adler32(strm.adler, buf, len, start);
6075
  }
6076

    
6077
  else if (strm.state.wrap === 2) {
6078
    strm.adler = crc32(strm.adler, buf, len, start);
6079
  }
6080

    
6081
  strm.next_in += len;
6082
  strm.total_in += len;
6083

    
6084
  return len;
6085
}
6086

    
6087

    
6088
/* ===========================================================================
6089
 * Set match_start to the longest match starting at the given string and
6090
 * return its length. Matches shorter or equal to prev_length are discarded,
6091
 * in which case the result is equal to prev_length and match_start is
6092
 * garbage.
6093
 * IN assertions: cur_match is the head of the hash chain for the current
6094
 *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
6095
 * OUT assertion: the match length is not greater than s->lookahead.
6096
 */
6097
function longest_match(s, cur_match) {
6098
  var chain_length = s.max_chain_length;      /* max hash chain length */
6099
  var scan = s.strstart; /* current string */
6100
  var match;                       /* matched string */
6101
  var len;                           /* length of current match */
6102
  var best_len = s.prev_length;              /* best match length so far */
6103
  var nice_match = s.nice_match;             /* stop if match long enough */
6104
  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
6105
      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
6106

    
6107
  var _win = s.window; // shortcut
6108

    
6109
  var wmask = s.w_mask;
6110
  var prev  = s.prev;
6111

    
6112
  /* Stop when cur_match becomes <= limit. To simplify the code,
6113
   * we prevent matches with the string of window index 0.
6114
   */
6115

    
6116
  var strend = s.strstart + MAX_MATCH;
6117
  var scan_end1  = _win[scan + best_len - 1];
6118
  var scan_end   = _win[scan + best_len];
6119

    
6120
  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
6121
   * It is easy to get rid of this optimization if necessary.
6122
   */
6123
  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
6124

    
6125
  /* Do not waste too much time if we already have a good match: */
6126
  if (s.prev_length >= s.good_match) {
6127
    chain_length >>= 2;
6128
  }
6129
  /* Do not look for matches beyond the end of the input. This is necessary
6130
   * to make deflate deterministic.
6131
   */
6132
  if (nice_match > s.lookahead) { nice_match = s.lookahead; }
6133

    
6134
  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
6135

    
6136
  do {
6137
    // Assert(cur_match < s->strstart, "no future");
6138
    match = cur_match;
6139

    
6140
    /* Skip to next match if the match length cannot increase
6141
     * or if the match length is less than 2.  Note that the checks below
6142
     * for insufficient lookahead only occur occasionally for performance
6143
     * reasons.  Therefore uninitialized memory will be accessed, and
6144
     * conditional jumps will be made that depend on those values.
6145
     * However the length of the match is limited to the lookahead, so
6146
     * the output of deflate is not affected by the uninitialized values.
6147
     */
6148

    
6149
    if (_win[match + best_len]     !== scan_end  ||
6150
        _win[match + best_len - 1] !== scan_end1 ||
6151
        _win[match]                !== _win[scan] ||
6152
        _win[++match]              !== _win[scan + 1]) {
6153
      continue;
6154
    }
6155

    
6156
    /* The check at best_len-1 can be removed because it will be made
6157
     * again later. (This heuristic is not always a win.)
6158
     * It is not necessary to compare scan[2] and match[2] since they
6159
     * are always equal when the other bytes match, given that
6160
     * the hash keys are equal and that HASH_BITS >= 8.
6161
     */
6162
    scan += 2;
6163
    match++;
6164
    // Assert(*scan == *match, "match[2]?");
6165

    
6166
    /* We check for insufficient lookahead only every 8th comparison;
6167
     * the 256th check will be made at strstart+258.
6168
     */
6169
    do {
6170
      /*jshint noempty:false*/
6171
    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
6172
             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
6173
             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
6174
             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
6175
             scan < strend);
6176

    
6177
    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
6178

    
6179
    len = MAX_MATCH - (strend - scan);
6180
    scan = strend - MAX_MATCH;
6181

    
6182
    if (len > best_len) {
6183
      s.match_start = cur_match;
6184
      best_len = len;
6185
      if (len >= nice_match) {
6186
        break;
6187
      }
6188
      scan_end1  = _win[scan + best_len - 1];
6189
      scan_end   = _win[scan + best_len];
6190
    }
6191
  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
6192

    
6193
  if (best_len <= s.lookahead) {
6194
    return best_len;
6195
  }
6196
  return s.lookahead;
6197
}
6198

    
6199

    
6200
/* ===========================================================================
6201
 * Fill the window when the lookahead becomes insufficient.
6202
 * Updates strstart and lookahead.
6203
 *
6204
 * IN assertion: lookahead < MIN_LOOKAHEAD
6205
 * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
6206
 *    At least one byte has been read, or avail_in == 0; reads are
6207
 *    performed for at least two bytes (required for the zip translate_eol
6208
 *    option -- not supported here).
6209
 */
6210
function fill_window(s) {
6211
  var _w_size = s.w_size;
6212
  var p, n, m, more, str;
6213

    
6214
  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
6215

    
6216
  do {
6217
    more = s.window_size - s.lookahead - s.strstart;
6218

    
6219
    // JS ints have 32 bit, block below not needed
6220
    /* Deal with !@#$% 64K limit: */
6221
    //if (sizeof(int) <= 2) {
6222
    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
6223
    //        more = wsize;
6224
    //
6225
    //  } else if (more == (unsigned)(-1)) {
6226
    //        /* Very unlikely, but possible on 16 bit machine if
6227
    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
6228
    //         */
6229
    //        more--;
6230
    //    }
6231
    //}
6232

    
6233

    
6234
    /* If the window is almost full and there is insufficient lookahead,
6235
     * move the upper half to the lower one to make room in the upper half.
6236
     */
6237
    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
6238

    
6239
      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
6240
      s.match_start -= _w_size;
6241
      s.strstart -= _w_size;
6242
      /* we now have strstart >= MAX_DIST */
6243
      s.block_start -= _w_size;
6244

    
6245
      /* Slide the hash table (could be avoided with 32 bit values
6246
       at the expense of memory usage). We slide even when level == 0
6247
       to keep the hash table consistent if we switch back to level > 0
6248
       later. (Using level 0 permanently is not an optimal usage of
6249
       zlib, so we don't care about this pathological case.)
6250
       */
6251

    
6252
      n = s.hash_size;
6253
      p = n;
6254
      do {
6255
        m = s.head[--p];
6256
        s.head[p] = (m >= _w_size ? m - _w_size : 0);
6257
      } while (--n);
6258

    
6259
      n = _w_size;
6260
      p = n;
6261
      do {
6262
        m = s.prev[--p];
6263
        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
6264
        /* If n is not on any hash chain, prev[n] is garbage but
6265
         * its value will never be used.
6266
         */
6267
      } while (--n);
6268

    
6269
      more += _w_size;
6270
    }
6271
    if (s.strm.avail_in === 0) {
6272
      break;
6273
    }
6274

    
6275
    /* If there was no sliding:
6276
     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
6277
     *    more == window_size - lookahead - strstart
6278
     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
6279
     * => more >= window_size - 2*WSIZE + 2
6280
     * In the BIG_MEM or MMAP case (not yet supported),
6281
     *   window_size == input_size + MIN_LOOKAHEAD  &&
6282
     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
6283
     * Otherwise, window_size == 2*WSIZE so more >= 2.
6284
     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
6285
     */
6286
    //Assert(more >= 2, "more < 2");
6287
    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
6288
    s.lookahead += n;
6289

    
6290
    /* Initialize the hash value now that we have some input: */
6291
    if (s.lookahead + s.insert >= MIN_MATCH) {
6292
      str = s.strstart - s.insert;
6293
      s.ins_h = s.window[str];
6294

    
6295
      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
6296
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
6297
//#if MIN_MATCH != 3
6298
//        Call update_hash() MIN_MATCH-3 more times
6299
//#endif
6300
      while (s.insert) {
6301
        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
6302
        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
6303

    
6304
        s.prev[str & s.w_mask] = s.head[s.ins_h];
6305
        s.head[s.ins_h] = str;
6306
        str++;
6307
        s.insert--;
6308
        if (s.lookahead + s.insert < MIN_MATCH) {
6309
          break;
6310
        }
6311
      }
6312
    }
6313
    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
6314
     * but this is not important since only literal bytes will be emitted.
6315
     */
6316

    
6317
  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
6318

    
6319
  /* If the WIN_INIT bytes after the end of the current data have never been
6320
   * written, then zero those bytes in order to avoid memory check reports of
6321
   * the use of uninitialized (or uninitialised as Julian writes) bytes by
6322
   * the longest match routines.  Update the high water mark for the next
6323
   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
6324
   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
6325
   */
6326
//  if (s.high_water < s.window_size) {
6327
//    var curr = s.strstart + s.lookahead;
6328
//    var init = 0;
6329
//
6330
//    if (s.high_water < curr) {
6331
//      /* Previous high water mark below current data -- zero WIN_INIT
6332
//       * bytes or up to end of window, whichever is less.
6333
//       */
6334
//      init = s.window_size - curr;
6335
//      if (init > WIN_INIT)
6336
//        init = WIN_INIT;
6337
//      zmemzero(s->window + curr, (unsigned)init);
6338
//      s->high_water = curr + init;
6339
//    }
6340
//    else if (s->high_water < (ulg)curr + WIN_INIT) {
6341
//      /* High water mark at or above current data, but below current data
6342
//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
6343
//       * to end of window, whichever is less.
6344
//       */
6345
//      init = (ulg)curr + WIN_INIT - s->high_water;
6346
//      if (init > s->window_size - s->high_water)
6347
//        init = s->window_size - s->high_water;
6348
//      zmemzero(s->window + s->high_water, (unsigned)init);
6349
//      s->high_water += init;
6350
//    }
6351
//  }
6352
//
6353
//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
6354
//    "not enough room for search");
6355
}
6356

    
6357
/* ===========================================================================
6358
 * Copy without compression as much as possible from the input stream, return
6359
 * the current block state.
6360
 * This function does not insert new strings in the dictionary since
6361
 * uncompressible data is probably not useful. This function is used
6362
 * only for the level=0 compression option.
6363
 * NOTE: this function should be optimized to avoid extra copying from
6364
 * window to pending_buf.
6365
 */
6366
function deflate_stored(s, flush) {
6367
  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
6368
   * to pending_buf_size, and each stored block has a 5 byte header:
6369
   */
6370
  var max_block_size = 0xffff;
6371

    
6372
  if (max_block_size > s.pending_buf_size - 5) {
6373
    max_block_size = s.pending_buf_size - 5;
6374
  }
6375

    
6376
  /* Copy as much as possible from input to output: */
6377
  for (;;) {
6378
    /* Fill the window as much as possible: */
6379
    if (s.lookahead <= 1) {
6380

    
6381
      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
6382
      //  s->block_start >= (long)s->w_size, "slide too late");
6383
//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
6384
//        s.block_start >= s.w_size)) {
6385
//        throw  new Error("slide too late");
6386
//      }
6387

    
6388
      fill_window(s);
6389
      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
6390
        return BS_NEED_MORE;
6391
      }
6392

    
6393
      if (s.lookahead === 0) {
6394
        break;
6395
      }
6396
      /* flush the current block */
6397
    }
6398
    //Assert(s->block_start >= 0L, "block gone");
6399
//    if (s.block_start < 0) throw new Error("block gone");
6400

    
6401
    s.strstart += s.lookahead;
6402
    s.lookahead = 0;
6403

    
6404
    /* Emit a stored block if pending_buf will be full: */
6405
    var max_start = s.block_start + max_block_size;
6406

    
6407
    if (s.strstart === 0 || s.strstart >= max_start) {
6408
      /* strstart == 0 is possible when wraparound on 16-bit machine */
6409
      s.lookahead = s.strstart - max_start;
6410
      s.strstart = max_start;
6411
      /*** FLUSH_BLOCK(s, 0); ***/
6412
      flush_block_only(s, false);
6413
      if (s.strm.avail_out === 0) {
6414
        return BS_NEED_MORE;
6415
      }
6416
      /***/
6417

    
6418

    
6419
    }
6420
    /* Flush if we may have to slide, otherwise block_start may become
6421
     * negative and the data will be gone:
6422
     */
6423
    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
6424
      /*** FLUSH_BLOCK(s, 0); ***/
6425
      flush_block_only(s, false);
6426
      if (s.strm.avail_out === 0) {
6427
        return BS_NEED_MORE;
6428
      }
6429
      /***/
6430
    }
6431
  }
6432

    
6433
  s.insert = 0;
6434

    
6435
  if (flush === Z_FINISH) {
6436
    /*** FLUSH_BLOCK(s, 1); ***/
6437
    flush_block_only(s, true);
6438
    if (s.strm.avail_out === 0) {
6439
      return BS_FINISH_STARTED;
6440
    }
6441
    /***/
6442
    return BS_FINISH_DONE;
6443
  }
6444

    
6445
  if (s.strstart > s.block_start) {
6446
    /*** FLUSH_BLOCK(s, 0); ***/
6447
    flush_block_only(s, false);
6448
    if (s.strm.avail_out === 0) {
6449
      return BS_NEED_MORE;
6450
    }
6451
    /***/
6452
  }
6453

    
6454
  return BS_NEED_MORE;
6455
}
6456

    
6457
/* ===========================================================================
6458
 * Compress as much as possible from the input stream, return the current
6459
 * block state.
6460
 * This function does not perform lazy evaluation of matches and inserts
6461
 * new strings in the dictionary only for unmatched strings or for short
6462
 * matches. It is used only for the fast compression options.
6463
 */
6464
function deflate_fast(s, flush) {
6465
  var hash_head;        /* head of the hash chain */
6466
  var bflush;           /* set if current block must be flushed */
6467

    
6468
  for (;;) {
6469
    /* Make sure that we always have enough lookahead, except
6470
     * at the end of the input file. We need MAX_MATCH bytes
6471
     * for the next match, plus MIN_MATCH bytes to insert the
6472
     * string following the next match.
6473
     */
6474
    if (s.lookahead < MIN_LOOKAHEAD) {
6475
      fill_window(s);
6476
      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
6477
        return BS_NEED_MORE;
6478
      }
6479
      if (s.lookahead === 0) {
6480
        break; /* flush the current block */
6481
      }
6482
    }
6483

    
6484
    /* Insert the string window[strstart .. strstart+2] in the
6485
     * dictionary, and set hash_head to the head of the hash chain:
6486
     */
6487
    hash_head = 0/*NIL*/;
6488
    if (s.lookahead >= MIN_MATCH) {
6489
      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
6490
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
6491
      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
6492
      s.head[s.ins_h] = s.strstart;
6493
      /***/
6494
    }
6495

    
6496
    /* Find the longest match, discarding those <= prev_length.
6497
     * At this point we have always match_length < MIN_MATCH
6498
     */
6499
    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
6500
      /* To simplify the code, we prevent matches with the string
6501
       * of window index 0 (in particular we have to avoid a match
6502
       * of the string with itself at the start of the input file).
6503
       */
6504
      s.match_length = longest_match(s, hash_head);
6505
      /* longest_match() sets match_start */
6506
    }
6507
    if (s.match_length >= MIN_MATCH) {
6508
      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
6509

    
6510
      /*** _tr_tally_dist(s, s.strstart - s.match_start,
6511
                     s.match_length - MIN_MATCH, bflush); ***/
6512
      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
6513

    
6514
      s.lookahead -= s.match_length;
6515

    
6516
      /* Insert new strings in the hash table only if the match length
6517
       * is not too large. This saves time but degrades compression.
6518
       */
6519
      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
6520
        s.match_length--; /* string at strstart already in table */
6521
        do {
6522
          s.strstart++;
6523
          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
6524
          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
6525
          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
6526
          s.head[s.ins_h] = s.strstart;
6527
          /***/
6528
          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
6529
           * always MIN_MATCH bytes ahead.
6530
           */
6531
        } while (--s.match_length !== 0);
6532
        s.strstart++;
6533
      } else
6534
      {
6535
        s.strstart += s.match_length;
6536
        s.match_length = 0;
6537
        s.ins_h = s.window[s.strstart];
6538
        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
6539
        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
6540

    
6541
//#if MIN_MATCH != 3
6542
//                Call UPDATE_HASH() MIN_MATCH-3 more times
6543
//#endif
6544
        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
6545
         * matter since it will be recomputed at next deflate call.
6546
         */
6547
      }
6548
    } else {
6549
      /* No match, output a literal byte */
6550
      //Tracevv((stderr,"%c", s.window[s.strstart]));
6551
      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
6552
      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
6553

    
6554
      s.lookahead--;
6555
      s.strstart++;
6556
    }
6557
    if (bflush) {
6558
      /*** FLUSH_BLOCK(s, 0); ***/
6559
      flush_block_only(s, false);
6560
      if (s.strm.avail_out === 0) {
6561
        return BS_NEED_MORE;
6562
      }
6563
      /***/
6564
    }
6565
  }
6566
  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
6567
  if (flush === Z_FINISH) {
6568
    /*** FLUSH_BLOCK(s, 1); ***/
6569
    flush_block_only(s, true);
6570
    if (s.strm.avail_out === 0) {
6571
      return BS_FINISH_STARTED;
6572
    }
6573
    /***/
6574
    return BS_FINISH_DONE;
6575
  }
6576
  if (s.last_lit) {
6577
    /*** FLUSH_BLOCK(s, 0); ***/
6578
    flush_block_only(s, false);
6579
    if (s.strm.avail_out === 0) {
6580
      return BS_NEED_MORE;
6581
    }
6582
    /***/
6583
  }
6584
  return BS_BLOCK_DONE;
6585
}
6586

    
6587
/* ===========================================================================
6588
 * Same as above, but achieves better compression. We use a lazy
6589
 * evaluation for matches: a match is finally adopted only if there is
6590
 * no better match at the next window position.
6591
 */
6592
function deflate_slow(s, flush) {
6593
  var hash_head;          /* head of hash chain */
6594
  var bflush;              /* set if current block must be flushed */
6595

    
6596
  var max_insert;
6597

    
6598
  /* Process the input block. */
6599
  for (;;) {
6600
    /* Make sure that we always have enough lookahead, except
6601
     * at the end of the input file. We need MAX_MATCH bytes
6602
     * for the next match, plus MIN_MATCH bytes to insert the
6603
     * string following the next match.
6604
     */
6605
    if (s.lookahead < MIN_LOOKAHEAD) {
6606
      fill_window(s);
6607
      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
6608
        return BS_NEED_MORE;
6609
      }
6610
      if (s.lookahead === 0) { break; } /* flush the current block */
6611
    }
6612

    
6613
    /* Insert the string window[strstart .. strstart+2] in the
6614
     * dictionary, and set hash_head to the head of the hash chain:
6615
     */
6616
    hash_head = 0/*NIL*/;
6617
    if (s.lookahead >= MIN_MATCH) {
6618
      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
6619
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
6620
      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
6621
      s.head[s.ins_h] = s.strstart;
6622
      /***/
6623
    }
6624

    
6625
    /* Find the longest match, discarding those <= prev_length.
6626
     */
6627
    s.prev_length = s.match_length;
6628
    s.prev_match = s.match_start;
6629
    s.match_length = MIN_MATCH - 1;
6630

    
6631
    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
6632
        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
6633
      /* To simplify the code, we prevent matches with the string
6634
       * of window index 0 (in particular we have to avoid a match
6635
       * of the string with itself at the start of the input file).
6636
       */
6637
      s.match_length = longest_match(s, hash_head);
6638
      /* longest_match() sets match_start */
6639

    
6640
      if (s.match_length <= 5 &&
6641
         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
6642

    
6643
        /* If prev_match is also MIN_MATCH, match_start is garbage
6644
         * but we will ignore the current match anyway.
6645
         */
6646
        s.match_length = MIN_MATCH - 1;
6647
      }
6648
    }
6649
    /* If there was a match at the previous step and the current
6650
     * match is not better, output the previous match:
6651
     */
6652
    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
6653
      max_insert = s.strstart + s.lookahead - MIN_MATCH;
6654
      /* Do not insert strings in hash table beyond this. */
6655

    
6656
      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
6657

    
6658
      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
6659
                     s.prev_length - MIN_MATCH, bflush);***/
6660
      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
6661
      /* Insert in hash table all strings up to the end of the match.
6662
       * strstart-1 and strstart are already inserted. If there is not
6663
       * enough lookahead, the last two strings are not inserted in
6664
       * the hash table.
6665
       */
6666
      s.lookahead -= s.prev_length - 1;
6667
      s.prev_length -= 2;
6668
      do {
6669
        if (++s.strstart <= max_insert) {
6670
          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
6671
          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
6672
          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
6673
          s.head[s.ins_h] = s.strstart;
6674
          /***/
6675
        }
6676
      } while (--s.prev_length !== 0);
6677
      s.match_available = 0;
6678
      s.match_length = MIN_MATCH - 1;
6679
      s.strstart++;
6680

    
6681
      if (bflush) {
6682
        /*** FLUSH_BLOCK(s, 0); ***/
6683
        flush_block_only(s, false);
6684
        if (s.strm.avail_out === 0) {
6685
          return BS_NEED_MORE;
6686
        }
6687
        /***/
6688
      }
6689

    
6690
    } else if (s.match_available) {
6691
      /* If there was no match at the previous position, output a
6692
       * single literal. If there was a match but the current match
6693
       * is longer, truncate the previous match to a single literal.
6694
       */
6695
      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
6696
      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
6697
      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
6698

    
6699
      if (bflush) {
6700
        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
6701
        flush_block_only(s, false);
6702
        /***/
6703
      }
6704
      s.strstart++;
6705
      s.lookahead--;
6706
      if (s.strm.avail_out === 0) {
6707
        return BS_NEED_MORE;
6708
      }
6709
    } else {
6710
      /* There is no previous match to compare with, wait for
6711
       * the next step to decide.
6712
       */
6713
      s.match_available = 1;
6714
      s.strstart++;
6715
      s.lookahead--;
6716
    }
6717
  }
6718
  //Assert (flush != Z_NO_FLUSH, "no flush?");
6719
  if (s.match_available) {
6720
    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
6721
    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
6722
    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
6723

    
6724
    s.match_available = 0;
6725
  }
6726
  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
6727
  if (flush === Z_FINISH) {
6728
    /*** FLUSH_BLOCK(s, 1); ***/
6729
    flush_block_only(s, true);
6730
    if (s.strm.avail_out === 0) {
6731
      return BS_FINISH_STARTED;
6732
    }
6733
    /***/
6734
    return BS_FINISH_DONE;
6735
  }
6736
  if (s.last_lit) {
6737
    /*** FLUSH_BLOCK(s, 0); ***/
6738
    flush_block_only(s, false);
6739
    if (s.strm.avail_out === 0) {
6740
      return BS_NEED_MORE;
6741
    }
6742
    /***/
6743
  }
6744

    
6745
  return BS_BLOCK_DONE;
6746
}
6747

    
6748

    
6749
/* ===========================================================================
6750
 * For Z_RLE, simply look for runs of bytes, generate matches only of distance
6751
 * one.  Do not maintain a hash table.  (It will be regenerated if this run of
6752
 * deflate switches away from Z_RLE.)
6753
 */
6754
function deflate_rle(s, flush) {
6755
  var bflush;            /* set if current block must be flushed */
6756
  var prev;              /* byte at distance one to match */
6757
  var scan, strend;      /* scan goes up to strend for length of run */
6758

    
6759
  var _win = s.window;
6760

    
6761
  for (;;) {
6762
    /* Make sure that we always have enough lookahead, except
6763
     * at the end of the input file. We need MAX_MATCH bytes
6764
     * for the longest run, plus one for the unrolled loop.
6765
     */
6766
    if (s.lookahead <= MAX_MATCH) {
6767
      fill_window(s);
6768
      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
6769
        return BS_NEED_MORE;
6770
      }
6771
      if (s.lookahead === 0) { break; } /* flush the current block */
6772
    }
6773

    
6774
    /* See how many times the previous byte repeats */
6775
    s.match_length = 0;
6776
    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
6777
      scan = s.strstart - 1;
6778
      prev = _win[scan];
6779
      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
6780
        strend = s.strstart + MAX_MATCH;
6781
        do {
6782
          /*jshint noempty:false*/
6783
        } while (prev === _win[++scan] && prev === _win[++scan] &&
6784
                 prev === _win[++scan] && prev === _win[++scan] &&
6785
                 prev === _win[++scan] && prev === _win[++scan] &&
6786
                 prev === _win[++scan] && prev === _win[++scan] &&
6787
                 scan < strend);
6788
        s.match_length = MAX_MATCH - (strend - scan);
6789
        if (s.match_length > s.lookahead) {
6790
          s.match_length = s.lookahead;
6791
        }
6792
      }
6793
      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
6794
    }
6795

    
6796
    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
6797
    if (s.match_length >= MIN_MATCH) {
6798
      //check_match(s, s.strstart, s.strstart - 1, s.match_length);
6799

    
6800
      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
6801
      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
6802

    
6803
      s.lookahead -= s.match_length;
6804
      s.strstart += s.match_length;
6805
      s.match_length = 0;
6806
    } else {
6807
      /* No match, output a literal byte */
6808
      //Tracevv((stderr,"%c", s->window[s->strstart]));
6809
      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
6810
      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
6811

    
6812
      s.lookahead--;
6813
      s.strstart++;
6814
    }
6815
    if (bflush) {
6816
      /*** FLUSH_BLOCK(s, 0); ***/
6817
      flush_block_only(s, false);
6818
      if (s.strm.avail_out === 0) {
6819
        return BS_NEED_MORE;
6820
      }
6821
      /***/
6822
    }
6823
  }
6824
  s.insert = 0;
6825
  if (flush === Z_FINISH) {
6826
    /*** FLUSH_BLOCK(s, 1); ***/
6827
    flush_block_only(s, true);
6828
    if (s.strm.avail_out === 0) {
6829
      return BS_FINISH_STARTED;
6830
    }
6831
    /***/
6832
    return BS_FINISH_DONE;
6833
  }
6834
  if (s.last_lit) {
6835
    /*** FLUSH_BLOCK(s, 0); ***/
6836
    flush_block_only(s, false);
6837
    if (s.strm.avail_out === 0) {
6838
      return BS_NEED_MORE;
6839
    }
6840
    /***/
6841
  }
6842
  return BS_BLOCK_DONE;
6843
}
6844

    
6845
/* ===========================================================================
6846
 * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
6847
 * (It will be regenerated if this run of deflate switches away from Huffman.)
6848
 */
6849
function deflate_huff(s, flush) {
6850
  var bflush;             /* set if current block must be flushed */
6851

    
6852
  for (;;) {
6853
    /* Make sure that we have a literal to write. */
6854
    if (s.lookahead === 0) {
6855
      fill_window(s);
6856
      if (s.lookahead === 0) {
6857
        if (flush === Z_NO_FLUSH) {
6858
          return BS_NEED_MORE;
6859
        }
6860
        break;      /* flush the current block */
6861
      }
6862
    }
6863

    
6864
    /* Output a literal byte */
6865
    s.match_length = 0;
6866
    //Tracevv((stderr,"%c", s->window[s->strstart]));
6867
    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
6868
    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
6869
    s.lookahead--;
6870
    s.strstart++;
6871
    if (bflush) {
6872
      /*** FLUSH_BLOCK(s, 0); ***/
6873
      flush_block_only(s, false);
6874
      if (s.strm.avail_out === 0) {
6875
        return BS_NEED_MORE;
6876
      }
6877
      /***/
6878
    }
6879
  }
6880
  s.insert = 0;
6881
  if (flush === Z_FINISH) {
6882
    /*** FLUSH_BLOCK(s, 1); ***/
6883
    flush_block_only(s, true);
6884
    if (s.strm.avail_out === 0) {
6885
      return BS_FINISH_STARTED;
6886
    }
6887
    /***/
6888
    return BS_FINISH_DONE;
6889
  }
6890
  if (s.last_lit) {
6891
    /*** FLUSH_BLOCK(s, 0); ***/
6892
    flush_block_only(s, false);
6893
    if (s.strm.avail_out === 0) {
6894
      return BS_NEED_MORE;
6895
    }
6896
    /***/
6897
  }
6898
  return BS_BLOCK_DONE;
6899
}
6900

    
6901
/* Values for max_lazy_match, good_match and max_chain_length, depending on
6902
 * the desired pack level (0..9). The values given below have been tuned to
6903
 * exclude worst case performance for pathological files. Better values may be
6904
 * found for specific files.
6905
 */
6906
function Config(good_length, max_lazy, nice_length, max_chain, func) {
6907
  this.good_length = good_length;
6908
  this.max_lazy = max_lazy;
6909
  this.nice_length = nice_length;
6910
  this.max_chain = max_chain;
6911
  this.func = func;
6912
}
6913

    
6914
var configuration_table;
6915

    
6916
configuration_table = [
6917
  /*      good lazy nice chain */
6918
  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
6919
  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
6920
  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
6921
  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
6922

    
6923
  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
6924
  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
6925
  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
6926
  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
6927
  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
6928
  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
6929
];
6930

    
6931

    
6932
/* ===========================================================================
6933
 * Initialize the "longest match" routines for a new zlib stream
6934
 */
6935
function lm_init(s) {
6936
  s.window_size = 2 * s.w_size;
6937

    
6938
  /*** CLEAR_HASH(s); ***/
6939
  zero(s.head); // Fill with NIL (= 0);
6940

    
6941
  /* Set the default configuration parameters:
6942
   */
6943
  s.max_lazy_match = configuration_table[s.level].max_lazy;
6944
  s.good_match = configuration_table[s.level].good_length;
6945
  s.nice_match = configuration_table[s.level].nice_length;
6946
  s.max_chain_length = configuration_table[s.level].max_chain;
6947

    
6948
  s.strstart = 0;
6949
  s.block_start = 0;
6950
  s.lookahead = 0;
6951
  s.insert = 0;
6952
  s.match_length = s.prev_length = MIN_MATCH - 1;
6953
  s.match_available = 0;
6954
  s.ins_h = 0;
6955
}
6956

    
6957

    
6958
function DeflateState() {
6959
  this.strm = null;            /* pointer back to this zlib stream */
6960
  this.status = 0;            /* as the name implies */
6961
  this.pending_buf = null;      /* output still pending */
6962
  this.pending_buf_size = 0;  /* size of pending_buf */
6963
  this.pending_out = 0;       /* next pending byte to output to the stream */
6964
  this.pending = 0;           /* nb of bytes in the pending buffer */
6965
  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
6966
  this.gzhead = null;         /* gzip header information to write */
6967
  this.gzindex = 0;           /* where in extra, name, or comment */
6968
  this.method = Z_DEFLATED; /* can only be DEFLATED */
6969
  this.last_flush = -1;   /* value of flush param for previous deflate call */
6970

    
6971
  this.w_size = 0;  /* LZ77 window size (32K by default) */
6972
  this.w_bits = 0;  /* log2(w_size)  (8..16) */
6973
  this.w_mask = 0;  /* w_size - 1 */
6974

    
6975
  this.window = null;
6976
  /* Sliding window. Input bytes are read into the second half of the window,
6977
   * and move to the first half later to keep a dictionary of at least wSize
6978
   * bytes. With this organization, matches are limited to a distance of
6979
   * wSize-MAX_MATCH bytes, but this ensures that IO is always
6980
   * performed with a length multiple of the block size.
6981
   */
6982

    
6983
  this.window_size = 0;
6984
  /* Actual size of window: 2*wSize, except when the user input buffer
6985
   * is directly used as sliding window.
6986
   */
6987

    
6988
  this.prev = null;
6989
  /* Link to older string with same hash index. To limit the size of this
6990
   * array to 64K, this link is maintained only for the last 32K strings.
6991
   * An index in this array is thus a window index modulo 32K.
6992
   */
6993

    
6994
  this.head = null;   /* Heads of the hash chains or NIL. */
6995

    
6996
  this.ins_h = 0;       /* hash index of string to be inserted */
6997
  this.hash_size = 0;   /* number of elements in hash table */
6998
  this.hash_bits = 0;   /* log2(hash_size) */
6999
  this.hash_mask = 0;   /* hash_size-1 */
7000

    
7001
  this.hash_shift = 0;
7002
  /* Number of bits by which ins_h must be shifted at each input
7003
   * step. It must be such that after MIN_MATCH steps, the oldest
7004
   * byte no longer takes part in the hash key, that is:
7005
   *   hash_shift * MIN_MATCH >= hash_bits
7006
   */
7007

    
7008
  this.block_start = 0;
7009
  /* Window position at the beginning of the current output block. Gets
7010
   * negative when the window is moved backwards.
7011
   */
7012

    
7013
  this.match_length = 0;      /* length of best match */
7014
  this.prev_match = 0;        /* previous match */
7015
  this.match_available = 0;   /* set if previous match exists */
7016
  this.strstart = 0;          /* start of string to insert */
7017
  this.match_start = 0;       /* start of matching string */
7018
  this.lookahead = 0;         /* number of valid bytes ahead in window */
7019

    
7020
  this.prev_length = 0;
7021
  /* Length of the best match at previous step. Matches not greater than this
7022
   * are discarded. This is used in the lazy match evaluation.
7023
   */
7024

    
7025
  this.max_chain_length = 0;
7026
  /* To speed up deflation, hash chains are never searched beyond this
7027
   * length.  A higher limit improves compression ratio but degrades the
7028
   * speed.
7029
   */
7030

    
7031
  this.max_lazy_match = 0;
7032
  /* Attempt to find a better match only when the current match is strictly
7033
   * smaller than this value. This mechanism is used only for compression
7034
   * levels >= 4.
7035
   */
7036
  // That's alias to max_lazy_match, don't use directly
7037
  //this.max_insert_length = 0;
7038
  /* Insert new strings in the hash table only if the match length is not
7039
   * greater than this length. This saves time but degrades compression.
7040
   * max_insert_length is used only for compression levels <= 3.
7041
   */
7042

    
7043
  this.level = 0;     /* compression level (1..9) */
7044
  this.strategy = 0;  /* favor or force Huffman coding*/
7045

    
7046
  this.good_match = 0;
7047
  /* Use a faster search when the previous match is longer than this */
7048

    
7049
  this.nice_match = 0; /* Stop searching when current match exceeds this */
7050

    
7051
              /* used by trees.c: */
7052

    
7053
  /* Didn't use ct_data typedef below to suppress compiler warning */
7054

    
7055
  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
7056
  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
7057
  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
7058

    
7059
  // Use flat array of DOUBLE size, with interleaved fata,
7060
  // because JS does not support effective
7061
  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
7062
  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
7063
  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
7064
  zero(this.dyn_ltree);
7065
  zero(this.dyn_dtree);
7066
  zero(this.bl_tree);
7067

    
7068
  this.l_desc   = null;         /* desc. for literal tree */
7069
  this.d_desc   = null;         /* desc. for distance tree */
7070
  this.bl_desc  = null;         /* desc. for bit length tree */
7071

    
7072
  //ush bl_count[MAX_BITS+1];
7073
  this.bl_count = new utils.Buf16(MAX_BITS + 1);
7074
  /* number of codes at each bit length for an optimal tree */
7075

    
7076
  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
7077
  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
7078
  zero(this.heap);
7079

    
7080
  this.heap_len = 0;               /* number of elements in the heap */
7081
  this.heap_max = 0;               /* element of largest frequency */
7082
  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
7083
   * The same heap array is used to build all trees.
7084
   */
7085

    
7086
  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
7087
  zero(this.depth);
7088
  /* Depth of each subtree used as tie breaker for trees of equal frequency
7089
   */
7090

    
7091
  this.l_buf = 0;          /* buffer index for literals or lengths */
7092

    
7093
  this.lit_bufsize = 0;
7094
  /* Size of match buffer for literals/lengths.  There are 4 reasons for
7095
   * limiting lit_bufsize to 64K:
7096
   *   - frequencies can be kept in 16 bit counters
7097
   *   - if compression is not successful for the first block, all input
7098
   *     data is still in the window so we can still emit a stored block even
7099
   *     when input comes from standard input.  (This can also be done for
7100
   *     all blocks if lit_bufsize is not greater than 32K.)
7101
   *   - if compression is not successful for a file smaller than 64K, we can
7102
   *     even emit a stored file instead of a stored block (saving 5 bytes).
7103
   *     This is applicable only for zip (not gzip or zlib).
7104
   *   - creating new Huffman trees less frequently may not provide fast
7105
   *     adaptation to changes in the input data statistics. (Take for
7106
   *     example a binary file with poorly compressible code followed by
7107
   *     a highly compressible string table.) Smaller buffer sizes give
7108
   *     fast adaptation but have of course the overhead of transmitting
7109
   *     trees more frequently.
7110
   *   - I can't count above 4
7111
   */
7112

    
7113
  this.last_lit = 0;      /* running index in l_buf */
7114

    
7115
  this.d_buf = 0;
7116
  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
7117
   * the same number of elements. To use different lengths, an extra flag
7118
   * array would be necessary.
7119
   */
7120

    
7121
  this.opt_len = 0;       /* bit length of current block with optimal trees */
7122
  this.static_len = 0;    /* bit length of current block with static trees */
7123
  this.matches = 0;       /* number of string matches in current block */
7124
  this.insert = 0;        /* bytes at end of window left to insert */
7125

    
7126

    
7127
  this.bi_buf = 0;
7128
  /* Output buffer. bits are inserted starting at the bottom (least
7129
   * significant bits).
7130
   */
7131
  this.bi_valid = 0;
7132
  /* Number of valid bits in bi_buf.  All bits above the last valid bit
7133
   * are always zero.
7134
   */
7135

    
7136
  // Used for window memory init. We safely ignore it for JS. That makes
7137
  // sense only for pointers and memory check tools.
7138
  //this.high_water = 0;
7139
  /* High water mark offset in window for initialized bytes -- bytes above
7140
   * this are set to zero in order to avoid memory check warnings when
7141
   * longest match routines access bytes past the input.  This is then
7142
   * updated to the new high water mark.
7143
   */
7144
}
7145

    
7146

    
7147
function deflateResetKeep(strm) {
7148
  var s;
7149

    
7150
  if (!strm || !strm.state) {
7151
    return err(strm, Z_STREAM_ERROR);
7152
  }
7153

    
7154
  strm.total_in = strm.total_out = 0;
7155
  strm.data_type = Z_UNKNOWN;
7156

    
7157
  s = strm.state;
7158
  s.pending = 0;
7159
  s.pending_out = 0;
7160

    
7161
  if (s.wrap < 0) {
7162
    s.wrap = -s.wrap;
7163
    /* was made negative by deflate(..., Z_FINISH); */
7164
  }
7165
  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
7166
  strm.adler = (s.wrap === 2) ?
7167
    0  // crc32(0, Z_NULL, 0)
7168
  :
7169
    1; // adler32(0, Z_NULL, 0)
7170
  s.last_flush = Z_NO_FLUSH;
7171
  trees._tr_init(s);
7172
  return Z_OK;
7173
}
7174

    
7175

    
7176
function deflateReset(strm) {
7177
  var ret = deflateResetKeep(strm);
7178
  if (ret === Z_OK) {
7179
    lm_init(strm.state);
7180
  }
7181
  return ret;
7182
}
7183

    
7184

    
7185
function deflateSetHeader(strm, head) {
7186
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
7187
  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
7188
  strm.state.gzhead = head;
7189
  return Z_OK;
7190
}
7191

    
7192

    
7193
function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
7194
  if (!strm) { // === Z_NULL
7195
    return Z_STREAM_ERROR;
7196
  }
7197
  var wrap = 1;
7198

    
7199
  if (level === Z_DEFAULT_COMPRESSION) {
7200
    level = 6;
7201
  }
7202

    
7203
  if (windowBits < 0) { /* suppress zlib wrapper */
7204
    wrap = 0;
7205
    windowBits = -windowBits;
7206
  }
7207

    
7208
  else if (windowBits > 15) {
7209
    wrap = 2;           /* write gzip wrapper instead */
7210
    windowBits -= 16;
7211
  }
7212

    
7213

    
7214
  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
7215
    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
7216
    strategy < 0 || strategy > Z_FIXED) {
7217
    return err(strm, Z_STREAM_ERROR);
7218
  }
7219

    
7220

    
7221
  if (windowBits === 8) {
7222
    windowBits = 9;
7223
  }
7224
  /* until 256-byte window bug fixed */
7225

    
7226
  var s = new DeflateState();
7227

    
7228
  strm.state = s;
7229
  s.strm = strm;
7230

    
7231
  s.wrap = wrap;
7232
  s.gzhead = null;
7233
  s.w_bits = windowBits;
7234
  s.w_size = 1 << s.w_bits;
7235
  s.w_mask = s.w_size - 1;
7236

    
7237
  s.hash_bits = memLevel + 7;
7238
  s.hash_size = 1 << s.hash_bits;
7239
  s.hash_mask = s.hash_size - 1;
7240
  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
7241

    
7242
  s.window = new utils.Buf8(s.w_size * 2);
7243
  s.head = new utils.Buf16(s.hash_size);
7244
  s.prev = new utils.Buf16(s.w_size);
7245

    
7246
  // Don't need mem init magic for JS.
7247
  //s.high_water = 0;  /* nothing written to s->window yet */
7248

    
7249
  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
7250

    
7251
  s.pending_buf_size = s.lit_bufsize * 4;
7252

    
7253
  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
7254
  //s->pending_buf = (uchf *) overlay;
7255
  s.pending_buf = new utils.Buf8(s.pending_buf_size);
7256

    
7257
  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
7258
  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
7259
  s.d_buf = 1 * s.lit_bufsize;
7260

    
7261
  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
7262
  s.l_buf = (1 + 2) * s.lit_bufsize;
7263

    
7264
  s.level = level;
7265
  s.strategy = strategy;
7266
  s.method = method;
7267

    
7268
  return deflateReset(strm);
7269
}
7270

    
7271
function deflateInit(strm, level) {
7272
  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
7273
}
7274

    
7275

    
7276
function deflate(strm, flush) {
7277
  var old_flush, s;
7278
  var beg, val; // for gzip header write only
7279

    
7280
  if (!strm || !strm.state ||
7281
    flush > Z_BLOCK || flush < 0) {
7282
    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
7283
  }
7284

    
7285
  s = strm.state;
7286

    
7287
  if (!strm.output ||
7288
      (!strm.input && strm.avail_in !== 0) ||
7289
      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
7290
    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
7291
  }
7292

    
7293
  s.strm = strm; /* just in case */
7294
  old_flush = s.last_flush;
7295
  s.last_flush = flush;
7296

    
7297
  /* Write the header */
7298
  if (s.status === INIT_STATE) {
7299

    
7300
    if (s.wrap === 2) { // GZIP header
7301
      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
7302
      put_byte(s, 31);
7303
      put_byte(s, 139);
7304
      put_byte(s, 8);
7305
      if (!s.gzhead) { // s->gzhead == Z_NULL
7306
        put_byte(s, 0);
7307
        put_byte(s, 0);
7308
        put_byte(s, 0);
7309
        put_byte(s, 0);
7310
        put_byte(s, 0);
7311
        put_byte(s, s.level === 9 ? 2 :
7312
                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
7313
                     4 : 0));
7314
        put_byte(s, OS_CODE);
7315
        s.status = BUSY_STATE;
7316
      }
7317
      else {
7318
        put_byte(s, (s.gzhead.text ? 1 : 0) +
7319
                    (s.gzhead.hcrc ? 2 : 0) +
7320
                    (!s.gzhead.extra ? 0 : 4) +
7321
                    (!s.gzhead.name ? 0 : 8) +
7322
                    (!s.gzhead.comment ? 0 : 16)
7323
                );
7324
        put_byte(s, s.gzhead.time & 0xff);
7325
        put_byte(s, (s.gzhead.time >> 8) & 0xff);
7326
        put_byte(s, (s.gzhead.time >> 16) & 0xff);
7327
        put_byte(s, (s.gzhead.time >> 24) & 0xff);
7328
        put_byte(s, s.level === 9 ? 2 :
7329
                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
7330
                     4 : 0));
7331
        put_byte(s, s.gzhead.os & 0xff);
7332
        if (s.gzhead.extra && s.gzhead.extra.length) {
7333
          put_byte(s, s.gzhead.extra.length & 0xff);
7334
          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
7335
        }
7336
        if (s.gzhead.hcrc) {
7337
          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
7338
        }
7339
        s.gzindex = 0;
7340
        s.status = EXTRA_STATE;
7341
      }
7342
    }
7343
    else // DEFLATE header
7344
    {
7345
      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
7346
      var level_flags = -1;
7347

    
7348
      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
7349
        level_flags = 0;
7350
      } else if (s.level < 6) {
7351
        level_flags = 1;
7352
      } else if (s.level === 6) {
7353
        level_flags = 2;
7354
      } else {
7355
        level_flags = 3;
7356
      }
7357
      header |= (level_flags << 6);
7358
      if (s.strstart !== 0) { header |= PRESET_DICT; }
7359
      header += 31 - (header % 31);
7360

    
7361
      s.status = BUSY_STATE;
7362
      putShortMSB(s, header);
7363

    
7364
      /* Save the adler32 of the preset dictionary: */
7365
      if (s.strstart !== 0) {
7366
        putShortMSB(s, strm.adler >>> 16);
7367
        putShortMSB(s, strm.adler & 0xffff);
7368
      }
7369
      strm.adler = 1; // adler32(0L, Z_NULL, 0);
7370
    }
7371
  }
7372

    
7373
//#ifdef GZIP
7374
  if (s.status === EXTRA_STATE) {
7375
    if (s.gzhead.extra/* != Z_NULL*/) {
7376
      beg = s.pending;  /* start of bytes to update crc */
7377

    
7378
      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
7379
        if (s.pending === s.pending_buf_size) {
7380
          if (s.gzhead.hcrc && s.pending > beg) {
7381
            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
7382
          }
7383
          flush_pending(strm);
7384
          beg = s.pending;
7385
          if (s.pending === s.pending_buf_size) {
7386
            break;
7387
          }
7388
        }
7389
        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
7390
        s.gzindex++;
7391
      }
7392
      if (s.gzhead.hcrc && s.pending > beg) {
7393
        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
7394
      }
7395
      if (s.gzindex === s.gzhead.extra.length) {
7396
        s.gzindex = 0;
7397
        s.status = NAME_STATE;
7398
      }
7399
    }
7400
    else {
7401
      s.status = NAME_STATE;
7402
    }
7403
  }
7404
  if (s.status === NAME_STATE) {
7405
    if (s.gzhead.name/* != Z_NULL*/) {
7406
      beg = s.pending;  /* start of bytes to update crc */
7407
      //int val;
7408

    
7409
      do {
7410
        if (s.pending === s.pending_buf_size) {
7411
          if (s.gzhead.hcrc && s.pending > beg) {
7412
            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
7413
          }
7414
          flush_pending(strm);
7415
          beg = s.pending;
7416
          if (s.pending === s.pending_buf_size) {
7417
            val = 1;
7418
            break;
7419
          }
7420
        }
7421
        // JS specific: little magic to add zero terminator to end of string
7422
        if (s.gzindex < s.gzhead.name.length) {
7423
          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
7424
        } else {
7425
          val = 0;
7426
        }
7427
        put_byte(s, val);
7428
      } while (val !== 0);
7429

    
7430
      if (s.gzhead.hcrc && s.pending > beg) {
7431
        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
7432
      }
7433
      if (val === 0) {
7434
        s.gzindex = 0;
7435
        s.status = COMMENT_STATE;
7436
      }
7437
    }
7438
    else {
7439
      s.status = COMMENT_STATE;
7440
    }
7441
  }
7442
  if (s.status === COMMENT_STATE) {
7443
    if (s.gzhead.comment/* != Z_NULL*/) {
7444
      beg = s.pending;  /* start of bytes to update crc */
7445
      //int val;
7446

    
7447
      do {
7448
        if (s.pending === s.pending_buf_size) {
7449
          if (s.gzhead.hcrc && s.pending > beg) {
7450
            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
7451
          }
7452
          flush_pending(strm);
7453
          beg = s.pending;
7454
          if (s.pending === s.pending_buf_size) {
7455
            val = 1;
7456
            break;
7457
          }
7458
        }
7459
        // JS specific: little magic to add zero terminator to end of string
7460
        if (s.gzindex < s.gzhead.comment.length) {
7461
          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
7462
        } else {
7463
          val = 0;
7464
        }
7465
        put_byte(s, val);
7466
      } while (val !== 0);
7467

    
7468
      if (s.gzhead.hcrc && s.pending > beg) {
7469
        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
7470
      }
7471
      if (val === 0) {
7472
        s.status = HCRC_STATE;
7473
      }
7474
    }
7475
    else {
7476
      s.status = HCRC_STATE;
7477
    }
7478
  }
7479
  if (s.status === HCRC_STATE) {
7480
    if (s.gzhead.hcrc) {
7481
      if (s.pending + 2 > s.pending_buf_size) {
7482
        flush_pending(strm);
7483
      }
7484
      if (s.pending + 2 <= s.pending_buf_size) {
7485
        put_byte(s, strm.adler & 0xff);
7486
        put_byte(s, (strm.adler >> 8) & 0xff);
7487
        strm.adler = 0; //crc32(0L, Z_NULL, 0);
7488
        s.status = BUSY_STATE;
7489
      }
7490
    }
7491
    else {
7492
      s.status = BUSY_STATE;
7493
    }
7494
  }
7495
//#endif
7496

    
7497
  /* Flush as much pending output as possible */
7498
  if (s.pending !== 0) {
7499
    flush_pending(strm);
7500
    if (strm.avail_out === 0) {
7501
      /* Since avail_out is 0, deflate will be called again with
7502
       * more output space, but possibly with both pending and
7503
       * avail_in equal to zero. There won't be anything to do,
7504
       * but this is not an error situation so make sure we
7505
       * return OK instead of BUF_ERROR at next call of deflate:
7506
       */
7507
      s.last_flush = -1;
7508
      return Z_OK;
7509
    }
7510

    
7511
    /* Make sure there is something to do and avoid duplicate consecutive
7512
     * flushes. For repeated and useless calls with Z_FINISH, we keep
7513
     * returning Z_STREAM_END instead of Z_BUF_ERROR.
7514
     */
7515
  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
7516
    flush !== Z_FINISH) {
7517
    return err(strm, Z_BUF_ERROR);
7518
  }
7519

    
7520
  /* User must not provide more input after the first FINISH: */
7521
  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
7522
    return err(strm, Z_BUF_ERROR);
7523
  }
7524

    
7525
  /* Start a new block or continue the current one.
7526
   */
7527
  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
7528
    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
7529
    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
7530
      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
7531
        configuration_table[s.level].func(s, flush));
7532

    
7533
    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
7534
      s.status = FINISH_STATE;
7535
    }
7536
    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
7537
      if (strm.avail_out === 0) {
7538
        s.last_flush = -1;
7539
        /* avoid BUF_ERROR next call, see above */
7540
      }
7541
      return Z_OK;
7542
      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
7543
       * of deflate should use the same flush parameter to make sure
7544
       * that the flush is complete. So we don't have to output an
7545
       * empty block here, this will be done at next call. This also
7546
       * ensures that for a very small output buffer, we emit at most
7547
       * one empty block.
7548
       */
7549
    }
7550
    if (bstate === BS_BLOCK_DONE) {
7551
      if (flush === Z_PARTIAL_FLUSH) {
7552
        trees._tr_align(s);
7553
      }
7554
      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
7555

    
7556
        trees._tr_stored_block(s, 0, 0, false);
7557
        /* For a full flush, this empty block will be recognized
7558
         * as a special marker by inflate_sync().
7559
         */
7560
        if (flush === Z_FULL_FLUSH) {
7561
          /*** CLEAR_HASH(s); ***/             /* forget history */
7562
          zero(s.head); // Fill with NIL (= 0);
7563

    
7564
          if (s.lookahead === 0) {
7565
            s.strstart = 0;
7566
            s.block_start = 0;
7567
            s.insert = 0;
7568
          }
7569
        }
7570
      }
7571
      flush_pending(strm);
7572
      if (strm.avail_out === 0) {
7573
        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
7574
        return Z_OK;
7575
      }
7576
    }
7577
  }
7578
  //Assert(strm->avail_out > 0, "bug2");
7579
  //if (strm.avail_out <= 0) { throw new Error("bug2");}
7580

    
7581
  if (flush !== Z_FINISH) { return Z_OK; }
7582
  if (s.wrap <= 0) { return Z_STREAM_END; }
7583

    
7584
  /* Write the trailer */
7585
  if (s.wrap === 2) {
7586
    put_byte(s, strm.adler & 0xff);
7587
    put_byte(s, (strm.adler >> 8) & 0xff);
7588
    put_byte(s, (strm.adler >> 16) & 0xff);
7589
    put_byte(s, (strm.adler >> 24) & 0xff);
7590
    put_byte(s, strm.total_in & 0xff);
7591
    put_byte(s, (strm.total_in >> 8) & 0xff);
7592
    put_byte(s, (strm.total_in >> 16) & 0xff);
7593
    put_byte(s, (strm.total_in >> 24) & 0xff);
7594
  }
7595
  else
7596
  {
7597
    putShortMSB(s, strm.adler >>> 16);
7598
    putShortMSB(s, strm.adler & 0xffff);
7599
  }
7600

    
7601
  flush_pending(strm);
7602
  /* If avail_out is zero, the application will call deflate again
7603
   * to flush the rest.
7604
   */
7605
  if (s.wrap > 0) { s.wrap = -s.wrap; }
7606
  /* write the trailer only once! */
7607
  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
7608
}
7609

    
7610
function deflateEnd(strm) {
7611
  var status;
7612

    
7613
  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
7614
    return Z_STREAM_ERROR;
7615
  }
7616

    
7617
  status = strm.state.status;
7618
  if (status !== INIT_STATE &&
7619
    status !== EXTRA_STATE &&
7620
    status !== NAME_STATE &&
7621
    status !== COMMENT_STATE &&
7622
    status !== HCRC_STATE &&
7623
    status !== BUSY_STATE &&
7624
    status !== FINISH_STATE
7625
  ) {
7626
    return err(strm, Z_STREAM_ERROR);
7627
  }
7628

    
7629
  strm.state = null;
7630

    
7631
  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
7632
}
7633

    
7634

    
7635
/* =========================================================================
7636
 * Initializes the compression dictionary from the given byte
7637
 * sequence without producing any compressed output.
7638
 */
7639
function deflateSetDictionary(strm, dictionary) {
7640
  var dictLength = dictionary.length;
7641

    
7642
  var s;
7643
  var str, n;
7644
  var wrap;
7645
  var avail;
7646
  var next;
7647
  var input;
7648
  var tmpDict;
7649

    
7650
  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
7651
    return Z_STREAM_ERROR;
7652
  }
7653

    
7654
  s = strm.state;
7655
  wrap = s.wrap;
7656

    
7657
  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
7658
    return Z_STREAM_ERROR;
7659
  }
7660

    
7661
  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
7662
  if (wrap === 1) {
7663
    /* adler32(strm->adler, dictionary, dictLength); */
7664
    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
7665
  }
7666

    
7667
  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */
7668

    
7669
  /* if dictionary would fill window, just replace the history */
7670
  if (dictLength >= s.w_size) {
7671
    if (wrap === 0) {            /* already empty otherwise */
7672
      /*** CLEAR_HASH(s); ***/
7673
      zero(s.head); // Fill with NIL (= 0);
7674
      s.strstart = 0;
7675
      s.block_start = 0;
7676
      s.insert = 0;
7677
    }
7678
    /* use the tail */
7679
    // dictionary = dictionary.slice(dictLength - s.w_size);
7680
    tmpDict = new utils.Buf8(s.w_size);
7681
    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
7682
    dictionary = tmpDict;
7683
    dictLength = s.w_size;
7684
  }
7685
  /* insert dictionary into window and hash */
7686
  avail = strm.avail_in;
7687
  next = strm.next_in;
7688
  input = strm.input;
7689
  strm.avail_in = dictLength;
7690
  strm.next_in = 0;
7691
  strm.input = dictionary;
7692
  fill_window(s);
7693
  while (s.lookahead >= MIN_MATCH) {
7694
    str = s.strstart;
7695
    n = s.lookahead - (MIN_MATCH - 1);
7696
    do {
7697
      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
7698
      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
7699

    
7700
      s.prev[str & s.w_mask] = s.head[s.ins_h];
7701

    
7702
      s.head[s.ins_h] = str;
7703
      str++;
7704
    } while (--n);
7705
    s.strstart = str;
7706
    s.lookahead = MIN_MATCH - 1;
7707
    fill_window(s);
7708
  }
7709
  s.strstart += s.lookahead;
7710
  s.block_start = s.strstart;
7711
  s.insert = s.lookahead;
7712
  s.lookahead = 0;
7713
  s.match_length = s.prev_length = MIN_MATCH - 1;
7714
  s.match_available = 0;
7715
  strm.next_in = next;
7716
  strm.input = input;
7717
  strm.avail_in = avail;
7718
  s.wrap = wrap;
7719
  return Z_OK;
7720
}
7721

    
7722

    
7723
exports.deflateInit = deflateInit;
7724
exports.deflateInit2 = deflateInit2;
7725
exports.deflateReset = deflateReset;
7726
exports.deflateResetKeep = deflateResetKeep;
7727
exports.deflateSetHeader = deflateSetHeader;
7728
exports.deflate = deflate;
7729
exports.deflateEnd = deflateEnd;
7730
exports.deflateSetDictionary = deflateSetDictionary;
7731
exports.deflateInfo = 'pako deflate (from Nodeca project)';
7732

    
7733
/* Not implemented
7734
exports.deflateBound = deflateBound;
7735
exports.deflateCopy = deflateCopy;
7736
exports.deflateParams = deflateParams;
7737
exports.deflatePending = deflatePending;
7738
exports.deflatePrime = deflatePrime;
7739
exports.deflateTune = deflateTune;
7740
*/
7741

    
7742
},{"../utils/common":41,"./adler32":43,"./crc32":45,"./messages":51,"./trees":52}],47:[function(require,module,exports){
7743
'use strict';
7744

    
7745
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
7746
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
7747
//
7748
// This software is provided 'as-is', without any express or implied
7749
// warranty. In no event will the authors be held liable for any damages
7750
// arising from the use of this software.
7751
//
7752
// Permission is granted to anyone to use this software for any purpose,
7753
// including commercial applications, and to alter it and redistribute it
7754
// freely, subject to the following restrictions:
7755
//
7756
// 1. The origin of this software must not be misrepresented; you must not
7757
//   claim that you wrote the original software. If you use this software
7758
//   in a product, an acknowledgment in the product documentation would be
7759
//   appreciated but is not required.
7760
// 2. Altered source versions must be plainly marked as such, and must not be
7761
//   misrepresented as being the original software.
7762
// 3. This notice may not be removed or altered from any source distribution.
7763

    
7764
function GZheader() {
7765
  /* true if compressed data believed to be text */
7766
  this.text       = 0;
7767
  /* modification time */
7768
  this.time       = 0;
7769
  /* extra flags (not used when writing a gzip file) */
7770
  this.xflags     = 0;
7771
  /* operating system */
7772
  this.os         = 0;
7773
  /* pointer to extra field or Z_NULL if none */
7774
  this.extra      = null;
7775
  /* extra field length (valid if extra != Z_NULL) */
7776
  this.extra_len  = 0; // Actually, we don't need it in JS,
7777
                       // but leave for few code modifications
7778

    
7779
  //
7780
  // Setup limits is not necessary because in js we should not preallocate memory
7781
  // for inflate use constant limit in 65536 bytes
7782
  //
7783

    
7784
  /* space at extra (only when reading header) */
7785
  // this.extra_max  = 0;
7786
  /* pointer to zero-terminated file name or Z_NULL */
7787
  this.name       = '';
7788
  /* space at name (only when reading header) */
7789
  // this.name_max   = 0;
7790
  /* pointer to zero-terminated comment or Z_NULL */
7791
  this.comment    = '';
7792
  /* space at comment (only when reading header) */
7793
  // this.comm_max   = 0;
7794
  /* true if there was or will be a header crc */
7795
  this.hcrc       = 0;
7796
  /* true when done reading gzip header (not used when writing a gzip file) */
7797
  this.done       = false;
7798
}
7799

    
7800
module.exports = GZheader;
7801

    
7802
},{}],48:[function(require,module,exports){
7803
'use strict';
7804

    
7805
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
7806
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
7807
//
7808
// This software is provided 'as-is', without any express or implied
7809
// warranty. In no event will the authors be held liable for any damages
7810
// arising from the use of this software.
7811
//
7812
// Permission is granted to anyone to use this software for any purpose,
7813
// including commercial applications, and to alter it and redistribute it
7814
// freely, subject to the following restrictions:
7815
//
7816
// 1. The origin of this software must not be misrepresented; you must not
7817
//   claim that you wrote the original software. If you use this software
7818
//   in a product, an acknowledgment in the product documentation would be
7819
//   appreciated but is not required.
7820
// 2. Altered source versions must be plainly marked as such, and must not be
7821
//   misrepresented as being the original software.
7822
// 3. This notice may not be removed or altered from any source distribution.
7823

    
7824
// See state defs from inflate.js
7825
var BAD = 30;       /* got a data error -- remain here until reset */
7826
var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
7827

    
7828
/*
7829
   Decode literal, length, and distance codes and write out the resulting
7830
   literal and match bytes until either not enough input or output is
7831
   available, an end-of-block is encountered, or a data error is encountered.
7832
   When large enough input and output buffers are supplied to inflate(), for
7833
   example, a 16K input buffer and a 64K output buffer, more than 95% of the
7834
   inflate execution time is spent in this routine.
7835

7836
   Entry assumptions:
7837

7838
        state.mode === LEN
7839
        strm.avail_in >= 6
7840
        strm.avail_out >= 258
7841
        start >= strm.avail_out
7842
        state.bits < 8
7843

7844
   On return, state.mode is one of:
7845

7846
        LEN -- ran out of enough output space or enough available input
7847
        TYPE -- reached end of block code, inflate() to interpret next block
7848
        BAD -- error in block data
7849

7850
   Notes:
7851

7852
    - The maximum input bits used by a length/distance pair is 15 bits for the
7853
      length code, 5 bits for the length extra, 15 bits for the distance code,
7854
      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
7855
      Therefore if strm.avail_in >= 6, then there is enough input to avoid
7856
      checking for available input while decoding.
7857

7858
    - The maximum bytes that a single length/distance pair can output is 258
7859
      bytes, which is the maximum length that can be coded.  inflate_fast()
7860
      requires strm.avail_out >= 258 for each loop to avoid checking for
7861
      output space.
7862
 */
7863
module.exports = function inflate_fast(strm, start) {
7864
  var state;
7865
  var _in;                    /* local strm.input */
7866
  var last;                   /* have enough input while in < last */
7867
  var _out;                   /* local strm.output */
7868
  var beg;                    /* inflate()'s initial strm.output */
7869
  var end;                    /* while out < end, enough space available */
7870
//#ifdef INFLATE_STRICT
7871
  var dmax;                   /* maximum distance from zlib header */
7872
//#endif
7873
  var wsize;                  /* window size or zero if not using window */
7874
  var whave;                  /* valid bytes in the window */
7875
  var wnext;                  /* window write index */
7876
  // Use `s_window` instead `window`, avoid conflict with instrumentation tools
7877
  var s_window;               /* allocated sliding window, if wsize != 0 */
7878
  var hold;                   /* local strm.hold */
7879
  var bits;                   /* local strm.bits */
7880
  var lcode;                  /* local strm.lencode */
7881
  var dcode;                  /* local strm.distcode */
7882
  var lmask;                  /* mask for first level of length codes */
7883
  var dmask;                  /* mask for first level of distance codes */
7884
  var here;                   /* retrieved table entry */
7885
  var op;                     /* code bits, operation, extra bits, or */
7886
                              /*  window position, window bytes to copy */
7887
  var len;                    /* match length, unused bytes */
7888
  var dist;                   /* match distance */
7889
  var from;                   /* where to copy match from */
7890
  var from_source;
7891

    
7892

    
7893
  var input, output; // JS specific, because we have no pointers
7894

    
7895
  /* copy state to local variables */
7896
  state = strm.state;
7897
  //here = state.here;
7898
  _in = strm.next_in;
7899
  input = strm.input;
7900
  last = _in + (strm.avail_in - 5);
7901
  _out = strm.next_out;
7902
  output = strm.output;
7903
  beg = _out - (start - strm.avail_out);
7904
  end = _out + (strm.avail_out - 257);
7905
//#ifdef INFLATE_STRICT
7906
  dmax = state.dmax;
7907
//#endif
7908
  wsize = state.wsize;
7909
  whave = state.whave;
7910
  wnext = state.wnext;
7911
  s_window = state.window;
7912
  hold = state.hold;
7913
  bits = state.bits;
7914
  lcode = state.lencode;
7915
  dcode = state.distcode;
7916
  lmask = (1 << state.lenbits) - 1;
7917
  dmask = (1 << state.distbits) - 1;
7918

    
7919

    
7920
  /* decode literals and length/distances until end-of-block or not enough
7921
     input data or output space */
7922

    
7923
  top:
7924
  do {
7925
    if (bits < 15) {
7926
      hold += input[_in++] << bits;
7927
      bits += 8;
7928
      hold += input[_in++] << bits;
7929
      bits += 8;
7930
    }
7931

    
7932
    here = lcode[hold & lmask];
7933

    
7934
    dolen:
7935
    for (;;) { // Goto emulation
7936
      op = here >>> 24/*here.bits*/;
7937
      hold >>>= op;
7938
      bits -= op;
7939
      op = (here >>> 16) & 0xff/*here.op*/;
7940
      if (op === 0) {                          /* literal */
7941
        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
7942
        //        "inflate:         literal '%c'\n" :
7943
        //        "inflate:         literal 0x%02x\n", here.val));
7944
        output[_out++] = here & 0xffff/*here.val*/;
7945
      }
7946
      else if (op & 16) {                     /* length base */
7947
        len = here & 0xffff/*here.val*/;
7948
        op &= 15;                           /* number of extra bits */
7949
        if (op) {
7950
          if (bits < op) {
7951
            hold += input[_in++] << bits;
7952
            bits += 8;
7953
          }
7954
          len += hold & ((1 << op) - 1);
7955
          hold >>>= op;
7956
          bits -= op;
7957
        }
7958
        //Tracevv((stderr, "inflate:         length %u\n", len));
7959
        if (bits < 15) {
7960
          hold += input[_in++] << bits;
7961
          bits += 8;
7962
          hold += input[_in++] << bits;
7963
          bits += 8;
7964
        }
7965
        here = dcode[hold & dmask];
7966

    
7967
        dodist:
7968
        for (;;) { // goto emulation
7969
          op = here >>> 24/*here.bits*/;
7970
          hold >>>= op;
7971
          bits -= op;
7972
          op = (here >>> 16) & 0xff/*here.op*/;
7973

    
7974
          if (op & 16) {                      /* distance base */
7975
            dist = here & 0xffff/*here.val*/;
7976
            op &= 15;                       /* number of extra bits */
7977
            if (bits < op) {
7978
              hold += input[_in++] << bits;
7979
              bits += 8;
7980
              if (bits < op) {
7981
                hold += input[_in++] << bits;
7982
                bits += 8;
7983
              }
7984
            }
7985
            dist += hold & ((1 << op) - 1);
7986
//#ifdef INFLATE_STRICT
7987
            if (dist > dmax) {
7988
              strm.msg = 'invalid distance too far back';
7989
              state.mode = BAD;
7990
              break top;
7991
            }
7992
//#endif
7993
            hold >>>= op;
7994
            bits -= op;
7995
            //Tracevv((stderr, "inflate:         distance %u\n", dist));
7996
            op = _out - beg;                /* max distance in output */
7997
            if (dist > op) {                /* see if copy from window */
7998
              op = dist - op;               /* distance back in window */
7999
              if (op > whave) {
8000
                if (state.sane) {
8001
                  strm.msg = 'invalid distance too far back';
8002
                  state.mode = BAD;
8003
                  break top;
8004
                }
8005

    
8006
// (!) This block is disabled in zlib defailts,
8007
// don't enable it for binary compatibility
8008
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
8009
//                if (len <= op - whave) {
8010
//                  do {
8011
//                    output[_out++] = 0;
8012
//                  } while (--len);
8013
//                  continue top;
8014
//                }
8015
//                len -= op - whave;
8016
//                do {
8017
//                  output[_out++] = 0;
8018
//                } while (--op > whave);
8019
//                if (op === 0) {
8020
//                  from = _out - dist;
8021
//                  do {
8022
//                    output[_out++] = output[from++];
8023
//                  } while (--len);
8024
//                  continue top;
8025
//                }
8026
//#endif
8027
              }
8028
              from = 0; // window index
8029
              from_source = s_window;
8030
              if (wnext === 0) {           /* very common case */
8031
                from += wsize - op;
8032
                if (op < len) {         /* some from window */
8033
                  len -= op;
8034
                  do {
8035
                    output[_out++] = s_window[from++];
8036
                  } while (--op);
8037
                  from = _out - dist;  /* rest from output */
8038
                  from_source = output;
8039
                }
8040
              }
8041
              else if (wnext < op) {      /* wrap around window */
8042
                from += wsize + wnext - op;
8043
                op -= wnext;
8044
                if (op < len) {         /* some from end of window */
8045
                  len -= op;
8046
                  do {
8047
                    output[_out++] = s_window[from++];
8048
                  } while (--op);
8049
                  from = 0;
8050
                  if (wnext < len) {  /* some from start of window */
8051
                    op = wnext;
8052
                    len -= op;
8053
                    do {
8054
                      output[_out++] = s_window[from++];
8055
                    } while (--op);
8056
                    from = _out - dist;      /* rest from output */
8057
                    from_source = output;
8058
                  }
8059
                }
8060
              }
8061
              else {                      /* contiguous in window */
8062
                from += wnext - op;
8063
                if (op < len) {         /* some from window */
8064
                  len -= op;
8065
                  do {
8066
                    output[_out++] = s_window[from++];
8067
                  } while (--op);
8068
                  from = _out - dist;  /* rest from output */
8069
                  from_source = output;
8070
                }
8071
              }
8072
              while (len > 2) {
8073
                output[_out++] = from_source[from++];
8074
                output[_out++] = from_source[from++];
8075
                output[_out++] = from_source[from++];
8076
                len -= 3;
8077
              }
8078
              if (len) {
8079
                output[_out++] = from_source[from++];
8080
                if (len > 1) {
8081
                  output[_out++] = from_source[from++];
8082
                }
8083
              }
8084
            }
8085
            else {
8086
              from = _out - dist;          /* copy direct from output */
8087
              do {                        /* minimum length is three */
8088
                output[_out++] = output[from++];
8089
                output[_out++] = output[from++];
8090
                output[_out++] = output[from++];
8091
                len -= 3;
8092
              } while (len > 2);
8093
              if (len) {
8094
                output[_out++] = output[from++];
8095
                if (len > 1) {
8096
                  output[_out++] = output[from++];
8097
                }
8098
              }
8099
            }
8100
          }
8101
          else if ((op & 64) === 0) {          /* 2nd level distance code */
8102
            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
8103
            continue dodist;
8104
          }
8105
          else {
8106
            strm.msg = 'invalid distance code';
8107
            state.mode = BAD;
8108
            break top;
8109
          }
8110

    
8111
          break; // need to emulate goto via "continue"
8112
        }
8113
      }
8114
      else if ((op & 64) === 0) {              /* 2nd level length code */
8115
        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
8116
        continue dolen;
8117
      }
8118
      else if (op & 32) {                     /* end-of-block */
8119
        //Tracevv((stderr, "inflate:         end of block\n"));
8120
        state.mode = TYPE;
8121
        break top;
8122
      }
8123
      else {
8124
        strm.msg = 'invalid literal/length code';
8125
        state.mode = BAD;
8126
        break top;
8127
      }
8128

    
8129
      break; // need to emulate goto via "continue"
8130
    }
8131
  } while (_in < last && _out < end);
8132

    
8133
  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
8134
  len = bits >> 3;
8135
  _in -= len;
8136
  bits -= len << 3;
8137
  hold &= (1 << bits) - 1;
8138

    
8139
  /* update state and return */
8140
  strm.next_in = _in;
8141
  strm.next_out = _out;
8142
  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
8143
  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
8144
  state.hold = hold;
8145
  state.bits = bits;
8146
  return;
8147
};
8148

    
8149
},{}],49:[function(require,module,exports){
8150
'use strict';
8151

    
8152
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
8153
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
8154
//
8155
// This software is provided 'as-is', without any express or implied
8156
// warranty. In no event will the authors be held liable for any damages
8157
// arising from the use of this software.
8158
//
8159
// Permission is granted to anyone to use this software for any purpose,
8160
// including commercial applications, and to alter it and redistribute it
8161
// freely, subject to the following restrictions:
8162
//
8163
// 1. The origin of this software must not be misrepresented; you must not
8164
//   claim that you wrote the original software. If you use this software
8165
//   in a product, an acknowledgment in the product documentation would be
8166
//   appreciated but is not required.
8167
// 2. Altered source versions must be plainly marked as such, and must not be
8168
//   misrepresented as being the original software.
8169
// 3. This notice may not be removed or altered from any source distribution.
8170

    
8171
var utils         = require('../utils/common');
8172
var adler32       = require('./adler32');
8173
var crc32         = require('./crc32');
8174
var inflate_fast  = require('./inffast');
8175
var inflate_table = require('./inftrees');
8176

    
8177
var CODES = 0;
8178
var LENS = 1;
8179
var DISTS = 2;
8180

    
8181
/* Public constants ==========================================================*/
8182
/* ===========================================================================*/
8183

    
8184

    
8185
/* Allowed flush values; see deflate() and inflate() below for details */
8186
//var Z_NO_FLUSH      = 0;
8187
//var Z_PARTIAL_FLUSH = 1;
8188
//var Z_SYNC_FLUSH    = 2;
8189
//var Z_FULL_FLUSH    = 3;
8190
var Z_FINISH        = 4;
8191
var Z_BLOCK         = 5;
8192
var Z_TREES         = 6;
8193

    
8194

    
8195
/* Return codes for the compression/decompression functions. Negative values
8196
 * are errors, positive values are used for special but normal events.
8197
 */
8198
var Z_OK            = 0;
8199
var Z_STREAM_END    = 1;
8200
var Z_NEED_DICT     = 2;
8201
//var Z_ERRNO         = -1;
8202
var Z_STREAM_ERROR  = -2;
8203
var Z_DATA_ERROR    = -3;
8204
var Z_MEM_ERROR     = -4;
8205
var Z_BUF_ERROR     = -5;
8206
//var Z_VERSION_ERROR = -6;
8207

    
8208
/* The deflate compression method */
8209
var Z_DEFLATED  = 8;
8210

    
8211

    
8212
/* STATES ====================================================================*/
8213
/* ===========================================================================*/
8214

    
8215

    
8216
var    HEAD = 1;       /* i: waiting for magic header */
8217
var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
8218
var    TIME = 3;       /* i: waiting for modification time (gzip) */
8219
var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
8220
var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
8221
var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
8222
var    NAME = 7;       /* i: waiting for end of file name (gzip) */
8223
var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
8224
var    HCRC = 9;       /* i: waiting for header crc (gzip) */
8225
var    DICTID = 10;    /* i: waiting for dictionary check value */
8226
var    DICT = 11;      /* waiting for inflateSetDictionary() call */
8227
var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
8228
var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
8229
var        STORED = 14;    /* i: waiting for stored size (length and complement) */
8230
var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
8231
var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
8232
var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
8233
var        LENLENS = 18;   /* i: waiting for code length code lengths */
8234
var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
8235
var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
8236
var            LEN = 21;       /* i: waiting for length/lit/eob code */
8237
var            LENEXT = 22;    /* i: waiting for length extra bits */
8238
var            DIST = 23;      /* i: waiting for distance code */
8239
var            DISTEXT = 24;   /* i: waiting for distance extra bits */
8240
var            MATCH = 25;     /* o: waiting for output space to copy string */
8241
var            LIT = 26;       /* o: waiting for output space to write literal */
8242
var    CHECK = 27;     /* i: waiting for 32-bit check value */
8243
var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
8244
var    DONE = 29;      /* finished check, done -- remain here until reset */
8245
var    BAD = 30;       /* got a data error -- remain here until reset */
8246
var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
8247
var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
8248

    
8249
/* ===========================================================================*/
8250

    
8251

    
8252

    
8253
var ENOUGH_LENS = 852;
8254
var ENOUGH_DISTS = 592;
8255
//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
8256

    
8257
var MAX_WBITS = 15;
8258
/* 32K LZ77 window */
8259
var DEF_WBITS = MAX_WBITS;
8260

    
8261

    
8262
function zswap32(q) {
8263
  return  (((q >>> 24) & 0xff) +
8264
          ((q >>> 8) & 0xff00) +
8265
          ((q & 0xff00) << 8) +
8266
          ((q & 0xff) << 24));
8267
}
8268

    
8269

    
8270
function InflateState() {
8271
  this.mode = 0;             /* current inflate mode */
8272
  this.last = false;          /* true if processing last block */
8273
  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
8274
  this.havedict = false;      /* true if dictionary provided */
8275
  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
8276
  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
8277
  this.check = 0;             /* protected copy of check value */
8278
  this.total = 0;             /* protected copy of output count */
8279
  // TODO: may be {}
8280
  this.head = null;           /* where to save gzip header information */
8281

    
8282
  /* sliding window */
8283
  this.wbits = 0;             /* log base 2 of requested window size */
8284
  this.wsize = 0;             /* window size or zero if not using window */
8285
  this.whave = 0;             /* valid bytes in the window */
8286
  this.wnext = 0;             /* window write index */
8287
  this.window = null;         /* allocated sliding window, if needed */
8288

    
8289
  /* bit accumulator */
8290
  this.hold = 0;              /* input bit accumulator */
8291
  this.bits = 0;              /* number of bits in "in" */
8292

    
8293
  /* for string and stored block copying */
8294
  this.length = 0;            /* literal or length of data to copy */
8295
  this.offset = 0;            /* distance back to copy string from */
8296

    
8297
  /* for table and code decoding */
8298
  this.extra = 0;             /* extra bits needed */
8299

    
8300
  /* fixed and dynamic code tables */
8301
  this.lencode = null;          /* starting table for length/literal codes */
8302
  this.distcode = null;         /* starting table for distance codes */
8303
  this.lenbits = 0;           /* index bits for lencode */
8304
  this.distbits = 0;          /* index bits for distcode */
8305

    
8306
  /* dynamic table building */
8307
  this.ncode = 0;             /* number of code length code lengths */
8308
  this.nlen = 0;              /* number of length code lengths */
8309
  this.ndist = 0;             /* number of distance code lengths */
8310
  this.have = 0;              /* number of code lengths in lens[] */
8311
  this.next = null;              /* next available space in codes[] */
8312

    
8313
  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
8314
  this.work = new utils.Buf16(288); /* work area for code table building */
8315

    
8316
  /*
8317
   because we don't have pointers in js, we use lencode and distcode directly
8318
   as buffers so we don't need codes
8319
  */
8320
  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
8321
  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
8322
  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
8323
  this.sane = 0;                   /* if false, allow invalid distance too far */
8324
  this.back = 0;                   /* bits back of last unprocessed length/lit */
8325
  this.was = 0;                    /* initial length of match */
8326
}
8327

    
8328
function inflateResetKeep(strm) {
8329
  var state;
8330

    
8331
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
8332
  state = strm.state;
8333
  strm.total_in = strm.total_out = state.total = 0;
8334
  strm.msg = ''; /*Z_NULL*/
8335
  if (state.wrap) {       /* to support ill-conceived Java test suite */
8336
    strm.adler = state.wrap & 1;
8337
  }
8338
  state.mode = HEAD;
8339
  state.last = 0;
8340
  state.havedict = 0;
8341
  state.dmax = 32768;
8342
  state.head = null/*Z_NULL*/;
8343
  state.hold = 0;
8344
  state.bits = 0;
8345
  //state.lencode = state.distcode = state.next = state.codes;
8346
  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
8347
  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
8348

    
8349
  state.sane = 1;
8350
  state.back = -1;
8351
  //Tracev((stderr, "inflate: reset\n"));
8352
  return Z_OK;
8353
}
8354

    
8355
function inflateReset(strm) {
8356
  var state;
8357

    
8358
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
8359
  state = strm.state;
8360
  state.wsize = 0;
8361
  state.whave = 0;
8362
  state.wnext = 0;
8363
  return inflateResetKeep(strm);
8364

    
8365
}
8366

    
8367
function inflateReset2(strm, windowBits) {
8368
  var wrap;
8369
  var state;
8370

    
8371
  /* get the state */
8372
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
8373
  state = strm.state;
8374

    
8375
  /* extract wrap request from windowBits parameter */
8376
  if (windowBits < 0) {
8377
    wrap = 0;
8378
    windowBits = -windowBits;
8379
  }
8380
  else {
8381
    wrap = (windowBits >> 4) + 1;
8382
    if (windowBits < 48) {
8383
      windowBits &= 15;
8384
    }
8385
  }
8386

    
8387
  /* set number of window bits, free window if different */
8388
  if (windowBits && (windowBits < 8 || windowBits > 15)) {
8389
    return Z_STREAM_ERROR;
8390
  }
8391
  if (state.window !== null && state.wbits !== windowBits) {
8392
    state.window = null;
8393
  }
8394

    
8395
  /* update state and reset the rest of it */
8396
  state.wrap = wrap;
8397
  state.wbits = windowBits;
8398
  return inflateReset(strm);
8399
}
8400

    
8401
function inflateInit2(strm, windowBits) {
8402
  var ret;
8403
  var state;
8404

    
8405
  if (!strm) { return Z_STREAM_ERROR; }
8406
  //strm.msg = Z_NULL;                 /* in case we return an error */
8407

    
8408
  state = new InflateState();
8409

    
8410
  //if (state === Z_NULL) return Z_MEM_ERROR;
8411
  //Tracev((stderr, "inflate: allocated\n"));
8412
  strm.state = state;
8413
  state.window = null/*Z_NULL*/;
8414
  ret = inflateReset2(strm, windowBits);
8415
  if (ret !== Z_OK) {
8416
    strm.state = null/*Z_NULL*/;
8417
  }
8418
  return ret;
8419
}
8420

    
8421
function inflateInit(strm) {
8422
  return inflateInit2(strm, DEF_WBITS);
8423
}
8424

    
8425

    
8426
/*
8427
 Return state with length and distance decoding tables and index sizes set to
8428
 fixed code decoding.  Normally this returns fixed tables from inffixed.h.
8429
 If BUILDFIXED is defined, then instead this routine builds the tables the
8430
 first time it's called, and returns those tables the first time and
8431
 thereafter.  This reduces the size of the code by about 2K bytes, in
8432
 exchange for a little execution time.  However, BUILDFIXED should not be
8433
 used for threaded applications, since the rewriting of the tables and virgin
8434
 may not be thread-safe.
8435
 */
8436
var virgin = true;
8437

    
8438
var lenfix, distfix; // We have no pointers in JS, so keep tables separate
8439

    
8440
function fixedtables(state) {
8441
  /* build fixed huffman tables if first call (may not be thread safe) */
8442
  if (virgin) {
8443
    var sym;
8444

    
8445
    lenfix = new utils.Buf32(512);
8446
    distfix = new utils.Buf32(32);
8447

    
8448
    /* literal/length table */
8449
    sym = 0;
8450
    while (sym < 144) { state.lens[sym++] = 8; }
8451
    while (sym < 256) { state.lens[sym++] = 9; }
8452
    while (sym < 280) { state.lens[sym++] = 7; }
8453
    while (sym < 288) { state.lens[sym++] = 8; }
8454

    
8455
    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
8456

    
8457
    /* distance table */
8458
    sym = 0;
8459
    while (sym < 32) { state.lens[sym++] = 5; }
8460

    
8461
    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
8462

    
8463
    /* do this just once */
8464
    virgin = false;
8465
  }
8466

    
8467
  state.lencode = lenfix;
8468
  state.lenbits = 9;
8469
  state.distcode = distfix;
8470
  state.distbits = 5;
8471
}
8472

    
8473

    
8474
/*
8475
 Update the window with the last wsize (normally 32K) bytes written before
8476
 returning.  If window does not exist yet, create it.  This is only called
8477
 when a window is already in use, or when output has been written during this
8478
 inflate call, but the end of the deflate stream has not been reached yet.
8479
 It is also called to create a window for dictionary data when a dictionary
8480
 is loaded.
8481

8482
 Providing output buffers larger than 32K to inflate() should provide a speed
8483
 advantage, since only the last 32K of output is copied to the sliding window
8484
 upon return from inflate(), and since all distances after the first 32K of
8485
 output will fall in the output data, making match copies simpler and faster.
8486
 The advantage may be dependent on the size of the processor's data caches.
8487
 */
8488
function updatewindow(strm, src, end, copy) {
8489
  var dist;
8490
  var state = strm.state;
8491

    
8492
  /* if it hasn't been done already, allocate space for the window */
8493
  if (state.window === null) {
8494
    state.wsize = 1 << state.wbits;
8495
    state.wnext = 0;
8496
    state.whave = 0;
8497

    
8498
    state.window = new utils.Buf8(state.wsize);
8499
  }
8500

    
8501
  /* copy state->wsize or less output bytes into the circular window */
8502
  if (copy >= state.wsize) {
8503
    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
8504
    state.wnext = 0;
8505
    state.whave = state.wsize;
8506
  }
8507
  else {
8508
    dist = state.wsize - state.wnext;
8509
    if (dist > copy) {
8510
      dist = copy;
8511
    }
8512
    //zmemcpy(state->window + state->wnext, end - copy, dist);
8513
    utils.arraySet(state.window, src, end - copy, dist, state.wnext);
8514
    copy -= dist;
8515
    if (copy) {
8516
      //zmemcpy(state->window, end - copy, copy);
8517
      utils.arraySet(state.window, src, end - copy, copy, 0);
8518
      state.wnext = copy;
8519
      state.whave = state.wsize;
8520
    }
8521
    else {
8522
      state.wnext += dist;
8523
      if (state.wnext === state.wsize) { state.wnext = 0; }
8524
      if (state.whave < state.wsize) { state.whave += dist; }
8525
    }
8526
  }
8527
  return 0;
8528
}
8529

    
8530
function inflate(strm, flush) {
8531
  var state;
8532
  var input, output;          // input/output buffers
8533
  var next;                   /* next input INDEX */
8534
  var put;                    /* next output INDEX */
8535
  var have, left;             /* available input and output */
8536
  var hold;                   /* bit buffer */
8537
  var bits;                   /* bits in bit buffer */
8538
  var _in, _out;              /* save starting available input and output */
8539
  var copy;                   /* number of stored or match bytes to copy */
8540
  var from;                   /* where to copy match bytes from */
8541
  var from_source;
8542
  var here = 0;               /* current decoding table entry */
8543
  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
8544
  //var last;                   /* parent table entry */
8545
  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
8546
  var len;                    /* length to copy for repeats, bits to drop */
8547
  var ret;                    /* return code */
8548
  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
8549
  var opts;
8550

    
8551
  var n; // temporary var for NEED_BITS
8552

    
8553
  var order = /* permutation of code lengths */
8554
    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
8555

    
8556

    
8557
  if (!strm || !strm.state || !strm.output ||
8558
      (!strm.input && strm.avail_in !== 0)) {
8559
    return Z_STREAM_ERROR;
8560
  }
8561

    
8562
  state = strm.state;
8563
  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
8564

    
8565

    
8566
  //--- LOAD() ---
8567
  put = strm.next_out;
8568
  output = strm.output;
8569
  left = strm.avail_out;
8570
  next = strm.next_in;
8571
  input = strm.input;
8572
  have = strm.avail_in;
8573
  hold = state.hold;
8574
  bits = state.bits;
8575
  //---
8576

    
8577
  _in = have;
8578
  _out = left;
8579
  ret = Z_OK;
8580

    
8581
  inf_leave: // goto emulation
8582
  for (;;) {
8583
    switch (state.mode) {
8584
    case HEAD:
8585
      if (state.wrap === 0) {
8586
        state.mode = TYPEDO;
8587
        break;
8588
      }
8589
      //=== NEEDBITS(16);
8590
      while (bits < 16) {
8591
        if (have === 0) { break inf_leave; }
8592
        have--;
8593
        hold += input[next++] << bits;
8594
        bits += 8;
8595
      }
8596
      //===//
8597
      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
8598
        state.check = 0/*crc32(0L, Z_NULL, 0)*/;
8599
        //=== CRC2(state.check, hold);
8600
        hbuf[0] = hold & 0xff;
8601
        hbuf[1] = (hold >>> 8) & 0xff;
8602
        state.check = crc32(state.check, hbuf, 2, 0);
8603
        //===//
8604

    
8605
        //=== INITBITS();
8606
        hold = 0;
8607
        bits = 0;
8608
        //===//
8609
        state.mode = FLAGS;
8610
        break;
8611
      }
8612
      state.flags = 0;           /* expect zlib header */
8613
      if (state.head) {
8614
        state.head.done = false;
8615
      }
8616
      if (!(state.wrap & 1) ||   /* check if zlib header allowed */
8617
        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
8618
        strm.msg = 'incorrect header check';
8619
        state.mode = BAD;
8620
        break;
8621
      }
8622
      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
8623
        strm.msg = 'unknown compression method';
8624
        state.mode = BAD;
8625
        break;
8626
      }
8627
      //--- DROPBITS(4) ---//
8628
      hold >>>= 4;
8629
      bits -= 4;
8630
      //---//
8631
      len = (hold & 0x0f)/*BITS(4)*/ + 8;
8632
      if (state.wbits === 0) {
8633
        state.wbits = len;
8634
      }
8635
      else if (len > state.wbits) {
8636
        strm.msg = 'invalid window size';
8637
        state.mode = BAD;
8638
        break;
8639
      }
8640
      state.dmax = 1 << len;
8641
      //Tracev((stderr, "inflate:   zlib header ok\n"));
8642
      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
8643
      state.mode = hold & 0x200 ? DICTID : TYPE;
8644
      //=== INITBITS();
8645
      hold = 0;
8646
      bits = 0;
8647
      //===//
8648
      break;
8649
    case FLAGS:
8650
      //=== NEEDBITS(16); */
8651
      while (bits < 16) {
8652
        if (have === 0) { break inf_leave; }
8653
        have--;
8654
        hold += input[next++] << bits;
8655
        bits += 8;
8656
      }
8657
      //===//
8658
      state.flags = hold;
8659
      if ((state.flags & 0xff) !== Z_DEFLATED) {
8660
        strm.msg = 'unknown compression method';
8661
        state.mode = BAD;
8662
        break;
8663
      }
8664
      if (state.flags & 0xe000) {
8665
        strm.msg = 'unknown header flags set';
8666
        state.mode = BAD;
8667
        break;
8668
      }
8669
      if (state.head) {
8670
        state.head.text = ((hold >> 8) & 1);
8671
      }
8672
      if (state.flags & 0x0200) {
8673
        //=== CRC2(state.check, hold);
8674
        hbuf[0] = hold & 0xff;
8675
        hbuf[1] = (hold >>> 8) & 0xff;
8676
        state.check = crc32(state.check, hbuf, 2, 0);
8677
        //===//
8678
      }
8679
      //=== INITBITS();
8680
      hold = 0;
8681
      bits = 0;
8682
      //===//
8683
      state.mode = TIME;
8684
      /* falls through */
8685
    case TIME:
8686
      //=== NEEDBITS(32); */
8687
      while (bits < 32) {
8688
        if (have === 0) { break inf_leave; }
8689
        have--;
8690
        hold += input[next++] << bits;
8691
        bits += 8;
8692
      }
8693
      //===//
8694
      if (state.head) {
8695
        state.head.time = hold;
8696
      }
8697
      if (state.flags & 0x0200) {
8698
        //=== CRC4(state.check, hold)
8699
        hbuf[0] = hold & 0xff;
8700
        hbuf[1] = (hold >>> 8) & 0xff;
8701
        hbuf[2] = (hold >>> 16) & 0xff;
8702
        hbuf[3] = (hold >>> 24) & 0xff;
8703
        state.check = crc32(state.check, hbuf, 4, 0);
8704
        //===
8705
      }
8706
      //=== INITBITS();
8707
      hold = 0;
8708
      bits = 0;
8709
      //===//
8710
      state.mode = OS;
8711
      /* falls through */
8712
    case OS:
8713
      //=== NEEDBITS(16); */
8714
      while (bits < 16) {
8715
        if (have === 0) { break inf_leave; }
8716
        have--;
8717
        hold += input[next++] << bits;
8718
        bits += 8;
8719
      }
8720
      //===//
8721
      if (state.head) {
8722
        state.head.xflags = (hold & 0xff);
8723
        state.head.os = (hold >> 8);
8724
      }
8725
      if (state.flags & 0x0200) {
8726
        //=== CRC2(state.check, hold);
8727
        hbuf[0] = hold & 0xff;
8728
        hbuf[1] = (hold >>> 8) & 0xff;
8729
        state.check = crc32(state.check, hbuf, 2, 0);
8730
        //===//
8731
      }
8732
      //=== INITBITS();
8733
      hold = 0;
8734
      bits = 0;
8735
      //===//
8736
      state.mode = EXLEN;
8737
      /* falls through */
8738
    case EXLEN:
8739
      if (state.flags & 0x0400) {
8740
        //=== NEEDBITS(16); */
8741
        while (bits < 16) {
8742
          if (have === 0) { break inf_leave; }
8743
          have--;
8744
          hold += input[next++] << bits;
8745
          bits += 8;
8746
        }
8747
        //===//
8748
        state.length = hold;
8749
        if (state.head) {
8750
          state.head.extra_len = hold;
8751
        }
8752
        if (state.flags & 0x0200) {
8753
          //=== CRC2(state.check, hold);
8754
          hbuf[0] = hold & 0xff;
8755
          hbuf[1] = (hold >>> 8) & 0xff;
8756
          state.check = crc32(state.check, hbuf, 2, 0);
8757
          //===//
8758
        }
8759
        //=== INITBITS();
8760
        hold = 0;
8761
        bits = 0;
8762
        //===//
8763
      }
8764
      else if (state.head) {
8765
        state.head.extra = null/*Z_NULL*/;
8766
      }
8767
      state.mode = EXTRA;
8768
      /* falls through */
8769
    case EXTRA:
8770
      if (state.flags & 0x0400) {
8771
        copy = state.length;
8772
        if (copy > have) { copy = have; }
8773
        if (copy) {
8774
          if (state.head) {
8775
            len = state.head.extra_len - state.length;
8776
            if (!state.head.extra) {
8777
              // Use untyped array for more conveniend processing later
8778
              state.head.extra = new Array(state.head.extra_len);
8779
            }
8780
            utils.arraySet(
8781
              state.head.extra,
8782
              input,
8783
              next,
8784
              // extra field is limited to 65536 bytes
8785
              // - no need for additional size check
8786
              copy,
8787
              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
8788
              len
8789
            );
8790
            //zmemcpy(state.head.extra + len, next,
8791
            //        len + copy > state.head.extra_max ?
8792
            //        state.head.extra_max - len : copy);
8793
          }
8794
          if (state.flags & 0x0200) {
8795
            state.check = crc32(state.check, input, copy, next);
8796
          }
8797
          have -= copy;
8798
          next += copy;
8799
          state.length -= copy;
8800
        }
8801
        if (state.length) { break inf_leave; }
8802
      }
8803
      state.length = 0;
8804
      state.mode = NAME;
8805
      /* falls through */
8806
    case NAME:
8807
      if (state.flags & 0x0800) {
8808
        if (have === 0) { break inf_leave; }
8809
        copy = 0;
8810
        do {
8811
          // TODO: 2 or 1 bytes?
8812
          len = input[next + copy++];
8813
          /* use constant limit because in js we should not preallocate memory */
8814
          if (state.head && len &&
8815
              (state.length < 65536 /*state.head.name_max*/)) {
8816
            state.head.name += String.fromCharCode(len);
8817
          }
8818
        } while (len && copy < have);
8819

    
8820
        if (state.flags & 0x0200) {
8821
          state.check = crc32(state.check, input, copy, next);
8822
        }
8823
        have -= copy;
8824
        next += copy;
8825
        if (len) { break inf_leave; }
8826
      }
8827
      else if (state.head) {
8828
        state.head.name = null;
8829
      }
8830
      state.length = 0;
8831
      state.mode = COMMENT;
8832
      /* falls through */
8833
    case COMMENT:
8834
      if (state.flags & 0x1000) {
8835
        if (have === 0) { break inf_leave; }
8836
        copy = 0;
8837
        do {
8838
          len = input[next + copy++];
8839
          /* use constant limit because in js we should not preallocate memory */
8840
          if (state.head && len &&
8841
              (state.length < 65536 /*state.head.comm_max*/)) {
8842
            state.head.comment += String.fromCharCode(len);
8843
          }
8844
        } while (len && copy < have);
8845
        if (state.flags & 0x0200) {
8846
          state.check = crc32(state.check, input, copy, next);
8847
        }
8848
        have -= copy;
8849
        next += copy;
8850
        if (len) { break inf_leave; }
8851
      }
8852
      else if (state.head) {
8853
        state.head.comment = null;
8854
      }
8855
      state.mode = HCRC;
8856
      /* falls through */
8857
    case HCRC:
8858
      if (state.flags & 0x0200) {
8859
        //=== NEEDBITS(16); */
8860
        while (bits < 16) {
8861
          if (have === 0) { break inf_leave; }
8862
          have--;
8863
          hold += input[next++] << bits;
8864
          bits += 8;
8865
        }
8866
        //===//
8867
        if (hold !== (state.check & 0xffff)) {
8868
          strm.msg = 'header crc mismatch';
8869
          state.mode = BAD;
8870
          break;
8871
        }
8872
        //=== INITBITS();
8873
        hold = 0;
8874
        bits = 0;
8875
        //===//
8876
      }
8877
      if (state.head) {
8878
        state.head.hcrc = ((state.flags >> 9) & 1);
8879
        state.head.done = true;
8880
      }
8881
      strm.adler = state.check = 0;
8882
      state.mode = TYPE;
8883
      break;
8884
    case DICTID:
8885
      //=== NEEDBITS(32); */
8886
      while (bits < 32) {
8887
        if (have === 0) { break inf_leave; }
8888
        have--;
8889
        hold += input[next++] << bits;
8890
        bits += 8;
8891
      }
8892
      //===//
8893
      strm.adler = state.check = zswap32(hold);
8894
      //=== INITBITS();
8895
      hold = 0;
8896
      bits = 0;
8897
      //===//
8898
      state.mode = DICT;
8899
      /* falls through */
8900
    case DICT:
8901
      if (state.havedict === 0) {
8902
        //--- RESTORE() ---
8903
        strm.next_out = put;
8904
        strm.avail_out = left;
8905
        strm.next_in = next;
8906
        strm.avail_in = have;
8907
        state.hold = hold;
8908
        state.bits = bits;
8909
        //---
8910
        return Z_NEED_DICT;
8911
      }
8912
      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
8913
      state.mode = TYPE;
8914
      /* falls through */
8915
    case TYPE:
8916
      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
8917
      /* falls through */
8918
    case TYPEDO:
8919
      if (state.last) {
8920
        //--- BYTEBITS() ---//
8921
        hold >>>= bits & 7;
8922
        bits -= bits & 7;
8923
        //---//
8924
        state.mode = CHECK;
8925
        break;
8926
      }
8927
      //=== NEEDBITS(3); */
8928
      while (bits < 3) {
8929
        if (have === 0) { break inf_leave; }
8930
        have--;
8931
        hold += input[next++] << bits;
8932
        bits += 8;
8933
      }
8934
      //===//
8935
      state.last = (hold & 0x01)/*BITS(1)*/;
8936
      //--- DROPBITS(1) ---//
8937
      hold >>>= 1;
8938
      bits -= 1;
8939
      //---//
8940

    
8941
      switch ((hold & 0x03)/*BITS(2)*/) {
8942
      case 0:                             /* stored block */
8943
        //Tracev((stderr, "inflate:     stored block%s\n",
8944
        //        state.last ? " (last)" : ""));
8945
        state.mode = STORED;
8946
        break;
8947
      case 1:                             /* fixed block */
8948
        fixedtables(state);
8949
        //Tracev((stderr, "inflate:     fixed codes block%s\n",
8950
        //        state.last ? " (last)" : ""));
8951
        state.mode = LEN_;             /* decode codes */
8952
        if (flush === Z_TREES) {
8953
          //--- DROPBITS(2) ---//
8954
          hold >>>= 2;
8955
          bits -= 2;
8956
          //---//
8957
          break inf_leave;
8958
        }
8959
        break;
8960
      case 2:                             /* dynamic block */
8961
        //Tracev((stderr, "inflate:     dynamic codes block%s\n",
8962
        //        state.last ? " (last)" : ""));
8963
        state.mode = TABLE;
8964
        break;
8965
      case 3:
8966
        strm.msg = 'invalid block type';
8967
        state.mode = BAD;
8968
      }
8969
      //--- DROPBITS(2) ---//
8970
      hold >>>= 2;
8971
      bits -= 2;
8972
      //---//
8973
      break;
8974
    case STORED:
8975
      //--- BYTEBITS() ---// /* go to byte boundary */
8976
      hold >>>= bits & 7;
8977
      bits -= bits & 7;
8978
      //---//
8979
      //=== NEEDBITS(32); */
8980
      while (bits < 32) {
8981
        if (have === 0) { break inf_leave; }
8982
        have--;
8983
        hold += input[next++] << bits;
8984
        bits += 8;
8985
      }
8986
      //===//
8987
      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
8988
        strm.msg = 'invalid stored block lengths';
8989
        state.mode = BAD;
8990
        break;
8991
      }
8992
      state.length = hold & 0xffff;
8993
      //Tracev((stderr, "inflate:       stored length %u\n",
8994
      //        state.length));
8995
      //=== INITBITS();
8996
      hold = 0;
8997
      bits = 0;
8998
      //===//
8999
      state.mode = COPY_;
9000
      if (flush === Z_TREES) { break inf_leave; }
9001
      /* falls through */
9002
    case COPY_:
9003
      state.mode = COPY;
9004
      /* falls through */
9005
    case COPY:
9006
      copy = state.length;
9007
      if (copy) {
9008
        if (copy > have) { copy = have; }
9009
        if (copy > left) { copy = left; }
9010
        if (copy === 0) { break inf_leave; }
9011
        //--- zmemcpy(put, next, copy); ---
9012
        utils.arraySet(output, input, next, copy, put);
9013
        //---//
9014
        have -= copy;
9015
        next += copy;
9016
        left -= copy;
9017
        put += copy;
9018
        state.length -= copy;
9019
        break;
9020
      }
9021
      //Tracev((stderr, "inflate:       stored end\n"));
9022
      state.mode = TYPE;
9023
      break;
9024
    case TABLE:
9025
      //=== NEEDBITS(14); */
9026
      while (bits < 14) {
9027
        if (have === 0) { break inf_leave; }
9028
        have--;
9029
        hold += input[next++] << bits;
9030
        bits += 8;
9031
      }
9032
      //===//
9033
      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
9034
      //--- DROPBITS(5) ---//
9035
      hold >>>= 5;
9036
      bits -= 5;
9037
      //---//
9038
      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
9039
      //--- DROPBITS(5) ---//
9040
      hold >>>= 5;
9041
      bits -= 5;
9042
      //---//
9043
      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
9044
      //--- DROPBITS(4) ---//
9045
      hold >>>= 4;
9046
      bits -= 4;
9047
      //---//
9048
//#ifndef PKZIP_BUG_WORKAROUND
9049
      if (state.nlen > 286 || state.ndist > 30) {
9050
        strm.msg = 'too many length or distance symbols';
9051
        state.mode = BAD;
9052
        break;
9053
      }
9054
//#endif
9055
      //Tracev((stderr, "inflate:       table sizes ok\n"));
9056
      state.have = 0;
9057
      state.mode = LENLENS;
9058
      /* falls through */
9059
    case LENLENS:
9060
      while (state.have < state.ncode) {
9061
        //=== NEEDBITS(3);
9062
        while (bits < 3) {
9063
          if (have === 0) { break inf_leave; }
9064
          have--;
9065
          hold += input[next++] << bits;
9066
          bits += 8;
9067
        }
9068
        //===//
9069
        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
9070
        //--- DROPBITS(3) ---//
9071
        hold >>>= 3;
9072
        bits -= 3;
9073
        //---//
9074
      }
9075
      while (state.have < 19) {
9076
        state.lens[order[state.have++]] = 0;
9077
      }
9078
      // We have separate tables & no pointers. 2 commented lines below not needed.
9079
      //state.next = state.codes;
9080
      //state.lencode = state.next;
9081
      // Switch to use dynamic table
9082
      state.lencode = state.lendyn;
9083
      state.lenbits = 7;
9084

    
9085
      opts = { bits: state.lenbits };
9086
      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
9087
      state.lenbits = opts.bits;
9088

    
9089
      if (ret) {
9090
        strm.msg = 'invalid code lengths set';
9091
        state.mode = BAD;
9092
        break;
9093
      }
9094
      //Tracev((stderr, "inflate:       code lengths ok\n"));
9095
      state.have = 0;
9096
      state.mode = CODELENS;
9097
      /* falls through */
9098
    case CODELENS:
9099
      while (state.have < state.nlen + state.ndist) {
9100
        for (;;) {
9101
          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
9102
          here_bits = here >>> 24;
9103
          here_op = (here >>> 16) & 0xff;
9104
          here_val = here & 0xffff;
9105

    
9106
          if ((here_bits) <= bits) { break; }
9107
          //--- PULLBYTE() ---//
9108
          if (have === 0) { break inf_leave; }
9109
          have--;
9110
          hold += input[next++] << bits;
9111
          bits += 8;
9112
          //---//
9113
        }
9114
        if (here_val < 16) {
9115
          //--- DROPBITS(here.bits) ---//
9116
          hold >>>= here_bits;
9117
          bits -= here_bits;
9118
          //---//
9119
          state.lens[state.have++] = here_val;
9120
        }
9121
        else {
9122
          if (here_val === 16) {
9123
            //=== NEEDBITS(here.bits + 2);
9124
            n = here_bits + 2;
9125
            while (bits < n) {
9126
              if (have === 0) { break inf_leave; }
9127
              have--;
9128
              hold += input[next++] << bits;
9129
              bits += 8;
9130
            }
9131
            //===//
9132
            //--- DROPBITS(here.bits) ---//
9133
            hold >>>= here_bits;
9134
            bits -= here_bits;
9135
            //---//
9136
            if (state.have === 0) {
9137
              strm.msg = 'invalid bit length repeat';
9138
              state.mode = BAD;
9139
              break;
9140
            }
9141
            len = state.lens[state.have - 1];
9142
            copy = 3 + (hold & 0x03);//BITS(2);
9143
            //--- DROPBITS(2) ---//
9144
            hold >>>= 2;
9145
            bits -= 2;
9146
            //---//
9147
          }
9148
          else if (here_val === 17) {
9149
            //=== NEEDBITS(here.bits + 3);
9150
            n = here_bits + 3;
9151
            while (bits < n) {
9152
              if (have === 0) { break inf_leave; }
9153
              have--;
9154
              hold += input[next++] << bits;
9155
              bits += 8;
9156
            }
9157
            //===//
9158
            //--- DROPBITS(here.bits) ---//
9159
            hold >>>= here_bits;
9160
            bits -= here_bits;
9161
            //---//
9162
            len = 0;
9163
            copy = 3 + (hold & 0x07);//BITS(3);
9164
            //--- DROPBITS(3) ---//
9165
            hold >>>= 3;
9166
            bits -= 3;
9167
            //---//
9168
          }
9169
          else {
9170
            //=== NEEDBITS(here.bits + 7);
9171
            n = here_bits + 7;
9172
            while (bits < n) {
9173
              if (have === 0) { break inf_leave; }
9174
              have--;
9175
              hold += input[next++] << bits;
9176
              bits += 8;
9177
            }
9178
            //===//
9179
            //--- DROPBITS(here.bits) ---//
9180
            hold >>>= here_bits;
9181
            bits -= here_bits;
9182
            //---//
9183
            len = 0;
9184
            copy = 11 + (hold & 0x7f);//BITS(7);
9185
            //--- DROPBITS(7) ---//
9186
            hold >>>= 7;
9187
            bits -= 7;
9188
            //---//
9189
          }
9190
          if (state.have + copy > state.nlen + state.ndist) {
9191
            strm.msg = 'invalid bit length repeat';
9192
            state.mode = BAD;
9193
            break;
9194
          }
9195
          while (copy--) {
9196
            state.lens[state.have++] = len;
9197
          }
9198
        }
9199
      }
9200

    
9201
      /* handle error breaks in while */
9202
      if (state.mode === BAD) { break; }
9203

    
9204
      /* check for end-of-block code (better have one) */
9205
      if (state.lens[256] === 0) {
9206
        strm.msg = 'invalid code -- missing end-of-block';
9207
        state.mode = BAD;
9208
        break;
9209
      }
9210

    
9211
      /* build code tables -- note: do not change the lenbits or distbits
9212
         values here (9 and 6) without reading the comments in inftrees.h
9213
         concerning the ENOUGH constants, which depend on those values */
9214
      state.lenbits = 9;
9215

    
9216
      opts = { bits: state.lenbits };
9217
      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
9218
      // We have separate tables & no pointers. 2 commented lines below not needed.
9219
      // state.next_index = opts.table_index;
9220
      state.lenbits = opts.bits;
9221
      // state.lencode = state.next;
9222

    
9223
      if (ret) {
9224
        strm.msg = 'invalid literal/lengths set';
9225
        state.mode = BAD;
9226
        break;
9227
      }
9228

    
9229
      state.distbits = 6;
9230
      //state.distcode.copy(state.codes);
9231
      // Switch to use dynamic table
9232
      state.distcode = state.distdyn;
9233
      opts = { bits: state.distbits };
9234
      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
9235
      // We have separate tables & no pointers. 2 commented lines below not needed.
9236
      // state.next_index = opts.table_index;
9237
      state.distbits = opts.bits;
9238
      // state.distcode = state.next;
9239

    
9240
      if (ret) {
9241
        strm.msg = 'invalid distances set';
9242
        state.mode = BAD;
9243
        break;
9244
      }
9245
      //Tracev((stderr, 'inflate:       codes ok\n'));
9246
      state.mode = LEN_;
9247
      if (flush === Z_TREES) { break inf_leave; }
9248
      /* falls through */
9249
    case LEN_:
9250
      state.mode = LEN;
9251
      /* falls through */
9252
    case LEN:
9253
      if (have >= 6 && left >= 258) {
9254
        //--- RESTORE() ---
9255
        strm.next_out = put;
9256
        strm.avail_out = left;
9257
        strm.next_in = next;
9258
        strm.avail_in = have;
9259
        state.hold = hold;
9260
        state.bits = bits;
9261
        //---
9262
        inflate_fast(strm, _out);
9263
        //--- LOAD() ---
9264
        put = strm.next_out;
9265
        output = strm.output;
9266
        left = strm.avail_out;
9267
        next = strm.next_in;
9268
        input = strm.input;
9269
        have = strm.avail_in;
9270
        hold = state.hold;
9271
        bits = state.bits;
9272
        //---
9273

    
9274
        if (state.mode === TYPE) {
9275
          state.back = -1;
9276
        }
9277
        break;
9278
      }
9279
      state.back = 0;
9280
      for (;;) {
9281
        here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
9282
        here_bits = here >>> 24;
9283
        here_op = (here >>> 16) & 0xff;
9284
        here_val = here & 0xffff;
9285

    
9286
        if (here_bits <= bits) { break; }
9287
        //--- PULLBYTE() ---//
9288
        if (have === 0) { break inf_leave; }
9289
        have--;
9290
        hold += input[next++] << bits;
9291
        bits += 8;
9292
        //---//
9293
      }
9294
      if (here_op && (here_op & 0xf0) === 0) {
9295
        last_bits = here_bits;
9296
        last_op = here_op;
9297
        last_val = here_val;
9298
        for (;;) {
9299
          here = state.lencode[last_val +
9300
                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
9301
          here_bits = here >>> 24;
9302
          here_op = (here >>> 16) & 0xff;
9303
          here_val = here & 0xffff;
9304

    
9305
          if ((last_bits + here_bits) <= bits) { break; }
9306
          //--- PULLBYTE() ---//
9307
          if (have === 0) { break inf_leave; }
9308
          have--;
9309
          hold += input[next++] << bits;
9310
          bits += 8;
9311
          //---//
9312
        }
9313
        //--- DROPBITS(last.bits) ---//
9314
        hold >>>= last_bits;
9315
        bits -= last_bits;
9316
        //---//
9317
        state.back += last_bits;
9318
      }
9319
      //--- DROPBITS(here.bits) ---//
9320
      hold >>>= here_bits;
9321
      bits -= here_bits;
9322
      //---//
9323
      state.back += here_bits;
9324
      state.length = here_val;
9325
      if (here_op === 0) {
9326
        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
9327
        //        "inflate:         literal '%c'\n" :
9328
        //        "inflate:         literal 0x%02x\n", here.val));
9329
        state.mode = LIT;
9330
        break;
9331
      }
9332
      if (here_op & 32) {
9333
        //Tracevv((stderr, "inflate:         end of block\n"));
9334
        state.back = -1;
9335
        state.mode = TYPE;
9336
        break;
9337
      }
9338
      if (here_op & 64) {
9339
        strm.msg = 'invalid literal/length code';
9340
        state.mode = BAD;
9341
        break;
9342
      }
9343
      state.extra = here_op & 15;
9344
      state.mode = LENEXT;
9345
      /* falls through */
9346
    case LENEXT:
9347
      if (state.extra) {
9348
        //=== NEEDBITS(state.extra);
9349
        n = state.extra;
9350
        while (bits < n) {
9351
          if (have === 0) { break inf_leave; }
9352
          have--;
9353
          hold += input[next++] << bits;
9354
          bits += 8;
9355
        }
9356
        //===//
9357
        state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
9358
        //--- DROPBITS(state.extra) ---//
9359
        hold >>>= state.extra;
9360
        bits -= state.extra;
9361
        //---//
9362
        state.back += state.extra;
9363
      }
9364
      //Tracevv((stderr, "inflate:         length %u\n", state.length));
9365
      state.was = state.length;
9366
      state.mode = DIST;
9367
      /* falls through */
9368
    case DIST:
9369
      for (;;) {
9370
        here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
9371
        here_bits = here >>> 24;
9372
        here_op = (here >>> 16) & 0xff;
9373
        here_val = here & 0xffff;
9374

    
9375
        if ((here_bits) <= bits) { break; }
9376
        //--- PULLBYTE() ---//
9377
        if (have === 0) { break inf_leave; }
9378
        have--;
9379
        hold += input[next++] << bits;
9380
        bits += 8;
9381
        //---//
9382
      }
9383
      if ((here_op & 0xf0) === 0) {
9384
        last_bits = here_bits;
9385
        last_op = here_op;
9386
        last_val = here_val;
9387
        for (;;) {
9388
          here = state.distcode[last_val +
9389
                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
9390
          here_bits = here >>> 24;
9391
          here_op = (here >>> 16) & 0xff;
9392
          here_val = here & 0xffff;
9393

    
9394
          if ((last_bits + here_bits) <= bits) { break; }
9395
          //--- PULLBYTE() ---//
9396
          if (have === 0) { break inf_leave; }
9397
          have--;
9398
          hold += input[next++] << bits;
9399
          bits += 8;
9400
          //---//
9401
        }
9402
        //--- DROPBITS(last.bits) ---//
9403
        hold >>>= last_bits;
9404
        bits -= last_bits;
9405
        //---//
9406
        state.back += last_bits;
9407
      }
9408
      //--- DROPBITS(here.bits) ---//
9409
      hold >>>= here_bits;
9410
      bits -= here_bits;
9411
      //---//
9412
      state.back += here_bits;
9413
      if (here_op & 64) {
9414
        strm.msg = 'invalid distance code';
9415
        state.mode = BAD;
9416
        break;
9417
      }
9418
      state.offset = here_val;
9419
      state.extra = (here_op) & 15;
9420
      state.mode = DISTEXT;
9421
      /* falls through */
9422
    case DISTEXT:
9423
      if (state.extra) {
9424
        //=== NEEDBITS(state.extra);
9425
        n = state.extra;
9426
        while (bits < n) {
9427
          if (have === 0) { break inf_leave; }
9428
          have--;
9429
          hold += input[next++] << bits;
9430
          bits += 8;
9431
        }
9432
        //===//
9433
        state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
9434
        //--- DROPBITS(state.extra) ---//
9435
        hold >>>= state.extra;
9436
        bits -= state.extra;
9437
        //---//
9438
        state.back += state.extra;
9439
      }
9440
//#ifdef INFLATE_STRICT
9441
      if (state.offset > state.dmax) {
9442
        strm.msg = 'invalid distance too far back';
9443
        state.mode = BAD;
9444
        break;
9445
      }
9446
//#endif
9447
      //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
9448
      state.mode = MATCH;
9449
      /* falls through */
9450
    case MATCH:
9451
      if (left === 0) { break inf_leave; }
9452
      copy = _out - left;
9453
      if (state.offset > copy) {         /* copy from window */
9454
        copy = state.offset - copy;
9455
        if (copy > state.whave) {
9456
          if (state.sane) {
9457
            strm.msg = 'invalid distance too far back';
9458
            state.mode = BAD;
9459
            break;
9460
          }
9461
// (!) This block is disabled in zlib defailts,
9462
// don't enable it for binary compatibility
9463
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
9464
//          Trace((stderr, "inflate.c too far\n"));
9465
//          copy -= state.whave;
9466
//          if (copy > state.length) { copy = state.length; }
9467
//          if (copy > left) { copy = left; }
9468
//          left -= copy;
9469
//          state.length -= copy;
9470
//          do {
9471
//            output[put++] = 0;
9472
//          } while (--copy);
9473
//          if (state.length === 0) { state.mode = LEN; }
9474
//          break;
9475
//#endif
9476
        }
9477
        if (copy > state.wnext) {
9478
          copy -= state.wnext;
9479
          from = state.wsize - copy;
9480
        }
9481
        else {
9482
          from = state.wnext - copy;
9483
        }
9484
        if (copy > state.length) { copy = state.length; }
9485
        from_source = state.window;
9486
      }
9487
      else {                              /* copy from output */
9488
        from_source = output;
9489
        from = put - state.offset;
9490
        copy = state.length;
9491
      }
9492
      if (copy > left) { copy = left; }
9493
      left -= copy;
9494
      state.length -= copy;
9495
      do {
9496
        output[put++] = from_source[from++];
9497
      } while (--copy);
9498
      if (state.length === 0) { state.mode = LEN; }
9499
      break;
9500
    case LIT:
9501
      if (left === 0) { break inf_leave; }
9502
      output[put++] = state.length;
9503
      left--;
9504
      state.mode = LEN;
9505
      break;
9506
    case CHECK:
9507
      if (state.wrap) {
9508
        //=== NEEDBITS(32);
9509
        while (bits < 32) {
9510
          if (have === 0) { break inf_leave; }
9511
          have--;
9512
          // Use '|' insdead of '+' to make sure that result is signed
9513
          hold |= input[next++] << bits;
9514
          bits += 8;
9515
        }
9516
        //===//
9517
        _out -= left;
9518
        strm.total_out += _out;
9519
        state.total += _out;
9520
        if (_out) {
9521
          strm.adler = state.check =
9522
              /*UPDATE(state.check, put - _out, _out);*/
9523
              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
9524

    
9525
        }
9526
        _out = left;
9527
        // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
9528
        if ((state.flags ? hold : zswap32(hold)) !== state.check) {
9529
          strm.msg = 'incorrect data check';
9530
          state.mode = BAD;
9531
          break;
9532
        }
9533
        //=== INITBITS();
9534
        hold = 0;
9535
        bits = 0;
9536
        //===//
9537
        //Tracev((stderr, "inflate:   check matches trailer\n"));
9538
      }
9539
      state.mode = LENGTH;
9540
      /* falls through */
9541
    case LENGTH:
9542
      if (state.wrap && state.flags) {
9543
        //=== NEEDBITS(32);
9544
        while (bits < 32) {
9545
          if (have === 0) { break inf_leave; }
9546
          have--;
9547
          hold += input[next++] << bits;
9548
          bits += 8;
9549
        }
9550
        //===//
9551
        if (hold !== (state.total & 0xffffffff)) {
9552
          strm.msg = 'incorrect length check';
9553
          state.mode = BAD;
9554
          break;
9555
        }
9556
        //=== INITBITS();
9557
        hold = 0;
9558
        bits = 0;
9559
        //===//
9560
        //Tracev((stderr, "inflate:   length matches trailer\n"));
9561
      }
9562
      state.mode = DONE;
9563
      /* falls through */
9564
    case DONE:
9565
      ret = Z_STREAM_END;
9566
      break inf_leave;
9567
    case BAD:
9568
      ret = Z_DATA_ERROR;
9569
      break inf_leave;
9570
    case MEM:
9571
      return Z_MEM_ERROR;
9572
    case SYNC:
9573
      /* falls through */
9574
    default:
9575
      return Z_STREAM_ERROR;
9576
    }
9577
  }
9578

    
9579
  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
9580

    
9581
  /*
9582
     Return from inflate(), updating the total counts and the check value.
9583
     If there was no progress during the inflate() call, return a buffer
9584
     error.  Call updatewindow() to create and/or update the window state.
9585
     Note: a memory error from inflate() is non-recoverable.
9586
   */
9587

    
9588
  //--- RESTORE() ---
9589
  strm.next_out = put;
9590
  strm.avail_out = left;
9591
  strm.next_in = next;
9592
  strm.avail_in = have;
9593
  state.hold = hold;
9594
  state.bits = bits;
9595
  //---
9596

    
9597
  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
9598
                      (state.mode < CHECK || flush !== Z_FINISH))) {
9599
    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
9600
      state.mode = MEM;
9601
      return Z_MEM_ERROR;
9602
    }
9603
  }
9604
  _in -= strm.avail_in;
9605
  _out -= strm.avail_out;
9606
  strm.total_in += _in;
9607
  strm.total_out += _out;
9608
  state.total += _out;
9609
  if (state.wrap && _out) {
9610
    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
9611
      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
9612
  }
9613
  strm.data_type = state.bits + (state.last ? 64 : 0) +
9614
                    (state.mode === TYPE ? 128 : 0) +
9615
                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
9616
  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
9617
    ret = Z_BUF_ERROR;
9618
  }
9619
  return ret;
9620
}
9621

    
9622
function inflateEnd(strm) {
9623

    
9624
  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
9625
    return Z_STREAM_ERROR;
9626
  }
9627

    
9628
  var state = strm.state;
9629
  if (state.window) {
9630
    state.window = null;
9631
  }
9632
  strm.state = null;
9633
  return Z_OK;
9634
}
9635

    
9636
function inflateGetHeader(strm, head) {
9637
  var state;
9638

    
9639
  /* check state */
9640
  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
9641
  state = strm.state;
9642
  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
9643

    
9644
  /* save header structure */
9645
  state.head = head;
9646
  head.done = false;
9647
  return Z_OK;
9648
}
9649

    
9650
function inflateSetDictionary(strm, dictionary) {
9651
  var dictLength = dictionary.length;
9652

    
9653
  var state;
9654
  var dictid;
9655
  var ret;
9656

    
9657
  /* check state */
9658
  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
9659
  state = strm.state;
9660

    
9661
  if (state.wrap !== 0 && state.mode !== DICT) {
9662
    return Z_STREAM_ERROR;
9663
  }
9664

    
9665
  /* check for correct dictionary identifier */
9666
  if (state.mode === DICT) {
9667
    dictid = 1; /* adler32(0, null, 0)*/
9668
    /* dictid = adler32(dictid, dictionary, dictLength); */
9669
    dictid = adler32(dictid, dictionary, dictLength, 0);
9670
    if (dictid !== state.check) {
9671
      return Z_DATA_ERROR;
9672
    }
9673
  }
9674
  /* copy dictionary to window using updatewindow(), which will amend the
9675
   existing dictionary if appropriate */
9676
  ret = updatewindow(strm, dictionary, dictLength, dictLength);
9677
  if (ret) {
9678
    state.mode = MEM;
9679
    return Z_MEM_ERROR;
9680
  }
9681
  state.havedict = 1;
9682
  // Tracev((stderr, "inflate:   dictionary set\n"));
9683
  return Z_OK;
9684
}
9685

    
9686
exports.inflateReset = inflateReset;
9687
exports.inflateReset2 = inflateReset2;
9688
exports.inflateResetKeep = inflateResetKeep;
9689
exports.inflateInit = inflateInit;
9690
exports.inflateInit2 = inflateInit2;
9691
exports.inflate = inflate;
9692
exports.inflateEnd = inflateEnd;
9693
exports.inflateGetHeader = inflateGetHeader;
9694
exports.inflateSetDictionary = inflateSetDictionary;
9695
exports.inflateInfo = 'pako inflate (from Nodeca project)';
9696

    
9697
/* Not implemented
9698
exports.inflateCopy = inflateCopy;
9699
exports.inflateGetDictionary = inflateGetDictionary;
9700
exports.inflateMark = inflateMark;
9701
exports.inflatePrime = inflatePrime;
9702
exports.inflateSync = inflateSync;
9703
exports.inflateSyncPoint = inflateSyncPoint;
9704
exports.inflateUndermine = inflateUndermine;
9705
*/
9706

    
9707
},{"../utils/common":41,"./adler32":43,"./crc32":45,"./inffast":48,"./inftrees":50}],50:[function(require,module,exports){
9708
'use strict';
9709

    
9710
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
9711
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
9712
//
9713
// This software is provided 'as-is', without any express or implied
9714
// warranty. In no event will the authors be held liable for any damages
9715
// arising from the use of this software.
9716
//
9717
// Permission is granted to anyone to use this software for any purpose,
9718
// including commercial applications, and to alter it and redistribute it
9719
// freely, subject to the following restrictions:
9720
//
9721
// 1. The origin of this software must not be misrepresented; you must not
9722
//   claim that you wrote the original software. If you use this software
9723
//   in a product, an acknowledgment in the product documentation would be
9724
//   appreciated but is not required.
9725
// 2. Altered source versions must be plainly marked as such, and must not be
9726
//   misrepresented as being the original software.
9727
// 3. This notice may not be removed or altered from any source distribution.
9728

    
9729
var utils = require('../utils/common');
9730

    
9731
var MAXBITS = 15;
9732
var ENOUGH_LENS = 852;
9733
var ENOUGH_DISTS = 592;
9734
//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
9735

    
9736
var CODES = 0;
9737
var LENS = 1;
9738
var DISTS = 2;
9739

    
9740
var lbase = [ /* Length codes 257..285 base */
9741
  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
9742
  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
9743
];
9744

    
9745
var lext = [ /* Length codes 257..285 extra */
9746
  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
9747
  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
9748
];
9749

    
9750
var dbase = [ /* Distance codes 0..29 base */
9751
  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
9752
  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
9753
  8193, 12289, 16385, 24577, 0, 0
9754
];
9755

    
9756
var dext = [ /* Distance codes 0..29 extra */
9757
  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
9758
  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
9759
  28, 28, 29, 29, 64, 64
9760
];
9761

    
9762
module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
9763
{
9764
  var bits = opts.bits;
9765
      //here = opts.here; /* table entry for duplication */
9766

    
9767
  var len = 0;               /* a code's length in bits */
9768
  var sym = 0;               /* index of code symbols */
9769
  var min = 0, max = 0;          /* minimum and maximum code lengths */
9770
  var root = 0;              /* number of index bits for root table */
9771
  var curr = 0;              /* number of index bits for current table */
9772
  var drop = 0;              /* code bits to drop for sub-table */
9773
  var left = 0;                   /* number of prefix codes available */
9774
  var used = 0;              /* code entries in table used */
9775
  var huff = 0;              /* Huffman code */
9776
  var incr;              /* for incrementing code, index */
9777
  var fill;              /* index for replicating entries */
9778
  var low;               /* low bits for current root entry */
9779
  var mask;              /* mask for low root bits */
9780
  var next;             /* next available space in table */
9781
  var base = null;     /* base value table to use */
9782
  var base_index = 0;
9783
//  var shoextra;    /* extra bits table to use */
9784
  var end;                    /* use base and extra for symbol > end */
9785
  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
9786
  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
9787
  var extra = null;
9788
  var extra_index = 0;
9789

    
9790
  var here_bits, here_op, here_val;
9791

    
9792
  /*
9793
   Process a set of code lengths to create a canonical Huffman code.  The
9794
   code lengths are lens[0..codes-1].  Each length corresponds to the
9795
   symbols 0..codes-1.  The Huffman code is generated by first sorting the
9796
   symbols by length from short to long, and retaining the symbol order
9797
   for codes with equal lengths.  Then the code starts with all zero bits
9798
   for the first code of the shortest length, and the codes are integer
9799
   increments for the same length, and zeros are appended as the length
9800
   increases.  For the deflate format, these bits are stored backwards
9801
   from their more natural integer increment ordering, and so when the
9802
   decoding tables are built in the large loop below, the integer codes
9803
   are incremented backwards.
9804

9805
   This routine assumes, but does not check, that all of the entries in
9806
   lens[] are in the range 0..MAXBITS.  The caller must assure this.
9807
   1..MAXBITS is interpreted as that code length.  zero means that that
9808
   symbol does not occur in this code.
9809

9810
   The codes are sorted by computing a count of codes for each length,
9811
   creating from that a table of starting indices for each length in the
9812
   sorted table, and then entering the symbols in order in the sorted
9813
   table.  The sorted table is work[], with that space being provided by
9814
   the caller.
9815

9816
   The length counts are used for other purposes as well, i.e. finding
9817
   the minimum and maximum length codes, determining if there are any
9818
   codes at all, checking for a valid set of lengths, and looking ahead
9819
   at length counts to determine sub-table sizes when building the
9820
   decoding tables.
9821
   */
9822

    
9823
  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
9824
  for (len = 0; len <= MAXBITS; len++) {
9825
    count[len] = 0;
9826
  }
9827
  for (sym = 0; sym < codes; sym++) {
9828
    count[lens[lens_index + sym]]++;
9829
  }
9830

    
9831
  /* bound code lengths, force root to be within code lengths */
9832
  root = bits;
9833
  for (max = MAXBITS; max >= 1; max--) {
9834
    if (count[max] !== 0) { break; }
9835
  }
9836
  if (root > max) {
9837
    root = max;
9838
  }
9839
  if (max === 0) {                     /* no symbols to code at all */
9840
    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
9841
    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
9842
    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
9843
    table[table_index++] = (1 << 24) | (64 << 16) | 0;
9844

    
9845

    
9846
    //table.op[opts.table_index] = 64;
9847
    //table.bits[opts.table_index] = 1;
9848
    //table.val[opts.table_index++] = 0;
9849
    table[table_index++] = (1 << 24) | (64 << 16) | 0;
9850

    
9851
    opts.bits = 1;
9852
    return 0;     /* no symbols, but wait for decoding to report error */
9853
  }
9854
  for (min = 1; min < max; min++) {
9855
    if (count[min] !== 0) { break; }
9856
  }
9857
  if (root < min) {
9858
    root = min;
9859
  }
9860

    
9861
  /* check for an over-subscribed or incomplete set of lengths */
9862
  left = 1;
9863
  for (len = 1; len <= MAXBITS; len++) {
9864
    left <<= 1;
9865
    left -= count[len];
9866
    if (left < 0) {
9867
      return -1;
9868
    }        /* over-subscribed */
9869
  }
9870
  if (left > 0 && (type === CODES || max !== 1)) {
9871
    return -1;                      /* incomplete set */
9872
  }
9873

    
9874
  /* generate offsets into symbol table for each length for sorting */
9875
  offs[1] = 0;
9876
  for (len = 1; len < MAXBITS; len++) {
9877
    offs[len + 1] = offs[len] + count[len];
9878
  }
9879

    
9880
  /* sort symbols by length, by symbol order within each length */
9881
  for (sym = 0; sym < codes; sym++) {
9882
    if (lens[lens_index + sym] !== 0) {
9883
      work[offs[lens[lens_index + sym]]++] = sym;
9884
    }
9885
  }
9886

    
9887
  /*
9888
   Create and fill in decoding tables.  In this loop, the table being
9889
   filled is at next and has curr index bits.  The code being used is huff
9890
   with length len.  That code is converted to an index by dropping drop
9891
   bits off of the bottom.  For codes where len is less than drop + curr,
9892
   those top drop + curr - len bits are incremented through all values to
9893
   fill the table with replicated entries.
9894

9895
   root is the number of index bits for the root table.  When len exceeds
9896
   root, sub-tables are created pointed to by the root entry with an index
9897
   of the low root bits of huff.  This is saved in low to check for when a
9898
   new sub-table should be started.  drop is zero when the root table is
9899
   being filled, and drop is root when sub-tables are being filled.
9900

9901
   When a new sub-table is needed, it is necessary to look ahead in the
9902
   code lengths to determine what size sub-table is needed.  The length
9903
   counts are used for this, and so count[] is decremented as codes are
9904
   entered in the tables.
9905

9906
   used keeps track of how many table entries have been allocated from the
9907
   provided *table space.  It is checked for LENS and DIST tables against
9908
   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
9909
   the initial root table size constants.  See the comments in inftrees.h
9910
   for more information.
9911

9912
   sym increments through all symbols, and the loop terminates when
9913
   all codes of length max, i.e. all codes, have been processed.  This
9914
   routine permits incomplete codes, so another loop after this one fills
9915
   in the rest of the decoding tables with invalid code markers.
9916
   */
9917

    
9918
  /* set up for code type */
9919
  // poor man optimization - use if-else instead of switch,
9920
  // to avoid deopts in old v8
9921
  if (type === CODES) {
9922
    base = extra = work;    /* dummy value--not used */
9923
    end = 19;
9924

    
9925
  } else if (type === LENS) {
9926
    base = lbase;
9927
    base_index -= 257;
9928
    extra = lext;
9929
    extra_index -= 257;
9930
    end = 256;
9931

    
9932
  } else {                    /* DISTS */
9933
    base = dbase;
9934
    extra = dext;
9935
    end = -1;
9936
  }
9937

    
9938
  /* initialize opts for loop */
9939
  huff = 0;                   /* starting code */
9940
  sym = 0;                    /* starting code symbol */
9941
  len = min;                  /* starting code length */
9942
  next = table_index;              /* current table to fill in */
9943
  curr = root;                /* current table index bits */
9944
  drop = 0;                   /* current bits to drop from code for index */
9945
  low = -1;                   /* trigger new sub-table when len > root */
9946
  used = 1 << root;          /* use root table entries */
9947
  mask = used - 1;            /* mask for comparing low */
9948

    
9949
  /* check available table space */
9950
  if ((type === LENS && used > ENOUGH_LENS) ||
9951
    (type === DISTS && used > ENOUGH_DISTS)) {
9952
    return 1;
9953
  }
9954

    
9955
  /* process all codes and make table entries */
9956
  for (;;) {
9957
    /* create table entry */
9958
    here_bits = len - drop;
9959
    if (work[sym] < end) {
9960
      here_op = 0;
9961
      here_val = work[sym];
9962
    }
9963
    else if (work[sym] > end) {
9964
      here_op = extra[extra_index + work[sym]];
9965
      here_val = base[base_index + work[sym]];
9966
    }
9967
    else {
9968
      here_op = 32 + 64;         /* end of block */
9969
      here_val = 0;
9970
    }
9971

    
9972
    /* replicate for those indices with low len bits equal to huff */
9973
    incr = 1 << (len - drop);
9974
    fill = 1 << curr;
9975
    min = fill;                 /* save offset to next table */
9976
    do {
9977
      fill -= incr;
9978
      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
9979
    } while (fill !== 0);
9980

    
9981
    /* backwards increment the len-bit code huff */
9982
    incr = 1 << (len - 1);
9983
    while (huff & incr) {
9984
      incr >>= 1;
9985
    }
9986
    if (incr !== 0) {
9987
      huff &= incr - 1;
9988
      huff += incr;
9989
    } else {
9990
      huff = 0;
9991
    }
9992

    
9993
    /* go to next symbol, update count, len */
9994
    sym++;
9995
    if (--count[len] === 0) {
9996
      if (len === max) { break; }
9997
      len = lens[lens_index + work[sym]];
9998
    }
9999

    
10000
    /* create new sub-table if needed */
10001
    if (len > root && (huff & mask) !== low) {
10002
      /* if first time, transition to sub-tables */
10003
      if (drop === 0) {
10004
        drop = root;
10005
      }
10006

    
10007
      /* increment past last table */
10008
      next += min;            /* here min is 1 << curr */
10009

    
10010
      /* determine length of next table */
10011
      curr = len - drop;
10012
      left = 1 << curr;
10013
      while (curr + drop < max) {
10014
        left -= count[curr + drop];
10015
        if (left <= 0) { break; }
10016
        curr++;
10017
        left <<= 1;
10018
      }
10019

    
10020
      /* check for enough space */
10021
      used += 1 << curr;
10022
      if ((type === LENS && used > ENOUGH_LENS) ||
10023
        (type === DISTS && used > ENOUGH_DISTS)) {
10024
        return 1;
10025
      }
10026

    
10027
      /* point entry in root table to sub-table */
10028
      low = huff & mask;
10029
      /*table.op[low] = curr;
10030
      table.bits[low] = root;
10031
      table.val[low] = next - opts.table_index;*/
10032
      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
10033
    }
10034
  }
10035

    
10036
  /* fill in remaining table entry if code is incomplete (guaranteed to have
10037
   at most one remaining entry, since if the code is incomplete, the
10038
   maximum code length that was allowed to get this far is one bit) */
10039
  if (huff !== 0) {
10040
    //table.op[next + huff] = 64;            /* invalid code marker */
10041
    //table.bits[next + huff] = len - drop;
10042
    //table.val[next + huff] = 0;
10043
    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
10044
  }
10045

    
10046
  /* set return parameters */
10047
  //opts.table_index += used;
10048
  opts.bits = root;
10049
  return 0;
10050
};
10051

    
10052
},{"../utils/common":41}],51:[function(require,module,exports){
10053
'use strict';
10054

    
10055
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
10056
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
10057
//
10058
// This software is provided 'as-is', without any express or implied
10059
// warranty. In no event will the authors be held liable for any damages
10060
// arising from the use of this software.
10061
//
10062
// Permission is granted to anyone to use this software for any purpose,
10063
// including commercial applications, and to alter it and redistribute it
10064
// freely, subject to the following restrictions:
10065
//
10066
// 1. The origin of this software must not be misrepresented; you must not
10067
//   claim that you wrote the original software. If you use this software
10068
//   in a product, an acknowledgment in the product documentation would be
10069
//   appreciated but is not required.
10070
// 2. Altered source versions must be plainly marked as such, and must not be
10071
//   misrepresented as being the original software.
10072
// 3. This notice may not be removed or altered from any source distribution.
10073

    
10074
module.exports = {
10075
  2:      'need dictionary',     /* Z_NEED_DICT       2  */
10076
  1:      'stream end',          /* Z_STREAM_END      1  */
10077
  0:      '',                    /* Z_OK              0  */
10078
  '-1':   'file error',          /* Z_ERRNO         (-1) */
10079
  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
10080
  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
10081
  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
10082
  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
10083
  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
10084
};
10085

    
10086
},{}],52:[function(require,module,exports){
10087
'use strict';
10088

    
10089
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
10090
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
10091
//
10092
// This software is provided 'as-is', without any express or implied
10093
// warranty. In no event will the authors be held liable for any damages
10094
// arising from the use of this software.
10095
//
10096
// Permission is granted to anyone to use this software for any purpose,
10097
// including commercial applications, and to alter it and redistribute it
10098
// freely, subject to the following restrictions:
10099
//
10100
// 1. The origin of this software must not be misrepresented; you must not
10101
//   claim that you wrote the original software. If you use this software
10102
//   in a product, an acknowledgment in the product documentation would be
10103
//   appreciated but is not required.
10104
// 2. Altered source versions must be plainly marked as such, and must not be
10105
//   misrepresented as being the original software.
10106
// 3. This notice may not be removed or altered from any source distribution.
10107

    
10108
var utils = require('../utils/common');
10109

    
10110
/* Public constants ==========================================================*/
10111
/* ===========================================================================*/
10112

    
10113

    
10114
//var Z_FILTERED          = 1;
10115
//var Z_HUFFMAN_ONLY      = 2;
10116
//var Z_RLE               = 3;
10117
var Z_FIXED               = 4;
10118
//var Z_DEFAULT_STRATEGY  = 0;
10119

    
10120
/* Possible values of the data_type field (though see inflate()) */
10121
var Z_BINARY              = 0;
10122
var Z_TEXT                = 1;
10123
//var Z_ASCII             = 1; // = Z_TEXT
10124
var Z_UNKNOWN             = 2;
10125

    
10126
/*============================================================================*/
10127

    
10128

    
10129
function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
10130

    
10131
// From zutil.h
10132

    
10133
var STORED_BLOCK = 0;
10134
var STATIC_TREES = 1;
10135
var DYN_TREES    = 2;
10136
/* The three kinds of block type */
10137

    
10138
var MIN_MATCH    = 3;
10139
var MAX_MATCH    = 258;
10140
/* The minimum and maximum match lengths */
10141

    
10142
// From deflate.h
10143
/* ===========================================================================
10144
 * Internal compression state.
10145
 */
10146

    
10147
var LENGTH_CODES  = 29;
10148
/* number of length codes, not counting the special END_BLOCK code */
10149

    
10150
var LITERALS      = 256;
10151
/* number of literal bytes 0..255 */
10152

    
10153
var L_CODES       = LITERALS + 1 + LENGTH_CODES;
10154
/* number of Literal or Length codes, including the END_BLOCK code */
10155

    
10156
var D_CODES       = 30;
10157
/* number of distance codes */
10158

    
10159
var BL_CODES      = 19;
10160
/* number of codes used to transfer the bit lengths */
10161

    
10162
var HEAP_SIZE     = 2 * L_CODES + 1;
10163
/* maximum heap size */
10164

    
10165
var MAX_BITS      = 15;
10166
/* All codes must not exceed MAX_BITS bits */
10167

    
10168
var Buf_size      = 16;
10169
/* size of bit buffer in bi_buf */
10170

    
10171

    
10172
/* ===========================================================================
10173
 * Constants
10174
 */
10175

    
10176
var MAX_BL_BITS = 7;
10177
/* Bit length codes must not exceed MAX_BL_BITS bits */
10178

    
10179
var END_BLOCK   = 256;
10180
/* end of block literal code */
10181

    
10182
var REP_3_6     = 16;
10183
/* repeat previous bit length 3-6 times (2 bits of repeat count) */
10184

    
10185
var REPZ_3_10   = 17;
10186
/* repeat a zero length 3-10 times  (3 bits of repeat count) */
10187

    
10188
var REPZ_11_138 = 18;
10189
/* repeat a zero length 11-138 times  (7 bits of repeat count) */
10190

    
10191
/* eslint-disable comma-spacing,array-bracket-spacing */
10192
var extra_lbits =   /* extra bits for each length code */
10193
  [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];
10194

    
10195
var extra_dbits =   /* extra bits for each distance code */
10196
  [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];
10197

    
10198
var extra_blbits =  /* extra bits for each bit length code */
10199
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
10200

    
10201
var bl_order =
10202
  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
10203
/* eslint-enable comma-spacing,array-bracket-spacing */
10204

    
10205
/* The lengths of the bit length codes are sent in order of decreasing
10206
 * probability, to avoid transmitting the lengths for unused bit length codes.
10207
 */
10208

    
10209
/* ===========================================================================
10210
 * Local data. These are initialized only once.
10211
 */
10212

    
10213
// We pre-fill arrays with 0 to avoid uninitialized gaps
10214

    
10215
var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
10216

    
10217
// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
10218
var static_ltree  = new Array((L_CODES + 2) * 2);
10219
zero(static_ltree);
10220
/* The static literal tree. Since the bit lengths are imposed, there is no
10221
 * need for the L_CODES extra codes used during heap construction. However
10222
 * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
10223
 * below).
10224
 */
10225

    
10226
var static_dtree  = new Array(D_CODES * 2);
10227
zero(static_dtree);
10228
/* The static distance tree. (Actually a trivial tree since all codes use
10229
 * 5 bits.)
10230
 */
10231

    
10232
var _dist_code    = new Array(DIST_CODE_LEN);
10233
zero(_dist_code);
10234
/* Distance codes. The first 256 values correspond to the distances
10235
 * 3 .. 258, the last 256 values correspond to the top 8 bits of
10236
 * the 15 bit distances.
10237
 */
10238

    
10239
var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
10240
zero(_length_code);
10241
/* length code for each normalized match length (0 == MIN_MATCH) */
10242

    
10243
var base_length   = new Array(LENGTH_CODES);
10244
zero(base_length);
10245
/* First normalized length for each code (0 = MIN_MATCH) */
10246

    
10247
var base_dist     = new Array(D_CODES);
10248
zero(base_dist);
10249
/* First normalized distance for each code (0 = distance of 1) */
10250

    
10251

    
10252
function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
10253

    
10254
  this.static_tree  = static_tree;  /* static tree or NULL */
10255
  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
10256
  this.extra_base   = extra_base;   /* base index for extra_bits */
10257
  this.elems        = elems;        /* max number of elements in the tree */
10258
  this.max_length   = max_length;   /* max bit length for the codes */
10259

    
10260
  // show if `static_tree` has data or dummy - needed for monomorphic objects
10261
  this.has_stree    = static_tree && static_tree.length;
10262
}
10263

    
10264

    
10265
var static_l_desc;
10266
var static_d_desc;
10267
var static_bl_desc;
10268

    
10269

    
10270
function TreeDesc(dyn_tree, stat_desc) {
10271
  this.dyn_tree = dyn_tree;     /* the dynamic tree */
10272
  this.max_code = 0;            /* largest code with non zero frequency */
10273
  this.stat_desc = stat_desc;   /* the corresponding static tree */
10274
}
10275

    
10276

    
10277

    
10278
function d_code(dist) {
10279
  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
10280
}
10281

    
10282

    
10283
/* ===========================================================================
10284
 * Output a short LSB first on the stream.
10285
 * IN assertion: there is enough room in pendingBuf.
10286
 */
10287
function put_short(s, w) {
10288
//    put_byte(s, (uch)((w) & 0xff));
10289
//    put_byte(s, (uch)((ush)(w) >> 8));
10290
  s.pending_buf[s.pending++] = (w) & 0xff;
10291
  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
10292
}
10293

    
10294

    
10295
/* ===========================================================================
10296
 * Send a value on a given number of bits.
10297
 * IN assertion: length <= 16 and value fits in length bits.
10298
 */
10299
function send_bits(s, value, length) {
10300
  if (s.bi_valid > (Buf_size - length)) {
10301
    s.bi_buf |= (value << s.bi_valid) & 0xffff;
10302
    put_short(s, s.bi_buf);
10303
    s.bi_buf = value >> (Buf_size - s.bi_valid);
10304
    s.bi_valid += length - Buf_size;
10305
  } else {
10306
    s.bi_buf |= (value << s.bi_valid) & 0xffff;
10307
    s.bi_valid += length;
10308
  }
10309
}
10310

    
10311

    
10312
function send_code(s, c, tree) {
10313
  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
10314
}
10315

    
10316

    
10317
/* ===========================================================================
10318
 * Reverse the first len bits of a code, using straightforward code (a faster
10319
 * method would use a table)
10320
 * IN assertion: 1 <= len <= 15
10321
 */
10322
function bi_reverse(code, len) {
10323
  var res = 0;
10324
  do {
10325
    res |= code & 1;
10326
    code >>>= 1;
10327
    res <<= 1;
10328
  } while (--len > 0);
10329
  return res >>> 1;
10330
}
10331

    
10332

    
10333
/* ===========================================================================
10334
 * Flush the bit buffer, keeping at most 7 bits in it.
10335
 */
10336
function bi_flush(s) {
10337
  if (s.bi_valid === 16) {
10338
    put_short(s, s.bi_buf);
10339
    s.bi_buf = 0;
10340
    s.bi_valid = 0;
10341

    
10342
  } else if (s.bi_valid >= 8) {
10343
    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
10344
    s.bi_buf >>= 8;
10345
    s.bi_valid -= 8;
10346
  }
10347
}
10348

    
10349

    
10350
/* ===========================================================================
10351
 * Compute the optimal bit lengths for a tree and update the total bit length
10352
 * for the current block.
10353
 * IN assertion: the fields freq and dad are set, heap[heap_max] and
10354
 *    above are the tree nodes sorted by increasing frequency.
10355
 * OUT assertions: the field len is set to the optimal bit length, the
10356
 *     array bl_count contains the frequencies for each bit length.
10357
 *     The length opt_len is updated; static_len is also updated if stree is
10358
 *     not null.
10359
 */
10360
function gen_bitlen(s, desc)
10361
//    deflate_state *s;
10362
//    tree_desc *desc;    /* the tree descriptor */
10363
{
10364
  var tree            = desc.dyn_tree;
10365
  var max_code        = desc.max_code;
10366
  var stree           = desc.stat_desc.static_tree;
10367
  var has_stree       = desc.stat_desc.has_stree;
10368
  var extra           = desc.stat_desc.extra_bits;
10369
  var base            = desc.stat_desc.extra_base;
10370
  var max_length      = desc.stat_desc.max_length;
10371
  var h;              /* heap index */
10372
  var n, m;           /* iterate over the tree elements */
10373
  var bits;           /* bit length */
10374
  var xbits;          /* extra bits */
10375
  var f;              /* frequency */
10376
  var overflow = 0;   /* number of elements with bit length too large */
10377

    
10378
  for (bits = 0; bits <= MAX_BITS; bits++) {
10379
    s.bl_count[bits] = 0;
10380
  }
10381

    
10382
  /* In a first pass, compute the optimal bit lengths (which may
10383
   * overflow in the case of the bit length tree).
10384
   */
10385
  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
10386

    
10387
  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
10388
    n = s.heap[h];
10389
    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
10390
    if (bits > max_length) {
10391
      bits = max_length;
10392
      overflow++;
10393
    }
10394
    tree[n * 2 + 1]/*.Len*/ = bits;
10395
    /* We overwrite tree[n].Dad which is no longer needed */
10396

    
10397
    if (n > max_code) { continue; } /* not a leaf node */
10398

    
10399
    s.bl_count[bits]++;
10400
    xbits = 0;
10401
    if (n >= base) {
10402
      xbits = extra[n - base];
10403
    }
10404
    f = tree[n * 2]/*.Freq*/;
10405
    s.opt_len += f * (bits + xbits);
10406
    if (has_stree) {
10407
      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
10408
    }
10409
  }
10410
  if (overflow === 0) { return; }
10411

    
10412
  // Trace((stderr,"\nbit length overflow\n"));
10413
  /* This happens for example on obj2 and pic of the Calgary corpus */
10414

    
10415
  /* Find the first bit length which could increase: */
10416
  do {
10417
    bits = max_length - 1;
10418
    while (s.bl_count[bits] === 0) { bits--; }
10419
    s.bl_count[bits]--;      /* move one leaf down the tree */
10420
    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
10421
    s.bl_count[max_length]--;
10422
    /* The brother of the overflow item also moves one step up,
10423
     * but this does not affect bl_count[max_length]
10424
     */
10425
    overflow -= 2;
10426
  } while (overflow > 0);
10427

    
10428
  /* Now recompute all bit lengths, scanning in increasing frequency.
10429
   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
10430
   * lengths instead of fixing only the wrong ones. This idea is taken
10431
   * from 'ar' written by Haruhiko Okumura.)
10432
   */
10433
  for (bits = max_length; bits !== 0; bits--) {
10434
    n = s.bl_count[bits];
10435
    while (n !== 0) {
10436
      m = s.heap[--h];
10437
      if (m > max_code) { continue; }
10438
      if (tree[m * 2 + 1]/*.Len*/ !== bits) {
10439
        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
10440
        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
10441
        tree[m * 2 + 1]/*.Len*/ = bits;
10442
      }
10443
      n--;
10444
    }
10445
  }
10446
}
10447

    
10448

    
10449
/* ===========================================================================
10450
 * Generate the codes for a given tree and bit counts (which need not be
10451
 * optimal).
10452
 * IN assertion: the array bl_count contains the bit length statistics for
10453
 * the given tree and the field len is set for all tree elements.
10454
 * OUT assertion: the field code is set for all tree elements of non
10455
 *     zero code length.
10456
 */
10457
function gen_codes(tree, max_code, bl_count)
10458
//    ct_data *tree;             /* the tree to decorate */
10459
//    int max_code;              /* largest code with non zero frequency */
10460
//    ushf *bl_count;            /* number of codes at each bit length */
10461
{
10462
  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
10463
  var code = 0;              /* running code value */
10464
  var bits;                  /* bit index */
10465
  var n;                     /* code index */
10466

    
10467
  /* The distribution counts are first used to generate the code values
10468
   * without bit reversal.
10469
   */
10470
  for (bits = 1; bits <= MAX_BITS; bits++) {
10471
    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
10472
  }
10473
  /* Check that the bit counts in bl_count are consistent. The last code
10474
   * must be all ones.
10475
   */
10476
  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
10477
  //        "inconsistent bit counts");
10478
  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
10479

    
10480
  for (n = 0;  n <= max_code; n++) {
10481
    var len = tree[n * 2 + 1]/*.Len*/;
10482
    if (len === 0) { continue; }
10483
    /* Now reverse the bits */
10484
    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
10485

    
10486
    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
10487
    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
10488
  }
10489
}
10490

    
10491

    
10492
/* ===========================================================================
10493
 * Initialize the various 'constant' tables.
10494
 */
10495
function tr_static_init() {
10496
  var n;        /* iterates over tree elements */
10497
  var bits;     /* bit counter */
10498
  var length;   /* length value */
10499
  var code;     /* code value */
10500
  var dist;     /* distance index */
10501
  var bl_count = new Array(MAX_BITS + 1);
10502
  /* number of codes at each bit length for an optimal tree */
10503

    
10504
  // do check in _tr_init()
10505
  //if (static_init_done) return;
10506

    
10507
  /* For some embedded targets, global variables are not initialized: */
10508
/*#ifdef NO_INIT_GLOBAL_POINTERS
10509
  static_l_desc.static_tree = static_ltree;
10510
  static_l_desc.extra_bits = extra_lbits;
10511
  static_d_desc.static_tree = static_dtree;
10512
  static_d_desc.extra_bits = extra_dbits;
10513
  static_bl_desc.extra_bits = extra_blbits;
10514
#endif*/
10515

    
10516
  /* Initialize the mapping length (0..255) -> length code (0..28) */
10517
  length = 0;
10518
  for (code = 0; code < LENGTH_CODES - 1; code++) {
10519
    base_length[code] = length;
10520
    for (n = 0; n < (1 << extra_lbits[code]); n++) {
10521
      _length_code[length++] = code;
10522
    }
10523
  }
10524
  //Assert (length == 256, "tr_static_init: length != 256");
10525
  /* Note that the length 255 (match length 258) can be represented
10526
   * in two different ways: code 284 + 5 bits or code 285, so we
10527
   * overwrite length_code[255] to use the best encoding:
10528
   */
10529
  _length_code[length - 1] = code;
10530

    
10531
  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
10532
  dist = 0;
10533
  for (code = 0; code < 16; code++) {
10534
    base_dist[code] = dist;
10535
    for (n = 0; n < (1 << extra_dbits[code]); n++) {
10536
      _dist_code[dist++] = code;
10537
    }
10538
  }
10539
  //Assert (dist == 256, "tr_static_init: dist != 256");
10540
  dist >>= 7; /* from now on, all distances are divided by 128 */
10541
  for (; code < D_CODES; code++) {
10542
    base_dist[code] = dist << 7;
10543
    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
10544
      _dist_code[256 + dist++] = code;
10545
    }
10546
  }
10547
  //Assert (dist == 256, "tr_static_init: 256+dist != 512");
10548

    
10549
  /* Construct the codes of the static literal tree */
10550
  for (bits = 0; bits <= MAX_BITS; bits++) {
10551
    bl_count[bits] = 0;
10552
  }
10553

    
10554
  n = 0;
10555
  while (n <= 143) {
10556
    static_ltree[n * 2 + 1]/*.Len*/ = 8;
10557
    n++;
10558
    bl_count[8]++;
10559
  }
10560
  while (n <= 255) {
10561
    static_ltree[n * 2 + 1]/*.Len*/ = 9;
10562
    n++;
10563
    bl_count[9]++;
10564
  }
10565
  while (n <= 279) {
10566
    static_ltree[n * 2 + 1]/*.Len*/ = 7;
10567
    n++;
10568
    bl_count[7]++;
10569
  }
10570
  while (n <= 287) {
10571
    static_ltree[n * 2 + 1]/*.Len*/ = 8;
10572
    n++;
10573
    bl_count[8]++;
10574
  }
10575
  /* Codes 286 and 287 do not exist, but we must include them in the
10576
   * tree construction to get a canonical Huffman tree (longest code
10577
   * all ones)
10578
   */
10579
  gen_codes(static_ltree, L_CODES + 1, bl_count);
10580

    
10581
  /* The static distance tree is trivial: */
10582
  for (n = 0; n < D_CODES; n++) {
10583
    static_dtree[n * 2 + 1]/*.Len*/ = 5;
10584
    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
10585
  }
10586

    
10587
  // Now data ready and we can init static trees
10588
  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
10589
  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
10590
  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
10591

    
10592
  //static_init_done = true;
10593
}
10594

    
10595

    
10596
/* ===========================================================================
10597
 * Initialize a new block.
10598
 */
10599
function init_block(s) {
10600
  var n; /* iterates over tree elements */
10601

    
10602
  /* Initialize the trees. */
10603
  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
10604
  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
10605
  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
10606

    
10607
  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
10608
  s.opt_len = s.static_len = 0;
10609
  s.last_lit = s.matches = 0;
10610
}
10611

    
10612

    
10613
/* ===========================================================================
10614
 * Flush the bit buffer and align the output on a byte boundary
10615
 */
10616
function bi_windup(s)
10617
{
10618
  if (s.bi_valid > 8) {
10619
    put_short(s, s.bi_buf);
10620
  } else if (s.bi_valid > 0) {
10621
    //put_byte(s, (Byte)s->bi_buf);
10622
    s.pending_buf[s.pending++] = s.bi_buf;
10623
  }
10624
  s.bi_buf = 0;
10625
  s.bi_valid = 0;
10626
}
10627

    
10628
/* ===========================================================================
10629
 * Copy a stored block, storing first the length and its
10630
 * one's complement if requested.
10631
 */
10632
function copy_block(s, buf, len, header)
10633
//DeflateState *s;
10634
//charf    *buf;    /* the input data */
10635
//unsigned len;     /* its length */
10636
//int      header;  /* true if block header must be written */
10637
{
10638
  bi_windup(s);        /* align on byte boundary */
10639

    
10640
  if (header) {
10641
    put_short(s, len);
10642
    put_short(s, ~len);
10643
  }
10644
//  while (len--) {
10645
//    put_byte(s, *buf++);
10646
//  }
10647
  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
10648
  s.pending += len;
10649
}
10650

    
10651
/* ===========================================================================
10652
 * Compares to subtrees, using the tree depth as tie breaker when
10653
 * the subtrees have equal frequency. This minimizes the worst case length.
10654
 */
10655
function smaller(tree, n, m, depth) {
10656
  var _n2 = n * 2;
10657
  var _m2 = m * 2;
10658
  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
10659
         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
10660
}
10661

    
10662
/* ===========================================================================
10663
 * Restore the heap property by moving down the tree starting at node k,
10664
 * exchanging a node with the smallest of its two sons if necessary, stopping
10665
 * when the heap property is re-established (each father smaller than its
10666
 * two sons).
10667
 */
10668
function pqdownheap(s, tree, k)
10669
//    deflate_state *s;
10670
//    ct_data *tree;  /* the tree to restore */
10671
//    int k;               /* node to move down */
10672
{
10673
  var v = s.heap[k];
10674
  var j = k << 1;  /* left son of k */
10675
  while (j <= s.heap_len) {
10676
    /* Set j to the smallest of the two sons: */
10677
    if (j < s.heap_len &&
10678
      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
10679
      j++;
10680
    }
10681
    /* Exit if v is smaller than both sons */
10682
    if (smaller(tree, v, s.heap[j], s.depth)) { break; }
10683

    
10684
    /* Exchange v with the smallest son */
10685
    s.heap[k] = s.heap[j];
10686
    k = j;
10687

    
10688
    /* And continue down the tree, setting j to the left son of k */
10689
    j <<= 1;
10690
  }
10691
  s.heap[k] = v;
10692
}
10693

    
10694

    
10695
// inlined manually
10696
// var SMALLEST = 1;
10697

    
10698
/* ===========================================================================
10699
 * Send the block data compressed using the given Huffman trees
10700
 */
10701
function compress_block(s, ltree, dtree)
10702
//    deflate_state *s;
10703
//    const ct_data *ltree; /* literal tree */
10704
//    const ct_data *dtree; /* distance tree */
10705
{
10706
  var dist;           /* distance of matched string */
10707
  var lc;             /* match length or unmatched char (if dist == 0) */
10708
  var lx = 0;         /* running index in l_buf */
10709
  var code;           /* the code to send */
10710
  var extra;          /* number of extra bits to send */
10711

    
10712
  if (s.last_lit !== 0) {
10713
    do {
10714
      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
10715
      lc = s.pending_buf[s.l_buf + lx];
10716
      lx++;
10717

    
10718
      if (dist === 0) {
10719
        send_code(s, lc, ltree); /* send a literal byte */
10720
        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
10721
      } else {
10722
        /* Here, lc is the match length - MIN_MATCH */
10723
        code = _length_code[lc];
10724
        send_code(s, code + LITERALS + 1, ltree); /* send the length code */
10725
        extra = extra_lbits[code];
10726
        if (extra !== 0) {
10727
          lc -= base_length[code];
10728
          send_bits(s, lc, extra);       /* send the extra length bits */
10729
        }
10730
        dist--; /* dist is now the match distance - 1 */
10731
        code = d_code(dist);
10732
        //Assert (code < D_CODES, "bad d_code");
10733

    
10734
        send_code(s, code, dtree);       /* send the distance code */
10735
        extra = extra_dbits[code];
10736
        if (extra !== 0) {
10737
          dist -= base_dist[code];
10738
          send_bits(s, dist, extra);   /* send the extra distance bits */
10739
        }
10740
      } /* literal or match pair ? */
10741

    
10742
      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
10743
      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
10744
      //       "pendingBuf overflow");
10745

    
10746
    } while (lx < s.last_lit);
10747
  }
10748

    
10749
  send_code(s, END_BLOCK, ltree);
10750
}
10751

    
10752

    
10753
/* ===========================================================================
10754
 * Construct one Huffman tree and assigns the code bit strings and lengths.
10755
 * Update the total bit length for the current block.
10756
 * IN assertion: the field freq is set for all tree elements.
10757
 * OUT assertions: the fields len and code are set to the optimal bit length
10758
 *     and corresponding code. The length opt_len is updated; static_len is
10759
 *     also updated if stree is not null. The field max_code is set.
10760
 */
10761
function build_tree(s, desc)
10762
//    deflate_state *s;
10763
//    tree_desc *desc; /* the tree descriptor */
10764
{
10765
  var tree     = desc.dyn_tree;
10766
  var stree    = desc.stat_desc.static_tree;
10767
  var has_stree = desc.stat_desc.has_stree;
10768
  var elems    = desc.stat_desc.elems;
10769
  var n, m;          /* iterate over heap elements */
10770
  var max_code = -1; /* largest code with non zero frequency */
10771
  var node;          /* new node being created */
10772

    
10773
  /* Construct the initial heap, with least frequent element in
10774
   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
10775
   * heap[0] is not used.
10776
   */
10777
  s.heap_len = 0;
10778
  s.heap_max = HEAP_SIZE;
10779

    
10780
  for (n = 0; n < elems; n++) {
10781
    if (tree[n * 2]/*.Freq*/ !== 0) {
10782
      s.heap[++s.heap_len] = max_code = n;
10783
      s.depth[n] = 0;
10784

    
10785
    } else {
10786
      tree[n * 2 + 1]/*.Len*/ = 0;
10787
    }
10788
  }
10789

    
10790
  /* The pkzip format requires that at least one distance code exists,
10791
   * and that at least one bit should be sent even if there is only one
10792
   * possible code. So to avoid special checks later on we force at least
10793
   * two codes of non zero frequency.
10794
   */
10795
  while (s.heap_len < 2) {
10796
    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
10797
    tree[node * 2]/*.Freq*/ = 1;
10798
    s.depth[node] = 0;
10799
    s.opt_len--;
10800

    
10801
    if (has_stree) {
10802
      s.static_len -= stree[node * 2 + 1]/*.Len*/;
10803
    }
10804
    /* node is 0 or 1 so it does not have extra bits */
10805
  }
10806
  desc.max_code = max_code;
10807

    
10808
  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
10809
   * establish sub-heaps of increasing lengths:
10810
   */
10811
  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
10812

    
10813
  /* Construct the Huffman tree by repeatedly combining the least two
10814
   * frequent nodes.
10815
   */
10816
  node = elems;              /* next internal node of the tree */
10817
  do {
10818
    //pqremove(s, tree, n);  /* n = node of least frequency */
10819
    /*** pqremove ***/
10820
    n = s.heap[1/*SMALLEST*/];
10821
    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
10822
    pqdownheap(s, tree, 1/*SMALLEST*/);
10823
    /***/
10824

    
10825
    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
10826

    
10827
    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
10828
    s.heap[--s.heap_max] = m;
10829

    
10830
    /* Create a new node father of n and m */
10831
    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
10832
    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
10833
    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
10834

    
10835
    /* and insert the new node in the heap */
10836
    s.heap[1/*SMALLEST*/] = node++;
10837
    pqdownheap(s, tree, 1/*SMALLEST*/);
10838

    
10839
  } while (s.heap_len >= 2);
10840

    
10841
  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
10842

    
10843
  /* At this point, the fields freq and dad are set. We can now
10844
   * generate the bit lengths.
10845
   */
10846
  gen_bitlen(s, desc);
10847

    
10848
  /* The field len is now set, we can generate the bit codes */
10849
  gen_codes(tree, max_code, s.bl_count);
10850
}
10851

    
10852

    
10853
/* ===========================================================================
10854
 * Scan a literal or distance tree to determine the frequencies of the codes
10855
 * in the bit length tree.
10856
 */
10857
function scan_tree(s, tree, max_code)
10858
//    deflate_state *s;
10859
//    ct_data *tree;   /* the tree to be scanned */
10860
//    int max_code;    /* and its largest code of non zero frequency */
10861
{
10862
  var n;                     /* iterates over all tree elements */
10863
  var prevlen = -1;          /* last emitted length */
10864
  var curlen;                /* length of current code */
10865

    
10866
  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
10867

    
10868
  var count = 0;             /* repeat count of the current code */
10869
  var max_count = 7;         /* max repeat count */
10870
  var min_count = 4;         /* min repeat count */
10871

    
10872
  if (nextlen === 0) {
10873
    max_count = 138;
10874
    min_count = 3;
10875
  }
10876
  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
10877

    
10878
  for (n = 0; n <= max_code; n++) {
10879
    curlen = nextlen;
10880
    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
10881

    
10882
    if (++count < max_count && curlen === nextlen) {
10883
      continue;
10884

    
10885
    } else if (count < min_count) {
10886
      s.bl_tree[curlen * 2]/*.Freq*/ += count;
10887

    
10888
    } else if (curlen !== 0) {
10889

    
10890
      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
10891
      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
10892

    
10893
    } else if (count <= 10) {
10894
      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
10895

    
10896
    } else {
10897
      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
10898
    }
10899

    
10900
    count = 0;
10901
    prevlen = curlen;
10902

    
10903
    if (nextlen === 0) {
10904
      max_count = 138;
10905
      min_count = 3;
10906

    
10907
    } else if (curlen === nextlen) {
10908
      max_count = 6;
10909
      min_count = 3;
10910

    
10911
    } else {
10912
      max_count = 7;
10913
      min_count = 4;
10914
    }
10915
  }
10916
}
10917

    
10918

    
10919
/* ===========================================================================
10920
 * Send a literal or distance tree in compressed form, using the codes in
10921
 * bl_tree.
10922
 */
10923
function send_tree(s, tree, max_code)
10924
//    deflate_state *s;
10925
//    ct_data *tree; /* the tree to be scanned */
10926
//    int max_code;       /* and its largest code of non zero frequency */
10927
{
10928
  var n;                     /* iterates over all tree elements */
10929
  var prevlen = -1;          /* last emitted length */
10930
  var curlen;                /* length of current code */
10931

    
10932
  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
10933

    
10934
  var count = 0;             /* repeat count of the current code */
10935
  var max_count = 7;         /* max repeat count */
10936
  var min_count = 4;         /* min repeat count */
10937

    
10938
  /* tree[max_code+1].Len = -1; */  /* guard already set */
10939
  if (nextlen === 0) {
10940
    max_count = 138;
10941
    min_count = 3;
10942
  }
10943

    
10944
  for (n = 0; n <= max_code; n++) {
10945
    curlen = nextlen;
10946
    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
10947

    
10948
    if (++count < max_count && curlen === nextlen) {
10949
      continue;
10950

    
10951
    } else if (count < min_count) {
10952
      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
10953

    
10954
    } else if (curlen !== 0) {
10955
      if (curlen !== prevlen) {
10956
        send_code(s, curlen, s.bl_tree);
10957
        count--;
10958
      }
10959
      //Assert(count >= 3 && count <= 6, " 3_6?");
10960
      send_code(s, REP_3_6, s.bl_tree);
10961
      send_bits(s, count - 3, 2);
10962

    
10963
    } else if (count <= 10) {
10964
      send_code(s, REPZ_3_10, s.bl_tree);
10965
      send_bits(s, count - 3, 3);
10966

    
10967
    } else {
10968
      send_code(s, REPZ_11_138, s.bl_tree);
10969
      send_bits(s, count - 11, 7);
10970
    }
10971

    
10972
    count = 0;
10973
    prevlen = curlen;
10974
    if (nextlen === 0) {
10975
      max_count = 138;
10976
      min_count = 3;
10977

    
10978
    } else if (curlen === nextlen) {
10979
      max_count = 6;
10980
      min_count = 3;
10981

    
10982
    } else {
10983
      max_count = 7;
10984
      min_count = 4;
10985
    }
10986
  }
10987
}
10988

    
10989

    
10990
/* ===========================================================================
10991
 * Construct the Huffman tree for the bit lengths and return the index in
10992
 * bl_order of the last bit length code to send.
10993
 */
10994
function build_bl_tree(s) {
10995
  var max_blindex;  /* index of last bit length code of non zero freq */
10996

    
10997
  /* Determine the bit length frequencies for literal and distance trees */
10998
  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
10999
  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
11000

    
11001
  /* Build the bit length tree: */
11002
  build_tree(s, s.bl_desc);
11003
  /* opt_len now includes the length of the tree representations, except
11004
   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
11005
   */
11006

    
11007
  /* Determine the number of bit length codes to send. The pkzip format
11008
   * requires that at least 4 bit length codes be sent. (appnote.txt says
11009
   * 3 but the actual value used is 4.)
11010
   */
11011
  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
11012
    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
11013
      break;
11014
    }
11015
  }
11016
  /* Update opt_len to include the bit length tree and counts */
11017
  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
11018
  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
11019
  //        s->opt_len, s->static_len));
11020

    
11021
  return max_blindex;
11022
}
11023

    
11024

    
11025
/* ===========================================================================
11026
 * Send the header for a block using dynamic Huffman trees: the counts, the
11027
 * lengths of the bit length codes, the literal tree and the distance tree.
11028
 * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
11029
 */
11030
function send_all_trees(s, lcodes, dcodes, blcodes)
11031
//    deflate_state *s;
11032
//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
11033
{
11034
  var rank;                    /* index in bl_order */
11035

    
11036
  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
11037
  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
11038
  //        "too many codes");
11039
  //Tracev((stderr, "\nbl counts: "));
11040
  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
11041
  send_bits(s, dcodes - 1,   5);
11042
  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
11043
  for (rank = 0; rank < blcodes; rank++) {
11044
    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
11045
    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
11046
  }
11047
  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
11048

    
11049
  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
11050
  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
11051

    
11052
  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
11053
  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
11054
}
11055

    
11056

    
11057
/* ===========================================================================
11058
 * Check if the data type is TEXT or BINARY, using the following algorithm:
11059
 * - TEXT if the two conditions below are satisfied:
11060
 *    a) There are no non-portable control characters belonging to the
11061
 *       "black list" (0..6, 14..25, 28..31).
11062
 *    b) There is at least one printable character belonging to the
11063
 *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
11064
 * - BINARY otherwise.
11065
 * - The following partially-portable control characters form a
11066
 *   "gray list" that is ignored in this detection algorithm:
11067
 *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
11068
 * IN assertion: the fields Freq of dyn_ltree are set.
11069
 */
11070
function detect_data_type(s) {
11071
  /* black_mask is the bit mask of black-listed bytes
11072
   * set bits 0..6, 14..25, and 28..31
11073
   * 0xf3ffc07f = binary 11110011111111111100000001111111
11074
   */
11075
  var black_mask = 0xf3ffc07f;
11076
  var n;
11077

    
11078
  /* Check for non-textual ("black-listed") bytes. */
11079
  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
11080
    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
11081
      return Z_BINARY;
11082
    }
11083
  }
11084

    
11085
  /* Check for textual ("white-listed") bytes. */
11086
  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
11087
      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
11088
    return Z_TEXT;
11089
  }
11090
  for (n = 32; n < LITERALS; n++) {
11091
    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
11092
      return Z_TEXT;
11093
    }
11094
  }
11095

    
11096
  /* There are no "black-listed" or "white-listed" bytes:
11097
   * this stream either is empty or has tolerated ("gray-listed") bytes only.
11098
   */
11099
  return Z_BINARY;
11100
}
11101

    
11102

    
11103
var static_init_done = false;
11104

    
11105
/* ===========================================================================
11106
 * Initialize the tree data structures for a new zlib stream.
11107
 */
11108
function _tr_init(s)
11109
{
11110

    
11111
  if (!static_init_done) {
11112
    tr_static_init();
11113
    static_init_done = true;
11114
  }
11115

    
11116
  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
11117
  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
11118
  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
11119

    
11120
  s.bi_buf = 0;
11121
  s.bi_valid = 0;
11122

    
11123
  /* Initialize the first block of the first file: */
11124
  init_block(s);
11125
}
11126

    
11127

    
11128
/* ===========================================================================
11129
 * Send a stored block
11130
 */
11131
function _tr_stored_block(s, buf, stored_len, last)
11132
//DeflateState *s;
11133
//charf *buf;       /* input block */
11134
//ulg stored_len;   /* length of input block */
11135
//int last;         /* one if this is the last block for a file */
11136
{
11137
  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
11138
  copy_block(s, buf, stored_len, true); /* with header */
11139
}
11140

    
11141

    
11142
/* ===========================================================================
11143
 * Send one empty static block to give enough lookahead for inflate.
11144
 * This takes 10 bits, of which 7 may remain in the bit buffer.
11145
 */
11146
function _tr_align(s) {
11147
  send_bits(s, STATIC_TREES << 1, 3);
11148
  send_code(s, END_BLOCK, static_ltree);
11149
  bi_flush(s);
11150
}
11151

    
11152

    
11153
/* ===========================================================================
11154
 * Determine the best encoding for the current block: dynamic trees, static
11155
 * trees or store, and output the encoded block to the zip file.
11156
 */
11157
function _tr_flush_block(s, buf, stored_len, last)
11158
//DeflateState *s;
11159
//charf *buf;       /* input block, or NULL if too old */
11160
//ulg stored_len;   /* length of input block */
11161
//int last;         /* one if this is the last block for a file */
11162
{
11163
  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
11164
  var max_blindex = 0;        /* index of last bit length code of non zero freq */
11165

    
11166
  /* Build the Huffman trees unless a stored block is forced */
11167
  if (s.level > 0) {
11168

    
11169
    /* Check if the file is binary or text */
11170
    if (s.strm.data_type === Z_UNKNOWN) {
11171
      s.strm.data_type = detect_data_type(s);
11172
    }
11173

    
11174
    /* Construct the literal and distance trees */
11175
    build_tree(s, s.l_desc);
11176
    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
11177
    //        s->static_len));
11178

    
11179
    build_tree(s, s.d_desc);
11180
    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
11181
    //        s->static_len));
11182
    /* At this point, opt_len and static_len are the total bit lengths of
11183
     * the compressed block data, excluding the tree representations.
11184
     */
11185

    
11186
    /* Build the bit length tree for the above two trees, and get the index
11187
     * in bl_order of the last bit length code to send.
11188
     */
11189
    max_blindex = build_bl_tree(s);
11190

    
11191
    /* Determine the best encoding. Compute the block lengths in bytes. */
11192
    opt_lenb = (s.opt_len + 3 + 7) >>> 3;
11193
    static_lenb = (s.static_len + 3 + 7) >>> 3;
11194

    
11195
    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
11196
    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
11197
    //        s->last_lit));
11198

    
11199
    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
11200

    
11201
  } else {
11202
    // Assert(buf != (char*)0, "lost buf");
11203
    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
11204
  }
11205

    
11206
  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
11207
    /* 4: two words for the lengths */
11208

    
11209
    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
11210
     * Otherwise we can't have processed more than WSIZE input bytes since
11211
     * the last block flush, because compression would have been
11212
     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
11213
     * transform a block into a stored block.
11214
     */
11215
    _tr_stored_block(s, buf, stored_len, last);
11216

    
11217
  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
11218

    
11219
    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
11220
    compress_block(s, static_ltree, static_dtree);
11221

    
11222
  } else {
11223
    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
11224
    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
11225
    compress_block(s, s.dyn_ltree, s.dyn_dtree);
11226
  }
11227
  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
11228
  /* The above check is made mod 2^32, for files larger than 512 MB
11229
   * and uLong implemented on 32 bits.
11230
   */
11231
  init_block(s);
11232

    
11233
  if (last) {
11234
    bi_windup(s);
11235
  }
11236
  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
11237
  //       s->compressed_len-7*last));
11238
}
11239

    
11240
/* ===========================================================================
11241
 * Save the match info and tally the frequency counts. Return true if
11242
 * the current block must be flushed.
11243
 */
11244
function _tr_tally(s, dist, lc)
11245
//    deflate_state *s;
11246
//    unsigned dist;  /* distance of matched string */
11247
//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
11248
{
11249
  //var out_length, in_length, dcode;
11250

    
11251
  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
11252
  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
11253

    
11254
  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
11255
  s.last_lit++;
11256

    
11257
  if (dist === 0) {
11258
    /* lc is the unmatched char */
11259
    s.dyn_ltree[lc * 2]/*.Freq*/++;
11260
  } else {
11261
    s.matches++;
11262
    /* Here, lc is the match length - MIN_MATCH */
11263
    dist--;             /* dist = match distance - 1 */
11264
    //Assert((ush)dist < (ush)MAX_DIST(s) &&
11265
    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
11266
    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
11267

    
11268
    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
11269
    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
11270
  }
11271

    
11272
// (!) This block is disabled in zlib defailts,
11273
// don't enable it for binary compatibility
11274

    
11275
//#ifdef TRUNCATE_BLOCK
11276
//  /* Try to guess if it is profitable to stop the current block here */
11277
//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
11278
//    /* Compute an upper bound for the compressed length */
11279
//    out_length = s.last_lit*8;
11280
//    in_length = s.strstart - s.block_start;
11281
//
11282
//    for (dcode = 0; dcode < D_CODES; dcode++) {
11283
//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
11284
//    }
11285
//    out_length >>>= 3;
11286
//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
11287
//    //       s->last_lit, in_length, out_length,
11288
//    //       100L - out_length*100L/in_length));
11289
//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
11290
//      return true;
11291
//    }
11292
//  }
11293
//#endif
11294

    
11295
  return (s.last_lit === s.lit_bufsize - 1);
11296
  /* We avoid equality with lit_bufsize because of wraparound at 64K
11297
   * on 16 bit machines and because stored blocks are restricted to
11298
   * 64K-1 bytes.
11299
   */
11300
}
11301

    
11302
exports._tr_init  = _tr_init;
11303
exports._tr_stored_block = _tr_stored_block;
11304
exports._tr_flush_block  = _tr_flush_block;
11305
exports._tr_tally = _tr_tally;
11306
exports._tr_align = _tr_align;
11307

    
11308
},{"../utils/common":41}],53:[function(require,module,exports){
11309
'use strict';
11310

    
11311
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
11312
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
11313
//
11314
// This software is provided 'as-is', without any express or implied
11315
// warranty. In no event will the authors be held liable for any damages
11316
// arising from the use of this software.
11317
//
11318
// Permission is granted to anyone to use this software for any purpose,
11319
// including commercial applications, and to alter it and redistribute it
11320
// freely, subject to the following restrictions:
11321
//
11322
// 1. The origin of this software must not be misrepresented; you must not
11323
//   claim that you wrote the original software. If you use this software
11324
//   in a product, an acknowledgment in the product documentation would be
11325
//   appreciated but is not required.
11326
// 2. Altered source versions must be plainly marked as such, and must not be
11327
//   misrepresented as being the original software.
11328
// 3. This notice may not be removed or altered from any source distribution.
11329

    
11330
function ZStream() {
11331
  /* next input byte */
11332
  this.input = null; // JS specific, because we have no pointers
11333
  this.next_in = 0;
11334
  /* number of bytes available at input */
11335
  this.avail_in = 0;
11336
  /* total number of input bytes read so far */
11337
  this.total_in = 0;
11338
  /* next output byte should be put there */
11339
  this.output = null; // JS specific, because we have no pointers
11340
  this.next_out = 0;
11341
  /* remaining free space at output */
11342
  this.avail_out = 0;
11343
  /* total number of bytes output so far */
11344
  this.total_out = 0;
11345
  /* last error message, NULL if no error */
11346
  this.msg = ''/*Z_NULL*/;
11347
  /* not visible by applications */
11348
  this.state = null;
11349
  /* best guess about the data type: binary or text */
11350
  this.data_type = 2/*Z_UNKNOWN*/;
11351
  /* adler32 value of the uncompressed data */
11352
  this.adler = 0;
11353
}
11354

    
11355
module.exports = ZStream;
11356

    
11357
},{}],54:[function(require,module,exports){
11358
'use strict';
11359
module.exports = typeof setImmediate === 'function' ? setImmediate :
11360
        function setImmediate() {
11361
                var args = [].slice.apply(arguments);
11362
                args.splice(1, 0, 0);
11363
                setTimeout.apply(null, args);
11364
        };
11365

    
11366
},{}]},{},[10])(10)
11367
});