comparison geotemco/platin.js @ 8:8f05c2a84bba

Apply new platin and Add tree layers
author nylin@mpiwg-berlin.mpg.de
date Wed, 07 Oct 2015 11:09:20 +0200
parents 0330b2138c87
children 8f5635197895
comparison
equal deleted inserted replaced
7:0330b2138c87 8:8f05c2a84bba
18301 done(); 18301 done();
18302 }); 18302 });
18303 }; 18303 };
18304 18304
18305 })(jQuery); 18305 })(jQuery);
18306 /** 18306 /*!
18307 18307
18308 JSZip - A Javascript class for generating and reading zip files 18308 JSZip - A Javascript class for generating and reading zip files
18309 <http://stuartk.com/jszip> 18309 <http://stuartk.com/jszip>
18310 18310
18311 (c) 2009-2012 Stuart Knightley <stuart [at] stuartk.com> 18311 (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
18312 Dual licenced under the MIT license or GPLv3. See LICENSE.markdown. 18312 Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
18313 18313
18314 Usage: 18314 JSZip uses the library pako released under the MIT license :
18315 zip = new JSZip(); 18315 https://github.com/nodeca/pako/blob/master/LICENSE
18316 zip.file("hello.txt", "Hello, World!").add("tempfile", "nothing"); 18316 */
18317 zip.folder("images").file("smile.gif", base64Data, {base64: true}); 18317 !function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";c.encode=function(a){for(var b,c,e,f,g,h,i,j="",k=0;k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),e=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=d.indexOf(a.charAt(k++)),g=d.indexOf(a.charAt(k++)),h=d.indexOf(a.charAt(k++)),i=d.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<a||0>a)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;g<e.length;g++)h=e[g],this.file(h.fileName,h.decompressed,{binary:!0,optimizedBinaryString:!0,date:h.date,dir:h.dir,comment:h.fileComment.length?h.fileComment:null,createFolders:b.createFolders});return f.zipComment.length&&(this.comment=f.zipComment),this}},{"./base64":1,"./zipEntries":22}],11:[function(a,b){(function(a){"use strict";b.exports=function(b,c){return new a(b,c)},b.exports.test=function(b){return a.isBuffer(b)}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],12:[function(a,b){"use strict";function c(a){this.data=a,this.length=this.data.length,this.index=0}var d=a("./uint8ArrayReader");c.prototype=new d,c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./uint8ArrayReader":18}],13:[function(a,b){"use strict";var c=a("./support"),d=a("./utils"),e=a("./crc32"),f=a("./signature"),g=a("./defaults"),h=a("./base64"),i=a("./compressions"),j=a("./compressedObject"),k=a("./nodeBuffer"),l=a("./utf8"),m=a("./stringWriter"),n=a("./uint8ArrayWriter"),o=function(a){if(a._data instanceof j&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,"uint8array"===d.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length),0!==b.length&&a._data.set(b,0)}return a._data},p=function(a){var b=o(a),e=d.getTypeOf(b);return"string"===e?!a.options.binary&&c.nodebuffer?k(b,"utf-8"):a.asBinary():b},q=function(a){var b=o(this);return null===b||"undefined"==typeof b?"":(this.options.base64&&(b=h.decode(b)),b=a&&this.options.binary?A.utf8decode(b):d.transformTo("string",b),a||this.options.binary||(b=d.transformTo("string",A.utf8encode(b))),b)},r=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this._data=b,this.options=c,this._initialMetadata={dir:c.dir,date:c.date}};r.prototype={asText:function(){return q.call(this,!0)},asBinary:function(){return q.call(this,!1)},asNodeBuffer:function(){var a=p(this);return d.transformTo("nodebuffer",a)},asUint8Array:function(){var a=p(this);return d.transformTo("uint8array",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var s=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&"undefined"==typeof c[b]&&(c[b]=arguments[a][b]);return c},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=t(a,g),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var e,f=d.getTypeOf(b);if(c=u(c),c.createFolders&&(e=w(a))&&x.call(this,e,!0),c.dir||null===b||"undefined"==typeof b)c.base64=!1,c.binary=!1,b=null;else if("string"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=d.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof j))throw new Error("The data of '"+a+"' is in an unsupported format !");"arraybuffer"===f&&(b=d.transformTo("uint8array",b))}var g=new r(a,b,c);return this.files[a]=g,g},w=function(a){"/"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf("/");return b>0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";w+="\n\x00",w+=p||q?"\x00\b":"\x00\x00",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2);var x=f.LOCAL_FILE_HEADER+w+m+t,y=f.CENTRAL_FILE_HEADER+"\x00"+w+s(o.length,2)+"\x00\x00\x00\x00"+(j===!0?"\x00\x00\x00":"\x00\x00\x00\x00")+s(g,4)+m+t+o;return{fileRecord:x,dirRecord:y,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d<c.length;d++)delete this.files[c[d].name];return this},generate:function(a){a=t(a||{},{base64:!0,compression:"STORE",type:"base64",comment:null}),d.checkSupport(a.type);var b,c,e=[],g=0,j=0,k=d.transformTo("string",this.utf8encode(a.comment||this.comment||""));for(var l in this.files)if(this.files.hasOwnProperty(l)){var o=this.files[l],p=o.options.compression||a.compression.toUpperCase(),q=i[p];if(!q)throw new Error(p+" is not a valid compression method !");var r=y.call(this,o,q),u=z.call(this,l,o,r,g);g+=u.fileRecord.length+r.compressedSize,j+=u.dirRecord.length,e.push(u)}var v="";v=f.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+s(e.length,2)+s(e.length,2)+s(j,4)+s(g,4)+s(k.length,2)+k;var w=a.type.toLowerCase();for(b="uint8array"===w||"arraybuffer"===w||"blob"===w||"nodebuffer"===w?new n(g+j+v.length):new m(g+j+v.length),c=0;c<e.length;c++)b.append(e[c].fileRecord),b.append(e[c].compressedObject.compressedContent);for(c=0;c<e.length;c++)b.append(e[c].dirRecord);b.append(v);var x=b.finalize();switch(a.type.toLowerCase()){case"uint8array":case"arraybuffer":case"nodebuffer":return d.transformTo(a.type.toLowerCase(),x);case"blob":return d.arrayBuffer2Blob(d.transformTo("arraybuffer",x));case"base64":return a.base64?h.encode(x):x;default:return x}},crc32:function(a,b){return e(a,b)},utf8encode:function(a){return d.transformTo("string",l.utf8encode(a))},utf8decode:function(a){return l.utf8decode(a)}};b.exports=A},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],15:[function(a,b){"use strict";function c(a,b){this.data=a,b||(this.data=e.string2binary(this.data)),this.length=this.data.length,this.index=0}var d=a("./dataReader"),e=a("./utils");c.prototype=new d,c.prototype.byteAt=function(a){return this.data.charCodeAt(a)},c.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)},c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5,"./utils":21}],16:[function(a,b){"use strict";var c=a("./utils"),d=function(){this.data=[]};d.prototype={append:function(a){a=c.transformTo("string",a),this.data.push(a)},finalize:function(){return this.data.join("")}},b.exports=d},{"./utils":21}],17:[function(a,b,c){(function(a){"use strict";if(c.base64=!0,c.array=!0,c.string=!0,c.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,c.nodebuffer="undefined"!=typeof a,c.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)c.blob=!1;else{var b=new ArrayBuffer(0);try{c.blob=0===new Blob([b],{type:"application/zip"}).size}catch(d){try{var e=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,f=new e;f.append(b),c.blob=0===f.getBlob("application/zip").size}catch(d){c.blob=!1}}}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],18:[function(a,b){"use strict";function c(a){a&&(this.data=a,this.length=this.data.length,this.index=0)}var d=a("./dataReader");c.prototype=new d,c.prototype.byteAt=function(a){return this.data[a]},c.prototype.lastIndexOfSignature=function(a){for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.length-4;f>=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function f(a){var b=65536,d=[],e=a.length,f=c.getTypeOf(a),g=0,h=!0;try{switch(f){case"uint8array":String.fromCharCode.apply(null,new Uint8Array(0));break;case"nodebuffer":String.fromCharCode.apply(null,j(0))}}catch(i){h=!1}if(!h){for(var k="",l=0;l<a.length;l++)k+=String.fromCharCode(a[l]);return k}for(;e>g&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var h=a("./support"),i=a("./compressions"),j=a("./nodeBuffer");c.string2binary=function(a){for(var b="",c=0;c<a.length;c++)b+=String.fromCharCode(255&a.charCodeAt(c));return b},c.arrayBuffer2Blob=function(a){c.checkSupport("blob");try{return new Blob([a],{type:"application/zip"})}catch(b){try{var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,e=new d;return e.append(a),e.getBlob("application/zip")}catch(b){throw new Error("Bug : can't construct the Blob.")}}},c.applyFromCharCode=f;var k={};k.string={string:d,array:function(a){return e(a,new Array(a.length))},arraybuffer:function(a){return k.string.uint8array(a).buffer},uint8array:function(a){return e(a,new Uint8Array(a.length))},nodebuffer:function(a){return e(a,j(a.length))}},k.array={string:f,array:d,arraybuffer:function(a){return new Uint8Array(a).buffer},uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(a)}},k.arraybuffer={string:function(a){return f(new Uint8Array(a))},array:function(a){return g(new Uint8Array(a),new Array(a.byteLength))},arraybuffer:d,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(new Uint8Array(a))}},k.uint8array={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:d,nodebuffer:function(a){return j(a)}},k.nodebuffer={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return k.nodebuffer.uint8array(a).buffer},uint8array:function(a){return g(a,new Uint8Array(a.length))},nodebuffer:d},c.transformTo=function(a,b){if(b||(b=""),!a)return b;c.checkSupport(a);var d=c.getTypeOf(b),e=k[d][a](b);return e},c.getTypeOf=function(a){return"string"==typeof a?"string":"[object Array]"===Object.prototype.toString.call(a)?"array":h.nodebuffer&&j.test(a)?"nodebuffer":h.uint8array&&a instanceof Uint8Array?"uint8array":h.arraybuffer&&a instanceof ArrayBuffer?"arraybuffer":void 0},c.checkSupport=function(a){var b=h[a.toLowerCase()];if(!b)throw new Error(a+" is not supported by this browser")},c.MAX_VALUE_16BITS=65535,c.MAX_VALUE_32BITS=-1,c.pretty=function(a){var b,c,d="";for(c=0;c<(a||"").length;c++)b=a.charCodeAt(c),d+="\\x"+(16>b?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(h.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===h.CENTRAL_FILE_HEADER;)a=new i({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(h.CENTRAL_DIRECTORY_END);if(-1===a)throw new Error("Corrupted zip : can't find end of central directory");if(this.reader.setIndex(a),this.checkSignature(h.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===g.MAX_VALUE_16BITS||this.diskWithCentralDirStart===g.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===g.MAX_VALUE_16BITS||this.centralDirRecords===g.MAX_VALUE_16BITS||this.centralDirSize===g.MAX_VALUE_32BITS||this.centralDirOffset===g.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),-1===a)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");this.reader.setIndex(a),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}},prepareReader:function(a){var b=g.getTypeOf(a);this.reader="string"!==b||j.uint8array?"nodebuffer"===b?new e(a):new f(g.transformTo("uint8array",a)):new d(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=c},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(a,b){"use strict";function c(a,b){this.options=a,this.loadOptions=b}var d=a("./stringReader"),e=a("./utils"),f=a("./compressedObject"),g=a("./object");c.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,f){return function(){var a=e.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==f)throw new Error("Bug : uncompressed data size mismatch");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readString(this.fileNameLength),a.skip(c),-1==this.compressedSize||-1==this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");if(b=e.findCompression(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+e.pretty(this.compressionMethod)+" unknown (inner file : "+this.fileName+")");if(this.decompressed=new f,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=e.transformTo("string",this.decompressed.getContent()),g.crc32(this.decompressed)!==this.crc32))throw new Error("Corrupted zip : CRC32 mismatch")},readCentralPart:function(a){if(this.versionMadeBy=a.readString(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");this.fileName=a.readString(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readString(this.fileCommentLength),this.dir=16&this.externalFileAttributes?!0:!1},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new d(this.extraFields[1].value);this.uncompressedSize===e.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===e.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===e.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===e.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index<e+this.extraFieldsLength;)b=a.readInt(2),c=a.readInt(2),d=a.readString(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){if(this.useUTF8())this.fileName=g.utf8decode(this.fileName),this.fileComment=g.utf8decode(this.fileComment);else{var a=this.findExtraFieldUnicodePath();null!==a&&(this.fileName=a);var b=this.findExtraFieldUnicodeComment();null!==b&&(this.fileComment=b)}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileName)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}},b.exports=c},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(a,b){"use strict";var c=a("./lib/utils/common").assign,d=a("./lib/deflate"),e=a("./lib/inflate"),f=a("./lib/zlib/constants"),g={};c(g,d,e,f),b.exports=g},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(a,b,c){"use strict";function d(a,b){var c=new s(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}function f(a,b){return b=b||{},b.gzip=!0,d(a,b)}var g=a("./zlib/deflate.js"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=0,m=4,n=0,o=1,p=-1,q=0,r=8,s=function(a){this.options=h.assign({level:p,method:r,chunkSize:16384,windowBits:15,memLevel:8,strategy:q,to:""},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header)
18318 zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")}); 18318 };s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+hb-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<hb)););}while(a.lookahead<jb&&0!==a.strm.avail_in)}function n(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c)),a.match_length>=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function p(a,b){for(var c,d,e;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=hb-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c),a.match_length<=5&&(a.strategy===S||a.match_length===hb&&a.strstart-a.match_start>4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=hb-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return sb}else if(a.match_available){if(d=D._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return sb}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=D._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ib){if(m(a),a.lookahead<=ib&&b===H)return sb;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<<i.w_bits,i.w_mask=i.w_size-1,i.hash_bits=f+7,i.hash_size=1<<i.hash_bits,i.hash_mask=i.hash_size-1,i.hash_shift=~~((i.hash_bits+hb-1)/hb),i.window=new C.Buf8(2*i.w_size),i.head=new C.Buf16(i.hash_size),i.prev=new C.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new C.Buf8(i.pending_buf_size),i.d_buf=i.lit_bufsize>>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.name.length?255&h.gzhead.name.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.comment.length?255&h.gzhead.comment.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<<e.lenbits)-1,u=(1<<e.distbits)-1;a:do{15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=r[p&t];b:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<<w)-1)];continue b}if(32&w){e.mode=d;break a}a.msg="invalid literal/length code",e.mode=c;break a}x=65535&v,w&=15,w&&(w>q&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=s[p&u];c:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<<w)-1)];continue c}a.msg="invalid distance code",e.mode=c;break a}if(y=65535&v,w&=15,w>q&&(p+=B[f++]<<q,q+=8,w>q&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=g>f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<<f.wbits,f.wnext=0,f.whave=0,f.window=new r.Buf8(f.wsize)),d>=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave<f.wsize&&(f.whave+=e))),0}function m(a,b){var c,e,f,g,h,i,j,m,n,o,p,q,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab=0,Bb=new r.Buf8(4),Cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return F;c=a.state,c.mode===V&&(c.mode=W),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,o=i,p=j,xb=C;a:for(;;)switch(c.mode){case K:if(0===c.wrap){c.mode=W;break}for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<<wb,a.adler=c.check=1,c.mode=512&m?T:V,m=0,n=0;break;case L:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==J){a.msg="unknown compression method",c.mode=lb;break}if(57344&c.flags){a.msg="unknown header flags set",c.mode=lb;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length=m,c.head&&(c.head.extra_len=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg="header crc mismatch",c.mode=lb;break}m=0,n=0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=U;case U:if(0===c.havedict)return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,E;a.adler=c.check=1,c.mode=V;case V:if(b===A||b===B)break a;case W:if(c.last){m>>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}switch(c.last=1&m,m>>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if((65535&m)!==(m>>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.nlen=(31&m)+257,m>>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.have<c.ncode;){for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Cb[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have<c.nlen+c.ndist;){for(;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(16>sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(rb&&0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.lencode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<<c.distbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.distcode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.offset+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a;
18319 zip.remove("tempfile"); 18319 if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<<n,n+=8}if(p-=j,a.total_out+=p,c.total+=p,p&&(a.adler=c.check=c.flags?t(c.check,f,p,h-p):s(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg="incorrect data check",c.mode=lb;break}m=0,n=0}c.mode=jb;case jb:if(c.wrap&&c.flags){for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg="incorrect length check",c.mode=lb;break}m=0,n=0}c.mode=kb;case kb:xb=D;break a;case lb:xb=G;break a;case mb:return H;case nb:default:return F}return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,(c.wsize||p!==a.avail_out&&c.mode<lb&&(c.mode<ib||b!==z))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=mb,H):(o-=a.avail_in,p-=a.avail_out,a.total_in+=o,a.total_out+=p,c.total+=p,c.wrap&&p&&(a.adler=c.check=c.flags?t(c.check,f,p,a.next_out-p):s(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===V?128:0)+(c.mode===bb||c.mode===Y?256:0),(0===o&&0===p||b===z)&&xb===C&&(xb=I),xb)}function n(a){if(!a||!a.state)return F;var b=a.state;return b.window&&(b.window=null),a.state=null,C}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?F:(c.head=b,b.done=!1,C)):F}var p,q,r=a("../utils/common"),s=a("./adler32"),t=a("./crc32"),u=a("./inffast"),v=a("./inftrees"),w=0,x=1,y=2,z=4,A=5,B=6,C=0,D=1,E=2,F=-2,G=-3,H=-4,I=-5,J=8,K=1,L=2,M=3,N=4,O=5,P=6,Q=7,R=8,S=9,T=10,U=11,V=12,W=13,X=14,Y=15,Z=16,$=17,_=18,ab=19,bb=20,cb=21,db=22,eb=23,fb=24,gb=25,hb=26,ib=27,jb=28,kb=29,lb=30,mb=31,nb=32,ob=852,pb=592,qb=15,rb=qb,sb=!0;c.inflateReset=g,c.inflateReset2=h,c.inflateResetKeep=f,c.inflateInit=j,c.inflateInit2=i,c.inflate=m,c.inflateEnd=n,c.inflateGetHeader=o,c.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(a,b){"use strict";var c=a("../utils/common"),d=15,e=852,f=592,g=0,h=1,i=2,j=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],k=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],l=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],m=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(a,b,n,o,p,q,r,s){var t,u,v,w,x,y,z,A,B,C=s.bits,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=null,O=0,P=new c.Buf16(d+1),Q=new c.Buf16(d+1),R=null,S=0;for(D=0;d>=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===h&&L>e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]<y?(A=0,B=r[E]):r[E]>y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<<D-J,u=1<<I,F=u;do u-=t,p[x+(M>>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<<D-1;M&t;)t>>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;G>I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<<I,a===h&&L>e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<<a.bi_valid&65535,f(a,a.bi_buf),a.bi_buf=b>>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function h(a,b,c){g(a,c[2*b],c[2*b+1])}function i(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<<ab[d];a++)gb[e++]=d;for(e>>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<<ab[d]-7;a++)gb[256+e++]=d;for(b=0;U>=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]<a[f]||a[e]===a[f]&&d[b]<=d[c]}function r(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&q(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!q(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function s(a,b,c){var d,f,i,j,k=0;if(0!==a.last_lit)do d=a.pending_buf[a.d_buf+2*k]<<8|a.pending_buf[a.d_buf+2*k+1],f=a.pending_buf[a.l_buf+k],k++,0===d?h(a,f,b):(i=hb[f],h(a,i+P+1,b),j=_[i],0!==j&&(f-=ib[i],g(a,f,j)),d--,i=e(d),h(a,i,c),j=ab[i],0!==j&&(d-=jb[i],g(a,d,j)));while(k<a.last_lit);h(a,X,b)}function t(a,b){var c,d,e,f=b.dyn_tree,g=b.stat_desc.static_tree,h=b.stat_desc.has_stree,i=b.stat_desc.elems,j=-1;for(a.heap_len=0,a.heap_max=T,c=0;i>c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(j>h?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++j<k&&e===i)){if(l>j){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[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],ab=[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],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)});
18320 18320 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
18321 base64zip = zip.generate(); 18321 if (!Object.keys) {
18322 18322 Object.keys = (function () {
18323 **/ 18323 var hasOwnProperty = Object.prototype.hasOwnProperty,
18324 18324 hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
18325 /** 18325 dontEnums = [
18326 * Representation a of zip file in js 18326 'toString',
18327 * @constructor 18327 'toLocaleString',
18328 * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional). 18328 'valueOf',
18329 * @param {Object=} options the options for creating this objects (optional). 18329 'hasOwnProperty',
18330 */ 18330 'isPrototypeOf',
18331 var JSZip = function(data, options) { 18331 'propertyIsEnumerable',
18332 // object containing the files : 18332 'constructor'
18333 // { 18333 ],
18334 // "folder/" : {...}, 18334 dontEnumsLength = dontEnums.length;
18335 // "folder/data.txt" : {...} 18335
18336 // } 18336 return function (obj) {
18337 this.files = {}; 18337 if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
18338 18338
18339 // Where we are in the hierarchy 18339 var result = [];
18340 this.root = ""; 18340
18341 18341 for (var prop in obj) {
18342 if (data) { 18342 if (hasOwnProperty.call(obj, prop)) result.push(prop);
18343 this.load(data, options);
18344 }
18345 };
18346
18347 JSZip.signature = {
18348 LOCAL_FILE_HEADER : "\x50\x4b\x03\x04",
18349 CENTRAL_FILE_HEADER : "\x50\x4b\x01\x02",
18350 CENTRAL_DIRECTORY_END : "\x50\x4b\x05\x06",
18351 ZIP64_CENTRAL_DIRECTORY_LOCATOR : "\x50\x4b\x06\x07",
18352 ZIP64_CENTRAL_DIRECTORY_END : "\x50\x4b\x06\x06",
18353 DATA_DESCRIPTOR : "\x50\x4b\x07\x08"
18354 };
18355
18356 // Default properties for a new file
18357 JSZip.defaults = {
18358 base64: false,
18359 binary: false,
18360 dir: false,
18361 date: null
18362 };
18363
18364
18365 JSZip.prototype = (function () {
18366 /**
18367 * A simple object representing a file in the zip file.
18368 * @constructor
18369 * @param {string} name the name of the file
18370 * @param {string} data the data
18371 * @param {Object} options the options of the file
18372 */
18373 var ZipObject = function (name, data, options) {
18374 this.name = name;
18375 this.data = data;
18376 this.options = options;
18377 };
18378
18379 ZipObject.prototype = {
18380 /**
18381 * Return the content as UTF8 string.
18382 * @return {string} the UTF8 string.
18383 */
18384 asText : function () {
18385 var result = this.data;
18386 if (result === null || typeof result === "undefined") {
18387 return "";
18388 }
18389 if (this.options.base64) {
18390 result = JSZipBase64.decode(result);
18391 }
18392 if (this.options.binary) {
18393 result = JSZip.prototype.utf8decode(result);
18394 }
18395 return result;
18396 },
18397 /**
18398 * Returns the binary content.
18399 * @return {string} the content as binary.
18400 */
18401 asBinary : function () {
18402 var result = this.data;
18403 if (result === null || typeof result === "undefined") {
18404 return "";
18405 }
18406 if (this.options.base64) {
18407 result = JSZipBase64.decode(result);
18408 }
18409 if (!this.options.binary) {
18410 result = JSZip.prototype.utf8encode(result);
18411 }
18412 return result;
18413 },
18414 /**
18415 * Returns the content as an Uint8Array.
18416 * @return {Uint8Array} the content as an Uint8Array.
18417 */
18418 asUint8Array : function () {
18419 return JSZip.utils.string2Uint8Array(this.asBinary());
18420 },
18421 /**
18422 * Returns the content as an ArrayBuffer.
18423 * @return {ArrayBuffer} the content as an ArrayBufer.
18424 */
18425 asArrayBuffer : function () {
18426 return JSZip.utils.string2Uint8Array(this.asBinary()).buffer;
18427 } 18343 }
18428 }; 18344
18429 18345 if (hasDontEnumBug) {
18430 /** 18346 for (var i=0; i < dontEnumsLength; i++) {
18431 * Transform an integer into a string in hexadecimal. 18347 if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
18432 * @private 18348 }
18433 * @param {number} dec the number to convert.
18434 * @param {number} bytes the number of bytes to generate.
18435 * @returns {string} the result.
18436 */
18437 var decToHex = function(dec, bytes) {
18438 var hex = "", i;
18439 for(i = 0; i < bytes; i++) {
18440 hex += String.fromCharCode(dec&0xff);
18441 dec=dec>>>8;
18442 }
18443 return hex;
18444 };
18445
18446 /**
18447 * Merge the objects passed as parameters into a new one.
18448 * @private
18449 * @param {...Object} var_args All objects to merge.
18450 * @return {Object} a new object with the data of the others.
18451 */
18452 var extend = function () {
18453 var result = {}, i, attr;
18454 for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
18455 for (attr in arguments[i]) {
18456 if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
18457 result[attr] = arguments[i][attr];
18458 }
18459 }
18460 } 18349 }
18461 return result; 18350 return result;
18462 }; 18351 };
18463 18352 })();
18464 /** 18353 }
18465 * Transforms the (incomplete) options from the user into the complete 18354
18466 * set of options to create a file. 18355 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
18467 * @private 18356 if (!Array.prototype.filter)
18468 * @param {Object} o the options from the user. 18357 {
18469 * @return {Object} the complete set of options. 18358 Array.prototype.filter = function(fun /*, thisp */)
18470 */ 18359 {
18471 var prepareFileAttrs = function (o) { 18360 "use strict";
18472 o = o || {}; 18361
18473 if (o.base64 === true && o.binary == null) { 18362 if (this == null)
18474 o.binary = true; 18363 throw new TypeError();
18364
18365 var t = Object(this);
18366 var len = t.length >>> 0;
18367 if (typeof fun != "function")
18368 throw new TypeError();
18369
18370 var res = [];
18371 var thisp = arguments[1];
18372 for (var i = 0; i < len; i++)
18373 {
18374 if (i in t)
18375 {
18376 var val = t[i]; // in case fun mutates this
18377 if (fun.call(thisp, val, i, t))
18378 res.push(val);
18475 } 18379 }
18476 o = extend(o, JSZip.defaults); 18380 }
18477 o.date = o.date || new Date(); 18381
18478 18382 return res;
18479 return o; 18383 };
18480 }; 18384 }
18481 18385
18482 /** 18386 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
18483 * Add a file in the current folder. 18387 if (!String.prototype.trim) {
18484 * @private 18388 String.prototype.trim = function () {
18485 * @param {string} name the name of the file 18389 return this.replace(/^\s+|\s+$/g, '');
18486 * @param {String|ArrayBuffer|Uint8Array} data the data of the file 18390 };
18487 * @param {Object} o the options of the file 18391 }
18488 * @return {Object} the new file. 18392
18489 */ 18393 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
18490 var fileAdd = function (name, data, o) { 18394 if (!Array.prototype.forEach)
18491 // be sure sub folders exist 18395 {
18492 var parent = parentFolder(name); 18396 Array.prototype.forEach = function(fun /*, thisArg */)
18493 if (parent) { 18397 {
18494 folderAdd.call(this, parent); 18398 "use strict";
18399
18400 if (this === void 0 || this === null)
18401 throw new TypeError();
18402
18403 var t = Object(this);
18404 var len = t.length >>> 0;
18405 if (typeof fun !== "function")
18406 throw new TypeError();
18407
18408 var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
18409 for (var i = 0; i < len; i++)
18410 {
18411 if (i in t)
18412 fun.call(thisArg, t[i], i, t);
18413 }
18414 };
18415 }
18416
18417 // Production steps of ECMA-262, Edition 5, 15.4.4.19
18418 // Reference: http://es5.github.com/#x15.4.4.19
18419 if (!Array.prototype.map) {
18420 Array.prototype.map = function(callback, thisArg) {
18421
18422 var T, A, k;
18423
18424 if (this == null) {
18425 throw new TypeError(" this is null or not defined");
18426 }
18427
18428 // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
18429 var O = Object(this);
18430
18431 // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
18432 // 3. Let len be ToUint32(lenValue).
18433 var len = O.length >>> 0;
18434
18435 // 4. If IsCallable(callback) is false, throw a TypeError exception.
18436 // See: http://es5.github.com/#x9.11
18437 if (typeof callback !== "function") {
18438 throw new TypeError(callback + " is not a function");
18439 }
18440
18441 // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
18442 if (thisArg) {
18443 T = thisArg;
18444 }
18445
18446 // 6. Let A be a new array created as if by the expression new Array(len) where Array is
18447 // the standard built-in constructor with that name and len is the value of len.
18448 A = new Array(len);
18449
18450 // 7. Let k be 0
18451 k = 0;
18452
18453 // 8. Repeat, while k < len
18454 while(k < len) {
18455
18456 var kValue, mappedValue;
18457
18458 // a. Let Pk be ToString(k).
18459 // This is implicit for LHS operands of the in operator
18460 // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
18461 // This step can be combined with c
18462 // c. If kPresent is true, then
18463 if (k in O) {
18464
18465 // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
18466 kValue = O[ k ];
18467
18468 // ii. Let mappedValue be the result of calling the Call internal method of callback
18469 // with T as the this value and argument list containing kValue, k, and O.
18470 mappedValue = callback.call(T, kValue, k, O);
18471
18472 // iii. Call the DefineOwnProperty internal method of A with arguments
18473 // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
18474 // and false.
18475
18476 // In browsers that support Object.defineProperty, use the following:
18477 // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });
18478
18479 // For best browser support, use the following:
18480 A[ k ] = mappedValue;
18495 } 18481 }
18496 18482 // d. Increase k by 1.
18497 o = prepareFileAttrs(o); 18483 k++;
18498 18484 }
18499 if (o.dir || data === null || typeof data === "undefined") { 18485
18500 o.base64 = false; 18486 // 9. return A
18501 o.binary = false; 18487 return A;
18502 data = null; 18488 };
18503 } else if (JSZip.support.uint8array && data instanceof Uint8Array) { 18489 }
18504 o.base64 = false; 18490
18505 o.binary = true; 18491 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
18506 data = JSZip.utils.uint8Array2String(data); 18492 if (!Array.prototype.indexOf) {
18507 } else if (JSZip.support.arraybuffer && data instanceof ArrayBuffer) { 18493 Array.prototype.indexOf = function (searchElement, fromIndex) {
18508 o.base64 = false; 18494 if ( this === undefined || this === null ) {
18509 o.binary = true; 18495 throw new TypeError( '"this" is null or not defined' );
18510 var bufferView = new Uint8Array(data); 18496 }
18511 data = JSZip.utils.uint8Array2String(bufferView); 18497
18512 } else if (o.binary && !o.base64) { 18498 var length = this.length >>> 0; // Hack to convert object.length to a UInt32
18513 // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask 18499
18514 if (o.optimizedBinaryString !== true) { 18500 fromIndex = +fromIndex || 0;
18515 // this is a string, not in a base64 format. 18501
18516 // Be sure that this is a correct "binary string" 18502 if (Math.abs(fromIndex) === Infinity) {
18517 data = JSZip.utils.string2binary(data); 18503 fromIndex = 0;
18518 } 18504 }
18519 // we remove this option since it's only relevant here 18505
18520 delete o.optimizedBinaryString; 18506 if (fromIndex < 0) {
18507 fromIndex += length;
18508 if (fromIndex < 0) {
18509 fromIndex = 0;
18521 } 18510 }
18522 18511 }
18523 return this.files[name] = new ZipObject(name, data, o); 18512
18524 }; 18513 for (;fromIndex < length; fromIndex++) {
18525 18514 if (this[fromIndex] === searchElement) {
18526 18515 return fromIndex;
18527 /**
18528 * Find the parent folder of the path.
18529 * @private
18530 * @param {string} path the path to use
18531 * @return {string} the parent folder, or ""
18532 */
18533 var parentFolder = function (path) {
18534 if (path.slice(-1) == '/') {
18535 path = path.substring(0, path.length - 1);
18536 } 18516 }
18537 var lastSlash = path.lastIndexOf('/'); 18517 }
18538 return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; 18518
18539 }; 18519 return -1;
18540 18520 };
18541 /** 18521 }
18542 * Add a (sub) folder in the current folder. 18522 // Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
18543 * @private 18523
18544 * @param {string} name the folder's name 18524 if (! Array.isArray) {
18545 * @return {Object} the new folder. 18525 Array.isArray = function(obj) {
18546 */ 18526 return Object.prototype.toString.call(obj) === "[object Array]";
18547 var folderAdd = function (name) { 18527 };
18548 // Check the name ends with a / 18528 }
18549 if (name.slice(-1) != "/") { 18529
18550 name += "/"; // IE doesn't like substr(-1) 18530 // https://github.com/ttaubert/node-arraybuffer-slice
18551 } 18531 // (c) 2013 Tim Taubert <tim@timtaubert.de>
18552 18532 // arraybuffer-slice may be freely distributed under the MIT license.
18553 // Does this folder already exist? 18533
18554 if (!this.files[name]) { 18534 "use strict";
18555 // be sure sub folders exist 18535
18556 var parent = parentFolder(name); 18536 if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
18557 if (parent) { 18537 ArrayBuffer.prototype.slice = function (begin, end) {
18558 folderAdd.call(this, parent); 18538 begin = (begin|0) || 0;
18559 } 18539 var num = this.byteLength;
18560 18540 end = end === (void 0) ? num : (end|0);
18561 fileAdd.call(this, name, null, {dir:true}); 18541
18562 } 18542 // Handle negative values.
18563 return this.files[name]; 18543 if (begin < 0) begin += num;
18564 }; 18544 if (end < 0) end += num;
18565 18545
18566 /** 18546 if (num === 0 || begin >= num || begin >= end) {
18567 * Generate the data found in the local header of a zip file. 18547 return new ArrayBuffer(0);
18568 * Do not create it now, as some parts are re-used later. 18548 }
18569 * @private 18549
18570 * @param {Object} file the file to use. 18550 var length = Math.min(num - begin, end - begin);
18571 * @param {string} utfEncodedFileName the file name, utf8 encoded. 18551 var target = new ArrayBuffer(length);
18572 * @param {string} compressionType the compression to use. 18552 var targetArray = new Uint8Array(target);
18573 * @return {Object} an object containing header and compressedData. 18553 targetArray.set(new Uint8Array(this, begin, length));
18574 */ 18554 return target;
18575 var prepareLocalHeaderData = function(file, utfEncodedFileName, compressionType) { 18555 };
18576 var useUTF8 = utfEncodedFileName !== file.name, 18556 }
18577 data = file.asBinary(), 18557 /* xls.js (C) 2013-2014 SheetJS -- http://sheetjs.com */
18578 o = file.options, 18558 var XLS={};(function make_xls(XLS){XLS.version="0.7.1";var current_codepage=1252,current_cptable;if(typeof module!=="undefined"&&typeof require!=="undefined"){if(typeof cptable==="undefined")cptable=require("./dist/cpexcel");current_cptable=cptable[current_codepage]}function reset_cp(){set_cp(1252)}function set_cp(cp){current_codepage=cp;if(typeof cptable!=="undefined")current_cptable=cptable[cp]}var _getchar=function _gc1(x){return String.fromCharCode(x)};if(typeof cptable!=="undefined")_getchar=function _gc2(x){if(current_codepage===1200)return String.fromCharCode(x);return cptable.utils.decode(current_codepage,[x&255,x>>8])[0]};var has_buf=typeof Buffer!=="undefined";function new_buf(len){return new(has_buf?Buffer:Array)(len)}var Base64=function make_b64(){var map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return{decode:function b64_decode(input,utf8){var o="";var c1,c2,c3;var e1,e2,e3,e4;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");for(var i=0;i<input.length;){e1=map.indexOf(input.charAt(i++));e2=map.indexOf(input.charAt(i++));e3=map.indexOf(input.charAt(i++));e4=map.indexOf(input.charAt(i++));c1=e1<<2|e2>>4;c2=(e2&15)<<4|e3>>2;c3=(e3&3)<<6|e4;o+=String.fromCharCode(c1);if(e3!=64){o+=String.fromCharCode(c2)}if(e4!=64){o+=String.fromCharCode(c3)}}return o}}}();function s2a(s){if(has_buf)return new Buffer(s,"binary");var w=s.split("").map(function(x){return x.charCodeAt(0)&255});return w}function readIEEE754(buf,idx,isLE,nl,ml){if(isLE===undefined)isLE=true;if(!nl)nl=8;if(!ml&&nl===8)ml=52;var e,m,el=nl*8-ml-1,eMax=(1<<el)-1,eBias=eMax>>1;var bits=-7,d=isLE?-1:1,i=isLE?nl-1:0,s=buf[idx+i];i+=d;e=s&(1<<-bits)-1;s>>>=-bits;bits+=el;for(;bits>0;e=e*256+buf[idx+i],i+=d,bits-=8);m=e&(1<<-bits)-1;e>>>=-bits;bits+=ml;for(;bits>0;m=m*256+buf[idx+i],i+=d,bits-=8);if(e===eMax)return m?NaN:(s?-1:1)*Infinity;else if(e===0)e=1-eBias;else{m=m+Math.pow(2,ml);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-ml)}var chr0=/\u0000/g,chr1=/[\u0001-\u0006]/;var __toBuffer,___toBuffer;__toBuffer=___toBuffer=function toBuffer_(bufs){var x=[];for(var i=0;i<bufs[0].length;++i){x.push.apply(x,bufs[0][i])}return x};var __utf16le,___utf16le;__utf16le=___utf16le=function utf16le_(b,s,e){var ss=[];for(var i=s;i<e;i+=2)ss.push(String.fromCharCode(__readUInt16LE(b,i)));return ss.join("")};var __hexlify,___hexlify;__hexlify=___hexlify=function hexlify_(b,s,l){return b.slice(s,s+l).map(function(x){return(x<16?"0":"")+x.toString(16)}).join("")};var __utf8,___utf8;__utf8=___utf8=function(b,s,e){var ss=[];for(var i=s;i<e;i++)ss.push(String.fromCharCode(__readUInt8(b,i)));return ss.join("")};var __lpstr,___lpstr;__lpstr=___lpstr=function lpstr_(b,i){var len=__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __lpwstr,___lpwstr;__lpwstr=___lpwstr=function lpwstr_(b,i){var len=2*__readUInt32LE(b,i);return len>0?__utf8(b,i+4,i+4+len-1):""};var __double,___double;__double=___double=function(b,idx){return readIEEE754(b,idx)};var bconcat=function(bufs){return[].concat.apply([],bufs)};if(typeof Buffer!=="undefined"){__utf16le=function utf16le_b(b,s,e){if(!Buffer.isBuffer(b))return ___utf16le(b,s,e);return b.toString("utf16le",s,e)};__hexlify=function(b,s,l){return Buffer.isBuffer(b)?b.toString("hex",s,s+l):___hexlify(b,s,l)};__lpstr=function lpstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpstr(b,i);var len=b.readUInt32LE(i);return len>0?b.toString("utf8",i+4,i+4+len-1):""};__lpwstr=function lpwstr_b(b,i){if(!Buffer.isBuffer(b))return ___lpwstr(b,i);var len=2*b.readUInt32LE(i);return b.toString("utf16le",i+4,i+4+len-1)};__utf8=function utf8_b(s,e){return this.toString("utf8",s,e)};__toBuffer=function(bufs){return bufs[0].length>0&&Buffer.isBuffer(bufs[0][0])?Buffer.concat(bufs[0]):___toBuffer(bufs)};bconcat=function(bufs){return Buffer.isBuffer(bufs[0])?Buffer.concat(bufs):[].concat.apply([],bufs)};__double=function double_(b,i){if(Buffer.isBuffer(b))return b.readDoubleLE(i);return ___double(b,i)}}var __readUInt8=function(b,idx){return b[idx]};var __readUInt16LE=function(b,idx){return b[idx+1]*(1<<8)+b[idx]};var __readInt16LE=function(b,idx){var u=b[idx+1]*(1<<8)+b[idx];return u<32768?u:(65535-u+1)*-1};var __readUInt32LE=function(b,idx){return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]};var __readInt32LE=function(b,idx){return b[idx+3]<<24|b[idx+2]<<16|b[idx+1]<<8|b[idx]};var ___unhexlify=function(s){return s.match(/../g).map(function(x){return parseInt(x,16)})};var __unhexlify=typeof Buffer!=="undefined"?function(s){return Buffer.isBuffer(s)?new Buffer(s,"hex"):___unhexlify(s)}:___unhexlify;if(typeof cptable!=="undefined"){__utf16le=function(b,s,e){return cptable.utils.decode(1200,b.slice(s,e))};__utf8=function(b,s,e){return cptable.utils.decode(65001,b.slice(s,e))};__lpstr=function(b,i){var len=__readUInt32LE(b,i);return len>0?cptable.utils.decode(current_codepage,b.slice(i+4,i+4+len-1)):""};__lpwstr=function(b,i){var len=2*__readUInt32LE(b,i);return len>0?cptable.utils.decode(1200,b.slice(i+4,i+4+len-1)):""}}function ReadShift(size,t){var o,oI,oR,oo=[],w,vv,i,loc;switch(t){case"lpstr":o=__lpstr(this,this.l);size=5+o.length;break;case"lpwstr":o=__lpwstr(this,this.l);size=5+o.length;if(o[o.length-1]=="\x00")size+=2;break;case"cstr":size=0;o="";while((w=__readUInt8(this,this.l+size++))!==0)oo.push(_getchar(w));o=oo.join("");break;case"wstr":size=0;o="";while((w=__readUInt16LE(this,this.l+size))!==0){oo.push(_getchar(w));size+=2}size+=2;o=oo.join("");break;case"dbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt16LE(this,loc)));loc+=2}o=oo.join("");size*=2;break;case"sbcs":o="";loc=this.l;for(i=0;i!=size;++i){if(this.lens&&this.lens.indexOf(loc)!==-1){w=__readUInt8(this,loc);this.l=loc+1;vv=ReadShift.call(this,size-i,w?"dbcs":"sbcs");return oo.join("")+vv}oo.push(_getchar(__readUInt8(this,loc)));loc+=1}o=oo.join("");break;case"utf8":o=__utf8(this,this.l,this.l+size);break;case"utf16le":size*=2;o=__utf16le(this,this.l,this.l+size);break;default:switch(size){case 1:oI=__readUInt8(this,this.l);this.l++;return oI;case 2:oI=t!=="i"?__readUInt16LE(this,this.l):__readInt16LE(this,this.l);this.l+=2;return oI;case 4:if(t==="i"||(this[this.l+3]&128)===0){oI=__readInt32LE(this,this.l);this.l+=4;return oI}else{oR=__readUInt32LE(this,this.l);this.l+=4;return oR}break;case 8:if(t==="f"){oR=__double(this,this.l);this.l+=8;return oR}case 16:o=__hexlify(this,this.l,size);break}}this.l+=size;return o}function CheckField(hexstr,fld){var m=__hexlify(this,this.l,hexstr.length>>1);if(m!==hexstr)throw fld+"Expected "+hexstr+" saw "+m;this.l+=hexstr.length>>1}function prep_blob(blob,pos){blob.l=pos;blob.read_shift=ReadShift;blob.chk=CheckField}var SSF={};var make_ssf=function make_ssf(SSF){SSF.version="0.8.1";function _strrev(x){var o="",i=x.length-1;while(i>=0)o+=x.charAt(i--);return o}function fill(c,l){var o="";while(o.length<l)o+=c;return o}function pad0(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}function pad_(v,d){var t=""+v;return t.length>=d?t:fill(" ",d-t.length)+t}function rpad_(v,d){var t=""+v;return t.length>=d?t:t+fill(" ",d-t.length)}function pad0r1(v,d){var t=""+Math.round(v);return t.length>=d?t:fill("0",d-t.length)+t}function pad0r2(v,d){var t=""+v;return t.length>=d?t:fill("0",d-t.length)+t}var p2_32=Math.pow(2,32);function pad0r(v,d){if(v>p2_32||v<-p2_32)return pad0r1(v,d);var i=Math.round(v);return pad0r2(i,d)}function isgeneral(s,i){return s.length>=7+i&&(s.charCodeAt(i)|32)===103&&(s.charCodeAt(i+1)|32)===101&&(s.charCodeAt(i+2)|32)===110&&(s.charCodeAt(i+3)|32)===101&&(s.charCodeAt(i+4)|32)===114&&(s.charCodeAt(i+5)|32)===97&&(s.charCodeAt(i+6)|32)===108}var opts_fmt=[["date1904",0],["output",""],["WTF",false]];function fixopts(o){for(var y=0;y!=opts_fmt.length;++y)if(o[opts_fmt[y][0]]===undefined)o[opts_fmt[y][0]]=opts_fmt[y][1]}SSF.opts=opts_fmt;var table_fmt={0:"General",1:"0",2:"0.00",3:"#,##0",4:"#,##0.00",9:"0%",10:"0.00%",11:"0.00E+00",12:"# ?/?",13:"# ??/??",14:"m/d/yy",15:"d-mmm-yy",16:"d-mmm",17:"mmm-yy",18:"h:mm AM/PM",19:"h:mm:ss AM/PM",20:"h:mm",21:"h:mm:ss",22:"m/d/yy h:mm",37:"#,##0 ;(#,##0)",38:"#,##0 ;[Red](#,##0)",39:"#,##0.00;(#,##0.00)",40:"#,##0.00;[Red](#,##0.00)",45:"mm:ss",46:"[h]:mm:ss",47:"mmss.0",48:"##0.0E+0",49:"@",56:'"上午/下午 "hh"時"mm"分"ss"秒 "',65535:"General"};var days=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]];var months=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function frac(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-A<5e-10)break;B=1/(B-A);P_2=P_1;P_1=P;Q_2=Q_1;Q_1=Q}if(Q>D){Q=Q_1;P=P_1}if(Q>D){Q=Q_2;P=P_2}if(!mixed)return[0,sgn*P,Q];if(Q===0)throw"Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2;var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]}function general_fmt_int(v,opts){return""+v}SSF._general_int=general_fmt_int;var general_fmt_num=function make_general_fmt_num(){var gnr1=/\.(\d*[1-9])0+$/,gnr2=/\.0*$/,gnr4=/\.(\d*[1-9])0+/,gnr5=/\.0*[Ee]/,gnr6=/(E[+-])(\d)$/;function gfn2(v){var w=v<0?12:11;var o=gfn5(v.toFixed(12));if(o.length<=w)return o;o=v.toPrecision(10);if(o.length<=w)return o;return v.toExponential(5)}function gfn3(v){var o=v.toFixed(11).replace(gnr1,".$1");if(o.length>(v<0?12:11))o=v.toPrecision(6);return o}function gfn4(o){for(var i=0;i!=o.length;++i)if((o.charCodeAt(i)|32)===101)return o.replace(gnr4,".$1").replace(gnr5,"E").replace("e","E").replace(gnr6,"$10$2");return o}function gfn5(o){return o.indexOf(".")>-1?o.replace(gnr2,"").replace(gnr1,".$1"):o}return function general_fmt_num(v,opts){var V=Math.floor(Math.log(Math.abs(v))*Math.LOG10E),o;if(V>=-4&&V<=-1)o=v.toPrecision(10+V);else if(Math.abs(V)<=9)o=gfn2(v);else if(V===10)o=v.toFixed(10).substr(0,12);else o=gfn3(v);return gfn5(gfn4(o))}}();SSF._general_num=general_fmt_num;function general_fmt(v,opts){switch(typeof v){case"string":return v;case"boolean":return v?"TRUE":"FALSE";case"number":return(v|0)===v?general_fmt_int(v,opts):general_fmt_num(v,opts)}throw new Error("unsupported value in General format: "+v)}SSF._general=general_fmt;function fix_hijri(date,o){return 0}function parse_date_code(v,opts,b2){if(v>2958465||v<0)return null;var date=v|0,time=Math.floor(86400*(v-date)),dow=0;var dout=[];var out={D:date,T:time,u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(out.u)<1e-6)out.u=0;fixopts(opts!=null?opts:opts=[]);if(opts.date1904)date+=1462;if(out.u>.999){out.u=0;if(++time==86400){time=0;++date}}if(date===60){dout=b2?[1317,10,29]:[1900,2,29];dow=3}else if(date===0){dout=b2?[1317,8,29]:[1900,1,0];dow=6}else{if(date>60)--date;var d=new Date(1900,0,1);d.setDate(d.getDate()+date-1);dout=[d.getFullYear(),d.getMonth()+1,d.getDate()];dow=d.getDay();if(date<60)dow=(dow+6)%7;if(b2)dow=fix_hijri(d,dout)}out.y=dout[0];out.m=dout[1];out.d=dout[2];out.S=time%60;time=Math.floor(time/60);out.M=time%60;time=Math.floor(time/60);out.H=time;out.q=dow;return out}SSF.parse_date_code=parse_date_code;function write_date(type,fmt,val,ss0){var o="",ss=0,tt=0,y=val.y,out,outl=0;switch(type){case 98:y=val.y+543;case 121:switch(fmt.length){case 1:case 2:out=y%100;outl=2;break;default:out=y%1e4;outl=4;break}break;case 109:switch(fmt.length){case 1:case 2:out=val.m;outl=fmt.length;break;case 3:return months[val.m-1][1];case 5:return months[val.m-1][0];default:return months[val.m-1][2]}break;case 100:switch(fmt.length){case 1:case 2:out=val.d;outl=fmt.length;break;case 3:return days[val.q][0];default:return days[val.q][1]}break;case 104:switch(fmt.length){case 1:case 2:out=1+(val.H+11)%12;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 72:switch(fmt.length){case 1:case 2:out=val.H;outl=fmt.length;break;default:throw"bad hour format: "+fmt}break;case 77:switch(fmt.length){case 1:case 2:out=val.M;outl=fmt.length;break;default:throw"bad minute format: "+fmt}break;case 115:if(val.u===0)switch(fmt){case"s":case"ss":return pad0(val.S,fmt.length);case".0":case".00":case".000":}switch(fmt){case"s":case"ss":case".0":case".00":case".000":if(ss0>=2)tt=ss0===3?1e3:100;else tt=ss0===1?10:1;ss=Math.round(tt*(val.S+val.u));if(ss>=60*tt)ss=0;if(fmt==="s")return ss===0?"0":""+ss/tt;o=pad0(ss,2+ss0);if(fmt==="ss")return o.substr(0,2);return"."+o.substr(2,fmt.length-1);default:throw"bad second format: "+fmt}case 90:switch(fmt){case"[h]":case"[hh]":out=val.D*24+val.H;break;case"[m]":case"[mm]":out=(val.D*24+val.H)*60+val.M;break;case"[s]":case"[ss]":out=((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u);break;default:throw"bad abstime format: "+fmt}outl=fmt.length===3?1:2;break;case 101:out=y;outl=1}if(outl>0)return pad0(out,outl);else return""}function commaify(s){if(s.length<=3)return s;var j=s.length%3,o=s.substr(0,j);for(;j!=s.length;j+=3)o+=(o.length>0?",":"")+s.substr(j,3);return o}var write_num=function make_write_num(){var pct1=/%/g;function write_num_pct(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_cm(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_exp(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(o.indexOf("e")===-1){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);while(o.substr(0,2)==="0."){o=o[0]+o.substr(2,period)+"."+o.substr(2+period);o=o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.")}o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}var frac1=/# (\?+)( ?)\/( ?)(\d+)/;function write_num_f1(r,aval,sign){var den=parseInt(r[4]),rr=Math.round(aval*den),base=Math.floor(rr/den);var myn=rr-base*den,myd=den;return sign+(base===0?"":""+base)+" "+(myn===0?fill(" ",r[1].length+1+r[4].length):pad_(myn,r[1].length)+r[2]+"/"+r[3]+pad0(myd,r[4].length))}function write_num_f2(r,aval,sign){return sign+(aval===0?"":""+aval)+fill(" ",r[1].length+2+r[4].length)}var dec1=/^#*0*\.(0+)/;var closeparen=/\).*[0#]/;var phone=/\(###\) ###\\?-####/;function hashq(str){var o="",cc;for(var i=0;i!=str.length;++i)switch(cc=str.charCodeAt(i)){case 35:break;case 63:o+=" ";break;case 48:o+="0";break;default:o+=String.fromCharCode(cc)}return o}function rnd(val,d){var dd=Math.pow(10,d);return""+Math.round(val*dd)/dd}function dec(val,d){return Math.round((val-Math.floor(val))*Math.pow(10,d))}function flr(val){if(val<2147483647&&val>-2147483648)return""+(val>=0?val|0:val-1|0);return""+Math.floor(val)}function write_num_flt(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_flt("n",ffmt,val);return"("+write_num_flt("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_flt(type,fmt.substr(fmt[1]==" "?2:1),val);var o,oo;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0r(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=pad0r(val,0);if(o==="0")o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f1(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0r(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=rnd(val,r[1].length).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+rnd(aval,r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(pad0r(aval,0));if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_flt(type,fmt,-val):commaify(""+Math.floor(val))+"."+pad0(dec(val,r[1].length),r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_flt(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_flt(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=pad0r(val,0);if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0?]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){ri=dec(val,r[1].length);return val<0?"-"+write_num_flt(type,fmt,-val):commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(ri,r[1].length)}switch(fmt){case"#,###":var x=commaify(pad0r(aval,0));return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}function write_num_cm2(type,fmt,val){var idx=fmt.length-1;while(fmt.charCodeAt(idx-1)===44)--idx;return write_num(type,fmt.substr(0,idx),val/Math.pow(10,3*(fmt.length-idx)))}function write_num_pct2(type,fmt,val){var sfmt=fmt.replace(pct1,""),mul=fmt.length-sfmt.length;return write_num(type,sfmt,val*Math.pow(10,2*mul))+fill("%",mul)}function write_num_exp2(fmt,val){var o;var idx=fmt.indexOf("E")-fmt.indexOf(".")-1;if(fmt.match(/^#+0.0E\+0$/)){var period=fmt.indexOf(".");if(period===-1)period=fmt.indexOf("E");var ee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;if(ee<0)ee+=period;o=(val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);if(!o.match(/[Ee]/)){var fakee=Math.floor(Math.log(Math.abs(val))*Math.LOG10E);if(o.indexOf(".")===-1)o=o[0]+"."+o.substr(1)+"E+"+(fakee-o.length+ee);else o+="E+"+(fakee-ee);o=o.replace(/\+-/,"-")}o=o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3){return $1+$2+$3.substr(0,(period+ee)%period)+"."+$3.substr(ee)+"E"})}else o=val.toExponential(idx);if(fmt.match(/E\+00$/)&&o.match(/e[+-]\d$/))o=o.substr(0,o.length-1)+"0"+o[o.length-1];if(fmt.match(/E\-/)&&o.match(/e\+/))o=o.replace(/e\+/,"e");return o.replace("e","E")}function write_num_int(type,fmt,val){if(type.charCodeAt(0)===40&&!fmt.match(closeparen)){var ffmt=fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");if(val>=0)return write_num_int("n",ffmt,val);return"("+write_num_int("n",ffmt,-val)+")"}if(fmt.charCodeAt(fmt.length-1)===44)return write_num_cm2(type,fmt,val);if(fmt.indexOf("%")!==-1)return write_num_pct2(type,fmt,val);if(fmt.indexOf("E")!==-1)return write_num_exp2(fmt,val);if(fmt.charCodeAt(0)===36)return"$"+write_num_int(type,fmt.substr(fmt[1]==" "?2:1),val);var o;var r,ri,ff,aval=Math.abs(val),sign=val<0?"-":"";if(fmt.match(/^00+$/))return sign+pad0(aval,fmt.length);if(fmt.match(/^[#?]+$/)){o=""+val;if(val===0)o="";return o.length>fmt.length?o:hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(frac1))!==null)return write_num_f2(r,aval,sign);if(fmt.match(/^#+0+$/)!==null)return sign+pad0(aval,fmt.length-fmt.indexOf("0"));if((r=fmt.match(dec1))!==null){o=(""+val).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$,$1){return"."+$1+fill("0",r[1].length-$1.length)});return fmt.indexOf("0.")!==-1?o:o.replace(/^0\./,".")}fmt=fmt.replace(/^#+([0.])/,"$1");if((r=fmt.match(/^(0*)\.(#*)$/))!==null){return sign+(""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".")}if((r=fmt.match(/^#,##0(\.?)$/))!==null)return sign+commaify(""+aval);if((r=fmt.match(/^#,##0\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val)+"."+fill("0",r[1].length)}if((r=fmt.match(/^#,#*,#0/))!==null)return write_num_int(type,fmt.replace(/^#,#*,/,""),val);if((r=fmt.match(/^([0#]+)(\\?-([0#]+))+$/))!==null){o=_strrev(write_num_int(type,fmt.replace(/[\\-]/g,""),val));ri=0;return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==="0"?"0":""}))}if(fmt.match(phone)!==null){o=write_num_int(type,"##########",val);return"("+o.substr(0,3)+") "+o.substr(3,3)+"-"+o.substr(6)}var oa="";if((r=fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(r[4].length,7);ff=frac(aval,Math.pow(10,ri)-1,false);o=""+sign;oa=write_num("n",r[1],ff[1]);if(oa[oa.length-1]==" ")oa=oa.substr(0,oa.length-1)+"0";o+=oa+r[2]+"/"+r[3];oa=rpad_(ff[2],ri);if(oa.length<r[4].length)oa=hashq(r[4].substr(r[4].length-oa.length))+oa;o+=oa;return o}if((r=fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))!==null){ri=Math.min(Math.max(r[1].length,r[4].length),7);ff=frac(aval,Math.pow(10,ri)-1,true);return sign+(ff[0]||(ff[1]?"":"0"))+" "+(ff[1]?pad_(ff[1],ri)+r[2]+"/"+r[3]+rpad_(ff[2],ri):fill(" ",2*ri+1+r[2].length+r[3].length))}if((r=fmt.match(/^[#0?]+$/))!==null){o=""+val;if(fmt.length<=o.length)return o;return hashq(fmt.substr(0,fmt.length-o.length))+o}if((r=fmt.match(/^([#0]+)\.([#0]+)$/))!==null){o=""+val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");ri=o.indexOf(".");var lres=fmt.indexOf(".")-ri,rres=fmt.length-o.length-lres;return hashq(fmt.substr(0,lres)+o+fmt.substr(fmt.length-rres))}if((r=fmt.match(/^00,000\.([#0]*0)$/))!==null){return val<0?"-"+write_num_int(type,fmt,-val):commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$){return"00,"+($$.length<3?pad0(0,3-$$.length):"")+$$})+"."+pad0(0,r[1].length)}switch(fmt){case"#,###":var x=commaify(""+aval);return x!=="0"?sign+x:"";default:}throw new Error("unsupported format |"+fmt+"|")}return function write_num(type,fmt,val){return(val|0)===val?write_num_int(type,fmt,val):write_num_flt(type,fmt,val)}}();function split_fmt(fmt){var out=[];var in_str=false,cc;for(var i=0,j=0;i<fmt.length;++i)switch(cc=fmt.charCodeAt(i)){case 34:in_str=!in_str;break;case 95:case 42:case 92:++i;break;case 59:out[out.length]=fmt.substr(j,i-j);j=i+1}out[out.length]=fmt.substr(j);if(in_str===true)throw new Error("Format |"+fmt+"| unterminated string ");return out}SSF._split=split_fmt;var abstime=/\[[HhMmSs]*\]/;function eval_fmt(fmt,v,opts,flen){var out=[],o="",i=0,c="",lst="t",q,dt,j,cc;var hr="H";while(i<fmt.length){switch(c=fmt[i]){case"G":if(!isgeneral(fmt,i))throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"G",v:"General"};i+=7;break;case'"':for(o="";(cc=fmt.charCodeAt(++i))!==34&&i<fmt.length;)o+=String.fromCharCode(cc);out[out.length]={t:"t",v:o};++i;break;case"\\":var w=fmt[++i],t=w==="("||w===")"?w:"t";out[out.length]={t:t,v:w};++i;break;case"_":out[out.length]={t:"t",v:" "};i+=2;break;case"@":out[out.length]={t:"T",v:v};++i;break;case"B":case"b":if(fmt[i+1]==="1"||fmt[i+1]==="2"){if(dt==null){dt=parse_date_code(v,opts,fmt[i+1]==="2");if(dt==null)return""}out[out.length]={t:"X",v:fmt.substr(i,2)};lst=c;i+=2;break}case"M":case"D":case"Y":case"H":case"S":case"E":c=c.toLowerCase();case"m":case"d":case"y":case"h":case"s":case"e":case"g":if(v<0)return"";if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}o=c;while(++i<fmt.length&&fmt[i].toLowerCase()===c)o+=c;if(c==="m"&&lst.toLowerCase()==="h")c="M";if(c==="h")c=hr;out[out.length]={t:c,v:o};lst=c;break;case"A":q={t:c,v:"A"};if(dt==null)dt=parse_date_code(v,opts);if(fmt.substr(i,3)==="A/P"){if(dt!=null)q.v=dt.H>=12?"P":"A";q.t="T";hr="h";i+=3}else if(fmt.substr(i,5)==="AM/PM"){if(dt!=null)q.v=dt.H>=12?"PM":"AM";q.t="T";i+=5;hr="h"}else{q.t="t";++i}if(dt==null&&q.t==="T")return"";out[out.length]=q;lst=c;break;case"[":o=c;while(fmt[i++]!=="]"&&i<fmt.length)o+=fmt[i];if(o.substr(-1)!=="]")throw'unterminated "[" block: |'+o+"|";if(o.match(abstime)){if(dt==null){dt=parse_date_code(v,opts);if(dt==null)return""}out[out.length]={t:"Z",v:o.toLowerCase()}}else{o=""}break;case".":if(dt!=null){o=c;while((c=fmt[++i])==="0")o+=c;out[out.length]={t:"s",v:o};break}case"0":case"#":o=c;while("0#?.,E+-%".indexOf(c=fmt[++i])>-1||c=="\\"&&fmt[i+1]=="-"&&"0#".indexOf(fmt[i+2])>-1)o+=c;out[out.length]={t:"n",v:o};break;case"?":o=c;while(fmt[++i]===c)o+=c;q={t:c,v:o};out[out.length]=q;lst=c;break;case"*":++i;if(fmt[i]==" "||fmt[i]=="*")++i;break;case"(":case")":out[out.length]={t:flen===1?"t":c,v:c};++i;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":o=c;while("0123456789".indexOf(fmt[++i])>-1)o+=fmt[i];out[out.length]={t:"D",v:o};break;case" ":out[out.length]={t:c,v:c};++i;break;default:if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c)===-1)throw new Error("unrecognized character "+c+" in "+fmt);out[out.length]={t:"t",v:c};++i;break}}var bt=0,ss0=0,ssm;for(i=out.length-1,lst="t";i>=0;--i){switch(out[i].t){case"h":case"H":out[i].t=hr;lst="h";if(bt<1)bt=1;break;case"s":if(ssm=out[i].v.match(/\.0+$/))ss0=Math.max(ss0,ssm[0].length-1);if(bt<3)bt=3;case"d":case"y":case"M":case"e":lst=out[i].t;break;case"m":if(lst==="s"){out[i].t="M";if(bt<2)bt=2}break;case"X":if(out[i].v==="B2");break;case"Z":if(bt<1&&out[i].v.match(/[Hh]/))bt=1;if(bt<2&&out[i].v.match(/[Mm]/))bt=2;if(bt<3&&out[i].v.match(/[Ss]/))bt=3}}switch(bt){case 0:break;case 1:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}if(dt.M>=60){dt.M=0;++dt.H}break;case 2:if(dt.u>=.5){dt.u=0;++dt.S}if(dt.S>=60){dt.S=0;++dt.M}break}var nstr="",jj;for(i=0;i<out.length;++i){switch(out[i].t){case"t":case"T":case" ":case"D":break;case"X":out[i]=undefined;break;case"d":case"m":case"y":case"h":case"H":case"M":case"s":case"e":case"b":case"Z":out[i].v=write_date(out[i].t.charCodeAt(0),out[i].v,dt,ss0);out[i].t="t";break;case"n":case"(":case"?":jj=i+1;while(out[jj]!=null&&((c=out[jj].t)==="?"||c==="D"||(c===" "||c==="t")&&out[jj+1]!=null&&(out[jj+1].t==="?"||out[jj+1].t==="t"&&out[jj+1].v==="/")||out[i].t==="("&&(c===" "||c==="n"||c===")")||c==="t"&&(out[jj].v==="/"||"$€".indexOf(out[jj].v)>-1||out[jj].v===" "&&out[jj+1]!=null&&out[jj+1].t=="?"))){out[i].v+=out[jj].v;out[jj]=undefined;++jj}nstr+=out[i].v;i=jj-1;break;case"G":out[i].t="t";out[i].v=general_fmt(v,opts);break}}var vv="",myv,ostr;if(nstr.length>0){myv=v<0&&nstr.charCodeAt(0)===45?-v:v;ostr=write_num(nstr.charCodeAt(0)===40?"(":"n",nstr,myv);jj=ostr.length-1;var decpt=out.length;for(i=0;i<out.length;++i)if(out[i]!=null&&out[i].v.indexOf(".")>-1){decpt=i;break}var lasti=out.length;if(decpt===out.length&&ostr.indexOf("E")===-1){for(i=out.length-1;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;if(jj>=out[i].v.length-1){jj-=out[i].v.length;out[i].v=ostr.substr(jj+1,out[i].v.length)}else if(jj<0)out[i].v="";else{out[i].v=ostr.substr(0,jj+1);jj=-1}out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v}else if(decpt!==out.length&&ostr.indexOf("E")===-1){jj=ostr.indexOf(".")-1;for(i=decpt;i>=0;--i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;vv=out[i].v.substr(j+1);for(;j>=0;--j){if(jj>=0&&(out[i].v[j]==="0"||out[i].v[j]==="#"))vv=ostr[jj--]+vv}out[i].v=vv;out[i].t="t";lasti=i}if(jj>=0&&lasti<out.length)out[lasti].v=ostr.substr(0,jj+1)+out[lasti].v;jj=ostr.indexOf(".")+1;for(i=decpt;i<out.length;++i){if(out[i]==null||"n?(".indexOf(out[i].t)===-1&&i!==decpt)continue;j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;vv=out[i].v.substr(0,j);for(;j<out[i].v.length;++j){if(jj<ostr.length)vv+=ostr[jj++]}out[i].v=vv;out[i].t="t";lasti=i}}}for(i=0;i<out.length;++i)if(out[i]!=null&&"n(?".indexOf(out[i].t)>-1){myv=flen>1&&v<0&&i>0&&out[i-1].v==="-"?-v:v;out[i].v=write_num(out[i].t,out[i].v,myv);out[i].t="t"}var retval="";for(i=0;i!==out.length;++i)if(out[i]!=null)retval+=out[i].v;return retval}SSF._eval=eval_fmt;var cfregex=/\[[=<>]/;var cfregex2=/\[([=<>]*)(-?\d+\.?\d*)\]/;function chkcond(v,rr){if(rr==null)return false;var thresh=parseFloat(rr[2]);switch(rr[1]){case"=":if(v==thresh)return true;break;case">":if(v>thresh)return true;break;case"<":if(v<thresh)return true;break;case"<>":if(v!=thresh)return true;break;case">=":if(v>=thresh)return true;break;case"<=":if(v<=thresh)return true;break}return false}function choose_fmt(f,v){var fmt=split_fmt(f);var l=fmt.length,lat=fmt[l-1].indexOf("@");if(l<4&&lat>-1)--l;if(fmt.length>4)throw"cannot find right format for |"+fmt+"|";if(typeof v!=="number")return[4,fmt.length===4||lat>-1?fmt[fmt.length-1]:"@"];switch(fmt.length){case 1:fmt=lat>-1?["General","General","General",fmt[0]]:[fmt[0],fmt[0],fmt[0],"@"];break;case 2:fmt=lat>-1?[fmt[0],fmt[0],fmt[0],fmt[1]]:[fmt[0],fmt[1],fmt[0],"@"];break;case 3:fmt=lat>-1?[fmt[0],fmt[1],fmt[0],fmt[2]]:[fmt[0],fmt[1],fmt[2],"@"];break;case 4:break}var ff=v>0?fmt[0]:v<0?fmt[1]:fmt[2];if(fmt[0].indexOf("[")===-1&&fmt[1].indexOf("[")===-1)return[l,ff];if(fmt[0].match(cfregex)!=null||fmt[1].match(cfregex)!=null){var m1=fmt[0].match(cfregex2);var m2=fmt[1].match(cfregex2);return chkcond(v,m1)?[l,fmt[0]]:chkcond(v,m2)?[l,fmt[1]]:[l,fmt[m1!=null&&m2!=null?2:1]]}return[l,ff]}function format(fmt,v,o){fixopts(o!=null?o:o=[]);var sfmt="";switch(typeof fmt){case"string":sfmt=fmt;break;case"number":sfmt=(o.table!=null?o.table:table_fmt)[fmt];break}if(isgeneral(sfmt,0))return general_fmt(v,o);var f=choose_fmt(sfmt,v);if(isgeneral(f[1]))return general_fmt(v,o);if(v===true)v="TRUE";else if(v===false)v="FALSE";else if(v===""||v==null)return"";return eval_fmt(f[1],v,o,f[0])}SSF._table=table_fmt;SSF.load=function load_entry(fmt,idx){table_fmt[idx]=fmt};SSF.format=format;SSF.get_table=function get_table(){return table_fmt};SSF.load_table=function load_table(tbl){for(var i=0;i!=392;++i)if(tbl[i]!==undefined)SSF.load(tbl[i],i)}};make_ssf(SSF);{var VT_EMPTY=0;var VT_NULL=1;var VT_I2=2;var VT_I4=3;var VT_R4=4;var VT_R8=5;var VT_CY=6;var VT_DATE=7;var VT_BSTR=8;var VT_ERROR=10;var VT_BOOL=11;var VT_VARIANT=12;var VT_DECIMAL=14;var VT_I1=16;var VT_UI1=17;var VT_UI2=18;var VT_UI4=19;var VT_I8=20;var VT_UI8=21;var VT_INT=22;var VT_UINT=23;var VT_LPSTR=30;var VT_LPWSTR=31;var VT_FILETIME=64;var VT_BLOB=65;var VT_STREAM=66;var VT_STORAGE=67;var VT_STREAMED_Object=68;
18579 dosTime, 18559 var VT_STORED_Object=69;var VT_BLOB_Object=70;var VT_CF=71;var VT_CLSID=72;var VT_VERSIONED_STREAM=73;var VT_VECTOR=4096;var VT_ARRAY=8192;var VT_STRING=80;var VT_USTR=81;var VT_CUSTOM=[VT_STRING,VT_USTR]}var DocSummaryPIDDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Category",t:VT_STRING},3:{n:"PresentationFormat",t:VT_STRING},4:{n:"ByteCount",t:VT_I4},5:{n:"LineCount",t:VT_I4},6:{n:"ParagraphCount",t:VT_I4},7:{n:"SlideCount",t:VT_I4},8:{n:"NoteCount",t:VT_I4},9:{n:"HiddenCount",t:VT_I4},10:{n:"MultimediaClipCount",t:VT_I4},11:{n:"Scale",t:VT_BOOL},12:{n:"HeadingPair",t:VT_VECTOR|VT_VARIANT},13:{n:"DocParts",t:VT_VECTOR|VT_LPSTR},14:{n:"Manager",t:VT_STRING},15:{n:"Company",t:VT_STRING},16:{n:"LinksDirty",t:VT_BOOL},17:{n:"CharacterCount",t:VT_I4},19:{n:"SharedDoc",t:VT_BOOL},22:{n:"HLinksChanged",t:VT_BOOL},23:{n:"AppVersion",t:VT_I4,p:"version"},26:{n:"ContentType",t:VT_STRING},27:{n:"ContentStatus",t:VT_STRING},28:{n:"Language",t:VT_STRING},29:{n:"Version",t:VT_STRING},255:{}};var SummaryPIDSI={1:{n:"CodePage",t:VT_I2},2:{n:"Title",t:VT_STRING},3:{n:"Subject",t:VT_STRING},4:{n:"Author",t:VT_STRING},5:{n:"Keywords",t:VT_STRING},6:{n:"Comments",t:VT_STRING},7:{n:"Template",t:VT_STRING},8:{n:"LastAuthor",t:VT_STRING},9:{n:"RevNumber",t:VT_STRING},10:{n:"EditTime",t:VT_FILETIME},11:{n:"LastPrinted",t:VT_FILETIME},12:{n:"CreatedDate",t:VT_FILETIME},13:{n:"ModifiedDate",t:VT_FILETIME},14:{n:"PageCount",t:VT_I4},15:{n:"WordCount",t:VT_I4},16:{n:"CharCount",t:VT_I4},17:{n:"Thumbnail",t:VT_CF},18:{n:"ApplicationName",t:VT_LPSTR},19:{n:"DocumentSecurity",t:VT_I4},255:{}};var SpecialProperties={2147483648:{n:"Locale",t:VT_UI4},2147483651:{n:"Behavior",t:VT_UI4},1768515945:{}};(function(){for(var y in SpecialProperties)if(SpecialProperties.hasOwnProperty(y))DocSummaryPIDDSI[y]=SummaryPIDSI[y]=SpecialProperties[y]})();function parse_FILETIME(blob){var dwLowDateTime=blob.read_shift(4),dwHighDateTime=blob.read_shift(4);return new Date((dwHighDateTime/1e7*Math.pow(2,32)+dwLowDateTime/1e7-11644473600)*1e3).toISOString().replace(/\.000/,"")}function parse_lpstr(blob,type,pad){var str=blob.read_shift(0,"lpstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_lpwstr(blob,type,pad){var str=blob.read_shift(0,"lpwstr");if(pad)blob.l+=4-(str.length+1&3)&3;return str}function parse_VtStringBase(blob,stringType,pad){if(stringType===31)return parse_lpwstr(blob);return parse_lpstr(blob,stringType,pad)}function parse_VtString(blob,t,pad){return parse_VtStringBase(blob,t,pad===false?0:4)}function parse_VtUnalignedString(blob,t){if(!t)throw new Error("dafuq?");return parse_VtStringBase(blob,t,0)}function parse_VtVecUnalignedLpstrValue(blob){var length=blob.read_shift(4);var ret=[];for(var i=0;i!=length;++i)ret[i]=blob.read_shift(0,"lpstr");return ret}function parse_VtVecUnalignedLpstr(blob){return parse_VtVecUnalignedLpstrValue(blob)}function parse_VtHeadingPair(blob){var headingString=parse_TypedPropertyValue(blob,VT_USTR);var headerParts=parse_TypedPropertyValue(blob,VT_I4);return[headingString,headerParts]}function parse_VtVecHeadingPairValue(blob){var cElements=blob.read_shift(4);var out=[];for(var i=0;i!=cElements/2;++i)out.push(parse_VtHeadingPair(blob));return out}function parse_VtVecHeadingPair(blob){return parse_VtVecHeadingPairValue(blob)}function parse_dictionary(blob,CodePage){var cnt=blob.read_shift(4);var dict={};for(var j=0;j!=cnt;++j){var pid=blob.read_shift(4);var len=blob.read_shift(4);dict[pid]=blob.read_shift(len,CodePage===1200?"utf16le":"utf8").replace(chr0,"").replace(chr1,"!")}if(blob.l&3)blob.l=blob.l>>2+1<<2;return dict}function parse_BLOB(blob){var size=blob.read_shift(4);var bytes=blob.slice(blob.l,blob.l+size);if(size&3>0)blob.l+=4-(size&3)&3;return bytes}function parse_ClipboardData(blob){var o={};o.Size=blob.read_shift(4);blob.l+=o.Size;return o}function parse_VtVector(blob,cb){}function parse_TypedPropertyValue(blob,type,_opts){var t=blob.read_shift(2),ret,opts=_opts||{};blob.l+=2;if(type!==VT_VARIANT)if(t!==type&&VT_CUSTOM.indexOf(type)===-1)throw new Error("Expected type "+type+" saw "+t);switch(type===VT_VARIANT?t:type){case 2:ret=blob.read_shift(2,"i");if(!opts.raw)blob.l+=2;return ret;case 3:ret=blob.read_shift(4,"i");return ret;case 11:return blob.read_shift(4)!==0;case 19:ret=blob.read_shift(4);return ret;case 30:return parse_lpstr(blob,t,4).replace(chr0,"");case 31:return parse_lpwstr(blob);case 64:return parse_FILETIME(blob);case 65:return parse_BLOB(blob);case 71:return parse_ClipboardData(blob);case 80:return parse_VtString(blob,t,!opts.raw&&4).replace(chr0,"");case 81:return parse_VtUnalignedString(blob,t,4).replace(chr0,"");case 4108:return parse_VtVecHeadingPair(blob);case 4126:return parse_VtVecUnalignedLpstr(blob);default:throw new Error("TypedPropertyValue unrecognized type "+type+" "+t)}}function parse_PropertySet(blob,PIDSI){var start_addr=blob.l;var size=blob.read_shift(4);var NumProps=blob.read_shift(4);var Props=[],i=0;var CodePage=0;var Dictionary=-1,DictObj;for(i=0;i!=NumProps;++i){var PropID=blob.read_shift(4);var Offset=blob.read_shift(4);Props[i]=[PropID,Offset+start_addr]}var PropH={};for(i=0;i!=NumProps;++i){if(blob.l!==Props[i][1]){var fail=true;if(i>0&&PIDSI)switch(PIDSI[Props[i-1][0]].t){case 2:if(blob.l+2===Props[i][1]){blob.l+=2;fail=false}break;case 80:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break;case 4108:if(blob.l<=Props[i][1]){blob.l=Props[i][1];fail=false}break}if(!PIDSI&&blob.l<=Props[i][1]){fail=false;blob.l=Props[i][1]}if(fail)throw new Error("Read Error: Expected address "+Props[i][1]+" at "+blob.l+" :"+i)}if(PIDSI){var piddsi=PIDSI[Props[i][0]];PropH[piddsi.n]=parse_TypedPropertyValue(blob,piddsi.t,{raw:true});if(piddsi.p==="version")PropH[piddsi.n]=String(PropH[piddsi.n]>>16)+"."+String(PropH[piddsi.n]&65535);if(piddsi.n=="CodePage")switch(PropH[piddsi.n]){case 0:PropH[piddsi.n]=1252;case 1e4:case 1252:case 874:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 932:case 936:case 949:case 950:case 1200:case 1201:case 65e3:case-536:case 65001:case-535:set_cp(CodePage=PropH[piddsi.n]);break;default:throw new Error("Unsupported CodePage: "+PropH[piddsi.n])}}else{if(Props[i][0]===1){CodePage=PropH.CodePage=parse_TypedPropertyValue(blob,VT_I2);set_cp(CodePage);if(Dictionary!==-1){var oldpos=blob.l;blob.l=Props[Dictionary][1];DictObj=parse_dictionary(blob,CodePage);blob.l=oldpos}}else if(Props[i][0]===0){if(CodePage===0){Dictionary=i;blob.l=Props[i+1][1];continue}DictObj=parse_dictionary(blob,CodePage)}else{var name=DictObj[Props[i][0]];var val;switch(blob[blob.l]){case 65:blob.l+=4;val=parse_BLOB(blob);break;case 30:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 31:blob.l+=4;val=parse_VtString(blob,blob[blob.l-4]);break;case 3:blob.l+=4;val=blob.read_shift(4,"i");break;case 19:blob.l+=4;val=blob.read_shift(4);break;case 5:blob.l+=4;val=blob.read_shift(8,"f");break;case 11:blob.l+=4;val=parsebool(blob,4);break;case 64:blob.l+=4;val=new Date(parse_FILETIME(blob));break;default:throw new Error("unparsed value: "+blob[blob.l])}PropH[name]=val}}}blob.l=start_addr+size;return PropH}function parse_PropertySetStream(file,PIDSI){var blob=file.content;prep_blob(blob,0);var NumSets,FMTID0,FMTID1,Offset0,Offset1;blob.chk("feff","Byte Order: ");var vers=blob.read_shift(2);var SystemIdentifier=blob.read_shift(4);blob.chk(CFB.utils.consts.HEADER_CLSID,"CLSID: ");NumSets=blob.read_shift(4);if(NumSets!==1&&NumSets!==2)throw"Unrecognized #Sets: "+NumSets;FMTID0=blob.read_shift(16);Offset0=blob.read_shift(4);if(NumSets===1&&Offset0!==blob.l)throw"Length mismatch";else if(NumSets===2){FMTID1=blob.read_shift(16);Offset1=blob.read_shift(4)}var PSet0=parse_PropertySet(blob,PIDSI);var rval={SystemIdentifier:SystemIdentifier};for(var y in PSet0)rval[y]=PSet0[y];rval.FMTID=FMTID0;if(NumSets===1)return rval;if(blob.l!==Offset1)throw"Length mismatch 2: "+blob.l+" !== "+Offset1;var PSet1;try{PSet1=parse_PropertySet(blob,null)}catch(e){}for(y in PSet1)rval[y]=PSet1[y];rval.FMTID=[FMTID0,FMTID1];return rval}var DO_NOT_EXPORT_CFB=true;var CFB=function _CFB(){var exports={};exports.version="0.10.0";function parse(file){var mver=3;var ssz=512;var nmfs=0;var ndfs=0;var dir_start=0;var minifat_start=0;var difat_start=0;var fat_addrs=[];var blob=file.slice(0,512);prep_blob(blob,0);mver=check_get_mver(blob);switch(mver){case 3:ssz=512;break;case 4:ssz=4096;break;default:throw"Major Version: Expected 3 or 4 saw "+mver}if(ssz!==512){blob=file.slice(0,ssz);prep_blob(blob,28)}var header=file.slice(0,ssz);check_shifts(blob,mver);var nds=blob.read_shift(4,"i");if(mver===3&&nds!==0)throw"# Directory Sectors: Expected 0 saw "+nds;blob.l+=4;dir_start=blob.read_shift(4,"i");blob.l+=4;blob.chk("00100000","Mini Stream Cutoff Size: ");minifat_start=blob.read_shift(4,"i");nmfs=blob.read_shift(4,"i");difat_start=blob.read_shift(4,"i");ndfs=blob.read_shift(4,"i");for(var q,j=0;j<109;++j){q=blob.read_shift(4,"i");if(q<0)break;fat_addrs[j]=q}var sectors=sectorify(file,ssz);sleuth_fat(difat_start,ndfs,sectors,ssz,fat_addrs);var sector_list=make_sector_list(sectors,dir_start,fat_addrs,ssz);sector_list[dir_start].name="!Directory";if(nmfs>0&&minifat_start!==ENDOFCHAIN)sector_list[minifat_start].name="!MiniFAT";sector_list[fat_addrs[0]].name="!FAT";var files={},Paths=[],FileIndex=[],FullPaths=[],FullPathDir={};read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex);build_full_paths(FileIndex,FullPathDir,FullPaths,Paths);var root_name=Paths.shift();Paths.root=root_name;var find_path=make_find_path(FullPaths,Paths,FileIndex,files,root_name);return{raw:{header:header,sectors:sectors},FileIndex:FileIndex,FullPaths:FullPaths,FullPathDir:FullPathDir,find:find_path}}function check_get_mver(blob){blob.chk(HEADER_SIGNATURE,"Header Signature: ");blob.chk(HEADER_CLSID,"CLSID: ");blob.l+=2;return blob.read_shift(2,"u")}function check_shifts(blob,mver){var shift=9;blob.chk("feff","Byte Order: ");switch(shift=blob.read_shift(2)){case 9:if(mver!==3)throw"MajorVersion/SectorShift Mismatch";break;case 12:if(mver!==4)throw"MajorVersion/SectorShift Mismatch";break;default:throw"Sector Shift: Expected 9 or 12 saw "+shift}blob.chk("0600","Mini Sector Shift: ");blob.chk("000000000000","Reserved: ")}function sectorify(file,ssz){var nsectors=Math.ceil(file.length/ssz)-1;var sectors=new Array(nsectors);for(var i=1;i<nsectors;++i)sectors[i-1]=file.slice(i*ssz,(i+1)*ssz);sectors[nsectors-1]=file.slice(nsectors*ssz);return sectors}function build_full_paths(FI,FPD,FP,Paths){var i=0,L=0,R=0,C=0,j=0,pl=Paths.length;var dad=new Array(pl),q=new Array(pl);for(;i<pl;++i){dad[i]=q[i]=i;FP[i]=Paths[i]}for(;j<q.length;++j){i=q[j];L=FI[i].L;R=FI[i].R;C=FI[i].C;if(dad[i]===i){if(L!==-1&&dad[L]!==L)dad[i]=dad[L];if(R!==-1&&dad[R]!==R)dad[i]=dad[R]}if(C!==-1)dad[C]=i;if(L!==-1){dad[L]=dad[i];q.push(L)}if(R!==-1){dad[R]=dad[i];q.push(R)}}for(i=1;i!==pl;++i)if(dad[i]===i){if(R!==-1&&dad[R]!==R)dad[i]=dad[R];else if(L!==-1&&dad[L]!==L)dad[i]=dad[L]}for(i=1;i<pl;++i){if(FI[i].type===0)continue;j=dad[i];if(j===0)FP[i]=FP[0]+"/"+FP[i];else while(j!==0){FP[i]=FP[j]+"/"+FP[i];j=dad[j]}dad[i]=0}FP[0]+="/";for(i=1;i<pl;++i){if(FI[i].type!==2)FP[i]+="/";FPD[FP[i]]=FI[i]}}function make_find_path(FullPaths,Paths,FileIndex,files,root_name){var UCFullPaths=new Array(FullPaths.length);var UCPaths=new Array(Paths.length),i;for(i=0;i<FullPaths.length;++i)UCFullPaths[i]=FullPaths[i].toUpperCase();for(i=0;i<Paths.length;++i)UCPaths[i]=Paths[i].toUpperCase();return function find_path(path){var k;if(path.charCodeAt(0)===47){k=true;path=root_name+path}else k=path.indexOf("/")!==-1;var UCPath=path.toUpperCase();var w=k===true?UCFullPaths.indexOf(UCPath):UCPaths.indexOf(UCPath);if(w===-1)return null;return k===true?FileIndex[w]:files[Paths[w]]}}function sleuth_fat(idx,cnt,sectors,ssz,fat_addrs){var q;if(idx===ENDOFCHAIN){if(cnt!==0)throw"DIFAT chain shorter than expected"}else if(idx!==-1){var sector=sectors[idx],m=(ssz>>>2)-1;for(var i=0;i<m;++i){if((q=__readInt32LE(sector,i*4))===ENDOFCHAIN)break;fat_addrs.push(q)}sleuth_fat(__readInt32LE(sector,ssz-4),cnt-1,sectors,ssz,fat_addrs)}}function make_sector_list(sectors,dir_start,fat_addrs,ssz){var sl=sectors.length,sector_list=new Array(sl);var chkd=new Array(sl),buf,buf_chain;var modulus=ssz-1,i,j,k,jj;for(i=0;i<sl;++i){buf=[];k=i+dir_start;if(k>=sl)k-=sl;if(chkd[k]===true)continue;buf_chain=[];for(j=k;j>=0;){chkd[j]=true;buf[buf.length]=j;buf_chain.push(sectors[j]);var addr=fat_addrs[Math.floor(j*4/ssz)];jj=j*4&modulus;if(ssz<4+jj)throw"FAT boundary crossed: "+j+" 4 "+ssz;j=__readInt32LE(sectors[addr],jj)}sector_list[k]={nodes:buf,data:__toBuffer([buf_chain])}}return sector_list}function read_directory(dir_start,sector_list,sectors,Paths,nmfs,files,FileIndex){var blob;var minifat_store=0,pl=Paths.length?2:0;var sector=sector_list[dir_start].data;var i=0,namelen=0,name,o,ctime,mtime;for(;i<sector.length;i+=128){blob=sector.slice(i,i+128);prep_blob(blob,64);namelen=blob.read_shift(2);if(namelen===0)continue;name=__utf16le(blob,0,namelen-pl).replace(chr0,"").replace(chr1,"!");Paths.push(name);o={name:name,type:blob.read_shift(1),color:blob.read_shift(1),L:blob.read_shift(4,"i"),R:blob.read_shift(4,"i"),C:blob.read_shift(4,"i"),clsid:blob.read_shift(16),state:blob.read_shift(4,"i")};ctime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(ctime!==0){o.ctime=ctime;o.ct=read_date(blob,blob.l-8)}mtime=blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2)+blob.read_shift(2);if(mtime!==0){o.mtime=mtime;o.mt=read_date(blob,blob.l-8)}o.start=blob.read_shift(4,"i");o.size=blob.read_shift(4,"i");if(o.type===5){minifat_store=o.start;if(nmfs>0&&minifat_store!==ENDOFCHAIN)sector_list[minifat_store].name="!StreamData"}else if(o.size>=4096){o.storage="fat";if(sector_list[o.start]===undefined)if((o.start+=dir_start)>=sectors.length)o.start-=sectors.length;sector_list[o.start].name=o.name;o.content=sector_list[o.start].data.slice(0,o.size);prep_blob(o.content,0)}else{o.storage="minifat";if(minifat_store!==ENDOFCHAIN&&o.start!==ENDOFCHAIN){o.content=sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);prep_blob(o.content,0)}}files[name]=o;FileIndex.push(o)}}function read_date(blob,offset){return new Date((__readUInt32LE(blob,offset+4)/1e7*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7-11644473600)*1e3)}var fs;function readFileSync(filename){if(fs===undefined)fs=require("fs");return parse(fs.readFileSync(filename))}function readSync(blob,options){switch(options!==undefined&&options.type!==undefined?options.type:"base64"){case"file":return readFileSync(blob);case"base64":return parse(s2a(Base64.decode(blob)));case"binary":return parse(s2a(blob))}return parse(blob)}var MSSZ=64;var ENDOFCHAIN=-2;var HEADER_SIGNATURE="d0cf11e0a1b11ae1";var HEADER_CLSID="00000000000000000000000000000000";var consts={MAXREGSECT:-6,DIFSECT:-4,FATSECT:-3,ENDOFCHAIN:ENDOFCHAIN,FREESECT:-1,HEADER_SIGNATURE:HEADER_SIGNATURE,HEADER_MINOR_VERSION:"3e00",MAXREGSID:-6,NOSTREAM:-1,HEADER_CLSID:HEADER_CLSID,EntryTypes:["unknown","storage","stream","lockbytes","property","root"]};exports.read=readSync;exports.parse=parse;exports.utils={ReadShift:ReadShift,CheckField:CheckField,prep_blob:prep_blob,bconcat:bconcat,consts:consts};return exports}();if(typeof require!=="undefined"&&typeof module!=="undefined"&&typeof DO_NOT_EXPORT_CFB==="undefined"){module.exports=CFB}function parsenoop(blob,length){blob.read_shift(length);return}function parsenoop2(blob,length){blob.read_shift(length);return null}function parslurp(blob,length,cb){var arr=[],target=blob.l+length;while(blob.l<target)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parslurp2(blob,length,cb){var arr=[],target=blob.l+length,len=blob.read_shift(2);while(len--!==0)arr.push(cb(blob,target-blob.l));if(target!==blob.l)throw new Error("Slurp error");return arr}function parsebool(blob,length){return blob.read_shift(length)===1}function parseuint16(blob){return blob.read_shift(2,"u")}function parseuint16a(blob,length){return parslurp(blob,length,parseuint16)}var parse_Boolean=parsebool;function parse_Bes(blob){var v=blob.read_shift(1),t=blob.read_shift(1);return t===1?BERR[v]:v===1}function parse_ShortXLUnicodeString(blob,length,opts){var cch=blob.read_shift(1);var width=1,encoding="sbcs";if(opts===undefined||opts.biff!==5){var fHighByte=blob.read_shift(1);if(fHighByte){width=2;encoding="dbcs"}}return cch?blob.read_shift(cch,encoding):""}function parse_XLUnicodeRichExtendedString(blob){var cch=blob.read_shift(2),flags=blob.read_shift(1);var fHighByte=flags&1,fExtSt=flags&4,fRichSt=flags&8;var width=1+(flags&1);var cRun,cbExtRst;var z={};if(fRichSt)cRun=blob.read_shift(2);if(fExtSt)cbExtRst=blob.read_shift(4);var encoding=flags&1?"dbcs":"sbcs";var msg=cch===0?"":blob.read_shift(cch,encoding);if(fRichSt)blob.l+=4*cRun;if(fExtSt)blob.l+=cbExtRst;z.t=msg;if(!fRichSt){z.raw="<t>"+z.t+"</t>";z.r=z.t}return z}function parse_XLUnicodeStringNoCch(blob,cch,opts){var retval;var fHighByte=blob.read_shift(1);if(fHighByte===0){retval=blob.read_shift(cch,"sbcs")}else{retval=blob.read_shift(cch,"dbcs")}return retval}function parse_XLUnicodeString(blob,length,opts){var cch=blob.read_shift(opts!==undefined&&opts.biff===5?1:2);if(cch===0){blob.l++;return""}return parse_XLUnicodeStringNoCch(blob,cch,opts)}function parse_XLUnicodeString2(blob,length,opts){if(opts.biff!==5)return parse_XLUnicodeString(blob,length,opts);var cch=blob.read_shift(1);if(cch===0){blob.l++;return""}return blob.read_shift(cch,"sbcs")}function parse_Xnum(blob){return blob.read_shift(8,"f")}var parse_ControlInfo=parsenoop;var parse_URLMoniker=function(blob,length){var len=blob.read_shift(4),start=blob.l;var extra=false;if(len>24){blob.l+=len-24;if(blob.read_shift(16)==="795881f43b1d7f48af2c825dc4852763")extra=true;blob.l=start}var url=blob.read_shift((extra?len-24:len)>>1,"utf16le").replace(chr0,"");if(extra)blob.l+=24;return url};var parse_FileMoniker=function(blob,length){var cAnti=blob.read_shift(2);var ansiLength=blob.read_shift(4);var ansiPath=blob.read_shift(ansiLength,"cstr");var endServer=blob.read_shift(2);var versionNumber=blob.read_shift(2);var cbUnicodePathSize=blob.read_shift(4);if(cbUnicodePathSize===0)return ansiPath.replace(/\\/g,"/");var cbUnicodePathBytes=blob.read_shift(4);var usKeyValue=blob.read_shift(2);var unicodePath=blob.read_shift(cbUnicodePathBytes>>1,"utf16le").replace(chr0,"");return unicodePath};var parse_HyperlinkMoniker=function(blob,length){var clsid=blob.read_shift(16);length-=16;switch(clsid){case"e0c9ea79f9bace118c8200aa004ba90b":return parse_URLMoniker(blob,length);case"0303000000000000c000000000000046":return parse_FileMoniker(blob,length);default:throw"unsupported moniker "+clsid}};var parse_HyperlinkString=function(blob,length){var len=blob.read_shift(4);var o=blob.read_shift(len,"utf16le").replace(chr0,"");return o};var parse_Hyperlink=function(blob,length){var end=blob.l+length;var sVer=blob.read_shift(4);if(sVer!==2)throw new Error("Unrecognized streamVersion: "+sVer);var flags=blob.read_shift(2);blob.l+=2;var displayName,targetFrameName,moniker,oleMoniker,location,guid,fileTime;if(flags&16)displayName=parse_HyperlinkString(blob,end-blob.l);if(flags&128)targetFrameName=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===257)moniker=parse_HyperlinkString(blob,end-blob.l);if((flags&257)===1)oleMoniker=parse_HyperlinkMoniker(blob,end-blob.l);if(flags&8)location=parse_HyperlinkString(blob,end-blob.l);if(flags&32)guid=blob.read_shift(16);if(flags&64)fileTime=parse_FILETIME(blob,8);blob.l=end;var target=targetFrameName||moniker||oleMoniker;if(location)target+="#"+location;return{Target:target}};function isval(x){return x!==undefined&&x!==null}function keys(o){return Object.keys(o)}function evert(obj,arr){var o={};var K=keys(obj);for(var i=0;i<K.length;++i){var k=K[i];if(!arr)o[obj[k]]=k;else(o[obj[k]]=o[obj[k]]||[]).push(k)}return o}function parse_Cell(blob,length){var rw=blob.read_shift(2);var col=blob.read_shift(2);var ixfe=blob.read_shift(2);return{r:rw,c:col,ixfe:ixfe}}function parse_frtHeader(blob){var rt=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=8;return{type:rt,flags:flags}}function parse_OptXLUnicodeString(blob,length,opts){return length===0?"":parse_XLUnicodeString2(blob,length,opts)}var HIDEOBJENUM=["SHOWALL","SHOWPLACEHOLDER","HIDEALL"];var parse_HideObjEnum=parseuint16;function parse_XTI(blob,length){var iSupBook=blob.read_shift(2),itabFirst=blob.read_shift(2,"i"),itabLast=blob.read_shift(2,"i");return[iSupBook,itabFirst,itabLast]}function parse_RkNumber(blob){var b=blob.slice(blob.l,blob.l+4);var fX100=b[0]&1,fInt=b[0]&2;blob.l+=4;b[0]&=~3;var RK=fInt===0?__double([0,0,0,0,b[0],b[1],b[2],b[3]],0):__readInt32LE(b,0)>>2;return fX100?RK/100:RK}function parse_RkRec(blob,length){var ixfe=blob.read_shift(2);var RK=parse_RkNumber(blob);return[ixfe,RK]}function parse_AddinUdf(blob,length){blob.l+=4;length-=4;var l=blob.l+length;var udfName=parse_ShortXLUnicodeString(blob,length);var cb=blob.read_shift(2);l-=blob.l;if(cb!==l)throw"Malformed AddinUdf: padding = "+l+" != "+cb;blob.l+=cb;return udfName}function parse_Ref8U(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(2);var colLast=blob.read_shift(2);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}function parse_RefU(blob,length){var rwFirst=blob.read_shift(2);var rwLast=blob.read_shift(2);var colFirst=blob.read_shift(1);var colLast=blob.read_shift(1);return{s:{c:colFirst,r:rwFirst},e:{c:colLast,r:rwLast}}}var parse_Ref=parse_RefU;function parse_FtCmo(blob,length){blob.l+=4;var ot=blob.read_shift(2);var id=blob.read_shift(2);var flags=blob.read_shift(2);blob.l+=12;return[id,ot,flags]}function parse_FtNts(blob,length){var out={};blob.l+=4;blob.l+=16;out.fSharedNote=blob.read_shift(2);blob.l+=4;return out}function parse_FtCf(blob,length){var out={};blob.l+=4;blob.cf=blob.read_shift(2);return out}var FtTab={21:parse_FtCmo,19:parsenoop,18:function(blob,length){blob.l+=12},17:function(blob,length){blob.l+=8},16:parsenoop,15:parsenoop,13:parse_FtNts,12:function(blob,length){blob.l+=24},11:function(blob,length){blob.l+=10},10:function(blob,length){blob.l+=16},9:parsenoop,8:function(blob,length){blob.l+=6},7:parse_FtCf,6:function(blob,length){blob.l+=6},4:parsenoop,0:function(blob,length){blob.l+=4}};function parse_FtArray(blob,length,ot){var s=blob.l;var fts=[];while(blob.l<s+length){var ft=blob.read_shift(2);blob.l-=2;try{fts.push(FtTab[ft](blob,s+length-blob.l))}catch(e){blob.l=s+length;return fts}}if(blob.l!=s+length)blob.l=s+length;return fts}var parse_FontIndex=parseuint16;function parse_BOF(blob,length){var o={};o.BIFFVer=blob.read_shift(2);length-=2;if(o.BIFFVer!==1536&&o.BIFFVer!==1280)throw"Unexpected BIFF Ver "+o.BIFFVer;blob.read_shift(length);return o}function parse_InterfaceHdr(blob,length){if(length===0)return 1200;var q;if((q=blob.read_shift(2))!==1200)throw"InterfaceHdr codePage "+q;return 1200}function parse_WriteAccess(blob,length,opts){if(opts.enc){blob.l+=length;return""}var l=blob.l;var UserName=parse_XLUnicodeString(blob,0,opts);blob.read_shift(length+l-blob.l);return UserName}function parse_BoundSheet8(blob,length,opts){var pos=blob.read_shift(4);var hidden=blob.read_shift(1)>>6;var dt=blob.read_shift(1);switch(dt){case 0:dt="Worksheet";break;case 1:dt="Macrosheet";break;case 2:dt="Chartsheet";break;case 6:dt="VBAModule";break}var name=parse_ShortXLUnicodeString(blob,0,opts);return{pos:pos,hs:hidden,dt:dt,name:name}}function parse_SST(blob,length){var cnt=blob.read_shift(4);var ucnt=blob.read_shift(4);var strs=[];for(var i=0;i!=ucnt;++i){strs.push(parse_XLUnicodeRichExtendedString(blob))}strs.Count=cnt;strs.Unique=ucnt;return strs}function parse_ExtSST(blob,length){var extsst={};extsst.dsst=blob.read_shift(2);blob.l+=length-2;return extsst}function parse_Row(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2),Col=blob.read_shift(2),rht=blob.read_shift(2);blob.read_shift(4);var flags=blob.read_shift(1);blob.read_shift(1);blob.read_shift(2);return{r:rw,c:col,cnt:Col-col}}function parse_ForceFullCalculation(blob,length){var header=parse_frtHeader(blob);if(header.type!=2211)throw"Invalid Future Record "+header.type;var fullcalc=blob.read_shift(4);return fullcalc!==0}var parse_CompressPictures=parsenoop2;function parse_RecalcId(blob,length){blob.read_shift(2);return blob.read_shift(4)}function parse_DefaultRowHeight(blob,length){var f=blob.read_shift(2),miyRw;miyRw=blob.read_shift(2);var fl={Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};return[fl,miyRw]}function parse_Window1(blob,length){var xWn=blob.read_shift(2),yWn=blob.read_shift(2),dxWn=blob.read_shift(2),dyWn=blob.read_shift(2);var flags=blob.read_shift(2),iTabCur=blob.read_shift(2),iTabFirst=blob.read_shift(2);var ctabSel=blob.read_shift(2),wTabRatio=blob.read_shift(2);return{Pos:[xWn,yWn],Dim:[dxWn,dyWn],Flags:flags,CurTab:iTabCur,FirstTab:iTabFirst,Selected:ctabSel,TabRatio:wTabRatio}}function parse_Font(blob,length,opts){blob.l+=14;var name=parse_ShortXLUnicodeString(blob,0,opts);return name}function parse_LabelSst(blob,length){var cell=parse_Cell(blob);cell.isst=blob.read_shift(4);return cell}function parse_Label(blob,length,opts){var cell=parse_Cell(blob,6);var str=parse_XLUnicodeString(blob,length-6,opts);cell.val=str;return cell}function parse_Format(blob,length,opts){var ifmt=blob.read_shift(2);var fmtstr=parse_XLUnicodeString2(blob,0,opts);return[ifmt,fmtstr]}function parse_Dimensions(blob,length){var w=length===10?2:4;var r=blob.read_shift(w),R=blob.read_shift(w),c=blob.read_shift(2),C=blob.read_shift(2);blob.l+=2;return{s:{r:r,c:c},e:{r:R,c:C}}}function parse_RK(blob,length){var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrec=parse_RkRec(blob);return{r:rw,c:col,ixfe:rkrec[0],rknum:rkrec[1]}}function parse_MulRk(blob,length){var target=blob.l+length-2;var rw=blob.read_shift(2),col=blob.read_shift(2);var rkrecs=[];while(blob.l<target)rkrecs.push(parse_RkRec(blob));if(blob.l!==target)throw"MulRK read error";var lastcol=blob.read_shift(2);if(rkrecs.length!=lastcol-col+1)throw"MulRK length mismatch";return{r:rw,c:col,C:lastcol,rkrec:rkrecs}}var parse_CellXF=parsenoop;var parse_StyleXF=parsenoop;function parse_XF(blob,length){var o={};o.ifnt=blob.read_shift(2);o.ifmt=blob.read_shift(2);o.flags=blob.read_shift(2);o.fStyle=o.flags>>2&1;length-=6;o.data=o.fStyle?parse_StyleXF(blob,length):parse_CellXF(blob,length);return o}function parse_Guts(blob,length){blob.l+=4;var out=[blob.read_shift(2),blob.read_shift(2)];if(out[0]!==0)out[0]--;if(out[1]!==0)out[1]--;if(out[0]>7||out[1]>7)throw"Bad Gutters: "+out;return out}function parse_BoolErr(blob,length){var cell=parse_Cell(blob,6);var val=parse_Bes(blob,2);cell.val=val;cell.t=val===true||val===false?"b":"e";return cell}function parse_Number(blob,length){var cell=parse_Cell(blob,6);var xnum=parse_Xnum(blob,8);cell.val=xnum;return cell}var parse_XLHeaderFooter=parse_OptXLUnicodeString;function parse_SupBook(blob,length,opts){var end=blob.l+length;var ctab=blob.read_shift(2);var cch=blob.read_shift(2);var virtPath;if(cch>=1&&cch<=255)virtPath=parse_XLUnicodeStringNoCch(blob,cch);var rgst=blob.read_shift(end-blob.l);opts.sbcch=cch;return[cch,ctab,virtPath,rgst]}function parse_ExternName(blob,length,opts){var flags=blob.read_shift(2);var body;var o={fBuiltIn:flags&1,fWantAdvise:flags>>>1&1,fWantPict:flags>>>2&1,fOle:flags>>>3&1,fOleLink:flags>>>4&1,cf:flags>>>5&1023,fIcon:flags>>>15&1};if(opts.sbcch===14849)body=parse_AddinUdf(blob,length-2);o.body=body||blob.read_shift(length-2);return o}function parse_Lbl(blob,length,opts){if(opts.biff<8)return parse_Label(blob,length,opts);var target=blob.l+length;var flags=blob.read_shift(2);var chKey=blob.read_shift(1);var cch=blob.read_shift(1);var cce=blob.read_shift(2);blob.l+=2;var itab=blob.read_shift(2);blob.l+=4;var name=parse_XLUnicodeStringNoCch(blob,cch,opts);var rgce=parse_NameParsedFormula(blob,target-blob.l,opts,cce);return{chKey:chKey,Name:name,rgce:rgce}}function parse_ExternSheet(blob,length,opts){if(opts.biff<8)return parse_ShortXLUnicodeString(blob,length,opts);var o=parslurp2(blob,length,parse_XTI);var oo=[];if(opts.sbcch===1025){for(var i=0;i!=o.length;++i)oo.push(opts.snames[o[i][1]]);return oo}else return o}function parse_ShrFmla(blob,length,opts){var ref=parse_RefU(blob,6);blob.l++;var cUse=blob.read_shift(1);length-=8;return[parse_SharedParsedFormula(blob,length,opts),cUse]}function parse_Array(blob,length,opts){var ref=parse_Ref(blob,6);blob.l+=6;length-=12;return[ref,parse_ArrayParsedFormula(blob,length,opts,ref)]}function parse_MTRSettings(blob,length){var fMTREnabled=blob.read_shift(4)!==0;var fUserSetThreadCount=blob.read_shift(4)!==0;var cUserThreadCount=blob.read_shift(4);return[fMTREnabled,fUserSetThreadCount,cUserThreadCount]}function parse_NoteSh(blob,length,opts){if(opts.biff<8)return;var row=blob.read_shift(2),col=blob.read_shift(2);var flags=blob.read_shift(2),idObj=blob.read_shift(2);var stAuthor=parse_XLUnicodeString2(blob,0,opts);if(opts.biff<8)blob.read_shift(1);return[{r:row,c:col},stAuthor,idObj,flags]}function parse_Note(blob,length,opts){return parse_NoteSh(blob,length,opts)}function parse_MergeCells(blob,length){var merges=[];var cmcs=blob.read_shift(2);while(cmcs--)merges.push(parse_Ref8U(blob,length));return merges}function parse_Obj(blob,length){var cmo=parse_FtCmo(blob,22);var fts=parse_FtArray(blob,length-22,cmo[1]);return{cmo:cmo,ft:fts}}function parse_TxO(blob,length,opts){var s=blob.l;try{blob.l+=4;var ot=(opts.lastobj||{cmo:[0,0]}).cmo[1];var controlInfo;if([0,5,7,11,12,14].indexOf(ot)==-1)blob.l+=6;else controlInfo=parse_ControlInfo(blob,6,opts);var cchText=blob.read_shift(2);var cbRuns=blob.read_shift(2);var ifntEmpty=parse_FontIndex(blob,2);var len=blob.read_shift(2);blob.l+=len;var texts="";for(var i=1;i<blob.lens.length-1;++i){if(blob.l-s!=blob.lens[i])throw"TxO: bad continue record";var hdr=blob[blob.l];var t=parse_XLUnicodeStringNoCch(blob,blob.lens[i+1]-blob.lens[i]-1);texts+=t;if(texts.length>=(hdr?cchText:2*cchText))break}if(texts.length!==cchText&&texts.length!==cchText*2){throw"cchText: "+cchText+" != "+texts.length}blob.l=s+length;return{t:texts}}catch(e){blob.l=s+length;return{t:texts||""}}}var parse_HLink=function(blob,length){var ref=parse_Ref8U(blob,8);blob.l+=16;var hlink=parse_Hyperlink(blob,length-24);return[ref,hlink]};var parse_HLinkTooltip=function(blob,length){var end=blob.l+length;blob.read_shift(2);var ref=parse_Ref8U(blob,8);var wzTooltip=blob.read_shift((length-10)/2,"dbcs");wzTooltip=wzTooltip.replace(chr0,"");return[ref,wzTooltip]};function parse_Country(blob,length){var o=[],d;d=blob.read_shift(2);o[0]=CountryEnum[d]||d;d=blob.read_shift(2);o[1]=CountryEnum[d]||d;return o}var parse_Backup=parsebool;var parse_Blank=parse_Cell;var parse_BottomMargin=parse_Xnum;var parse_BuiltInFnGroupCount=parseuint16;var parse_CalcCount=parseuint16;var parse_CalcDelta=parse_Xnum;var parse_CalcIter=parsebool;var parse_CalcMode=parseuint16;var parse_CalcPrecision=parsebool;var parse_CalcRefMode=parsenoop2;var parse_CalcSaveRecalc=parsebool;var parse_CodePage=parseuint16;var parse_Compat12=parsebool;var parse_Date1904=parsebool;var parse_DefColWidth=parseuint16;var parse_DSF=parsenoop2;var parse_EntExU2=parsenoop2;var parse_EOF=parsenoop2;var parse_Excel9File=parsenoop2;var parse_FeatHdr=parsenoop2;var parse_FontX=parseuint16;var parse_Footer=parse_XLHeaderFooter;var parse_GridSet=parseuint16;var parse_HCenter=parsebool;var parse_Header=parse_XLHeaderFooter;var parse_HideObj=parse_HideObjEnum;var parse_InterfaceEnd=parsenoop2;var parse_LeftMargin=parse_Xnum;var parse_Mms=parsenoop2;var parse_ObjProtect=parsebool;var parse_Password=parseuint16;var parse_PrintGrid=parsebool;var parse_PrintRowCol=parsebool;var parse_PrintSize=parseuint16;var parse_Prot4Rev=parsebool;var parse_Prot4RevPass=parseuint16;var parse_Protect=parsebool;var parse_RefreshAll=parsebool;var parse_RightMargin=parse_Xnum;
18580 dosDate; 18560 var parse_RRTabId=parseuint16a;var parse_ScenarioProtect=parsebool;var parse_Scl=parseuint16a;var parse_String=parse_XLUnicodeString;var parse_SxBool=parsebool;var parse_TopMargin=parse_Xnum;var parse_UsesELFs=parsebool;var parse_VCenter=parsebool;var parse_WinProtect=parsebool;var parse_WriteProtect=parsenoop;var parse_VerticalPageBreaks=parsenoop;var parse_HorizontalPageBreaks=parsenoop;var parse_Selection=parsenoop;var parse_Continue=parsenoop;var parse_Pane=parsenoop;var parse_Pls=parsenoop;var parse_DCon=parsenoop;var parse_DConRef=parsenoop;var parse_DConName=parsenoop;var parse_XCT=parsenoop;var parse_CRN=parsenoop;var parse_FileSharing=parsenoop;var parse_Uncalced=parsenoop;var parse_Template=parsenoop;var parse_Intl=parsenoop;var parse_ColInfo=parsenoop;var parse_WsBool=parsenoop;var parse_Sort=parsenoop;var parse_Palette=parsenoop;var parse_Sync=parsenoop;var parse_LPr=parsenoop;var parse_DxGCol=parsenoop;var parse_FnGroupName=parsenoop;var parse_FilterMode=parsenoop;var parse_AutoFilterInfo=parsenoop;var parse_AutoFilter=parsenoop;var parse_Setup=parsenoop;var parse_ScenMan=parsenoop;var parse_SCENARIO=parsenoop;var parse_SxView=parsenoop;var parse_Sxvd=parsenoop;var parse_SXVI=parsenoop;var parse_SxIvd=parsenoop;var parse_SXLI=parsenoop;var parse_SXPI=parsenoop;var parse_DocRoute=parsenoop;var parse_RecipName=parsenoop;var parse_MulBlank=parsenoop;var parse_SXDI=parsenoop;var parse_SXDB=parsenoop;var parse_SXFDB=parsenoop;var parse_SXDBB=parsenoop;var parse_SXNum=parsenoop;var parse_SxErr=parsenoop;var parse_SXInt=parsenoop;var parse_SXString=parsenoop;var parse_SXDtr=parsenoop;var parse_SxNil=parsenoop;var parse_SXTbl=parsenoop;var parse_SXTBRGIITM=parsenoop;var parse_SxTbpg=parsenoop;var parse_ObProj=parsenoop;var parse_SXStreamID=parsenoop;var parse_DBCell=parsenoop;var parse_SXRng=parsenoop;var parse_SxIsxoper=parsenoop;var parse_BookBool=parsenoop;var parse_DbOrParamQry=parsenoop;var parse_OleObjectSize=parsenoop;var parse_SXVS=parsenoop;var parse_BkHim=parsenoop;var parse_MsoDrawingGroup=parsenoop;var parse_MsoDrawing=parsenoop;var parse_MsoDrawingSelection=parsenoop;var parse_PhoneticInfo=parsenoop;var parse_SxRule=parsenoop;var parse_SXEx=parsenoop;var parse_SxFilt=parsenoop;var parse_SxDXF=parsenoop;var parse_SxItm=parsenoop;var parse_SxName=parsenoop;var parse_SxSelect=parsenoop;var parse_SXPair=parsenoop;var parse_SxFmla=parsenoop;var parse_SxFormat=parsenoop;var parse_SXVDEx=parsenoop;var parse_SXFormula=parsenoop;var parse_SXDBEx=parsenoop;var parse_RRDInsDel=parsenoop;var parse_RRDHead=parsenoop;var parse_RRDChgCell=parsenoop;var parse_RRDRenSheet=parsenoop;var parse_RRSort=parsenoop;var parse_RRDMove=parsenoop;var parse_RRFormat=parsenoop;var parse_RRAutoFmt=parsenoop;var parse_RRInsertSh=parsenoop;var parse_RRDMoveBegin=parsenoop;var parse_RRDMoveEnd=parsenoop;var parse_RRDInsDelBegin=parsenoop;var parse_RRDInsDelEnd=parsenoop;var parse_RRDConflict=parsenoop;var parse_RRDDefName=parsenoop;var parse_RRDRstEtxp=parsenoop;var parse_LRng=parsenoop;var parse_CUsr=parsenoop;var parse_CbUsr=parsenoop;var parse_UsrInfo=parsenoop;var parse_UsrExcl=parsenoop;var parse_FileLock=parsenoop;var parse_RRDInfo=parsenoop;var parse_BCUsrs=parsenoop;var parse_UsrChk=parsenoop;var parse_UserBView=parsenoop;var parse_UserSViewBegin=parsenoop;var parse_UserSViewEnd=parsenoop;var parse_RRDUserView=parsenoop;var parse_Qsi=parsenoop;var parse_CondFmt=parsenoop;var parse_CF=parsenoop;var parse_DVal=parsenoop;var parse_DConBin=parsenoop;var parse_Lel=parsenoop;var parse_CodeName=parse_XLUnicodeString;var parse_SXFDBType=parsenoop;var parse_ObNoMacros=parsenoop;var parse_Dv=parsenoop;var parse_Index=parsenoop;var parse_Table=parsenoop;var parse_Window2=parsenoop;var parse_Style=parsenoop;var parse_BigName=parsenoop;var parse_ContinueBigName=parsenoop;var parse_WebPub=parsenoop;var parse_QsiSXTag=parsenoop;var parse_DBQueryExt=parsenoop;var parse_ExtString=parsenoop;var parse_TxtQry=parsenoop;var parse_Qsir=parsenoop;var parse_Qsif=parsenoop;var parse_RRDTQSIF=parsenoop;var parse_OleDbConn=parsenoop;var parse_WOpt=parsenoop;var parse_SXViewEx=parsenoop;var parse_SXTH=parsenoop;var parse_SXPIEx=parsenoop;var parse_SXVDTEx=parsenoop;var parse_SXViewEx9=parsenoop;var parse_ContinueFrt=parsenoop;var parse_RealTimeData=parsenoop;var parse_ChartFrtInfo=parsenoop;var parse_FrtWrapper=parsenoop;var parse_StartBlock=parsenoop;var parse_EndBlock=parsenoop;var parse_StartObject=parsenoop;var parse_EndObject=parsenoop;var parse_CatLab=parsenoop;var parse_YMult=parsenoop;var parse_SXViewLink=parsenoop;var parse_PivotChartBits=parsenoop;var parse_FrtFontList=parsenoop;var parse_SheetExt=parsenoop;var parse_BookExt=parsenoop;var parse_SXAddl=parsenoop;var parse_CrErr=parsenoop;var parse_HFPicture=parsenoop;var parse_Feat=parsenoop;var parse_DataLabExt=parsenoop;var parse_DataLabExtContents=parsenoop;var parse_CellWatch=parsenoop;var parse_FeatHdr11=parsenoop;var parse_Feature11=parsenoop;var parse_DropDownObjIds=parsenoop;var parse_ContinueFrt11=parsenoop;var parse_DConn=parsenoop;var parse_List12=parsenoop;var parse_Feature12=parsenoop;var parse_CondFmt12=parsenoop;var parse_CF12=parsenoop;var parse_CFEx=parsenoop;var parse_XFCRC=parsenoop;var parse_XFExt=parsenoop;var parse_AutoFilter12=parsenoop;var parse_ContinueFrt12=parsenoop;var parse_MDTInfo=parsenoop;var parse_MDXStr=parsenoop;var parse_MDXTuple=parsenoop;var parse_MDXSet=parsenoop;var parse_MDXProp=parsenoop;var parse_MDXKPI=parsenoop;var parse_MDB=parsenoop;var parse_PLV=parsenoop;var parse_DXF=parsenoop;var parse_TableStyles=parsenoop;var parse_TableStyle=parsenoop;var parse_TableStyleElement=parsenoop;var parse_StyleExt=parsenoop;var parse_NamePublish=parsenoop;var parse_NameCmt=parsenoop;var parse_SortData=parsenoop;var parse_Theme=parsenoop;var parse_GUIDTypeLib=parsenoop;var parse_FnGrp12=parsenoop;var parse_NameFnGrp12=parsenoop;var parse_HeaderFooter=parsenoop;var parse_CrtLayout12=parsenoop;var parse_CrtMlFrt=parsenoop;var parse_CrtMlFrtContinue=parsenoop;var parse_ShapePropsStream=parsenoop;var parse_TextPropsStream=parsenoop;var parse_RichTextStream=parsenoop;var parse_CrtLayout12A=parsenoop;var parse_Units=parsenoop;var parse_Chart=parsenoop;var parse_Series=parsenoop;var parse_DataFormat=parsenoop;var parse_LineFormat=parsenoop;var parse_MarkerFormat=parsenoop;var parse_AreaFormat=parsenoop;var parse_PieFormat=parsenoop;var parse_AttachedLabel=parsenoop;var parse_SeriesText=parsenoop;var parse_ChartFormat=parsenoop;var parse_Legend=parsenoop;var parse_SeriesList=parsenoop;var parse_Bar=parsenoop;var parse_Line=parsenoop;var parse_Pie=parsenoop;var parse_Area=parsenoop;var parse_Scatter=parsenoop;var parse_CrtLine=parsenoop;var parse_Axis=parsenoop;var parse_Tick=parsenoop;var parse_ValueRange=parsenoop;var parse_CatSerRange=parsenoop;var parse_AxisLine=parsenoop;var parse_CrtLink=parsenoop;var parse_DefaultText=parsenoop;var parse_Text=parsenoop;var parse_ObjectLink=parsenoop;var parse_Frame=parsenoop;var parse_Begin=parsenoop;var parse_End=parsenoop;var parse_PlotArea=parsenoop;var parse_Chart3d=parsenoop;var parse_PicF=parsenoop;var parse_DropBar=parsenoop;var parse_Radar=parsenoop;var parse_Surf=parsenoop;var parse_RadarArea=parsenoop;var parse_AxisParent=parsenoop;var parse_LegendException=parsenoop;var parse_ShtProps=parsenoop;var parse_SerToCrt=parsenoop;var parse_AxesUsed=parsenoop;var parse_SBaseRef=parsenoop;var parse_SerParent=parsenoop;var parse_SerAuxTrend=parsenoop;var parse_IFmtRecord=parsenoop;var parse_Pos=parsenoop;var parse_AlRuns=parsenoop;var parse_BRAI=parsenoop;var parse_SerAuxErrBar=parsenoop;var parse_ClrtClient=parsenoop;var parse_SerFmt=parsenoop;var parse_Chart3DBarShape=parsenoop;var parse_Fbi=parsenoop;var parse_BopPop=parsenoop;var parse_AxcExt=parsenoop;var parse_Dat=parsenoop;var parse_PlotGrowth=parsenoop;var parse_SIIndex=parsenoop;var parse_GelFrame=parsenoop;var parse_BopPopCustom=parsenoop;var parse_Fbi2=parsenoop;function parse_BIFF5String(blob){var len=blob.read_shift(1);return blob.read_shift(len,"sbcs")}var _chr=function(c){return String.fromCharCode(c)};var attregexg=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;var attregex=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function parsexmltag(tag,skip_root){var words=tag.split(/\s+/);var z=[];if(!skip_root)z[0]=words[0];if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}function parsexmltagobj(tag){var words=tag.split(/\s+/);var z={};if(words.length===1)return z;var m=tag.match(attregexg),y,j,w,i;if(m)for(i=0;i!=m.length;++i){y=m[i].match(attregex);if((j=y[1].indexOf(":"))===-1)z[y[1]]=y[2].substr(1,y[2].length-2);else{if(y[1].substr(0,6)==="xmlns:")w="xmlns"+y[1].substr(6);else w=y[1].substr(j+1);z[w]=y[2].substr(1,y[2].length-2)}}return z}var encodings={"&quot;":'"',"&apos;":"'","&gt;":">","&lt;":"<","&amp;":"&"};var rencoding=evert(encodings);var rencstr="&<>'\"".split("");var XML_HEADER='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';var OFFCRYPTO={};var make_offcrypto=function(O,_crypto){var crypto;if(typeof _crypto!=="undefined")crypto=_crypto;else if(typeof require!=="undefined"){try{crypto=require("cry"+"pto")}catch(e){crypto=null}}O.rc4=function(key,data){var S=new Array(256);var c=0,i=0,j=0,t=0;for(i=0;i!=256;++i)S[i]=i;for(i=0;i!=256;++i){j=j+S[i]+key[i%key.length].charCodeAt(0)&255;t=S[i];S[i]=S[j];S[j]=t}i=j=0;out=Buffer(data.length);for(c=0;c!=data.length;++c){i=i+1&255;j=(j+S[i])%256;t=S[i];S[i]=S[j];S[j]=t;out[c]=data[c]^S[S[i]+S[j]&255]}return out};if(crypto){O.md5=function(hex){return crypto.createHash("md5").update(hex).digest("hex")}}else{O.md5=function(hex){throw"unimplemented"}}};make_offcrypto(OFFCRYPTO,typeof crypto!=="undefined"?crypto:undefined);function _JS2ANSI(str){if(typeof cptable!=="undefined")return cptable.utils.encode(1252,str);return str.split("").map(function(x){return x.charCodeAt(0)})}function parse_Version(blob,length){var o={};o.Major=blob.read_shift(2);o.Minor=blob.read_shift(2);return o}function parse_EncryptionHeader(blob,length){var o={};o.Flags=blob.read_shift(4);var tmp=blob.read_shift(4);if(tmp!==0)throw"Unrecognized SizeExtra: "+tmp;o.AlgID=blob.read_shift(4);switch(o.AlgID){case 0:case 26625:case 26126:case 26127:case 26128:break;default:throw"Unrecognized encryption algorithm: "+o.AlgID}parsenoop(blob,length-12);return o}function parse_EncryptionVerifier(blob,length){return parsenoop(blob,length)}function parse_RC4CryptoHeader(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Minor!=2)throw"unrecognized minor version code: "+vers.Minor;if(vers.Major>4||vers.Major<2)throw"unrecognized major version code: "+vers.Major;o.Flags=blob.read_shift(4);length-=4;var sz=blob.read_shift(4);length-=4;o.EncryptionHeader=parse_EncryptionHeader(blob,sz);length-=sz;o.EncryptionVerifier=parse_EncryptionVerifier(blob,length);return o}function parse_RC4Header(blob,length){var o={};var vers=o.EncryptionVersionInfo=parse_Version(blob,4);length-=4;if(vers.Major!=1||vers.Minor!=1)throw"unrecognized version code "+vers.Major+" : "+vers.Minor;o.Salt=blob.read_shift(16);o.EncryptedVerifier=blob.read_shift(16);o.EncryptedVerifierHash=blob.read_shift(16);return o}function crypto_CreatePasswordVerifier_Method1(Password){var Verifier=0,PasswordArray;var PasswordDecoded=_JS2ANSI(Password);var len=PasswordDecoded.length+1,i,PasswordByte;var Intermediate1,Intermediate2,Intermediate3;PasswordArray=new_buf(len);PasswordArray[0]=PasswordDecoded.length;for(i=1;i!=len;++i)PasswordArray[i]=PasswordDecoded[i-1];for(i=len-1;i>=0;--i){PasswordByte=PasswordArray[i];Intermediate1=(Verifier&16384)===0?0:1;Intermediate2=Verifier<<1&32767;Intermediate3=Intermediate1|Intermediate2;Verifier=Intermediate3^PasswordByte}return Verifier^52811}var crypto_CreateXorArray_Method1=function(){var PadArray=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0];var InitialCode=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163];var XorMatrix=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628];var Ror=function(Byte){return(Byte/2|Byte*128)&255};var XorRor=function(byte1,byte2){return Ror(byte1^byte2)};var CreateXorKey_Method1=function(Password){var XorKey=InitialCode[Password.length-1];var CurrentElement=104;for(var i=Password.length-1;i>=0;--i){var Char=Password[i];for(var j=0;j!=7;++j){if(Char&64)XorKey^=XorMatrix[CurrentElement];Char*=2;--CurrentElement}}return XorKey};return function(password){var Password=_JS2ANSI(password);var XorKey=CreateXorKey_Method1(Password);var Index=Password.length;var ObfuscationArray=new_buf(16);for(var i=0;i!=16;++i)ObfuscationArray[i]=0;var Temp,PasswordLastChar,PadIndex;if((Index&1)===1){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[0],Temp);--Index;Temp=XorKey&255;PasswordLastChar=Password[Password.length-1];ObfuscationArray[Index]=XorRor(PasswordLastChar,Temp)}while(Index>0){--Index;Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp)}Index=15;PadIndex=15-Password.length;while(PadIndex>0){Temp=XorKey>>8;ObfuscationArray[Index]=XorRor(PadArray[PadIndex],Temp);--Index;--PadIndex;Temp=XorKey&255;ObfuscationArray[Index]=XorRor(Password[Index],Temp);--Index;--PadIndex}return ObfuscationArray}}();var crypto_DecryptData_Method1=function(password,Data,XorArrayIndex,XorArray,O){if(!O)O=Data;if(!XorArray)XorArray=crypto_CreateXorArray_Method1(password);var Index,Value;for(Index=0;Index!=Data.length;++Index){Value=Data[Index];Value^=XorArray[XorArrayIndex];Value=(Value>>5|Value<<3)&255;O[Index]=Value;++XorArrayIndex}return[O,XorArrayIndex,XorArray]};var crypto_MakeXorDecryptor=function(password){var XorArrayIndex=0,XorArray=crypto_CreateXorArray_Method1(password);return function(Data){var O=crypto_DecryptData_Method1(null,Data,XorArrayIndex,XorArray);XorArrayIndex=O[1];return O[0]}};function parse_XORObfuscation(blob,length,opts,out){var o={key:parseuint16(blob),verificationBytes:parseuint16(blob)};if(opts.password)o.verifier=crypto_CreatePasswordVerifier_Method1(opts.password);out.valid=o.verificationBytes===o.verifier;if(out.valid)out.insitu_decrypt=crypto_MakeXorDecryptor(opts.password);return o}function parse_FilePassHeader(blob,length,oo){var o=oo||{};o.Info=blob.read_shift(2);blob.l-=2;if(o.Info===1)o.Data=parse_RC4Header(blob,length);else o.Data=parse_RC4CryptoHeader(blob,length);return o}function parse_FilePass(blob,length,opts){var o={Type:blob.read_shift(2)};if(o.Type)parse_FilePassHeader(blob,length-2,o);else parse_XORObfuscation(blob,length-2,opts,o);return o}function parseread(l){return function(blob,length){blob.l+=l;return}}function parseread1(blob,length){blob.l+=1;return}function parse_ColRelU(blob,length){var c=blob.read_shift(2);return[c&16383,c>>14&1,c>>15&1]}function parse_RgceArea(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceAreaRel(blob,length){var r=blob.read_shift(2),R=blob.read_shift(2);var c=parse_ColRelU(blob,2);var C=parse_ColRelU(blob,2);return{s:{r:r,c:c[0],cRel:c[1],rRel:c[2]},e:{r:R,c:C[0],cRel:C[1],rRel:C[2]}}}function parse_RgceLoc(blob,length){var r=blob.read_shift(2);var c=parse_ColRelU(blob,2);return{r:r,c:c[0],cRel:c[1],rRel:c[2]}}function parse_RgceLocRel(blob,length){var r=blob.read_shift(2);var cl=blob.read_shift(2);var cRel=(cl&32768)>>15,rRel=(cl&16384)>>14;cl&=16383;if(cRel!==0)while(cl>=256)cl-=256;return{r:r,c:cl,cRel:cRel,rRel:rRel}}function parse_PtgArea(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceArea(blob,8);return[type,area]}function parse_PtgArea3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);var area=parse_RgceArea(blob,8);return[type,ixti,area]}function parse_PtgAreaErr(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=8;return[type]}function parse_PtgAreaErr3d(blob,length){var type=(blob[blob.l++]&96)>>5;var ixti=blob.read_shift(2);blob.l+=8;return[type,ixti]}function parse_PtgAreaN(blob,length){var type=(blob[blob.l++]&96)>>5;var area=parse_RgceAreaRel(blob,8);return[type,area]}function parse_PtgArray(blob,length){var type=(blob[blob.l++]&96)>>5;blob.l+=7;return[type]}function parse_PtgAttrBaxcel(blob,length){var bitSemi=blob[blob.l+1]&1;var bitBaxcel=1;blob.l+=4;return[bitSemi,bitBaxcel]}function parse_PtgAttrChoose(blob,length){blob.l+=2;var offset=blob.read_shift(2);var o=[];for(var i=0;i<=offset;++i)o.push(blob.read_shift(2));return o}function parse_PtgAttrGoto(blob,length){var bitGoto=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitGoto,blob.read_shift(2)]}function parse_PtgAttrIf(blob,length){var bitIf=blob[blob.l+1]&255?1:0;blob.l+=2;return[bitIf,blob.read_shift(2)]}function parse_PtgAttrSemi(blob,length){var bitSemi=blob[blob.l+1]&255?1:0;blob.l+=4;return[bitSemi]}function parse_PtgAttrSpaceType(blob,length){var type=blob.read_shift(1),cch=blob.read_shift(1);return[type,cch]}function parse_PtgAttrSpace(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgAttrSpaceSemi(blob,length){blob.read_shift(2);return parse_PtgAttrSpaceType(blob,2)}function parse_PtgRef(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLoc(blob,4);return[type,loc]}function parse_PtgRefN(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var loc=parse_RgceLocRel(blob,4);return[type,loc]}function parse_PtgRef3d(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var ixti=blob.read_shift(2);var loc=parse_RgceLoc(blob,4);return[type,ixti,loc]}function parse_PtgFunc(blob,length){var ptg=blob[blob.l]&31;var type=(blob[blob.l]&96)>>5;blob.l+=1;var iftab=blob.read_shift(2);return[FtabArgc[iftab],Ftab[iftab]]}function parse_PtgFuncVar(blob,length){blob.l++;var cparams=blob.read_shift(1),tab=parsetab(blob);return[cparams,(tab[0]===0?Ftab:Cetab)[tab[1]]]}function parsetab(blob,length){return[blob[blob.l+1]>>7,blob.read_shift(2)&32767]}var parse_PtgAttrSum=parseread(4);var parse_PtgConcat=parseread1;function parse_PtgExp(blob,length){blob.l++;var row=blob.read_shift(2);var col=blob.read_shift(2);return[row,col]}function parse_PtgErr(blob,length){blob.l++;return BERR[blob.read_shift(1)]}function parse_PtgInt(blob,length){blob.l++;return blob.read_shift(2)}function parse_PtgBool(blob,length){blob.l++;return blob.read_shift(1)!==0}function parse_PtgNum(blob,length){blob.l++;return parse_Xnum(blob,8)}function parse_PtgStr(blob,length){blob.l++;return parse_ShortXLUnicodeString(blob)}function parse_SerAr(blob){var val=[];switch(val[0]=blob.read_shift(1)){case 4:val[1]=parsebool(blob,1)?"TRUE":"FALSE";blob.l+=7;break;case 16:val[1]=BERR[blob[blob.l]];blob.l+=8;break;case 0:blob.l+=8;break;case 1:val[1]=parse_Xnum(blob,8);break;case 2:val[1]=parse_XLUnicodeString(blob);break}return val}function parse_PtgExtraMem(blob,cce){var count=blob.read_shift(2);var out=[];for(var i=0;i!=count;++i)out.push(parse_Ref8U(blob,8));return out}function parse_PtgExtraArray(blob){var cols=1+blob.read_shift(1);var rows=1+blob.read_shift(2);for(var i=0,o=[];i!=rows&&(o[i]=[]);++i)for(var j=0;j!=cols;++j)o[i][j]=parse_SerAr(blob);return o}function parse_PtgName(blob,length){var type=blob.read_shift(1)>>>5&3;var nameindex=blob.read_shift(4);return[type,0,nameindex]}function parse_PtgNameX(blob,length){var type=blob.read_shift(1)>>>5&3;var ixti=blob.read_shift(2);var nameindex=blob.read_shift(4);return[type,ixti,nameindex]}function parse_PtgMemArea(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgMemFunc(blob,length){var type=blob.read_shift(1)>>>5&3;var cce=blob.read_shift(2);return[type,cce]}function parse_PtgRefErr(blob,length){var type=blob.read_shift(1)>>>5&3;blob.l+=4;return[type]}var parse_PtgAdd=parseread1;var parse_PtgDiv=parseread1;var parse_PtgEq=parseread1;var parse_PtgGe=parseread1;var parse_PtgGt=parseread1;var parse_PtgIsect=parseread1;var parse_PtgLe=parseread1;var parse_PtgLt=parseread1;var parse_PtgMissArg=parseread1;var parse_PtgMul=parseread1;var parse_PtgNe=parseread1;var parse_PtgParen=parseread1;var parse_PtgPercent=parseread1;var parse_PtgPower=parseread1;var parse_PtgRange=parseread1;var parse_PtgSub=parseread1;var parse_PtgUminus=parseread1;var parse_PtgUnion=parseread1;var parse_PtgUplus=parseread1;var parse_PtgMemErr=parsenoop;var parse_PtgMemNoMem=parsenoop;var parse_PtgRefErr3d=parsenoop;var parse_PtgTbl=parsenoop;var PtgTypes={1:{n:"PtgExp",f:parse_PtgExp},2:{n:"PtgTbl",f:parse_PtgTbl},3:{n:"PtgAdd",f:parse_PtgAdd},4:{n:"PtgSub",f:parse_PtgSub},5:{n:"PtgMul",f:parse_PtgMul},6:{n:"PtgDiv",f:parse_PtgDiv},7:{n:"PtgPower",f:parse_PtgPower},8:{n:"PtgConcat",f:parse_PtgConcat},9:{n:"PtgLt",f:parse_PtgLt},10:{n:"PtgLe",f:parse_PtgLe},11:{n:"PtgEq",f:parse_PtgEq},12:{n:"PtgGe",f:parse_PtgGe},13:{n:"PtgGt",f:parse_PtgGt},14:{n:"PtgNe",f:parse_PtgNe},15:{n:"PtgIsect",f:parse_PtgIsect},16:{n:"PtgUnion",f:parse_PtgUnion},17:{n:"PtgRange",f:parse_PtgRange},18:{n:"PtgUplus",f:parse_PtgUplus},19:{n:"PtgUminus",f:parse_PtgUminus},20:{n:"PtgPercent",f:parse_PtgPercent},21:{n:"PtgParen",f:parse_PtgParen},22:{n:"PtgMissArg",f:parse_PtgMissArg},23:{n:"PtgStr",f:parse_PtgStr},28:{n:"PtgErr",f:parse_PtgErr},29:{n:"PtgBool",f:parse_PtgBool},30:{n:"PtgInt",f:parse_PtgInt},31:{n:"PtgNum",f:parse_PtgNum},32:{n:"PtgArray",f:parse_PtgArray},33:{n:"PtgFunc",f:parse_PtgFunc},34:{n:"PtgFuncVar",f:parse_PtgFuncVar},35:{n:"PtgName",f:parse_PtgName},36:{n:"PtgRef",f:parse_PtgRef},37:{n:"PtgArea",f:parse_PtgArea},38:{n:"PtgMemArea",f:parse_PtgMemArea},39:{n:"PtgMemErr",f:parse_PtgMemErr},40:{n:"PtgMemNoMem",f:parse_PtgMemNoMem},41:{n:"PtgMemFunc",f:parse_PtgMemFunc},42:{n:"PtgRefErr",f:parse_PtgRefErr},43:{n:"PtgAreaErr",f:parse_PtgAreaErr},44:{n:"PtgRefN",f:parse_PtgRefN},45:{n:"PtgAreaN",f:parse_PtgAreaN},57:{n:"PtgNameX",f:parse_PtgNameX},58:{n:"PtgRef3d",f:parse_PtgRef3d},59:{n:"PtgArea3d",f:parse_PtgArea3d},60:{n:"PtgRefErr3d",f:parse_PtgRefErr3d},61:{n:"PtgAreaErr3d",f:parse_PtgAreaErr3d},255:{}};var PtgDupes={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};(function(){for(var y in PtgDupes)PtgTypes[y]=PtgTypes[PtgDupes[y]]})();var Ptg18={};var Ptg19={1:{n:"PtgAttrSemi",f:parse_PtgAttrSemi},2:{n:"PtgAttrIf",f:parse_PtgAttrIf},4:{n:"PtgAttrChoose",f:parse_PtgAttrChoose},8:{n:"PtgAttrGoto",f:parse_PtgAttrGoto},16:{n:"PtgAttrSum",f:parse_PtgAttrSum},32:{n:"PtgAttrBaxcel",f:parse_PtgAttrBaxcel},64:{n:"PtgAttrSpace",f:parse_PtgAttrSpace},65:{n:"PtgAttrSpaceSemi",f:parse_PtgAttrSpaceSemi},255:{}};var rcregex=/(^|[^A-Za-z])R(\[?)(-?\d+|)\]?C(\[?)(-?\d+|)\]?/g;var rcbase;function rcfunc($$,$1,$2,$3,$4,$5){var R=$3.length>0?parseInt($3,10)|0:0,C=$5.length>0?parseInt($5,10)|0:0;if(C<0&&$4.length===0)C=0;if($4.length>0)C+=rcbase.c;if($2.length>0)R+=rcbase.r;return $1+encode_col(C)+encode_row(R)}function rc_to_a1(fstr,base){rcbase=base;return fstr.replace(rcregex,rcfunc)}function parse_Formula(blob,length,opts){var cell=parse_Cell(blob,6);var val=parse_FormulaValue(blob,8);var flags=blob.read_shift(1);blob.read_shift(1);var chn=blob.read_shift(4);var cbf="";if(opts.biff===5)blob.l+=length-20;else cbf=parse_CellParsedFormula(blob,length-20,opts);return{cell:cell,val:val[0],formula:cbf,shared:flags>>3&1,tt:val[1]}}function parse_FormulaValue(blob){var b;if(__readUInt16LE(blob,blob.l+6)!==65535)return[parse_Xnum(blob),"n"];switch(blob[blob.l]){case 0:blob.l+=8;return["String","s"];case 1:b=blob[blob.l+2]===1;blob.l+=8;return[b,"b"];case 2:b=BERR[blob[blob.l+2]];blob.l+=8;return[b,"e"];case 3:blob.l+=8;return["","s"]}}function parse_RgbExtra(blob,length,rgce,opts){if(opts.biff<8)return parsenoop(blob,length);var target=blob.l+length;var o=[];for(var i=0;i!==rgce.length;++i){switch(rgce[i][0]){case"PtgArray":rgce[i][1]=parse_PtgExtraArray(blob);o.push(rgce[i][1]);break;case"PtgMemArea":rgce[i][2]=parse_PtgExtraMem(blob,rgce[i][1]);o.push(rgce[i][2]);break;default:break}}length=target-blob.l;if(length!==0)o.push(parsenoop(blob,length));return o}function parse_NameParsedFormula(blob,length,opts,cce){var target=blob.l+length;var rgce=parse_Rgce(blob,cce);var rgcb;if(target!==blob.l)rgcb=parse_RgbExtra(blob,target-blob.l,rgce,opts);return[rgce,rgcb]}function parse_CellParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,length-cce-2,rgce,opts);return[rgce,rgcb]}function parse_SharedParsedFormula(blob,length,opts){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);var rgce=parse_Rgce(blob,cce);if(cce==65535)return[[],parsenoop(blob,length-2)];if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_ArrayParsedFormula(blob,length,opts,ref){var target=blob.l+length;var rgcb,cce=blob.read_shift(2);if(cce==65535)return[[],parsenoop(blob,length-2)];var rgce=parse_Rgce(blob,cce);if(length!==cce+2)rgcb=parse_RgbExtra(blob,target-cce-2,rgce,opts);return[rgce,rgcb]}function parse_Rgce(blob,length){var target=blob.l+length;var R,id,ptgs=[];while(target!=blob.l){length=target-blob.l;id=blob[blob.l];R=PtgTypes[id];if(id===24||id===25){id=blob[blob.l+1];R=(id===24?Ptg18:Ptg19)[id]}if(!R||!R.f){ptgs.push(parsenoop(blob,length))}else{ptgs.push([R.n,R.f(blob,length)])}}return ptgs}function mapper(x){return x.map(function f2(y){return y[1]}).join(",")}function stringify_formula(formula,range,cell,supbooks,opts){if(opts!==undefined&&opts.biff===5)return"BIFF5??";var _range=range!==undefined?range:{s:{c:0,r:0}};var stack=[],e1,e2,type,c,ixti,nameidx,r;if(!formula[0]||!formula[0][0])return"";for(var ff=0,fflen=formula[0].length;ff<fflen;++ff){var f=formula[0][ff];switch(f[0]){case"PtgUminus":stack.push("-"+stack.pop());break;case"PtgUplus":stack.push("+"+stack.pop());break;case"PtgPercent":stack.push(stack.pop()+"%");break;case"PtgAdd":e1=stack.pop();e2=stack.pop();stack.push(e2+"+"+e1);break;case"PtgSub":e1=stack.pop();e2=stack.pop();stack.push(e2+"-"+e1);break;case"PtgMul":e1=stack.pop();e2=stack.pop();stack.push(e2+"*"+e1);break;case"PtgDiv":e1=stack.pop();e2=stack.pop();stack.push(e2+"/"+e1);break;case"PtgPower":e1=stack.pop();e2=stack.pop();stack.push(e2+"^"+e1);break;case"PtgConcat":e1=stack.pop();e2=stack.pop();stack.push(e2+"&"+e1);break;case"PtgLt":e1=stack.pop();e2=stack.pop();stack.push(e2+"<"+e1);break;case"PtgLe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<="+e1);break;case"PtgEq":e1=stack.pop();e2=stack.pop();stack.push(e2+"="+e1);break;case"PtgGe":e1=stack.pop();e2=stack.pop();stack.push(e2+">="+e1);break;case"PtgGt":e1=stack.pop();e2=stack.pop();stack.push(e2+">"+e1);break;case"PtgNe":e1=stack.pop();e2=stack.pop();stack.push(e2+"<>"+e1);break;case"PtgIsect":e1=stack.pop();e2=stack.pop();stack.push(e2+" "+e1);break;case"PtgUnion":e1=stack.pop();e2=stack.pop();stack.push(e2+","+e1);break;case"PtgRange":break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgRef":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),_range);stack.push(encode_cell(c));break;case"PtgRefN":type=f[1][0];c=shift_cell(decode_cell(encode_cell(f[1][1])),cell);stack.push(encode_cell(c));break;case"PtgRef3d":type=f[1][0];ixti=f[1][1];c=shift_cell(f[1][2],_range);stack.push(supbooks[1][ixti+1]+"!"+encode_cell(c));break;case"PtgFunc":case"PtgFuncVar":var argc=f[1][0],func=f[1][1];if(!argc)argc=0;var args=stack.slice(-argc);stack.length-=argc;if(func==="User")func=args.shift();stack.push(func+"("+args.join(",")+")");break;case"PtgBool":stack.push(f[1]?"TRUE":"FALSE");break;case"PtgInt":stack.push(f[1]);break;case"PtgNum":stack.push(String(f[1]));break;case"PtgStr":stack.push('"'+f[1]+'"');break;case"PtgErr":stack.push(f[1]);break;case"PtgArea":type=f[1][0];r=shift_range(f[1][1],_range);stack.push(encode_range(r));break;case"PtgArea3d":type=f[1][0];ixti=f[1][1];r=f[1][2];stack.push(supbooks[1][ixti+1]+"!"+encode_range(r));break;case"PtgAttrSum":stack.push("SUM("+stack.pop()+")");break;case"PtgAttrSemi":break;case"PtgName":nameidx=f[1][2];var lbl=supbooks[0][nameidx];var name=lbl.Name;if(name in XLSXFutureFunctions)name=XLSXFutureFunctions[name];stack.push(name);break;case"PtgNameX":var bookidx=f[1][1];nameidx=f[1][2];var externbook;if(supbooks[bookidx+1])externbook=supbooks[bookidx+1][nameidx];else if(supbooks[bookidx-1])externbook=supbooks[bookidx-1][nameidx];if(!externbook)externbook={body:"??NAMEX??"};stack.push(externbook.body);break;case"PtgParen":stack.push("("+stack.pop()+")");break;case"PtgRefErr":stack.push("#REF!");break;case"PtgExp":c={c:f[1][1],r:f[1][0]};var q={c:cell.c,r:cell.r};if(supbooks.sharedf[encode_cell(c)]){var parsedf=supbooks.sharedf[encode_cell(c)];stack.push(stringify_formula(parsedf,_range,q,supbooks,opts))}else{var fnd=false;for(e1=0;e1!=supbooks.arrayf.length;++e1){e2=supbooks.arrayf[e1];if(c.c<e2[0].s.c||c.c>e2[0].e.c)continue;if(c.r<e2[0].s.r||c.r>e2[0].e.r)continue;stack.push(stringify_formula(e2[1],_range,q,supbooks,opts))}if(!fnd)stack.push(f[1])}break;case"PtgArray":stack.push("{"+f[1].map(mapper).join(";")+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":stack.push("");break;case"PtgAreaErr":break;case"PtgAreaN":stack.push("");break;case"PtgRefErr3d":break;case"PtgMemFunc":break;default:throw"Unrecognized Formula Token: "+f}}return stack[0]}var PtgDataType={1:"REFERENCE",2:"VALUE",3:"ARRAY"};var BERR={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"};var Cetab={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"};
18581 18561 var Ftab={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD"};var FtabArgc={2:1,3:1,15:1,16:1,17:1,18:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,65:3,66:3,67:1,68:1,69:1,71:1,72:1,73:1,75:1,76:1,77:1,79:2,80:2,83:1,86:1,90:1,97:2,98:1,99:1,105:1,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,189:3,190:1,195:3,196:3,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,65535:0};var XLSXFutureFunctions={"_xlfn.ACOT":"ACOT","_xlfn.ACOTH":"ACOTH","_xlfn.AGGREGATE":"AGGREGATE","_xlfn.ARABIC":"ARABIC","_xlfn.AVERAGEIF":"AVERAGEIF","_xlfn.AVERAGEIFS":"AVERAGEIFS","_xlfn.BASE":"BASE","_xlfn.BETA.DIST":"BETA.DIST","_xlfn.BETA.INV":"BETA.INV","_xlfn.BINOM.DIST":"BINOM.DIST","_xlfn.BINOM.DIST.RANGE":"BINOM.DIST.RANGE","_xlfn.BINOM.INV":"BINOM.INV","_xlfn.BITAND":"BITAND","_xlfn.BITLSHIFT":"BITLSHIFT","_xlfn.BITOR":"BITOR","_xlfn.BITRSHIFT":"BITRSHIFT","_xlfn.BITXOR":"BITXOR","_xlfn.CEILING.MATH":"CEILING.MATH","_xlfn.CEILING.PRECISE":"CEILING.PRECISE","_xlfn.CHISQ.DIST":"CHISQ.DIST","_xlfn.CHISQ.DIST.RT":"CHISQ.DIST.RT","_xlfn.CHISQ.INV":"CHISQ.INV","_xlfn.CHISQ.INV.RT":"CHISQ.INV.RT","_xlfn.CHISQ.TEST":"CHISQ.TEST","_xlfn.COMBINA":"COMBINA","_xlfn.CONFIDENCE.NORM":"CONFIDENCE.NORM","_xlfn.CONFIDENCE.T":"CONFIDENCE.T","_xlfn.COT":"COT","_xlfn.COTH":"COTH","_xlfn.COUNTIFS":"COUNTIFS","_xlfn.COVARIANCE.P":"COVARIANCE.P","_xlfn.COVARIANCE.S":"COVARIANCE.S","_xlfn.CSC":"CSC","_xlfn.CSCH":"CSCH","_xlfn.DAYS":"DAYS","_xlfn.DECIMAL":"DECIMAL","_xlfn.ECMA.CEILING":"ECMA.CEILING","_xlfn.ERF.PRECISE":"ERF.PRECISE","_xlfn.ERFC.PRECISE":"ERFC.PRECISE","_xlfn.EXPON.DIST":"EXPON.DIST","_xlfn.F.DIST":"F.DIST","_xlfn.F.DIST.RT":"F.DIST.RT","_xlfn.F.INV":"F.INV","_xlfn.F.INV.RT":"F.INV.RT","_xlfn.F.TEST":"F.TEST","_xlfn.FILTERXML":"FILTERXML","_xlfn.FLOOR.MATH":"FLOOR.MATH","_xlfn.FLOOR.PRECISE":"FLOOR.PRECISE","_xlfn.FORMULATEXT":"FORMULATEXT","_xlfn.GAMMA":"GAMMA","_xlfn.GAMMA.DIST":"GAMMA.DIST","_xlfn.GAMMA.INV":"GAMMA.INV","_xlfn.GAMMALN.PRECISE":"GAMMALN.PRECISE","_xlfn.GAUSS":"GAUSS","_xlfn.HYPGEOM.DIST":"HYPGEOM.DIST","_xlfn.IFNA":"IFNA","_xlfn.IFERROR":"IFERROR","_xlfn.IMCOSH":"IMCOSH","_xlfn.IMCOT":"IMCOT","_xlfn.IMCSC":"IMCSC","_xlfn.IMCSCH":"IMCSCH","_xlfn.IMSEC":"IMSEC","_xlfn.IMSECH":"IMSECH","_xlfn.IMSINH":"IMSINH","_xlfn.IMTAN":"IMTAN","_xlfn.ISFORMULA":"ISFORMULA","_xlfn.ISO.CEILING":"ISO.CEILING","_xlfn.ISOWEEKNUM":"ISOWEEKNUM","_xlfn.LOGNORM.DIST":"LOGNORM.DIST","_xlfn.LOGNORM.INV":"LOGNORM.INV","_xlfn.MODE.MULT":"MODE.MULT","_xlfn.MODE.SNGL":"MODE.SNGL","_xlfn.MUNIT":"MUNIT","_xlfn.NEGBINOM.DIST":"NEGBINOM.DIST","_xlfn.NETWORKDAYS.INTL":"NETWORKDAYS.INTL","_xlfn.NIGBINOM":"NIGBINOM","_xlfn.NORM.DIST":"NORM.DIST","_xlfn.NORM.INV":"NORM.INV","_xlfn.NORM.S.DIST":"NORM.S.DIST","_xlfn.NORM.S.INV":"NORM.S.INV","_xlfn.NUMBERVALUE":"NUMBERVALUE","_xlfn.PDURATION":"PDURATION","_xlfn.PERCENTILE.EXC":"PERCENTILE.EXC","_xlfn.PERCENTILE.INC":"PERCENTILE.INC","_xlfn.PERCENTRANK.EXC":"PERCENTRANK.EXC","_xlfn.PERCENTRANK.INC":"PERCENTRANK.INC","_xlfn.PERMUTATIONA":"PERMUTATIONA","_xlfn.PHI":"PHI","_xlfn.POISSON.DIST":"POISSON.DIST","_xlfn.QUARTILE.EXC":"QUARTILE.EXC","_xlfn.QUARTILE.INC":"QUARTILE.INC","_xlfn.QUERYSTRING":"QUERYSTRING","_xlfn.RANK.AVG":"RANK.AVG","_xlfn.RANK.EQ":"RANK.EQ","_xlfn.RRI":"RRI","_xlfn.SEC":"SEC","_xlfn.SECH":"SECH","_xlfn.SHEET":"SHEET","_xlfn.SHEETS":"SHEETS","_xlfn.SKEW.P":"SKEW.P","_xlfn.STDEV.P":"STDEV.P","_xlfn.STDEV.S":"STDEV.S","_xlfn.SUMIFS":"SUMIFS","_xlfn.T.DIST":"T.DIST","_xlfn.T.DIST.2T":"T.DIST.2T","_xlfn.T.DIST.RT":"T.DIST.RT","_xlfn.T.INV":"T.INV","_xlfn.T.INV.2T":"T.INV.2T","_xlfn.T.TEST":"T.TEST","_xlfn.UNICHAR":"UNICHAR","_xlfn.UNICODE":"UNICODE","_xlfn.VAR.P":"VAR.P","_xlfn.VAR.S":"VAR.S","_xlfn.WEBSERVICE":"WEBSERVICE","_xlfn.WEIBULL.DIST":"WEIBULL.DIST","_xlfn.WORKDAY.INTL":"WORKDAY.INTL","_xlfn.XOR":"XOR","_xlfn.Z.TEST":"Z.TEST"};var RecordEnum={6:{n:"Formula",f:parse_Formula},10:{n:"EOF",f:parse_EOF},12:{n:"CalcCount",f:parse_CalcCount},13:{n:"CalcMode",f:parse_CalcMode},14:{n:"CalcPrecision",f:parse_CalcPrecision},15:{n:"CalcRefMode",f:parse_CalcRefMode},16:{n:"CalcDelta",f:parse_CalcDelta},17:{n:"CalcIter",f:parse_CalcIter},18:{n:"Protect",f:parse_Protect},19:{n:"Password",f:parse_Password},20:{n:"Header",f:parse_Header},21:{n:"Footer",f:parse_Footer},23:{n:"ExternSheet",f:parse_ExternSheet},24:{n:"Lbl",f:parse_Lbl},25:{n:"WinProtect",f:parse_WinProtect},26:{n:"VerticalPageBreaks",f:parse_VerticalPageBreaks},27:{n:"HorizontalPageBreaks",f:parse_HorizontalPageBreaks},28:{n:"Note",f:parse_Note},29:{n:"Selection",f:parse_Selection},34:{n:"Date1904",f:parse_Date1904},35:{n:"ExternName",f:parse_ExternName},38:{n:"LeftMargin",f:parse_LeftMargin},39:{n:"RightMargin",f:parse_RightMargin},40:{n:"TopMargin",f:parse_TopMargin},41:{n:"BottomMargin",f:parse_BottomMargin},42:{n:"PrintRowCol",f:parse_PrintRowCol},43:{n:"PrintGrid",f:parse_PrintGrid},47:{n:"FilePass",f:parse_FilePass},49:{n:"Font",f:parse_Font},51:{n:"PrintSize",f:parse_PrintSize},60:{n:"Continue",f:parse_Continue},61:{n:"Window1",f:parse_Window1},64:{n:"Backup",f:parse_Backup},65:{n:"Pane",f:parse_Pane},66:{n:"CodePage",f:parse_CodePage},77:{n:"Pls",f:parse_Pls},80:{n:"DCon",f:parse_DCon},81:{n:"DConRef",f:parse_DConRef},82:{n:"DConName",f:parse_DConName},85:{n:"DefColWidth",f:parse_DefColWidth},89:{n:"XCT",f:parse_XCT},90:{n:"CRN",f:parse_CRN},91:{n:"FileSharing",f:parse_FileSharing},92:{n:"WriteAccess",f:parse_WriteAccess},93:{n:"Obj",f:parse_Obj},94:{n:"Uncalced",f:parse_Uncalced},95:{n:"CalcSaveRecalc",f:parse_CalcSaveRecalc},96:{n:"Template",f:parse_Template},97:{n:"Intl",f:parse_Intl},99:{n:"ObjProtect",f:parse_ObjProtect},125:{n:"ColInfo",f:parse_ColInfo},128:{n:"Guts",f:parse_Guts},129:{n:"WsBool",f:parse_WsBool},130:{n:"GridSet",f:parse_GridSet},131:{n:"HCenter",f:parse_HCenter},132:{n:"VCenter",f:parse_VCenter},133:{n:"BoundSheet8",f:parse_BoundSheet8},134:{n:"WriteProtect",f:parse_WriteProtect},140:{n:"Country",f:parse_Country},141:{n:"HideObj",f:parse_HideObj},144:{n:"Sort",f:parse_Sort},146:{n:"Palette",f:parse_Palette},151:{n:"Sync",f:parse_Sync},152:{n:"LPr",f:parse_LPr},153:{n:"DxGCol",f:parse_DxGCol},154:{n:"FnGroupName",f:parse_FnGroupName},155:{n:"FilterMode",f:parse_FilterMode},156:{n:"BuiltInFnGroupCount",f:parse_BuiltInFnGroupCount},157:{n:"AutoFilterInfo",f:parse_AutoFilterInfo},158:{n:"AutoFilter",f:parse_AutoFilter},160:{n:"Scl",f:parse_Scl},161:{n:"Setup",f:parse_Setup},174:{n:"ScenMan",f:parse_ScenMan},175:{n:"SCENARIO",f:parse_SCENARIO},176:{n:"SxView",f:parse_SxView},177:{n:"Sxvd",f:parse_Sxvd},178:{n:"SXVI",f:parse_SXVI},180:{n:"SxIvd",f:parse_SxIvd},181:{n:"SXLI",f:parse_SXLI},182:{n:"SXPI",f:parse_SXPI},184:{n:"DocRoute",f:parse_DocRoute},185:{n:"RecipName",f:parse_RecipName},189:{n:"MulRk",f:parse_MulRk},190:{n:"MulBlank",f:parse_MulBlank},193:{n:"Mms",f:parse_Mms},197:{n:"SXDI",f:parse_SXDI},198:{n:"SXDB",f:parse_SXDB},199:{n:"SXFDB",f:parse_SXFDB},200:{n:"SXDBB",f:parse_SXDBB},201:{n:"SXNum",f:parse_SXNum},202:{n:"SxBool",f:parse_SxBool},203:{n:"SxErr",f:parse_SxErr},204:{n:"SXInt",f:parse_SXInt},205:{n:"SXString",f:parse_SXString},206:{n:"SXDtr",f:parse_SXDtr},207:{n:"SxNil",f:parse_SxNil},208:{n:"SXTbl",f:parse_SXTbl},209:{n:"SXTBRGIITM",f:parse_SXTBRGIITM},210:{n:"SxTbpg",f:parse_SxTbpg},211:{n:"ObProj",f:parse_ObProj},213:{n:"SXStreamID",f:parse_SXStreamID},215:{n:"DBCell",f:parse_DBCell},216:{n:"SXRng",f:parse_SXRng},217:{n:"SxIsxoper",f:parse_SxIsxoper},218:{n:"BookBool",f:parse_BookBool},220:{n:"DbOrParamQry",f:parse_DbOrParamQry},221:{n:"ScenarioProtect",f:parse_ScenarioProtect},222:{n:"OleObjectSize",f:parse_OleObjectSize},224:{n:"XF",f:parse_XF},225:{n:"InterfaceHdr",f:parse_InterfaceHdr},226:{n:"InterfaceEnd",f:parse_InterfaceEnd},227:{n:"SXVS",f:parse_SXVS},229:{n:"MergeCells",f:parse_MergeCells},233:{n:"BkHim",f:parse_BkHim},235:{n:"MsoDrawingGroup",f:parse_MsoDrawingGroup},236:{n:"MsoDrawing",f:parse_MsoDrawing},237:{n:"MsoDrawingSelection",f:parse_MsoDrawingSelection},239:{n:"PhoneticInfo",f:parse_PhoneticInfo},240:{n:"SxRule",f:parse_SxRule},241:{n:"SXEx",f:parse_SXEx},242:{n:"SxFilt",f:parse_SxFilt},244:{n:"SxDXF",f:parse_SxDXF},245:{n:"SxItm",f:parse_SxItm},246:{n:"SxName",f:parse_SxName},247:{n:"SxSelect",f:parse_SxSelect},248:{n:"SXPair",f:parse_SXPair},249:{n:"SxFmla",f:parse_SxFmla},251:{n:"SxFormat",f:parse_SxFormat},252:{n:"SST",f:parse_SST},253:{n:"LabelSst",f:parse_LabelSst},255:{n:"ExtSST",f:parse_ExtSST},256:{n:"SXVDEx",f:parse_SXVDEx},259:{n:"SXFormula",f:parse_SXFormula},290:{n:"SXDBEx",f:parse_SXDBEx},311:{n:"RRDInsDel",f:parse_RRDInsDel},312:{n:"RRDHead",f:parse_RRDHead},315:{n:"RRDChgCell",f:parse_RRDChgCell},317:{n:"RRTabId",f:parse_RRTabId},318:{n:"RRDRenSheet",f:parse_RRDRenSheet},319:{n:"RRSort",f:parse_RRSort},320:{n:"RRDMove",f:parse_RRDMove},330:{n:"RRFormat",f:parse_RRFormat},331:{n:"RRAutoFmt",f:parse_RRAutoFmt},333:{n:"RRInsertSh",f:parse_RRInsertSh},334:{n:"RRDMoveBegin",f:parse_RRDMoveBegin},335:{n:"RRDMoveEnd",f:parse_RRDMoveEnd},336:{n:"RRDInsDelBegin",f:parse_RRDInsDelBegin},337:{n:"RRDInsDelEnd",f:parse_RRDInsDelEnd},338:{n:"RRDConflict",f:parse_RRDConflict},339:{n:"RRDDefName",f:parse_RRDDefName},340:{n:"RRDRstEtxp",f:parse_RRDRstEtxp},351:{n:"LRng",f:parse_LRng},352:{n:"UsesELFs",f:parse_UsesELFs},353:{n:"DSF",f:parse_DSF},401:{n:"CUsr",f:parse_CUsr},402:{n:"CbUsr",f:parse_CbUsr},403:{n:"UsrInfo",f:parse_UsrInfo},404:{n:"UsrExcl",f:parse_UsrExcl},405:{n:"FileLock",f:parse_FileLock},406:{n:"RRDInfo",f:parse_RRDInfo},407:{n:"BCUsrs",f:parse_BCUsrs},408:{n:"UsrChk",f:parse_UsrChk},425:{n:"UserBView",f:parse_UserBView},426:{n:"UserSViewBegin",f:parse_UserSViewBegin},427:{n:"UserSViewEnd",f:parse_UserSViewEnd},428:{n:"RRDUserView",f:parse_RRDUserView},429:{n:"Qsi",f:parse_Qsi},430:{n:"SupBook",f:parse_SupBook},431:{n:"Prot4Rev",f:parse_Prot4Rev},432:{n:"CondFmt",f:parse_CondFmt},433:{n:"CF",f:parse_CF},434:{n:"DVal",f:parse_DVal},437:{n:"DConBin",f:parse_DConBin},438:{n:"TxO",f:parse_TxO},439:{n:"RefreshAll",f:parse_RefreshAll},440:{n:"HLink",f:parse_HLink},441:{n:"Lel",f:parse_Lel},442:{n:"CodeName",f:parse_CodeName},443:{n:"SXFDBType",f:parse_SXFDBType},444:{n:"Prot4RevPass",f:parse_Prot4RevPass},445:{n:"ObNoMacros",f:parse_ObNoMacros},446:{n:"Dv",f:parse_Dv},448:{n:"Excel9File",f:parse_Excel9File},449:{n:"RecalcId",f:parse_RecalcId,r:2},450:{n:"EntExU2",f:parse_EntExU2},512:{n:"Dimensions",f:parse_Dimensions},513:{n:"Blank",f:parse_Blank},515:{n:"Number",f:parse_Number},516:{n:"Label",f:parse_Label},517:{n:"BoolErr",f:parse_BoolErr},519:{n:"String",f:parse_String},520:{n:"Row",f:parse_Row},523:{n:"Index",f:parse_Index},545:{n:"Array",f:parse_Array},549:{n:"DefaultRowHeight",f:parse_DefaultRowHeight},566:{n:"Table",f:parse_Table},574:{n:"Window2",f:parse_Window2},638:{n:"RK",f:parse_RK},659:{n:"Style",f:parse_Style},1048:{n:"BigName",f:parse_BigName},1054:{n:"Format",f:parse_Format},1084:{n:"ContinueBigName",f:parse_ContinueBigName},1212:{n:"ShrFmla",f:parse_ShrFmla},2048:{n:"HLinkTooltip",f:parse_HLinkTooltip},2049:{n:"WebPub",f:parse_WebPub},2050:{n:"QsiSXTag",f:parse_QsiSXTag},2051:{n:"DBQueryExt",f:parse_DBQueryExt},2052:{n:"ExtString",f:parse_ExtString},2053:{n:"TxtQry",f:parse_TxtQry},2054:{n:"Qsir",f:parse_Qsir},2055:{n:"Qsif",f:parse_Qsif},2056:{n:"RRDTQSIF",f:parse_RRDTQSIF},2057:{n:"BOF",f:parse_BOF},2058:{n:"OleDbConn",f:parse_OleDbConn},2059:{n:"WOpt",f:parse_WOpt},2060:{n:"SXViewEx",f:parse_SXViewEx},2061:{n:"SXTH",f:parse_SXTH},2062:{n:"SXPIEx",f:parse_SXPIEx},2063:{n:"SXVDTEx",f:parse_SXVDTEx},2064:{n:"SXViewEx9",f:parse_SXViewEx9},2066:{n:"ContinueFrt",f:parse_ContinueFrt},2067:{n:"RealTimeData",f:parse_RealTimeData},2128:{n:"ChartFrtInfo",f:parse_ChartFrtInfo},2129:{n:"FrtWrapper",f:parse_FrtWrapper},2130:{n:"StartBlock",f:parse_StartBlock},2131:{n:"EndBlock",f:parse_EndBlock},2132:{n:"StartObject",f:parse_StartObject},2133:{n:"EndObject",f:parse_EndObject},2134:{n:"CatLab",f:parse_CatLab},2135:{n:"YMult",f:parse_YMult},2136:{n:"SXViewLink",f:parse_SXViewLink},2137:{n:"PivotChartBits",f:parse_PivotChartBits},2138:{n:"FrtFontList",f:parse_FrtFontList},2146:{n:"SheetExt",f:parse_SheetExt},2147:{n:"BookExt",f:parse_BookExt,r:12},2148:{n:"SXAddl",f:parse_SXAddl},2149:{n:"CrErr",f:parse_CrErr},2150:{n:"HFPicture",f:parse_HFPicture},2151:{n:"FeatHdr",f:parse_FeatHdr},2152:{n:"Feat",f:parse_Feat},2154:{n:"DataLabExt",f:parse_DataLabExt},2155:{n:"DataLabExtContents",f:parse_DataLabExtContents},2156:{n:"CellWatch",f:parse_CellWatch},2161:{n:"FeatHdr11",f:parse_FeatHdr11},2162:{n:"Feature11",f:parse_Feature11},2164:{n:"DropDownObjIds",f:parse_DropDownObjIds},2165:{n:"ContinueFrt11",f:parse_ContinueFrt11},2166:{n:"DConn",f:parse_DConn},2167:{n:"List12",f:parse_List12},2168:{n:"Feature12",f:parse_Feature12},2169:{n:"CondFmt12",f:parse_CondFmt12},2170:{n:"CF12",f:parse_CF12},2171:{n:"CFEx",f:parse_CFEx},2172:{n:"XFCRC",f:parse_XFCRC},2173:{n:"XFExt",f:parse_XFExt},2174:{n:"AutoFilter12",f:parse_AutoFilter12},2175:{n:"ContinueFrt12",f:parse_ContinueFrt12},2180:{n:"MDTInfo",f:parse_MDTInfo},2181:{n:"MDXStr",f:parse_MDXStr},2182:{n:"MDXTuple",f:parse_MDXTuple},2183:{n:"MDXSet",f:parse_MDXSet},2184:{n:"MDXProp",f:parse_MDXProp},2185:{n:"MDXKPI",f:parse_MDXKPI},2186:{n:"MDB",f:parse_MDB},2187:{n:"PLV",f:parse_PLV},2188:{n:"Compat12",f:parse_Compat12,r:12},2189:{n:"DXF",f:parse_DXF},2190:{n:"TableStyles",f:parse_TableStyles,r:12},2191:{n:"TableStyle",f:parse_TableStyle},2192:{n:"TableStyleElement",f:parse_TableStyleElement},2194:{n:"StyleExt",f:parse_StyleExt},2195:{n:"NamePublish",f:parse_NamePublish},2196:{n:"NameCmt",f:parse_NameCmt},2197:{n:"SortData",f:parse_SortData},2198:{n:"Theme",f:parse_Theme},2199:{n:"GUIDTypeLib",f:parse_GUIDTypeLib},2200:{n:"FnGrp12",f:parse_FnGrp12},2201:{n:"NameFnGrp12",f:parse_NameFnGrp12},2202:{n:"MTRSettings",f:parse_MTRSettings,r:12},2203:{n:"CompressPictures",f:parse_CompressPictures},2204:{n:"HeaderFooter",f:parse_HeaderFooter},2205:{n:"CrtLayout12",f:parse_CrtLayout12},2206:{n:"CrtMlFrt",f:parse_CrtMlFrt},2207:{n:"CrtMlFrtContinue",f:parse_CrtMlFrtContinue},2211:{n:"ForceFullCalculation",f:parse_ForceFullCalculation},2212:{n:"ShapePropsStream",f:parse_ShapePropsStream},2213:{n:"TextPropsStream",f:parse_TextPropsStream},2214:{n:"RichTextStream",f:parse_RichTextStream},2215:{n:"CrtLayout12A",f:parse_CrtLayout12A},4097:{n:"Units",f:parse_Units},4098:{n:"Chart",f:parse_Chart},4099:{n:"Series",f:parse_Series},4102:{n:"DataFormat",f:parse_DataFormat},4103:{n:"LineFormat",f:parse_LineFormat},4105:{n:"MarkerFormat",f:parse_MarkerFormat},4106:{n:"AreaFormat",f:parse_AreaFormat},4107:{n:"PieFormat",f:parse_PieFormat},4108:{n:"AttachedLabel",f:parse_AttachedLabel},4109:{n:"SeriesText",f:parse_SeriesText},4116:{n:"ChartFormat",f:parse_ChartFormat},4117:{n:"Legend",f:parse_Legend},4118:{n:"SeriesList",f:parse_SeriesList},4119:{n:"Bar",f:parse_Bar},4120:{n:"Line",f:parse_Line},4121:{n:"Pie",f:parse_Pie},4122:{n:"Area",f:parse_Area},4123:{n:"Scatter",f:parse_Scatter},4124:{n:"CrtLine",f:parse_CrtLine},4125:{n:"Axis",f:parse_Axis},4126:{n:"Tick",f:parse_Tick},4127:{n:"ValueRange",f:parse_ValueRange},4128:{n:"CatSerRange",f:parse_CatSerRange},4129:{n:"AxisLine",f:parse_AxisLine},4130:{n:"CrtLink",f:parse_CrtLink},4132:{n:"DefaultText",f:parse_DefaultText},4133:{n:"Text",f:parse_Text},4134:{n:"FontX",f:parse_FontX},4135:{n:"ObjectLink",f:parse_ObjectLink},4146:{n:"Frame",f:parse_Frame},4147:{n:"Begin",f:parse_Begin},4148:{n:"End",f:parse_End},4149:{n:"PlotArea",f:parse_PlotArea},4154:{n:"Chart3d",f:parse_Chart3d},4156:{n:"PicF",f:parse_PicF},4157:{n:"DropBar",f:parse_DropBar},4158:{n:"Radar",f:parse_Radar},4159:{n:"Surf",f:parse_Surf},4160:{n:"RadarArea",f:parse_RadarArea},4161:{n:"AxisParent",f:parse_AxisParent},4163:{n:"LegendException",f:parse_LegendException},4164:{n:"ShtProps",f:parse_ShtProps},4165:{n:"SerToCrt",f:parse_SerToCrt},4166:{n:"AxesUsed",f:parse_AxesUsed},4168:{n:"SBaseRef",f:parse_SBaseRef},4170:{n:"SerParent",f:parse_SerParent},4171:{n:"SerAuxTrend",f:parse_SerAuxTrend},4174:{n:"IFmtRecord",f:parse_IFmtRecord},4175:{n:"Pos",f:parse_Pos},4176:{n:"AlRuns",f:parse_AlRuns},4177:{n:"BRAI",f:parse_BRAI},4187:{n:"SerAuxErrBar",f:parse_SerAuxErrBar},4188:{n:"ClrtClient",f:parse_ClrtClient},4189:{n:"SerFmt",f:parse_SerFmt},4191:{n:"Chart3DBarShape",f:parse_Chart3DBarShape},4192:{n:"Fbi",f:parse_Fbi},4193:{n:"BopPop",f:parse_BopPop},4194:{n:"AxcExt",f:parse_AxcExt},4195:{n:"Dat",f:parse_Dat},4196:{n:"PlotGrowth",f:parse_PlotGrowth},4197:{n:"SIIndex",f:parse_SIIndex},4198:{n:"GelFrame",f:parse_GelFrame},4199:{n:"BopPopCustom",f:parse_BopPopCustom},4200:{n:"Fbi2",f:parse_Fbi2},22:{n:"ExternCount",f:parsenoop},126:{n:"RK",f:parsenoop},127:{n:"ImData",f:parsenoop},135:{n:"Addin",f:parsenoop},136:{n:"Edg",f:parsenoop},137:{n:"Pub",f:parsenoop},145:{n:"Sub",f:parsenoop},148:{n:"LHRecord",f:parsenoop},149:{n:"LHNGraph",f:parsenoop},150:{n:"Sound",f:parsenoop},169:{n:"CoordList",f:parsenoop},171:{n:"GCW",f:parsenoop},188:{n:"ShrFmla",f:parsenoop},194:{n:"AddMenu",f:parsenoop},195:{n:"DelMenu",f:parsenoop},214:{n:"RString",f:parsenoop},223:{n:"UDDesc",f:parsenoop},234:{n:"TabIdConf",f:parsenoop},354:{n:"XL5Modify",f:parsenoop},421:{n:"FileSharing2",f:parsenoop},536:{n:"Name",f:parsenoop},547:{n:"ExternName",f:parse_ExternName},561:{n:"Font",f:parsenoop},1030:{n:"Formula",f:parse_Formula},2157:{n:"FeatInfo",f:parsenoop},2163:{n:"FeatInfo11",f:parsenoop},2177:{n:"SXAddl12",f:parsenoop},2240:{n:"AutoWebPub",f:parsenoop},2241:{n:"ListObj",f:parsenoop},2242:{n:"ListField",f:parsenoop},2243:{n:"ListDV",f:parsenoop},2244:{n:"ListCondFmt",f:parsenoop},2245:{n:"ListCF",f:parsenoop},2246:{n:"FMQry",f:parsenoop},2247:{n:"FMSQry",f:parsenoop},2248:{n:"PLV",f:parsenoop},2249:{n:"LnExt",f:parsenoop},2250:{n:"MkrExt",f:parsenoop},2251:{n:"CrtCoopt",f:parsenoop},0:{}};var CountryEnum={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"};function fix_opts_func(defaults){return function fix_opts(opts){for(var i=0;i!=defaults.length;++i){var d=defaults[i];if(typeof opts[d[0]]==="undefined")opts[d[0]]=d[1];if(d[2]==="n")opts[d[0]]=Number(opts[d[0]])}}}var fixopts=fix_opts_func([["cellNF",false],["cellFormula",true],["sheetRows",0,"n"],["bookSheets",false],["bookProps",false],["bookFiles",false],["password",""],["WTF",false]]);function parse_compobj(obj){var v={};var o=obj.content;var l=28,m;m=__lpstr(o,l);l+=4+__readUInt32LE(o,l);v.UserType=m;m=__readUInt32LE(o,l);l+=4;switch(m){case 0:break;case 4294967295:case 4294967294:l+=4;break;default:if(m>400)throw new Error("Unsupported Clipboard: "+m.toString(16));l+=m}m=__lpstr(o,l);l+=m.length===0?0:5+m.length;v.Reserved1=m;if((m=__readUInt32LE(o,l))!==1907550708)return v;throw"Unsupported Unicode Extension"}function parse_xlscfb(cfb,options){if(!options)options={};fixopts(options);reset_cp();var CompObj=cfb.find("!CompObj");var Summary=cfb.find("!SummaryInformation");var Workbook=cfb.find("/Workbook");if(!Workbook)Workbook=cfb.find("/Book");var CompObjP,SummaryP,WorkbookP;function slurp(R,blob,length,opts){var l=length;var bufs=[];var d=blob.slice(blob.l,blob.l+l);if(opts.enc&&opts.enc.insitu_decrypt)switch(R.n){case"BOF":case"FilePass":case"FileLock":case"InterfaceHdr":case"RRDInfo":case"RRDHead":case"UsrExcl":break;default:if(d.length===0)break;opts.enc.insitu_decrypt(d)}bufs.push(d);blob.l+=l;var next=RecordEnum[__readUInt16LE(blob,blob.l)];while(next!=null&&next.n==="Continue"){l=__readUInt16LE(blob,blob.l+2);bufs.push(blob.slice(blob.l+4,blob.l+4+l));blob.l+=4+l;next=RecordEnum[__readUInt16LE(blob,blob.l)]}var b=bconcat(bufs);prep_blob(b,0);var ll=0;b.lens=[];for(var j=0;j<bufs.length;++j){b.lens.push(ll);ll+=bufs[j].length}return R.f(b,b.length,opts)}function safe_format_xf(p,opts){if(!p.XF)return;try{var fmtid=p.XF.ifmt||0;if(fmtid===0){if(p.t==="n"){if((p.v|0)===p.v)p.w=SSF._general_int(p.v);else p.w=SSF._general_num(p.v)}else p.w=SSF._general(p.v)}else p.w=SSF.format(fmtid,p.v);if(opts.cellNF)p.z=SSF._table[fmtid]}catch(e){if(opts.WTF)throw e}}function make_cell(val,ixfe,t){return{v:val,ixfe:ixfe,t:t}}function parse_workbook(blob,options){var wb={opts:{}};var Sheets={};var out={};var Directory={};var found_sheet=false;var range={};var last_formula=null;var sst=[];var cur_sheet="";var Preamble={};var lastcell,last_cell,cc,cmnt,rng,rngC,rngR;var shared_formulae={};var array_formulae=[];var temp_val;var country;var cell_valid=true;var XFs=[];var addline=function addline(cell,line,options){if(!cell_valid)return;lastcell=cell;last_cell=encode_cell(cell);if(range.s){if(cell.r<range.s.r)range.s.r=cell.r;if(cell.c<range.s.c)range.s.c=cell.c}if(range.e){if(cell.r+1>range.e.r)range.e.r=cell.r+1;if(cell.c+1>range.e.c)range.e.c=cell.c+1}if(options.sheetRows&&lastcell.r>=options.sheetRows)cell_valid=false;else out[last_cell]=line};var opts={enc:false,sbcch:0,snames:[],sharedf:shared_formulae,arrayf:array_formulae,rrtabid:[],lastuser:"",biff:8,codepage:0,winlocked:0,wtf:false};if(options.password)opts.password=options.password;var mergecells=[];var objects=[];var supbooks=[[]];var sbc=0,sbci=0,sbcli=0;supbooks.SheetNames=opts.snames;supbooks.sharedf=opts.sharedf;supbooks.arrayf=opts.arrayf;var last_Rn="";var file_depth=0;while(blob.l<blob.length-1){var s=blob.l;var RecordType=blob.read_shift(2);if(RecordType===0&&last_Rn==="EOF")break;var length=blob.l===blob.length?0:blob.read_shift(2),y;var R=RecordEnum[RecordType];if(R&&R.f){if(options.bookSheets){if(last_Rn==="BoundSheet8"&&R.n!=="BoundSheet8")break}last_Rn=R.n;if(R.r===2||R.r==12){var rt=blob.read_shift(2);length-=2;if(!opts.enc&&rt!==RecordType)throw"rt mismatch";if(R.r==12){blob.l+=10;length-=10}}var val;if(R.n==="EOF")val=R.f(blob,length,opts);else val=slurp(R,blob,length,opts);var Rn=R.n;if(opts.biff===5)switch(Rn){case"Lbl":Rn="Label";break}switch(Rn){case"Date1904":wb.opts.Date1904=val;break;case"WriteProtect":wb.opts.WriteProtect=true;break;case"FilePass":if(!opts.enc)blob.l=0;opts.enc=val;if(opts.WTF)console.error(val);if(!options.password)throw new Error("File is password-protected");if(val.Type!==0)throw new Error("Encryption scheme unsupported");if(!val.valid)throw new Error("Password is incorrect");break;case"WriteAccess":opts.lastuser=val;break;case"FileSharing":break;case"CodePage":if(val===21010)val=1200;opts.codepage=val;set_cp(val);break;case"RRTabId":opts.rrtabid=val;break;case"WinProtect":opts.winlocked=val;break;case"Template":break;case"RefreshAll":wb.opts.RefreshAll=val;break;case"BookBool":break;case"UsesELFs":break;case"MTRSettings":{if(val[0]&&val[1])throw"Unsupported threads: "+val}break;case"CalcCount":wb.opts.CalcCount=val;break;case"CalcDelta":wb.opts.CalcDelta=val;break;case"CalcIter":wb.opts.CalcIter=val;break;case"CalcMode":wb.opts.CalcMode=val;break;case"CalcPrecision":wb.opts.CalcPrecision=val;break;case"CalcSaveRecalc":wb.opts.CalcSaveRecalc=val;break;case"CalcRefMode":opts.CalcRefMode=val;break;case"Uncalced":break;case"ForceFullCalculation":wb.opts.FullCalc=val;break;case"WsBool":break;case"XF":XFs.push(val);break;case"ExtSST":break;case"BookExt":break;case"RichTextStream":break;case"BkHim":break;case"SupBook":supbooks[++sbc]=[val];sbci=0;break;case"ExternName":supbooks[sbc][++sbci]=val;break;case"Index":break;case"Lbl":supbooks[0][++sbcli]=val;break;case"ExternSheet":supbooks[sbc]=supbooks[sbc].concat(val);sbci+=val.length;break;case"Protect":out["!protect"]=val;break;case"Password":if(val!==0&&opts.WTF)console.error("Password verifier: "+val);break;case"Prot4Rev":case"Prot4RevPass":break;case"BoundSheet8":{Directory[val.pos]=val;opts.snames.push(val.name)}break;case"EOF":{if(--file_depth)break;if(range.e){out["!range"]=range;if(range.e.r>0&&range.e.c>0){range.e.r--;range.e.c--;out["!ref"]=encode_range(range);range.e.r++;range.e.c++}if(mergecells.length>0)out["!merges"]=mergecells;if(objects.length>0)out["!objects"]=objects}if(cur_sheet==="")Preamble=out;else Sheets[cur_sheet]=out;out={}}break;case"BOF":{if(val.BIFFVer===1280)opts.biff=5;if(file_depth++)break;cell_valid=true;out={};cur_sheet=(Directory[s]||{name:""}).name;mergecells=[];objects=[]}break;case"Number":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"BoolErr":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.val,t:val.t};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"RK":{temp_val={ixfe:val.ixfe,XF:XFs[val.ixfe],v:val.rknum,t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options)}break;case"MulRk":{for(var j=val.c;j<=val.C;++j){var ixfe=val.rkrec[j-val.c][0];temp_val={ixfe:ixfe,XF:XFs[ixfe],v:val.rkrec[j-val.c][1],t:"n"};if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:j,r:val.r},temp_val,options)}}break;case"Formula":{switch(val.val){case"String":last_formula=val;break;case"Array Formula":throw"Array Formula unsupported";default:temp_val={v:val.val,ixfe:val.cell.ixfe,t:val.tt};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(val.formula,range,val.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(val.cell,temp_val,options);last_formula=val}}break;case"String":{if(last_formula){last_formula.val=val;temp_val={v:last_formula.val,ixfe:last_formula.cell.ixfe,t:"s"};temp_val.XF=XFs[temp_val.ixfe];if(options.cellFormula)temp_val.f="="+stringify_formula(last_formula.formula,range,last_formula.cell,supbooks,opts);if(temp_val.XF)safe_format_xf(temp_val,options);addline(last_formula.cell,temp_val,options);last_formula=null}}break;case"Array":{array_formulae.push(val)}break;case"ShrFmla":{if(!cell_valid)break;shared_formulae[encode_cell(last_formula.cell)]=val[0]}break;case"LabelSst":temp_val=make_cell(sst[val.isst].t,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe];if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Label":temp_val=make_cell(val.val,val.ixfe,"s");temp_val.XF=XFs[temp_val.ixfe];
18582 // date 18562 if(temp_val.XF)safe_format_xf(temp_val,options);addline({c:val.c,r:val.r},temp_val,options);break;case"Dimensions":{if(file_depth===1)range=val}break;case"SST":{sst=val}break;case"Format":{SSF.load(val[1],val[0])}break;case"MergeCells":mergecells=mergecells.concat(val);break;case"Obj":objects[val.cmo[0]]=opts.lastobj=val;break;case"TxO":opts.lastobj.TxO=val;break;case"HLink":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l=val[1]}break;case"HLinkTooltip":{for(rngR=val[0].s.r;rngR<=val[0].e.r;++rngR)for(rngC=val[0].s.c;rngC<=val[0].e.c;++rngC)if(out[encode_cell({c:rngC,r:rngR})])out[encode_cell({c:rngC,r:rngR})].l.tooltip=val[1]}break;case"Note":{if(opts.biff===5)break;cc=out[encode_cell(val[0])];var noteobj=objects[val[2]];if(!cc)break;if(!cc.c)cc.c=[];cmnt={a:val[1],t:noteobj.TxO.t};cc.c.push(cmnt)}break;case"NameCmt":break;default:switch(R.n){case"Header":break;case"Footer":break;case"HCenter":break;case"VCenter":break;case"Pls":break;case"Setup":break;case"DefColWidth":break;case"GCW":break;case"LHRecord":break;case"ColInfo":break;case"Row":break;case"DBCell":break;case"MulBlank":break;case"EntExU2":break;case"SxView":break;case"Sxvd":break;case"SXVI":break;case"SXVDEx":break;case"SxIvd":break;case"SXDI":break;case"SXLI":break;case"SXEx":break;case"QsiSXTag":break;case"Selection":break;case"Feat":break;case"FeatHdr":case"FeatHdr11":break;case"Feature11":case"Feature12":case"List12":break;case"Blank":break;case"Country":country=val;break;case"RecalcId":break;case"DefaultRowHeight":case"DxGCol":break;case"Fbi":case"Fbi2":case"GelFrame":break;case"Font":break;case"XFCRC":break;case"XFExt":break;case"Style":break;case"StyleExt":break;case"Palette":break;case"ClrtClient":break;case"Theme":break;case"ScenarioProtect":break;case"ObjProtect":break;case"CondFmt12":break;case"Table":break;case"TableStyles":break;case"TableStyle":break;case"TableStyleElement":break;case"SXStreamID":break;case"SXVS":break;case"DConRef":break;case"SXAddl":break;case"DConName":break;case"SXPI":break;case"SxFormat":break;case"SxSelect":break;case"SxRule":break;case"SxFilt":break;case"SxItm":break;case"SxDXF":break;case"ScenMan":break;case"DCon":break;case"CellWatch":break;case"PrintRowCol":break;case"PrintGrid":break;case"PrintSize":break;case"XCT":break;case"CRN":break;case"Scl":{}break;case"SheetExt":{}break;case"SheetExtOptional":{}break;case"ObNoMacros":{}break;case"ObProj":{}break;case"CodeName":{}break;case"GUIDTypeLib":{}break;case"WOpt":break;case"PhoneticInfo":break;case"OleObjectSize":break;case"DXF":case"DXFN":case"DXFN12":case"DXFN12List":case"DXFN12NoCB":break;case"Dv":case"DVal":break;case"BRAI":case"Series":case"SeriesText":break;case"DConn":break;case"DbOrParamQry":break;case"DBQueryExt":break;case"IFmtRecord":break;case"CondFmt":case"CF":case"CF12":case"CFEx":break;case"Excel9File":break;case"Units":break;case"InterfaceHdr":case"Mms":case"InterfaceEnd":case"DSF":case"BuiltInFnGroupCount":case"Window1":case"Window2":case"HideObj":case"GridSet":case"Guts":case"UserBView":case"UserSViewBegin":case"UserSViewEnd":case"Pane":break;default:switch(R.n){case"Dat":case"Begin":case"End":case"StartBlock":case"EndBlock":case"Frame":case"Area":case"Axis":case"AxisLine":case"Tick":break;case"AxesUsed":case"CrtLayout12":case"CrtLayout12A":case"CrtLink":case"CrtLine":case"CrtMlFrt":break;case"LineFormat":case"AreaFormat":case"Chart":case"Chart3d":case"Chart3DBarShape":case"ChartFormat":case"ChartFrtInfo":break;case"PlotArea":case"PlotGrowth":break;case"SeriesList":case"SerParent":case"SerAuxTrend":break;case"DataFormat":case"SerToCrt":case"FontX":break;case"CatSerRange":case"AxcExt":case"SerFmt":break;case"ShtProps":break;case"DefaultText":case"Text":case"CatLab":break;case"DataLabExtContents":break;case"Legend":case"LegendException":break;case"Pie":case"Scatter":break;case"PieFormat":case"MarkerFormat":break;case"StartObject":case"EndObject":break;case"AlRuns":case"ObjectLink":break;case"SIIndex":break;case"AttachedLabel":break;case"Line":case"Bar":break;case"Surf":break;case"AxisParent":break;case"Pos":break;case"ValueRange":break;case"SXViewEx9":break;case"SXViewLink":break;case"PivotChartBits":break;case"SBaseRef":break;case"TextPropsStream":break;case"LnExt":break;case"MkrExt":break;case"CrtCoopt":break;case"Qsi":case"Qsif":case"Qsir":case"QsiSXTag":break;case"TxtQry":break;case"FilterMode":break;case"AutoFilter":case"AutoFilterInfo":break;case"AutoFilter12":break;case"DropDownObjIds":break;case"Sort":break;case"SortData":break;case"ShapePropsStream":break;case"MsoDrawing":case"MsoDrawingGroup":case"MsoDrawingSelection":break;case"ImData":break;case"WebPub":case"AutoWebPub":case"RightMargin":case"LeftMargin":case"TopMargin":case"BottomMargin":case"HeaderFooter":case"HFPicture":case"PLV":case"HorizontalPageBreaks":case"VerticalPageBreaks":case"Backup":case"CompressPictures":case"Compat12":break;case"Continue":case"ContinueFrt12":break;case"ExternCount":break;case"RString":break;case"TabIdConf":case"Radar":case"RadarArea":case"DropBar":case"Intl":case"CoordList":case"SerAuxErrBar":break;default:if(options.WTF)throw"Unrecognized Record "+R.n}}}}else blob.l+=length}var sheetnamesraw=Object.keys(Directory).sort(function(a,b){return Number(a)-Number(b)}).map(function(x){return Directory[x].name});var sheetnames=sheetnamesraw.slice();wb.Directory=sheetnamesraw;wb.SheetNames=sheetnamesraw;if(!options.bookSheets)wb.Sheets=Sheets;wb.Preamble=Preamble;wb.Strings=sst;wb.SSF=SSF.get_table();if(opts.enc)wb.Encryption=opts.enc;wb.Metadata={};if(country!==undefined)wb.Metadata.Country=country;return wb}if(CompObj)CompObjP=parse_compobj(CompObj);if(options.bookProps&&!options.bookSheets)WorkbookP={};else{if(Workbook)WorkbookP=parse_workbook(Workbook.content,options);else throw new Error("Cannot find Workbook stream")}parse_props(cfb);var props={};for(var y in cfb.Summary)props[y]=cfb.Summary[y];for(y in cfb.DocSummary)props[y]=cfb.DocSummary[y];WorkbookP.Props=WorkbookP.Custprops=props;if(options.bookFiles)WorkbookP.cfb=cfb;WorkbookP.CompObjP=CompObjP;return WorkbookP}function parse_props(cfb){var DSI=cfb.find("!DocumentSummaryInformation");if(DSI)try{cfb.DocSummary=parse_PropertySetStream(DSI,DocSummaryPIDDSI)}catch(e){}var SI=cfb.find("!SummaryInformation");if(SI)try{cfb.Summary=parse_PropertySetStream(SI,SummaryPIDSI)}catch(e){}}var encregex=/&[a-z]*;/g,coderegex=/_x([0-9a-fA-F]+)_/g;function coderepl(m,c){return _chr(parseInt(c,16))}function encrepl($$){return encodings[$$]}function unescapexml(s){if(s.indexOf("&")>-1)s=s.replace(encregex,encrepl);return s.indexOf("_")===-1?s:s.replace(coderegex,coderepl)}function parsexmlbool(value,tag){switch(value){case"1":case"true":case"TRUE":return true;default:return false}}function matchtag(f,g){return new RegExp("<"+f+'(?: xml:space="preserve")?>([^☃]*)</'+f+">",(g||"")+"m")}var entregex=/&#(\d+);/g;function entrepl($$,$1){return String.fromCharCode(parseInt($1,10))}function fixstr(str){return str.replace(entregex,entrepl)}var everted_BERR=evert(BERR);var magic_formats={"General Number":"General","General Date":SSF._table[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":SSF._table[15],"Short Date":SSF._table[14],"Long Time":SSF._table[19],"Medium Time":SSF._table[18],"Short Time":SSF._table[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:SSF._table[2],Standard:SSF._table[4],Percent:SSF._table[10],Scientific:SSF._table[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'};function xlml_format(format,value){var fmt=magic_formats[format]||unescapexml(format);if(fmt==="General")return SSF._general(value);return SSF.format(fmt,value)}function xlml_set_prop(Props,tag,val){switch(tag){case"Description":tag="Comments";break}Props[tag]=val}function xlml_set_custprop(Custprops,Rn,cp,val){switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":val=parsexmlbool(val);break;case"i2":case"int":val=parseInt(val,10);break;case"r4":case"float":val=parseFloat(val);break;case"date":case"dateTime.tz":val=new Date(val);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw"bad custprop:"+cp[0]}Custprops[unescapexml(Rn[3])]=val}function safe_format_xlml(cell,nf,o){try{if(nf==="General"){if(cell.t==="n"){if((cell.v|0)===cell.v)cell.w=SSF._general_int(cell.v);else cell.w=SSF._general_num(cell.v)}else cell.w=SSF._general(cell.v)}else cell.w=xlml_format(nf||"General",cell.v);if(o.cellNF)cell.z=magic_formats[nf]||nf||"General"}catch(e){if(o.WTF)throw e}}function parse_xlml_data(xml,ss,data,cell,base,styles,csty,o){var nf="General",sid=cell.StyleID;o=o||{};if(sid===undefined&&csty)sid=csty.StyleID;while(styles[sid]!==undefined){if(styles[sid].nf)nf=styles[sid].nf;if(!styles[sid].Parent)break;sid=styles[sid].Parent}switch(data.Type){case"Boolean":cell.t="b";cell.v=parsexmlbool(xml);break;case"String":cell.t="str";cell.r=fixstr(unescapexml(xml));cell.v=xml.indexOf("<")>-1?ss:cell.r;break;case"DateTime":cell.v=(Date.parse(xml)-new Date(Date.UTC(1899,11,30)))/(24*60*60*1e3);if(cell.v!==cell.v)cell.v=unescapexml(xml);else if(cell.v>=1&&cell.v<60)cell.v=cell.v-1;if(!nf||nf=="General")nf="yyyy-mm-dd";case"Number":if(cell.v===undefined)cell.v=+xml;if(!cell.t)cell.t="n";break;case"Error":cell.t="e";cell.v=xml;cell.w=xml;break;default:cell.t="s";cell.v=fixstr(ss);break}if(cell.t!=="e")safe_format_xlml(cell,nf,o);if(o.cellFormula!=null&&cell.Formula){cell.f=rc_to_a1(unescapexml(cell.Formula),base);cell.Formula=undefined}cell.ixfe=cell.StyleID!==undefined?cell.StyleID:"Default"}function xlml_clean_comment(comment){comment.t=comment.v;comment.v=comment.w=comment.ixfe=undefined}function xlml_normalize(d){if(has_buf&&Buffer.isBuffer(d))return d.toString("utf8");if(typeof d==="string")return d;throw"badf"}var xlmlregex=/<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/gm;function parse_xlml_xml(d,opts){var str=xlml_normalize(d);var Rn;var state=[],tmp;var sheets={},sheetnames=[],cursheet={},sheetname="";var table={},cell={},row={},dtag,didx;var c=0,r=0;var refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};var styles={},stag={};var ss="",fidx=0;var mergecells=[];var Props={},Custprops={},pidx=0,cp={};var comments=[],comment={};var cstys=[],csty;while(Rn=xlmlregex.exec(str))switch(Rn[3]){case"Data":if(state[state.length-1][1])break;if(Rn[1]==="/")parse_xlml_data(str.slice(didx,Rn.index),ss,dtag,state[state.length-1][0]=="Comment"?comment:cell,{c:c,r:r},styles,cstys[c],opts);else{ss="";dtag=parsexmltag(Rn[0]);didx=Rn.index+Rn[0].length}break;case"Cell":if(Rn[1]==="/"){if(comments.length>0)cell.c=comments;if((!opts.sheetRows||opts.sheetRows>r)&&cell.v!==undefined)cursheet[encode_col(c)+encode_row(r)]=cell;if(cell.HRef){cell.l={Target:cell.HRef,tooltip:cell.HRefScreenTip};cell.HRef=cell.HRefScreenTip=undefined}if(cell.MergeAcross||cell.MergeDown){var cc=c+(parseInt(cell.MergeAcross,10)|0);var rr=r+(parseInt(cell.MergeDown,10)|0);mergecells.push({s:{c:c,r:r},e:{c:cc,r:rr}})}++c;if(cell.MergeAcross)c+=+cell.MergeAcross}else{cell=parsexmltagobj(Rn[0]);if(cell.Index)c=+cell.Index-1;if(c<refguess.s.c)refguess.s.c=c;if(c>refguess.e.c)refguess.e.c=c;if(Rn[0].substr(-2)==="/>")++c;comments=[]}break;case"Row":if(Rn[1]==="/"||Rn[0].substr(-2)==="/>"){if(r<refguess.s.r)refguess.s.r=r;if(r>refguess.e.r)refguess.e.r=r;if(Rn[0].substr(-2)==="/>"){row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}c=0;++r}else{row=parsexmltag(Rn[0]);if(row.Index)r=+row.Index-1}break;case"Worksheet":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;sheetnames.push(sheetname);if(refguess.s.r<=refguess.e.r&&refguess.s.c<=refguess.e.c)cursheet["!ref"]=encode_range(refguess);if(mergecells.length)cursheet["!merges"]=mergecells;sheets[sheetname]=cursheet}else{refguess={s:{r:1e6,c:1e6},e:{r:0,c:0}};r=c=0;state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);sheetname=tmp.Name;cursheet={};mergecells=[]}break;case"Table":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].slice(-2)=="/>")break;else{table=parsexmltag(Rn[0]);state.push([Rn[3],false]);cstys=[]}break;case"Style":if(Rn[1]==="/")styles[stag.ID]=stag;else stag=parsexmltag(Rn[0]);break;case"NumberFormat":stag.nf=parsexmltag(Rn[0]).Format||"General";break;case"Column":if(state[state.length-1][0]!=="Table")break;csty=parsexmltag(Rn[0]);cstys[csty.Index-1||cstys.length]=csty;for(var i=0;i<+csty.Span;++i)cstys[cstys.length]=csty;break;case"NamedRange":break;case"NamedCell":break;case"B":break;case"I":break;case"U":break;case"S":break;case"Sub":break;case"Sup":break;case"Span":break;case"Border":break;case"Alignment":break;case"Borders":break;case"Font":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")ss+=str.slice(fidx,Rn.index);else fidx=Rn.index+Rn[0].length;break;case"Interior":break;case"Protection":break;case"Author":case"Title":case"Description":case"Created":case"Keywords":case"Subject":case"Category":case"Company":case"LastAuthor":case"LastSaved":case"LastPrinted":case"Version":case"Revision":case"TotalTime":case"HyperlinkBase":case"Manager":if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_prop(Props,Rn[3],str.slice(pidx,Rn.index));else pidx=Rn.index+Rn[0].length;break;case"Paragraphs":break;case"Styles":case"Workbook":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else state.push([Rn[3],false]);break;case"Comment":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp;xlml_clean_comment(comment);comments.push(comment)}else{state.push([Rn[3],false]);tmp=parsexmltag(Rn[0]);comment={a:tmp.Author}}break;case"Name":break;case"ComponentOptions":case"DocumentProperties":case"CustomDocumentProperties":case"OfficeDocumentSettings":case"PivotTable":case"PivotCache":case"Names":case"MapInfo":case"PageBreaks":case"QueryTable":case"DataValidation":case"AutoFilter":case"Sorting":case"Schema":case"data":case"ConditionalFormatting":case"SmartTagType":case"SmartTags":case"ExcelWorkbook":case"WorkbookOptions":case"WorksheetOptions":if(Rn[1]==="/"){if((tmp=state.pop())[0]!==Rn[3])throw"Bad state: "+tmp}else if(Rn[0].charAt(Rn[0].length-2)!=="/")state.push([Rn[3],true]);break;default:var seen=true;switch(state[state.length-1][0]){case"OfficeDocumentSettings":switch(Rn[3]){case"AllowPNG":break;case"RemovePersonalInformation":break;case"DownloadComponents":break;case"LocationOfComponents":break;case"Colors":break;case"Color":break;case"Index":break;case"RGB":break;case"PixelsPerInch":break;case"TargetScreenSize":break;case"ReadOnlyRecommended":break;default:seen=false}break;case"ComponentOptions":switch(Rn[3]){case"Toolbar":break;case"HideOfficeLogo":break;case"SpreadsheetAutoFit":break;case"Label":break;case"Caption":break;case"MaxHeight":break;case"MaxWidth":break;case"NextSheetNumber":break;default:seen=false}break;case"ExcelWorkbook":switch(Rn[3]){case"WindowHeight":break;case"WindowWidth":break;case"WindowTopX":break;case"WindowTopY":break;case"TabRatio":break;case"ProtectStructure":break;case"ProtectWindows":break;case"ActiveSheet":break;case"DisplayInkNotes":break;case"FirstVisibleSheet":break;case"SupBook":break;case"SheetName":break;case"SheetIndex":break;case"SheetIndexFirst":break;case"SheetIndexLast":break;case"Dll":break;case"AcceptLabelsInFormulas":break;case"DoNotSaveLinkValues":break;case"Date1904":break;case"Iteration":break;case"MaxIterations":break;case"MaxChange":break;case"Path":break;case"Xct":break;case"Count":break;case"SelectedSheets":break;case"Calculation":break;case"Uncalced":break;case"StartupPrompt":break;case"Crn":break;case"ExternName":break;case"Formula":break;case"ColFirst":break;case"ColLast":break;case"WantAdvise":break;case"Boolean":break;case"Error":break;case"Text":break;case"OLE":break;case"NoAutoRecover":break;case"PublishObjects":break;case"DoNotCalculateBeforeSave":break;case"Number":break;case"RefModeR1C1":break;case"EmbedSaveSmartTags":break;default:seen=false}break;case"WorkbookOptions":switch(Rn[3]){case"OWCVersion":break;case"Height":break;case"Width":break;default:seen=false}break;case"WorksheetOptions":switch(Rn[3]){case"Unsynced":break;case"Visible":break;case"Print":break;case"Panes":break;case"Scale":break;case"Pane":break;case"Number":break;case"Layout":break;case"Header":break;case"Footer":break;case"PageSetup":break;case"PageMargins":break;case"Selected":break;case"ProtectObjects":break;case"EnableSelection":break;case"ProtectScenarios":break;case"ValidPrinterInfo":break;case"HorizontalResolution":break;case"VerticalResolution":break;case"NumberofCopies":break;case"ActiveRow":break;case"ActiveCol":break;case"ActivePane":break;case"TopRowVisible":break;case"TopRowBottomPane":break;case"LeftColumnVisible":break;case"LeftColumnRightPane":break;case"FitToPage":break;case"RangeSelection":break;case"PaperSizeIndex":break;case"PageLayoutZoom":break;case"PageBreakZoom":break;case"FilterOn":break;case"DoNotDisplayGridlines":break;case"SplitHorizontal":break;case"SplitVertical":break;case"FreezePanes":break;case"FrozenNoSplit":break;case"FitWidth":break;case"FitHeight":break;case"CommentsLayout":break;case"Zoom":break;case"LeftToRight":break;case"Gridlines":break;case"AllowSort":break;case"AllowFilter":break;case"AllowInsertRows":break;case"AllowDeleteRows":break;case"AllowInsertCols":break;case"AllowDeleteCols":break;case"AllowInsertHyperlinks":break;case"AllowFormatCells":break;case"AllowSizeCols":break;case"AllowSizeRows":break;case"NoSummaryRowsBelowDetail":break;case"TabColorIndex":break;case"DoNotDisplayHeadings":break;case"ShowPageLayoutZoom":break;case"NoSummaryColumnsRightDetail":break;case"BlackAndWhite":break;case"DoNotDisplayZeros":break;case"DisplayPageBreak":break;case"RowColHeadings":break;case"DoNotDisplayOutline":break;case"NoOrientation":break;case"AllowUsePivotTables":break;case"ZeroHeight":break;case"ViewableRange":break;case"Selection":break;case"ProtectContents":break;default:seen=false}break;case"PivotTable":case"PivotCache":switch(Rn[3]){case"ImmediateItemsOnDrop":break;case"ShowPageMultipleItemLabel":break;case"CompactRowIndent":break;case"Location":break;case"PivotField":break;case"Orientation":break;case"LayoutForm":break;case"LayoutSubtotalLocation":break;case"LayoutCompactRow":break;case"Position":break;case"PivotItem":break;case"DataType":break;case"DataField":break;case"SourceName":break;case"ParentField":break;case"PTLineItems":break;case"PTLineItem":break;case"CountOfSameItems":break;case"Item":break;case"ItemType":break;case"PTSource":break;case"CacheIndex":break;case"ConsolidationReference":break;case"FileName":break;case"Reference":break;case"NoColumnGrand":break;case"NoRowGrand":break;case"BlankLineAfterItems":break;case"Hidden":break;case"Subtotal":break;case"BaseField":break;case"MapChildItems":break;case"Function":break;case"RefreshOnFileOpen":break;case"PrintSetTitles":break;case"MergeLabels":break;case"DefaultVersion":break;case"RefreshName":break;case"RefreshDate":break;case"RefreshDateCopy":break;case"VersionLastRefresh":break;case"VersionLastUpdate":break;case"VersionUpdateableMin":break;case"VersionRefreshableMin":break;case"Calculation":break;default:seen=false}break;case"PageBreaks":switch(Rn[3]){case"ColBreaks":break;case"ColBreak":break;case"RowBreaks":break;case"RowBreak":break;case"ColStart":break;case"ColEnd":break;case"RowEnd":break;default:seen=false}break;case"AutoFilter":switch(Rn[3]){case"AutoFilterColumn":break;case"AutoFilterCondition":break;case"AutoFilterAnd":break;case"AutoFilterOr":break;default:seen=false}break;case"QueryTable":switch(Rn[3]){case"Id":break;case"AutoFormatFont":break;case"AutoFormatPattern":break;case"QuerySource":break;case"QueryType":break;case"EnableRedirections":break;case"RefreshedInXl9":break;case"URLString":break;case"HTMLTables":break;case"Connection":break;case"CommandText":break;case"RefreshInfo":break;case"NoTitles":break;case"NextId":break;case"ColumnInfo":break;case"OverwriteCells":break;case"DoNotPromptForFile":break;case"TextWizardSettings":break;case"Source":break;case"Number":break;case"Decimal":break;case"ThousandSeparator":break;case"TrailingMinusNumbers":break;case"FormatSettings":break;case"FieldType":break;case"Delimiters":break;case"Tab":break;case"Comma":break;case"AutoFormatName":break;case"VersionLastEdit":break;case"VersionLastRefresh":break;default:seen=false}break;case"Sorting":case"ConditionalFormatting":case"DataValidation":switch(Rn[3]){case"Range":break;case"Type":break;case"Min":break;case"Max":break;case"Sort":break;case"Descending":break;case"Order":break;case"CaseSensitive":break;case"Value":break;case"ErrorStyle":break;case"ErrorMessage":break;case"ErrorTitle":break;case"CellRangeList":break;case"InputMessage":break;case"InputTitle":break;case"ComboHide":break;case"InputHide":break;case"Condition":break;case"Qualifier":break;case"UseBlank":break;case"Value1":break;case"Value2":break;case"Format":break;default:seen=false}break;case"MapInfo":case"Schema":case"data":switch(Rn[3]){case"Map":break;case"Entry":break;case"Range":break;case"XPath":break;case"Field":break;case"XSDType":break;case"FilterOn":break;case"Aggregate":break;case"ElementType":break;case"AttributeType":break;case"schema":case"element":case"complexType":case"datatype":case"all":case"attribute":case"extends":break;case"row":break;default:seen=false}break;case"SmartTags":break;default:seen=false;break}if(seen)break;if(!state[state.length-1][1])throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|");if(state[state.length-1][0]==="CustomDocumentProperties"){if(Rn[0].substr(-2)==="/>")break;else if(Rn[1]==="/")xlml_set_custprop(Custprops,Rn,cp,str.slice(pidx,Rn.index));else{cp=Rn;pidx=Rn.index+Rn[0].length}break}if(opts.WTF)throw"Unrecognized tag: "+Rn[3]+"|"+state.join("|")}var out={};if(!opts.bookSheets&&!opts.bookProps)out.Sheets=sheets;out.SheetNames=sheetnames;out.SSF=SSF.get_table();out.Props=Props;out.Custprops=Custprops;return out}function parse_xlml(data,opts){fixopts(opts=opts||{});switch(opts.type||"base64"){case"base64":return parse_xlml_xml(Base64.decode(data),opts);case"binary":case"buffer":case"file":return parse_xlml_xml(data,opts);case"array":return parse_xlml_xml(data.map(_chr).join(""),opts)}}function write_xlml(wb,opts){}var fs;if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){fs=require("fs")}}function firstbyte(f,o){switch((o||{}).type||"base64"){case"buffer":return f[0];case"base64":return Base64.decode(f.substr(0,12)).charCodeAt(0);case"binary":return f.charCodeAt(0);case"array":return f[0];default:throw new Error("Unrecognized type "+o.type)}}function xlsread(f,o){if(!o)o={};if(!o.type)o.type=has_buf&&Buffer.isBuffer(f)?"buffer":"base64";switch(firstbyte(f,o)){case 208:return parse_xlscfb(CFB.read(f,o),o);case 60:return parse_xlml(f,o);default:throw"Unsupported file"}}var readFile=function(f,o){var d=fs.readFileSync(f);if(!o)o={};switch(firstbyte(d,{type:"buffer"})){case 208:return parse_xlscfb(CFB.read(d,{type:"buffer"}),o);case 60:return parse_xlml(d,(o.type="buffer",o));default:throw"Unsupported file"}};function writeSync(wb,opts){var o=opts||{};switch(o.bookType){case"xml":return write_xlml(wb,o);default:throw"unsupported output format "+o.bookType}}function writeFileSync(wb,filename,opts){var o=opts|{};o.type="file";o.file=filename;switch(o.file.substr(-4).toLowerCase()){case".xls":o.bookType="xls";break;case".xml":o.bookType="xml";break}return writeSync(wb,o)}function shift_cell(cell,tgt){if(tgt.s){if(cell.cRel)cell.c+=tgt.s.c;if(cell.rRel)cell.r+=tgt.s.r}else{cell.c+=tgt.c;cell.r+=tgt.r}cell.cRel=cell.rRel=0;while(cell.c>=256)cell.c-=256;while(cell.r>=65536)cell.r-=65536;return cell}function shift_range(cell,range){cell.s=shift_cell(cell.s,range.s);cell.e=shift_cell(cell.e,range.s);return cell}function decode_row(rowstr){return parseInt(unfix_row(rowstr),10)-1}function encode_row(row){return""+(row+1)}function fix_row(cstr){return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")}function unfix_row(cstr){return cstr.replace(/\$(\d+)$/,"$1")}function decode_col(colstr){var c=unfix_col(colstr),d=0,i=0;for(;i!==c.length;++i)d=26*d+c.charCodeAt(i)-64;return d-1}function encode_col(col){var s="";for(++col;col;col=Math.floor((col-1)/26))s=String.fromCharCode((col-1)%26+65)+s;return s}function fix_col(cstr){return cstr.replace(/^([A-Z])/,"$$$1")}function unfix_col(cstr){return cstr.replace(/^\$([A-Z])/,"$1")}function split_cell(cstr){return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(",")}function decode_cell(cstr){var splt=split_cell(cstr);return{c:decode_col(splt[0]),r:decode_row(splt[1])}}function encode_cell(cell){return encode_col(cell.c)+encode_row(cell.r)}function fix_cell(cstr){return fix_col(fix_row(cstr))}function unfix_cell(cstr){return unfix_col(unfix_row(cstr))}function decode_range(range){var x=range.split(":").map(decode_cell);return{s:x[0],e:x[x.length-1]}}function encode_range(cs,ce){if(ce===undefined||typeof ce==="number")return encode_range(cs.s,cs.e);if(typeof cs!=="string")cs=encode_cell(cs);if(typeof ce!=="string")ce=encode_cell(ce);return cs==ce?cs:cs+":"+ce}function safe_decode_range(range){var o={s:{c:0,r:0},e:{c:0,r:0}};var idx=0,i=0,cc=0;var len=range.length;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.s.c=--idx;for(idx=0;i<len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.s.r=--idx;if(i===len||range.charCodeAt(++i)===58){o.e.c=o.s.c;o.e.r=o.s.r;return o}for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-64)<1||cc>26)break;idx=26*idx+cc}o.e.c=--idx;for(idx=0;i!=len;++i){if((cc=range.charCodeAt(i)-48)<0||cc>9)break;idx=10*idx+cc}o.e.r=--idx;return o}function safe_format_cell(cell,v){if(cell.z!==undefined)try{return cell.w=SSF.format(cell.z,v)}catch(e){}if(!cell.XF)return v;try{return cell.w=SSF.format(cell.XF.ifmt||0,v)}catch(e){return""+v}}function format_cell(cell,v){if(cell==null||cell.t==null)return"";if(cell.w!==undefined)return cell.w;if(v===undefined)return safe_format_cell(cell,cell.v);return safe_format_cell(cell,v)}function sheet_to_json(sheet,opts){var val,row,range,header=0,offset=1,r,hdr=[],isempty,R,C,v;var o=opts!=null?opts:{};var raw=o.raw;if(sheet==null||sheet["!ref"]==null)return[];range=o.range!==undefined?o.range:sheet["!ref"];if(o.header===1)header=1;else if(o.header==="A")header=2;else if(Array.isArray(o.header))header=3;switch(typeof range){case"string":r=safe_decode_range(range);break;case"number":r=safe_decode_range(sheet["!ref"]);r.s.r=range;break;default:r=range}if(header>0)offset=0;var rr=encode_row(r.s.r);var cols=new Array(r.e.c-r.s.c+1);var out=new Array(r.e.r-r.s.r-offset+1);var outi=0;for(C=r.s.c;C<=r.e.c;++C){cols[C]=encode_col(C);val=sheet[cols[C]+rr];switch(header){case 1:hdr[C]=C;break;case 2:hdr[C]=cols[C];break;case 3:hdr[C]=o.header[C-r.s.c];break;default:if(val===undefined)continue;hdr[C]=format_cell(val)}}for(R=r.s.r+offset;R<=r.e.r;++R){rr=encode_row(R);isempty=true;row=header===1?[]:Object.create({__rowNum__:R});for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];if(val===undefined||val.t===undefined)continue;v=val.v;switch(val.t){case"e":continue;case"s":case"str":break;case"b":case"n":break;default:throw"unrecognized type "+val.t}if(v!==undefined){row[hdr[C]]=raw?v:format_cell(val,v);isempty=false}}if(isempty===false)out[outi++]=row}out.length=outi;return out}function sheet_to_row_object_array(sheet,opts){return sheet_to_json(sheet,opts!=null?opts:{})}function sheet_to_csv(sheet,opts){var out="",txt="",qreg=/"/g;var o=opts==null?{}:opts;if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]);var FS=o.FS!==undefined?o.FS:",",fs=FS.charCodeAt(0);var RS=o.RS!==undefined?o.RS:"\n",rs=RS.charCodeAt(0);var row="",rr="",cols=[];var i=0,cc=0,val;var R=0,C=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(R=r.s.r;R<=r.e.r;++R){row="";rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){val=sheet[cols[C]+rr];txt=val!==undefined?""+format_cell(val):"";for(i=0,cc=0;i!==txt.length;++i)if((cc=txt.charCodeAt(i))===fs||cc===rs||cc===34){txt='"'+txt.replace(qreg,'""')+'"';break}row+=(C===r.s.c?"":FS)+txt}out+=row+RS}return out}var make_csv=sheet_to_csv;function sheet_to_formulae(sheet){var cmds,y="",x,val="";if(sheet==null||sheet["!ref"]==null)return"";var r=safe_decode_range(sheet["!ref"]),rr="",cols=[],C;cmds=new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));var i=0;for(C=r.s.c;C<=r.e.c;++C)cols[C]=encode_col(C);for(var R=r.s.r;R<=r.e.r;++R){rr=encode_row(R);for(C=r.s.c;C<=r.e.c;++C){y=cols[C]+rr;x=sheet[y];val="";if(x===undefined)continue;if(x.f!=null)val=x.f;else if(x.w!==undefined)val="'"+x.w;else if(x.v===undefined)continue;else val=""+x.v;cmds[i++]=y+"="+val}}cmds.length=i;return cmds}var utils={encode_col:encode_col,encode_row:encode_row,encode_cell:encode_cell,encode_range:encode_range,decode_col:decode_col,decode_row:decode_row,split_cell:split_cell,decode_cell:decode_cell,decode_range:decode_range,format_cell:format_cell,get_formulae:sheet_to_formulae,make_csv:sheet_to_csv,make_json:sheet_to_json,make_formulae:sheet_to_formulae,sheet_to_csv:sheet_to_csv,sheet_to_json:sheet_to_json,sheet_to_formulae:sheet_to_formulae,sheet_to_row_object_array:sheet_to_row_object_array};XLS.parse_xlscfb=parse_xlscfb;XLS.read=xlsread;XLS.readFile=readFile;XLS.utils=utils;XLS.CFB=CFB;XLS.SSF=SSF})(typeof exports!=="undefined"?exports:XLS);
18583 // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html 18563 //# sourceMappingURL=dist/xls.min.map
18584 // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html 18564 /* xlsx.js (C) 2013-2014 SheetJS -- http://sheetjs.com */
18585 // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html 18565 /* vim: set ts=2: */
18586 18566 /*jshint -W041 */
18587 dosTime = o.date.getHours(); 18567 var XLSX = {};
18588 dosTime = dosTime << 6; 18568 (function(XLSX){
18589 dosTime = dosTime | o.date.getMinutes(); 18569 XLSX.version = '0.7.8';
18590 dosTime = dosTime << 5; 18570 var current_codepage = 1252, current_cptable;
18591 dosTime = dosTime | o.date.getSeconds() / 2; 18571 if(typeof module !== "undefined" && typeof require !== 'undefined') {
18592 18572 if(typeof cptable === 'undefined') cptable = require('./dist/cpexcel');
18593 dosDate = o.date.getFullYear() - 1980; 18573 current_cptable = cptable[current_codepage];
18594 dosDate = dosDate << 4; 18574 }
18595 dosDate = dosDate | (o.date.getMonth() + 1); 18575 function reset_cp() { set_cp(1252); }
18596 dosDate = dosDate << 5; 18576 var set_cp = function(cp) { current_codepage = cp; };
18597 dosDate = dosDate | o.date.getDate(); 18577
18598 18578 function char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }
18599 var hasData = data !== null && data.length !== 0; 18579 var debom_xml = function(data) { return data; };
18600 18580
18601 var compression = JSZip.compressions[compressionType]; 18581 if(typeof cptable !== 'undefined') {
18602 var compressedData = hasData ? compression.compress(data) : ''; 18582 set_cp = function(cp) { current_codepage = cp; current_cptable = cptable[cp]; };
18603 18583 debom_xml = function(data) {
18604 var header = ""; 18584 if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.substr(2))); }
18605 18585 return data;
18606 // version needed to extract 18586 };
18607 header += "\x0A\x00"; 18587 }
18608 // general purpose bit flag 18588 /* ssf.js (C) 2013-2014 SheetJS -- http://sheetjs.com */
18609 // set bit 11 if utf8 18589 /*jshint -W041 */
18610 header += useUTF8 ? "\x00\x08" : "\x00\x00"; 18590 var SSF = {};
18611 // compression method 18591 var make_ssf = function make_ssf(SSF){
18612 header += hasData ? compression.magic : JSZip.compressions['STORE'].magic; 18592 SSF.version = '0.8.1';
18613 // last mod file time 18593 function _strrev(x) { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
18614 header += decToHex(dosTime, 2); 18594 function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; }
18615 // last mod file date 18595 function pad0(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
18616 header += decToHex(dosDate, 2); 18596 function pad_(v,d){var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
18617 // crc-32 18597 function rpad_(v,d){var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
18618 header += hasData ? decToHex(this.crc32(data), 4) : '\x00\x00\x00\x00'; 18598 function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
18619 // compressed size 18599 function pad0r2(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
18620 header += hasData ? decToHex(compressedData.length, 4) : '\x00\x00\x00\x00'; 18600 var p2_32 = Math.pow(2,32);
18621 // uncompressed size 18601 function pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
18622 header += hasData ? decToHex(data.length, 4) : '\x00\x00\x00\x00'; 18602 function isgeneral(s, i) { return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }
18623 // file name length 18603 /* Options */
18624 header += decToHex(utfEncodedFileName.length, 2); 18604 var opts_fmt = [
18625 // extra field length 18605 ["date1904", 0],
18626 header += "\x00\x00"; 18606 ["output", ""],
18627 18607 ["WTF", false]
18628 return { 18608 ];
18629 header:header, 18609 function fixopts(o){
18630 compressedData:compressedData 18610 for(var y = 0; y != opts_fmt.length; ++y) if(o[opts_fmt[y][0]]===undefined) o[opts_fmt[y][0]]=opts_fmt[y][1];
18631 }; 18611 }
18632 }; 18612 SSF.opts = opts_fmt;
18633 18613 var table_fmt = {
18634 18614 0: 'General',
18635 // return the actual prototype of JSZip 18615 1: '0',
18636 return { 18616 2: '0.00',
18637 /** 18617 3: '#,##0',
18638 * Read an existing zip and merge the data in the current JSZip object. 18618 4: '#,##0.00',
18639 * The implementation is in jszip-load.js, don't forget to include it. 18619 9: '0%',
18640 * @param {String|ArrayBuffer|Uint8Array} stream The stream to load 18620 10: '0.00%',
18641 * @param {Object} options Options for loading the stream. 18621 11: '0.00E+00',
18642 * options.base64 : is the stream in base64 ? default : false 18622 12: '# ?/?',
18643 * @return {JSZip} the current JSZip object 18623 13: '# ??/??',
18644 */ 18624 14: 'm/d/yy',
18645 load : function (stream, options) { 18625 15: 'd-mmm-yy',
18646 throw new Error("Load method is not defined. Is the file jszip-load.js included ?"); 18626 16: 'd-mmm',
18647 }, 18627 17: 'mmm-yy',
18648 18628 18: 'h:mm AM/PM',
18649 /** 18629 19: 'h:mm:ss AM/PM',
18650 * Filter nested files/folders with the specified function. 18630 20: 'h:mm',
18651 * @param {Function} search the predicate to use : 18631 21: 'h:mm:ss',
18652 * function (relativePath, file) {...} 18632 22: 'm/d/yy h:mm',
18653 * It takes 2 arguments : the relative path and the file. 18633 37: '#,##0 ;(#,##0)',
18654 * @return {Array} An array of matching elements. 18634 38: '#,##0 ;[Red](#,##0)',
18655 */ 18635 39: '#,##0.00;(#,##0.00)',
18656 filter : function (search) { 18636 40: '#,##0.00;[Red](#,##0.00)',
18657 var result = [], filename, relativePath, file, fileClone; 18637 45: 'mm:ss',
18658 for (filename in this.files) { 18638 46: '[h]:mm:ss',
18659 if ( !this.files.hasOwnProperty(filename) ) { continue; } 18639 47: 'mmss.0',
18660 file = this.files[filename]; 18640 48: '##0.0E+0',
18661 // return a new object, don't let the user mess with our internal objects :) 18641 49: '@',
18662 fileClone = new ZipObject(file.name, file.data, extend(file.options)); 18642 56: '"上午/下午 "hh"時"mm"分"ss"秒 "',
18663 relativePath = filename.slice(this.root.length, filename.length); 18643 65535: 'General'
18664 if (filename.slice(0, this.root.length) === this.root && // the file is in the current root 18644 };
18665 search(relativePath, fileClone)) { // and the file matches the function 18645 var days = [
18666 result.push(fileClone); 18646 ['Sun', 'Sunday'],
18667 } 18647 ['Mon', 'Monday'],
18668 } 18648 ['Tue', 'Tuesday'],
18669 return result; 18649 ['Wed', 'Wednesday'],
18670 }, 18650 ['Thu', 'Thursday'],
18671 18651 ['Fri', 'Friday'],
18672 /** 18652 ['Sat', 'Saturday']
18673 * Add a file to the zip file, or search a file. 18653 ];
18674 * @param {string|RegExp} name The name of the file to add (if data is defined), 18654 var months = [
18675 * the name of the file to find (if no data) or a regex to match files. 18655 ['J', 'Jan', 'January'],
18676 * @param {String|ArrayBuffer|Uint8Array} data The file data, either raw or base64 encoded 18656 ['F', 'Feb', 'February'],
18677 * @param {Object} o File options 18657 ['M', 'Mar', 'March'],
18678 * @return {JSZip|Object|Array} this JSZip object (when adding a file), 18658 ['A', 'Apr', 'April'],
18679 * a file (when searching by string) or an array of files (when searching by regex). 18659 ['M', 'May', 'May'],
18680 */ 18660 ['J', 'Jun', 'June'],
18681 file : function(name, data, o) { 18661 ['J', 'Jul', 'July'],
18682 if (arguments.length === 1) { 18662 ['A', 'Aug', 'August'],
18683 if (name instanceof RegExp) { 18663 ['S', 'Sep', 'September'],
18684 var regexp = name; 18664 ['O', 'Oct', 'October'],
18685 return this.filter(function(relativePath, file) { 18665 ['N', 'Nov', 'November'],
18686 return !file.options.dir && regexp.test(relativePath); 18666 ['D', 'Dec', 'December']
18687 }); 18667 ];
18688 } else { // text 18668 function frac(x, D, mixed) {
18689 return this.filter(function (relativePath, file) { 18669 var sgn = x < 0 ? -1 : 1;
18690 return !file.options.dir && relativePath === name; 18670 var B = x * sgn;
18691 })[0]||null; 18671 var P_2 = 0, P_1 = 1, P = 0;
18692 } 18672 var Q_2 = 1, Q_1 = 0, Q = 0;
18693 } else { // more than one argument : we have data ! 18673 var A = Math.floor(B);
18694 name = this.root+name; 18674 while(Q_1 < D) {
18695 fileAdd.call(this, name, data, o); 18675 A = Math.floor(B);
18696 } 18676 P = A * P_1 + P_2;
18697 return this; 18677 Q = A * Q_1 + Q_2;
18698 }, 18678 if((B - A) < 0.0000000005) break;
18699 18679 B = 1 / (B - A);
18700 /** 18680 P_2 = P_1; P_1 = P;
18701 * Add a directory to the zip file, or search. 18681 Q_2 = Q_1; Q_1 = Q;
18702 * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders. 18682 }
18703 * @return {JSZip} an object with the new directory as the root, or an array containing matching folders. 18683 if(Q > D) { Q = Q_1; P = P_1; }
18704 */ 18684 if(Q > D) { Q = Q_2; P = P_2; }
18705 folder : function(arg) { 18685 if(!mixed) return [0, sgn * P, Q];
18706 if (!arg) { 18686 if(Q===0) throw "Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2;
18707 return this; 18687 var q = Math.floor(sgn * P/Q);
18708 } 18688 return [q, sgn*P - q*Q, Q];
18709 18689 }
18710 if (arg instanceof RegExp) { 18690 function general_fmt_int(v, opts) { return ""+v; }
18711 return this.filter(function(relativePath, file) { 18691 SSF._general_int = general_fmt_int;
18712 return file.options.dir && arg.test(relativePath); 18692 var general_fmt_num = (function make_general_fmt_num() {
18713 }); 18693 var gnr1 = /\.(\d*[1-9])0+$/, gnr2 = /\.0*$/, gnr4 = /\.(\d*[1-9])0+/, gnr5 = /\.0*[Ee]/, gnr6 = /(E[+-])(\d)$/;
18714 } 18694 function gfn2(v) {
18715 18695 var w = (v<0?12:11);
18716 // else, name is a new folder 18696 var o = gfn5(v.toFixed(12)); if(o.length <= w) return o;
18717 var name = this.root + arg; 18697 o = v.toPrecision(10); if(o.length <= w) return o;
18718 var newFolder = folderAdd.call(this, name); 18698 return v.toExponential(5);
18719 18699 }
18720 // Allow chaining by returning a new object with this folder as the root 18700 function gfn3(v) {
18721 var ret = this.clone(); 18701 var o = v.toFixed(11).replace(gnr1,".$1");
18722 ret.root = newFolder.name; 18702 if(o.length > (v<0?12:11)) o = v.toPrecision(6);
18723 return ret; 18703 return o;
18724 }, 18704 }
18725 18705 function gfn4(o) {
18726 /** 18706 for(var i = 0; i != o.length; ++i) if((o.charCodeAt(i) | 0x20) === 101) return o.replace(gnr4,".$1").replace(gnr5,"E").replace("e","E").replace(gnr6,"$10$2");
18727 * Delete a file, or a directory and all sub-files, from the zip 18707 return o;
18728 * @param {string} name the name of the file to delete 18708 }
18729 * @return {JSZip} this JSZip object 18709 function gfn5(o) {
18730 */ 18710 //for(var i = 0; i != o.length; ++i) if(o.charCodeAt(i) === 46) return o.replace(gnr2,"").replace(gnr1,".$1");
18731 remove : function(name) { 18711 //return o;
18732 name = this.root + name; 18712 return o.indexOf(".") > -1 ? o.replace(gnr2,"").replace(gnr1,".$1") : o;
18733 var file = this.files[name]; 18713 }
18734 if (!file) { 18714 return function general_fmt_num(v, opts) {
18735 // Look for any folders 18715 var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
18736 if (name.slice(-1) != "/") { 18716 if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
18737 name += "/"; 18717 else if(Math.abs(V) <= 9) o = gfn2(v);
18738 } 18718 else if(V === 10) o = v.toFixed(10).substr(0,12);
18739 file = this.files[name]; 18719 else o = gfn3(v);
18740 } 18720 return gfn5(gfn4(o));
18741 18721 };})();
18742 if (file) { 18722 SSF._general_num = general_fmt_num;
18743 if (!file.options.dir) { 18723 function general_fmt(v, opts) {
18744 // file 18724 switch(typeof v) {
18745 delete this.files[name]; 18725 case 'string': return v;
18746 } else { 18726 case 'boolean': return v ? "TRUE" : "FALSE";
18747 // folder 18727 case 'number': return (v|0) === v ? general_fmt_int(v, opts) : general_fmt_num(v, opts);
18748 var kids = this.filter(function (relativePath, file) { 18728 }
18749 return file.name.slice(0, name.length) === name; 18729 throw new Error("unsupported value in General format: " + v);
18750 }); 18730 }
18751 for (var i = 0; i < kids.length; i++) { 18731 SSF._general = general_fmt;
18752 delete this.files[kids[i].name]; 18732 function fix_hijri(date, o) { return 0; }
18753 } 18733 function parse_date_code(v,opts,b2) {
18754 } 18734 if(v > 2958465 || v < 0) return null;
18755 } 18735 var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
18756 18736 var dout=[];
18757 return this; 18737 var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};
18758 }, 18738 if(Math.abs(out.u) < 1e-6) out.u = 0;
18759 18739 fixopts(opts != null ? opts : (opts=[]));
18760 /** 18740 if(opts.date1904) date += 1462;
18761 * Generate the complete zip file 18741 if(out.u > 0.999) {
18762 * @param {Object} options the options to generate the zip file : 18742 out.u = 0;
18763 * - base64, (deprecated, use type instead) true to generate base64. 18743 if(++time == 86400) { time = 0; ++date; }
18764 * - compression, "STORE" by default. 18744 }
18765 * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. 18745 if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
18766 * @return {String|Uint8Array|ArrayBuffer|Blob} the zip file 18746 else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
18767 */ 18747 else {
18768 generate : function(options) { 18748 if(date > 60) --date;
18769 options = extend(options || {}, { 18749 /* 1 = Jan 1 1900 */
18770 base64 : true, 18750 var d = new Date(1900,0,1);
18771 compression : "STORE", 18751 d.setDate(d.getDate() + date - 1);
18772 type : "base64" 18752 dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
18773 }); 18753 dow = d.getDay();
18774 var compression = options.compression.toUpperCase(); 18754 if(date < 60) dow = (dow + 6) % 7;
18775 18755 if(b2) dow = fix_hijri(d, dout);
18776 // The central directory, and files data 18756 }
18777 var directory = [], files = [], fileOffset = 0; 18757 out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
18778 18758 out.S = time % 60; time = Math.floor(time / 60);
18779 if (!JSZip.compressions[compression]) { 18759 out.M = time % 60; time = Math.floor(time / 60);
18780 throw compression + " is not a valid compression method !"; 18760 out.H = time;
18781 } 18761 out.q = dow;
18782 18762 return out;
18783 for (var name in this.files) { 18763 }
18784 if ( !this.files.hasOwnProperty(name) ) { continue; } 18764 SSF.parse_date_code = parse_date_code;
18785 18765 /*jshint -W086 */
18786 var file = this.files[name]; 18766 function write_date(type, fmt, val, ss0) {
18787 18767 var o="", ss=0, tt=0, y = val.y, out, outl = 0;
18788 var utfEncodedFileName = this.utf8encode(file.name); 18768 switch(type) {
18789 18769 case 98: /* 'b' buddhist year */
18790 var fileRecord = "", 18770 y = val.y + 543;
18791 dirRecord = "", 18771 /* falls through */
18792 data = prepareLocalHeaderData.call(this, file, utfEncodedFileName, compression); 18772 case 121: /* 'y' year */
18793 fileRecord = JSZip.signature.LOCAL_FILE_HEADER + data.header + utfEncodedFileName + data.compressedData; 18773 switch(fmt.length) {
18794 18774 case 1: case 2: out = y % 100; outl = 2; break;
18795 dirRecord = JSZip.signature.CENTRAL_FILE_HEADER + 18775 default: out = y % 10000; outl = 4; break;
18796 // version made by (00: DOS) 18776 } break;
18797 "\x14\x00" + 18777 case 109: /* 'm' month */
18798 // file header (common to file and central directory) 18778 switch(fmt.length) {
18799 data.header + 18779 case 1: case 2: out = val.m; outl = fmt.length; break;
18800 // file comment length 18780 case 3: return months[val.m-1][1];
18801 "\x00\x00" + 18781 case 5: return months[val.m-1][0];
18802 // disk number start 18782 default: return months[val.m-1][2];
18803 "\x00\x00" + 18783 } break;
18804 // internal file attributes TODO 18784 case 100: /* 'd' day */
18805 "\x00\x00" + 18785 switch(fmt.length) {
18806 // external file attributes 18786 case 1: case 2: out = val.d; outl = fmt.length; break;
18807 (this.files[name].options.dir===true?"\x10\x00\x00\x00":"\x00\x00\x00\x00")+ 18787 case 3: return days[val.q][0];
18808 // relative offset of local header 18788 default: return days[val.q][1];
18809 decToHex(fileOffset, 4) + 18789 } break;
18810 // file name 18790 case 104: /* 'h' 12-hour */
18811 utfEncodedFileName; 18791 switch(fmt.length) {
18812 18792 case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
18813 fileOffset += fileRecord.length; 18793 default: throw 'bad hour format: ' + fmt;
18814 18794 } break;
18815 files.push(fileRecord); 18795 case 72: /* 'H' 24-hour */
18816 directory.push(dirRecord); 18796 switch(fmt.length) {
18817 } 18797 case 1: case 2: out = val.H; outl = fmt.length; break;
18818 18798 default: throw 'bad hour format: ' + fmt;
18819 var fileData = files.join(""); 18799 } break;
18820 var dirData = directory.join(""); 18800 case 77: /* 'M' minutes */
18821 18801 switch(fmt.length) {
18822 var dirEnd = ""; 18802 case 1: case 2: out = val.M; outl = fmt.length; break;
18823 18803 default: throw 'bad minute format: ' + fmt;
18824 // end of central dir signature 18804 } break;
18825 dirEnd = JSZip.signature.CENTRAL_DIRECTORY_END + 18805 case 115: /* 's' seconds */
18826 // number of this disk 18806 if(val.u === 0) switch(fmt) {
18827 "\x00\x00" + 18807 case 's': case 'ss': return pad0(val.S, fmt.length);
18828 // number of the disk with the start of the central directory 18808 case '.0': case '.00': case '.000':
18829 "\x00\x00" + 18809 }
18830 // total number of entries in the central directory on this disk 18810 switch(fmt) {
18831 decToHex(files.length, 2) + 18811 case 's': case 'ss': case '.0': case '.00': case '.000':
18832 // total number of entries in the central directory 18812 if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
18833 decToHex(files.length, 2) + 18813 else tt = ss0 === 1 ? 10 : 1;
18834 // size of the central directory 4 bytes 18814 ss = Math.round((tt)*(val.S + val.u));
18835 decToHex(dirData.length, 4) + 18815 if(ss >= 60*tt) ss = 0;
18836 // offset of start of central directory with respect to the starting disk number 18816 if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
18837 decToHex(fileData.length, 4) + 18817 o = pad0(ss,2 + ss0);
18838 // .ZIP file comment length 18818 if(fmt === 'ss') return o.substr(0,2);
18839 "\x00\x00"; 18819 return "." + o.substr(2,fmt.length-1);
18840 18820 default: throw 'bad second format: ' + fmt;
18841 var zip = fileData + dirData + dirEnd; 18821 }
18842 18822 case 90: /* 'Z' absolute time */
18843 18823 switch(fmt) {
18844 switch(options.type.toLowerCase()) { 18824 case '[h]': case '[hh]': out = val.D*24+val.H; break;
18845 case "uint8array" : 18825 case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
18846 return JSZip.utils.string2Uint8Array(zip); 18826 case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
18847 case "arraybuffer" : 18827 default: throw 'bad abstime format: ' + fmt;
18848 return JSZip.utils.string2Uint8Array(zip).buffer; 18828 } outl = fmt.length === 3 ? 1 : 2; break;
18849 case "blob" : 18829 case 101: /* 'e' era */
18850 return JSZip.utils.string2Blob(zip); 18830 out = y; outl = 1;
18851 case "base64" : 18831 }
18852 return (options.base64) ? JSZipBase64.encode(zip) : zip; 18832 if(outl > 0) return pad0(out, outl); else return "";
18853 default : // case "string" : 18833 }
18854 return zip; 18834 /*jshint +W086 */
18855 } 18835 function commaify(s) {
18856 }, 18836 if(s.length <= 3) return s;
18857 18837 var j = (s.length % 3), o = s.substr(0,j);
18858 /** 18838 for(; j!=s.length; j+=3) o+=(o.length > 0 ? "," : "") + s.substr(j,3);
18859 * 18839 return o;
18860 * Javascript crc32 18840 }
18861 * http://www.webtoolkit.info/ 18841 var write_num = (function make_write_num(){
18862 * 18842 var pct1 = /%/g;
18863 */ 18843 function write_num_pct(type, fmt, val){
18864 crc32 : function(str, crc) { 18844 var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
18865 18845 return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
18866 if (str === "" || typeof str === "undefined") { 18846 }
18867 return 0; 18847 function write_num_cm(type, fmt, val){
18868 } 18848 var idx = fmt.length - 1;
18869 18849 while(fmt.charCodeAt(idx-1) === 44) --idx;
18870 var table = [ 18850 return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
18871 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 18851 }
18872 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 18852 function write_num_exp(fmt, val){
18873 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 18853 var o;
18874 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 18854 var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
18875 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 18855 if(fmt.match(/^#+0.0E\+0$/)) {
18876 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 18856 var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
18877 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 18857 var ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;
18878 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 18858 if(ee < 0) ee += period;
18879 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 18859 o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
18880 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 18860 if(o.indexOf("e") === -1) {
18881 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 18861 var fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);
18882 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 18862 if(o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
18883 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 18863 else o += "E+" + (fakee - ee);
18884 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 18864 while(o.substr(0,2) === "0.") {
18885 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 18865 o = o[0] + o.substr(2,period) + "." + o.substr(2+period);
18886 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 18866 o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
18887 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 18867 }
18888 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 18868 o = o.replace(/\+-/,"-");
18889 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 18869 }
18890 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 18870 o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
18891 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 18871 } else o = val.toExponential(idx);
18892 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 18872 if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o[o.length-1];
18893 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 18873 if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
18894 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 18874 return o.replace("e","E");
18895 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 18875 }
18896 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 18876 var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
18897 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 18877 function write_num_f1(r, aval, sign) {
18898 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 18878 var den = parseInt(r[4]), rr = Math.round(aval * den), base = Math.floor(rr/den);
18899 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 18879 var myn = (rr - base*den), myd = den;
18900 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 18880 return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length));
18901 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 18881 }
18902 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 18882 function write_num_f2(r, aval, sign) {
18903 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 18883 return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
18904 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 18884 }
18905 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 18885 var dec1 = /^#*0*\.(0+)/;
18906 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 18886 var closeparen = /\).*[0#]/;
18907 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 18887 var phone = /\(###\) ###\\?-####/;
18908 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 18888 function hashq(str) {
18909 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 18889 var o = "", cc;
18910 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 18890 for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
18911 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 18891 case 35: break;
18912 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 18892 case 63: o+= " "; break;
18913 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 18893 case 48: o+= "0"; break;
18914 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 18894 default: o+= String.fromCharCode(cc);
18915 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 18895 }
18916 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 18896 return o;
18917 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 18897 }
18918 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 18898 function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
18919 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 18899 function dec(val, d) { return Math.round((val-Math.floor(val))*Math.pow(10,d)); }
18920 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 18900 function flr(val) { if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0)); return ""+Math.floor(val); }
18921 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 18901 function write_num_flt(type, fmt, val) {
18922 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 18902 if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
18923 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 18903 var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
18924 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 18904 if(val >= 0) return write_num_flt('n', ffmt, val);
18925 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 18905 return '(' + write_num_flt('n', ffmt, -val) + ')';
18926 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 18906 }
18927 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 18907 if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
18928 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 18908 if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
18929 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 18909 if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
18930 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 18910 if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt[1]==' '?2:1),val);
18931 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 18911 var o, oo;
18932 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 18912 var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
18933 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 18913 if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
18934 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D 18914 if(fmt.match(/^[#?]+$/)) {
18935 ]; 18915 o = pad0r(val,0); if(o === "0") o = "";
18936 18916 return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
18937 if (typeof(crc) == "undefined") { crc = 0; } 18917 }
18938 var x = 0; 18918 if((r = fmt.match(frac1)) !== null) return write_num_f1(r, aval, sign);
18939 var y = 0; 18919 if(fmt.match(/^#+0+$/) !== null) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
18940 18920 if((r = fmt.match(dec1)) !== null) {
18941 crc = crc ^ (-1); 18921 o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); });
18942 for( var i = 0, iTop = str.length; i < iTop; i++ ) { 18922 return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
18943 y = ( crc ^ str.charCodeAt( i ) ) & 0xFF; 18923 }
18944 x = table[y]; 18924 fmt = fmt.replace(/^#+([0.])/, "$1");
18945 crc = ( crc >>> 8 ) ^ x; 18925 if((r = fmt.match(/^(0*)\.(#*)$/)) !== null) {
18946 } 18926 return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
18947 18927 }
18948 return crc ^ (-1); 18928 if((r = fmt.match(/^#,##0(\.?)$/)) !== null) return sign + commaify(pad0r(aval,0));
18949 }, 18929 if((r = fmt.match(/^#,##0\.([#0]*0)$/)) !== null) {
18950 18930 return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val))) + "." + pad0(dec(val, r[1].length),r[1].length);
18951 // Inspired by http://my.opera.com/GreyWyvern/blog/show.dml/1725165 18931 }
18952 clone : function() { 18932 if((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
18953 var newObj = new JSZip(); 18933 if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) !== null) {
18954 for (var i in this) { 18934 o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
18955 if (typeof this[i] !== "function") { 18935 ri = 0;
18956 newObj[i] = this[i]; 18936 return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':"";}));
18957 } 18937 }
18958 } 18938 if(fmt.match(phone) !== null) {
18959 return newObj; 18939 o = write_num_flt(type, "##########", val);
18960 }, 18940 return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
18961 18941 }
18962 18942 var oa = "";
18963 /** 18943 if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) {
18964 * http://www.webtoolkit.info/javascript-utf8.html 18944 ri = Math.min(r[4].length,7);
18965 */ 18945 ff = frac(aval, Math.pow(10,ri)-1, false);
18966 utf8encode : function (string) { 18946 o = "" + sign;
18967 string = string.replace(/\r\n/g,"\n"); 18947 oa = write_num("n", r[1], ff[1]);
18968 var utftext = ""; 18948 if(oa[oa.length-1] == " ") oa = oa.substr(0,oa.length-1) + "0";
18969 18949 o += oa + r[2] + "/" + r[3];
18970 for (var n = 0; n < string.length; n++) { 18950 oa = rpad_(ff[2],ri);
18971 18951 if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
18972 var c = string.charCodeAt(n); 18952 o += oa;
18973 18953 return o;
18974 if (c < 128) { 18954 }
18975 utftext += String.fromCharCode(c); 18955 if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) {
18976 } else if ((c > 127) && (c < 2048)) { 18956 ri = Math.min(Math.max(r[1].length, r[4].length),7);
18977 utftext += String.fromCharCode((c >> 6) | 192); 18957 ff = frac(aval, Math.pow(10,ri)-1, true);
18978 utftext += String.fromCharCode((c & 63) | 128); 18958 return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
18979 } else { 18959 }
18980 utftext += String.fromCharCode((c >> 12) | 224); 18960 if((r = fmt.match(/^[#0?]+$/)) !== null) {
18981 utftext += String.fromCharCode(((c >> 6) & 63) | 128); 18961 o = pad0r(val, 0);
18982 utftext += String.fromCharCode((c & 63) | 128); 18962 if(fmt.length <= o.length) return o;
18983 } 18963 return hashq(fmt.substr(0,fmt.length-o.length)) + o;
18984 18964 }
18985 } 18965 if((r = fmt.match(/^([#0?]+)\.([#0]+)$/)) !== null) {
18986 18966 o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
18987 return utftext; 18967 ri = o.indexOf(".");
18988 }, 18968 var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
18989 18969 return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
18990 /** 18970 }
18991 * http://www.webtoolkit.info/javascript-utf8.html 18971 if((r = fmt.match(/^00,000\.([#0]*0)$/)) !== null) {
18992 */ 18972 ri = dec(val, r[1].length);
18993 utf8decode : function (utftext) { 18973 return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length);
18994 var string = ""; 18974 }
18995 var i = 0; 18975 switch(fmt) {
18996 var c = 0, c1 = 0, c2 = 0, c3 = 0; 18976 case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : "";
18997 18977 default:
18998 while ( i < utftext.length ) { 18978 }
18999 18979 throw new Error("unsupported format |" + fmt + "|");
19000 c = utftext.charCodeAt(i); 18980 }
19001 18981 function write_num_cm2(type, fmt, val){
19002 if (c < 128) { 18982 var idx = fmt.length - 1;
19003 string += String.fromCharCode(c); 18983 while(fmt.charCodeAt(idx-1) === 44) --idx;
19004 i++; 18984 return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
19005 } else if ((c > 191) && (c < 224)) { 18985 }
19006 c2 = utftext.charCodeAt(i+1); 18986 function write_num_pct2(type, fmt, val){
19007 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 18987 var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
19008 i += 2; 18988 return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
19009 } else { 18989 }
19010 c2 = utftext.charCodeAt(i+1); 18990 function write_num_exp2(fmt, val){
19011 c3 = utftext.charCodeAt(i+2); 18991 var o;
19012 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 18992 var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
19013 i += 3; 18993 if(fmt.match(/^#+0.0E\+0$/)) {
19014 } 18994 var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
19015 18995 var ee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E)%period;
19016 } 18996 if(ee < 0) ee += period;
19017 18997 o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
19018 return string; 18998 if(!o.match(/[Ee]/)) {
19019 } 18999 var fakee = Math.floor(Math.log(Math.abs(val))*Math.LOG10E);
19020 }; 19000 if(o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
19021 }()); 19001 else o += "E+" + (fakee - ee);
19022 19002 o = o.replace(/\+-/,"-");
19003 }
19004 o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
19005 } else o = val.toExponential(idx);
19006 if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o[o.length-1];
19007 if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
19008 return o.replace("e","E");
19009 }
19010 function write_num_int(type, fmt, val) {
19011 if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
19012 var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
19013 if(val >= 0) return write_num_int('n', ffmt, val);
19014 return '(' + write_num_int('n', ffmt, -val) + ')';
19015 }
19016 if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
19017 if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
19018 if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
19019 if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt[1]==' '?2:1),val);
19020 var o;
19021 var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
19022 if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);
19023 if(fmt.match(/^[#?]+$/)) {
19024 o = (""+val); if(val === 0) o = "";
19025 return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
19026 }
19027 if((r = fmt.match(frac1)) !== null) return write_num_f2(r, aval, sign);
19028 if(fmt.match(/^#+0+$/) !== null) return sign + pad0(aval,fmt.length - fmt.indexOf("0"));
19029 if((r = fmt.match(dec1)) !== null) {
19030 o = (""+val).replace(/^([^\.]+)$/,"$1."+r[1]).replace(/\.$/,"."+r[1]).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", r[1].length-$1.length); });
19031 return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
19032 }
19033 fmt = fmt.replace(/^#+([0.])/, "$1");
19034 if((r = fmt.match(/^(0*)\.(#*)$/)) !== null) {
19035 return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
19036 }
19037 if((r = fmt.match(/^#,##0(\.?)$/)) !== null) return sign + commaify((""+aval));
19038 if((r = fmt.match(/^#,##0\.([#0]*0)$/)) !== null) {
19039 return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length);
19040 }
19041 if((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_int(type,fmt.replace(/^#,#*,/,""),val);
19042 if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) !== null) {
19043 o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val));
19044 ri = 0;
19045 return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o[ri++]:x==='0'?'0':"";}));
19046 }
19047 if(fmt.match(phone) !== null) {
19048 o = write_num_int(type, "##########", val);
19049 return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
19050 }
19051 var oa = "";
19052 if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) {
19053 ri = Math.min(r[4].length,7);
19054 ff = frac(aval, Math.pow(10,ri)-1, false);
19055 o = "" + sign;
19056 oa = write_num("n", r[1], ff[1]);
19057 if(oa[oa.length-1] == " ") oa = oa.substr(0,oa.length-1) + "0";
19058 o += oa + r[2] + "/" + r[3];
19059 oa = rpad_(ff[2],ri);
19060 if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
19061 o += oa;
19062 return o;
19063 }
19064 if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) {
19065 ri = Math.min(Math.max(r[1].length, r[4].length),7);
19066 ff = frac(aval, Math.pow(10,ri)-1, true);
19067 return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
19068 }
19069 if((r = fmt.match(/^[#0?]+$/)) !== null) {
19070 o = "" + val;
19071 if(fmt.length <= o.length) return o;
19072 return hashq(fmt.substr(0,fmt.length-o.length)) + o;
19073 }
19074 if((r = fmt.match(/^([#0]+)\.([#0]+)$/)) !== null) {
19075 o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
19076 ri = o.indexOf(".");
19077 var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
19078 return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
19079 }
19080 if((r = fmt.match(/^00,000\.([#0]*0)$/)) !== null) {
19081 return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length);
19082 }
19083 switch(fmt) {
19084 case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : "";
19085 default:
19086 }
19087 throw new Error("unsupported format |" + fmt + "|");
19088 }
19089 return function write_num(type, fmt, val) {
19090 return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
19091 };})();
19092 function split_fmt(fmt) {
19093 var out = [];
19094 var in_str = false, cc;
19095 for(var i = 0, j = 0; i < fmt.length; ++i) switch((cc=fmt.charCodeAt(i))) {
19096 case 34: /* '"' */
19097 in_str = !in_str; break;
19098 case 95: case 42: case 92: /* '_' '*' '\\' */
19099 ++i; break;
19100 case 59: /* ';' */
19101 out[out.length] = fmt.substr(j,i-j);
19102 j = i+1;
19103 }
19104 out[out.length] = fmt.substr(j);
19105 if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
19106 return out;
19107 }
19108 SSF._split = split_fmt;
19109 var abstime = /\[[HhMmSs]*\]/;
19110 function eval_fmt(fmt, v, opts, flen) {
19111 var out = [], o = "", i = 0, c = "", lst='t', q, dt, j, cc;
19112 var hr='H';
19113 /* Tokenize */
19114 while(i < fmt.length) {
19115 switch((c = fmt[i])) {
19116 case 'G': /* General */
19117 if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
19118 out[out.length] = {t:'G', v:'General'}; i+=7; break;
19119 case '"': /* Literal text */
19120 for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
19121 out[out.length] = {t:'t', v:o}; ++i; break;
19122 case '\\': var w = fmt[++i], t = (w === "(" || w === ")") ? w : 't';
19123 out[out.length] = {t:t, v:w}; ++i; break;
19124 case '_': out[out.length] = {t:'t', v:" "}; i+=2; break;
19125 case '@': /* Text Placeholder */
19126 out[out.length] = {t:'T', v:v}; ++i; break;
19127 case 'B': case 'b':
19128 if(fmt[i+1] === "1" || fmt[i+1] === "2") {
19129 if(dt==null) { dt=parse_date_code(v, opts, fmt[i+1] === "2"); if(dt==null) return ""; }
19130 out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
19131 }
19132 /* falls through */
19133 case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
19134 c = c.toLowerCase();
19135 /* falls through */
19136 case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':
19137 if(v < 0) return "";
19138 if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
19139 o = c; while(++i<fmt.length && fmt[i].toLowerCase() === c) o+=c;
19140 if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; /* m = minute */
19141 if(c === 'h') c = hr;
19142 out[out.length] = {t:c, v:o}; lst = c; break;
19143 case 'A':
19144 q={t:c, v:"A"};
19145 if(dt==null) dt=parse_date_code(v, opts);
19146 if(fmt.substr(i, 3) === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
19147 else if(fmt.substr(i,5) === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
19148 else { q.t = "t"; ++i; }
19149 if(dt==null && q.t === 'T') return "";
19150 out[out.length] = q; lst = c; break;
19151 case '[':
19152 o = c;
19153 while(fmt[i++] !== ']' && i < fmt.length) o += fmt[i];
19154 if(o.substr(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
19155 if(o.match(abstime)) {
19156 if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
19157 out[out.length] = {t:'Z', v:o.toLowerCase()};
19158 } else { o=""; }
19159 break;
19160 /* Numbers */
19161 case '.':
19162 if(dt != null) {
19163 o = c; while((c=fmt[++i]) === "0") o += c;
19164 out[out.length] = {t:'s', v:o}; break;
19165 }
19166 /* falls through */
19167 case '0': case '#':
19168 o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1 || c=='\\' && fmt[i+1] == "-" && "0#".indexOf(fmt[i+2])>-1) o += c;
19169 out[out.length] = {t:'n', v:o}; break;
19170 case '?':
19171 o = c; while(fmt[++i] === c) o+=c;
19172 q={t:c, v:o}; out[out.length] = q; lst = c; break;
19173 case '*': ++i; if(fmt[i] == ' ' || fmt[i] == '*') ++i; break; // **
19174 case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;
19175 case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
19176 o = c; while("0123456789".indexOf(fmt[++i]) > -1) o+=fmt[i];
19177 out[out.length] = {t:'D', v:o}; break;
19178 case ' ': out[out.length] = {t:c, v:c}; ++i; break;
19179 default:
19180 if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
19181 out[out.length] = {t:'t', v:c}; ++i; break;
19182 }
19183 }
19184 var bt = 0, ss0 = 0, ssm;
19185 for(i=out.length-1, lst='t'; i >= 0; --i) {
19186 switch(out[i].t) {
19187 case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
19188 case 's':
19189 if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);
19190 if(bt < 3) bt = 3;
19191 /* falls through */
19192 case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
19193 case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
19194 case 'X': if(out[i].v === "B2");
19195 break;
19196 case 'Z':
19197 if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
19198 if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
19199 if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
19200 }
19201 }
19202 switch(bt) {
19203 case 0: break;
19204 case 1:
19205 if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
19206 if(dt.S >= 60) { dt.S = 0; ++dt.M; }
19207 if(dt.M >= 60) { dt.M = 0; ++dt.H; }
19208 break;
19209 case 2:
19210 if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
19211 if(dt.S >= 60) { dt.S = 0; ++dt.M; }
19212 break;
19213 }
19214 /* replace fields */
19215 var nstr = "", jj;
19216 for(i=0; i < out.length; ++i) {
19217 switch(out[i].t) {
19218 case 't': case 'T': case ' ': case 'D': break;
19219 case 'X': out[i] = undefined; break;
19220 case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
19221 out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
19222 out[i].t = 't'; break;
19223 case 'n': case '(': case '?':
19224 jj = i+1;
19225 while(out[jj] != null && (
19226 (c=out[jj].t) === "?" || c === "D" ||
19227 (c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/') ||
19228 out[i].t === '(' && (c === ' ' || c === 'n' || c === ')') ||
19229 c === 't' && (out[jj].v === '/' || '$€'.indexOf(out[jj].v) > -1 || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')
19230 )) {
19231 out[i].v += out[jj].v;
19232 out[jj] = undefined; ++jj;
19233 }
19234 nstr += out[i].v;
19235 i = jj-1; break;
19236 case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
19237 }
19238 }
19239 var vv = "", myv, ostr;
19240 if(nstr.length > 0) {
19241 myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); /* '-' */
19242 ostr = write_num(nstr.charCodeAt(0) === 40 ? '(' : 'n', nstr, myv); /* '(' */
19243 jj=ostr.length-1;
19244 var decpt = out.length;
19245 for(i=0; i < out.length; ++i) if(out[i] != null && out[i].v.indexOf(".") > -1) { decpt = i; break; }
19246 var lasti=out.length;
19247 if(decpt === out.length && ostr.indexOf("E") === -1) {
19248 for(i=out.length-1; i>= 0;--i) {
19249 if(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;
19250 if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }
19251 else if(jj < 0) out[i].v = "";
19252 else { out[i].v = ostr.substr(0, jj+1); jj = -1; }
19253 out[i].t = 't';
19254 lasti = i;
19255 }
19256 if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
19257 }
19258 else if(decpt !== out.length && ostr.indexOf("E") === -1) {
19259 jj = ostr.indexOf(".")-1;
19260 for(i=decpt; i>= 0; --i) {
19261 if(out[i] == null || 'n?('.indexOf(out[i].t) === -1) continue;
19262 j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;
19263 vv = out[i].v.substr(j+1);
19264 for(; j>=0; --j) {
19265 if(jj>=0 && (out[i].v[j] === "0" || out[i].v[j] === "#")) vv = ostr[jj--] + vv;
19266 }
19267 out[i].v = vv;
19268 out[i].t = 't';
19269 lasti = i;
19270 }
19271 if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
19272 jj = ostr.indexOf(".")+1;
19273 for(i=decpt; i<out.length; ++i) {
19274 if(out[i] == null || 'n?('.indexOf(out[i].t) === -1 && i !== decpt ) continue;
19275 j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;
19276 vv = out[i].v.substr(0,j);
19277 for(; j<out[i].v.length; ++j) {
19278 if(jj<ostr.length) vv += ostr[jj++];
19279 }
19280 out[i].v = vv;
19281 out[i].t = 't';
19282 lasti = i;
19283 }
19284 }
19285 }
19286 for(i=0; i<out.length; ++i) if(out[i] != null && 'n(?'.indexOf(out[i].t)>-1) {
19287 myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v);
19288 out[i].v = write_num(out[i].t, out[i].v, myv);
19289 out[i].t = 't';
19290 }
19291 var retval = "";
19292 for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;
19293 return retval;
19294 }
19295 SSF._eval = eval_fmt;
19296 var cfregex = /\[[=<>]/;
19297 var cfregex2 = /\[([=<>]*)(-?\d+\.?\d*)\]/;
19298 function chkcond(v, rr) {
19299 if(rr == null) return false;
19300 var thresh = parseFloat(rr[2]);
19301 switch(rr[1]) {
19302 case "=": if(v == thresh) return true; break;
19303 case ">": if(v > thresh) return true; break;
19304 case "<": if(v < thresh) return true; break;
19305 case "<>": if(v != thresh) return true; break;
19306 case ">=": if(v >= thresh) return true; break;
19307 case "<=": if(v <= thresh) return true; break;
19308 }
19309 return false;
19310 }
19311 function choose_fmt(f, v) {
19312 var fmt = split_fmt(f);
19313 var l = fmt.length, lat = fmt[l-1].indexOf("@");
19314 if(l<4 && lat>-1) --l;
19315 if(fmt.length > 4) throw "cannot find right format for |" + fmt + "|";
19316 if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
19317 switch(fmt.length) {
19318 case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
19319 case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
19320 case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break;
19321 case 4: break;
19322 }
19323 var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
19324 if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
19325 if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
19326 var m1 = fmt[0].match(cfregex2);
19327 var m2 = fmt[1].match(cfregex2);
19328 return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
19329 }
19330 return [l, ff];
19331 }
19332 function format(fmt,v,o) {
19333 fixopts(o != null ? o : (o=[]));
19334 var sfmt = "";
19335 switch(typeof fmt) {
19336 case "string": sfmt = fmt; break;
19337 case "number": sfmt = (o.table != null ? o.table : table_fmt)[fmt]; break;
19338 }
19339 if(isgeneral(sfmt,0)) return general_fmt(v, o);
19340 var f = choose_fmt(sfmt, v);
19341 if(isgeneral(f[1])) return general_fmt(v, o);
19342 if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
19343 else if(v === "" || v == null) return "";
19344 return eval_fmt(f[1], v, o, f[0]);
19345 }
19346 SSF._table = table_fmt;
19347 SSF.load = function load_entry(fmt, idx) { table_fmt[idx] = fmt; };
19348 SSF.format = format;
19349 SSF.get_table = function get_table() { return table_fmt; };
19350 SSF.load_table = function load_table(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i] !== undefined) SSF.load(tbl[i], i); };
19351 };
19352 make_ssf(SSF);
19353 function isval(x) { return x !== undefined && x !== null; }
19354
19355 function keys(o) { return Object.keys(o); }
19356
19357 function evert_key(obj, key) {
19358 var o = [], K = keys(obj);
19359 for(var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i];
19360 return o;
19361 }
19362
19363 function evert(obj) {
19364 var o = [], K = keys(obj);
19365 for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];
19366 return o;
19367 }
19368
19369 function evert_num(obj) {
19370 var o = [], K = keys(obj);
19371 for(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);
19372 return o;
19373 }
19374
19375 function evert_arr(obj) {
19376 var o = [], K = keys(obj);
19377 for(var i = 0; i !== K.length; ++i) {
19378 if(o[obj[K[i]]] == null) o[obj[K[i]]] = [];
19379 o[obj[K[i]]].push(K[i]);
19380 }
19381 return o;
19382 }
19383
19384 /* TODO: date1904 logic */
19385 function datenum(v, date1904) {
19386 if(date1904) v+=1462;
19387 var epoch = Date.parse(v);
19388 return (epoch + 2209161600000) / (24 * 60 * 60 * 1000);
19389 }
19390
19391 function cc2str(arr) {
19392 var o = "";
19393 for(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);
19394 return o;
19395 }
19396
19397 var has_buf = (typeof Buffer !== 'undefined');
19398 function getdata(data) {
19399 if(!data) return null;
19400 if(data.name.substr(-4) === ".bin") {
19401 if(data.data) return char_codes(data.data);
19402 if(data.asNodeBuffer && has_buf) return data.asNodeBuffer();
19403 if(data._data && data._data.getContent) return Array.prototype.slice.call(data._data.getContent());
19404 } else {
19405 if(data.data) return data.name.substr(-4) !== ".bin" ? debom_xml(data.data) : char_codes(data.data);
19406 if(data.asNodeBuffer && has_buf) return debom_xml(data.asNodeBuffer().toString('binary'));
19407 if(data.asBinary) return debom_xml(data.asBinary());
19408 if(data._data && data._data.getContent) return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));
19409 }
19410 return null;
19411 }
19412
19413 function getzipfile(zip, file) {
19414 var f = file; if(zip.files[f]) return zip.files[f];
19415 f = file.toLowerCase(); if(zip.files[f]) return zip.files[f];
19416 f = f.replace(/\//g,'\\'); if(zip.files[f]) return zip.files[f];
19417 throw new Error("Cannot find file " + file + " in zip");
19418 }
19419
19420 function getzipdata(zip, file, safe) {
19421 if(!safe) return getdata(getzipfile(zip, file));
19422 if(!file) return null;
19423 try { return getzipdata(zip, file); } catch(e) { return null; }
19424 }
19425
19426 var _fs, jszip;
19427 if(typeof JSZip !== 'undefined') jszip = JSZip;
19428 if (typeof exports !== 'undefined') {
19429 if (typeof module !== 'undefined' && module.exports) {
19430 if(has_buf && typeof jszip === 'undefined') jszip = require('js'+'zip');
19431 if(typeof jszip === 'undefined') jszip = require('./js'+'zip').JSZip;
19432 _fs = require('f'+'s');
19433 }
19434 }
19435 var attregexg=/\b[\w:]+=["'][^"]*['"]/g;
19436 var tagregex=/<[^>]*>/g;
19437 var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/;
19438 function parsexmltag(tag, skip_root) {
19439 var z = [];
19440 var eq = 0, c = 0;
19441 for(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;
19442 if(!skip_root) z[0] = tag.substr(0, eq);
19443 if(eq === tag.length) return z;
19444 var m = tag.match(attregexg), j=0, w="", v="", i=0, q="", cc="";
19445 if(m) for(i = 0; i != m.length; ++i) {
19446 cc = m[i];
19447 for(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;
19448 q = cc.substr(0,c); v = cc.substring(c+2, cc.length-1);
19449 for(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;
19450 if(j===q.length) z[q] = v;
19451 else z[(j===5 && q.substr(0,5)==="xmlns"?"xmlns":"")+q.substr(j+1)] = v;
19452 }
19453 return z;
19454 }
19455 function strip_ns(x) { return x.replace(nsregex2, "<$1"); }
19456
19457 var encodings = {
19458 '&quot;': '"',
19459 '&apos;': "'",
19460 '&gt;': '>',
19461 '&lt;': '<',
19462 '&amp;': '&'
19463 };
19464 var rencoding = evert(encodings);
19465 var rencstr = "&<>'\"".split("");
19466
19467 // TODO: CP remap (need to read file version to determine OS)
19468 var encregex = /&[a-z]*;/g, coderegex = /_x([\da-fA-F]+)_/g;
19469 function unescapexml(text){
19470 var s = text + '';
19471 return s.replace(encregex, function($$) { return encodings[$$]; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});
19472 }
19473 var decregex=/[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g;
19474 function escapexml(text){
19475 var s = text + '';
19476 return s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return "_x" + ("000"+s.charCodeAt(0).toString(16)).substr(-4) + "_";});
19477 }
19478
19479 function parsexmlbool(value, tag) {
19480 switch(value) {
19481 case '1': case 'true': case 'TRUE': return true;
19482 /* case '0': case 'false': case 'FALSE':*/
19483 default: return false;
19484 }
19485 }
19486
19487 var utf8read = function utf8reada(orig) {
19488 var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;
19489 while (i < orig.length) {
19490 c = orig.charCodeAt(i++);
19491 if (c < 128) { out += String.fromCharCode(c); continue; }
19492 d = orig.charCodeAt(i++);
19493 if (c>191 && c<224) { out += String.fromCharCode(((c & 31) << 6) | (d & 63)); continue; }
19494 e = orig.charCodeAt(i++);
19495 if (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }
19496 f = orig.charCodeAt(i++);
19497 w = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;
19498 out += String.fromCharCode(0xD800 + ((w>>>10)&1023));
19499 out += String.fromCharCode(0xDC00 + (w&1023));
19500 }
19501 return out;
19502 };
19503
19504
19505 if(has_buf) {
19506 var utf8readb = function utf8readb(data) {
19507 var out = new Buffer(2*data.length), w, i, j = 1, k = 0, ww=0, c;
19508 for(i = 0; i < data.length; i+=j) {
19509 j = 1;
19510 if((c=data.charCodeAt(i)) < 128) w = c;
19511 else if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }
19512 else if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }
19513 else { j = 4;
19514 w = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);
19515 w -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
19516 }
19517 if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
19518 out[k++] = w%256; out[k++] = w>>>8;
19519 }
19520 out.length = k;
19521 return out.toString('ucs2');
19522 };
19523 var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
19524 if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
19525 var utf8readc = function utf8readc(data) { return Buffer(data, 'binary').toString('utf8'); };
19526 if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
19527 }
19528
19529 // matches <foo>...</foo> extracts content
19530 var matchtag = (function() {
19531 var mtcache = {};
19532 return function matchtag(f,g) {
19533 var t = f+"|"+g;
19534 if(mtcache[t] !== undefined) return mtcache[t];
19535 return (mtcache[t] = new RegExp('<(?:\\w+:)?'+f+'(?: xml:space="preserve")?(?:[^>]*)>([^\u2603]*)</(?:\\w+:)?'+f+'>',(g||"")));
19536 };
19537 })();
19538
19539 var vtregex = (function(){ var vt_cache = {};
19540 return function vt_regex(bt) {
19541 if(vt_cache[bt] !== undefined) return vt_cache[bt];
19542 return (vt_cache[bt] = new RegExp("<vt:" + bt + ">(.*?)</vt:" + bt + ">", 'g') );
19543 };})();
19544 var vtvregex = /<\/?vt:variant>/g, vtmregex = /<vt:([^>]*)>(.*)</;
19545 function parseVector(data) {
19546 var h = parsexmltag(data);
19547
19548 var matches = data.match(vtregex(h.baseType))||[];
19549 if(matches.length != h.size) throw "unexpected vector length " + matches.length + " != " + h.size;
19550 var res = [];
19551 matches.forEach(function(x) {
19552 var v = x.replace(vtvregex,"").match(vtmregex);
19553 res.push({v:v[2], t:v[1]});
19554 });
19555 return res;
19556 }
19557
19558 var wtregex = /(^\s|\s$|\n)/;
19559 function writetag(f,g) {return '<' + f + (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f + '>';}
19560
19561 function wxt_helper(h) { return keys(h).map(function(k) { return " " + k + '="' + h[k] + '"';}).join(""); }
19562 function writextag(f,g,h) { return '<' + f + (isval(h) ? wxt_helper(h) : "") + (isval(g) ? (g.match(wtregex)?' xml:space="preserve"' : "") + '>' + g + '</' + f : "/") + '>';}
19563
19564 function write_w3cdtf(d, t) { try { return d.toISOString().replace(/\.\d*/,""); } catch(e) { if(t) throw e; } }
19565
19566 function write_vt(s) {
19567 switch(typeof s) {
19568 case 'string': return writextag('vt:lpwstr', s);
19569 case 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', String(s));
19570 case 'boolean': return writextag('vt:bool',s?'true':'false');
19571 }
19572 if(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));
19573 throw new Error("Unable to serialize " + s);
19574 }
19575
19576 var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
19577 var XMLNS = {
19578 'dc': 'http://purl.org/dc/elements/1.1/',
19579 'dcterms': 'http://purl.org/dc/terms/',
19580 'dcmitype': 'http://purl.org/dc/dcmitype/',
19581 'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',
19582 'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
19583 'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',
19584 'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',
19585 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
19586 'xsd': 'http://www.w3.org/2001/XMLSchema'
19587 };
19588
19589 XMLNS.main = [
19590 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
19591 'http://purl.oclc.org/ooxml/spreadsheetml/main',
19592 'http://schemas.microsoft.com/office/excel/2006/main',
19593 'http://schemas.microsoft.com/office/excel/2006/2'
19594 ];
19595 function readIEEE754(buf, idx, isLE, nl, ml) {
19596 if(isLE === undefined) isLE = true;
19597 if(!nl) nl = 8;
19598 if(!ml && nl === 8) ml = 52;
19599 var e, m, el = nl * 8 - ml - 1, eMax = (1 << el) - 1, eBias = eMax >> 1;
19600 var bits = -7, d = isLE ? -1 : 1, i = isLE ? (nl - 1) : 0, s = buf[idx + i];
19601
19602 i += d;
19603 e = s & ((1 << (-bits)) - 1); s >>>= (-bits); bits += el;
19604 for (; bits > 0; e = e * 256 + buf[idx + i], i += d, bits -= 8);
19605 m = e & ((1 << (-bits)) - 1); e >>>= (-bits); bits += ml;
19606 for (; bits > 0; m = m * 256 + buf[idx + i], i += d, bits -= 8);
19607 if (e === eMax) return m ? NaN : ((s ? -1 : 1) * Infinity);
19608 else if (e === 0) e = 1 - eBias;
19609 else { m = m + Math.pow(2, ml); e = e - eBias; }
19610 return (s ? -1 : 1) * m * Math.pow(2, e - ml);
19611 }
19612
19613 var __toBuffer, ___toBuffer;
19614 __toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for(var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]); } return x; };
19615 var __double, ___double;
19616 __double = ___double = function(b, idx) { return readIEEE754(b, idx);};
19617
19618 var is_buf = function is_buf_a(a) { return Array.isArray(a); };
19619 if(has_buf) {
19620 __toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};
19621 __double = function double_(b,i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };
19622 is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };
19623 }
19624
19625
19626 var __readUInt8 = function(b, idx) { return b[idx]; };
19627 var __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; };
19628 var __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; };
19629 var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };
19630 var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };
19631
19632
19633 function ReadShift(size, t) {
19634 var o="", oo=[], w, vv, i, loc;
19635 if(t === 'dbcs') {
19636 loc = this.l;
19637 if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le");
19638 else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }
19639 size *= 2;
19640 } else switch(size) {
19641 case 1: o = __readUInt8(this, this.l); break;
19642 case 2: o = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); break;
19643 case 4: o = __readUInt32LE(this, this.l); break;
19644 case 8: if(t === 'f') { o = __double(this, this.l); break; }
19645 }
19646 this.l+=size; return o;
19647 }
19648
19649 function WriteShift(t, val, f) {
19650 var size, i;
19651 if(f === 'dbcs') {
19652 for(i = 0; i != val.length; ++i) this.writeUInt16LE(val.charCodeAt(i), this.l + 2 * i);
19653 size = 2 * val.length;
19654 } else switch(t) {
19655 case 1: size = 1; this[this.l] = val&255; break;
19656 case 3: size = 3; this[this.l+2] = val & 255; val >>>= 8; this[this.l+1] = val&255; val >>>= 8; this[this.l] = val&255; break;
19657 case 4: size = 4; this.writeUInt32LE(val, this.l); break;
19658 case 8: size = 8; if(f === 'f') { this.writeDoubleLE(val, this.l); break; }
19659 /* falls through */
19660 case 16: break;
19661 case -4: size = 4; this.writeInt32LE(val, this.l); break;
19662 }
19663 this.l += size; return this;
19664 }
19665
19666 function prep_blob(blob, pos) {
19667 blob.l = pos;
19668 blob.read_shift = ReadShift;
19669 blob.write_shift = WriteShift;
19670 }
19671
19672 function parsenoop(blob, length) { blob.l += length; }
19673
19674 function writenoop(blob, length) { blob.l += length; }
19675
19676 function new_buf(sz) {
19677 var o = has_buf ? new Buffer(sz) : new Array(sz);
19678 prep_blob(o, 0);
19679 return o;
19680 }
19681
19682 /* [MS-XLSB] 2.1.4 Record */
19683 function recordhopper(data, cb, opts) {
19684 var tmpbyte, cntbyte, length;
19685 prep_blob(data, data.l || 0);
19686 while(data.l < data.length) {
19687 var RT = data.read_shift(1);
19688 if(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);
19689 var R = RecordEnum[RT] || RecordEnum[0xFFFF];
19690 tmpbyte = data.read_shift(1);
19691 length = tmpbyte & 0x7F;
19692 for(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);
19693 var d = R.f(data, length, opts);
19694 if(cb(d, R, RT)) return;
19695 }
19696 }
19697
19698 /* control buffer usage for fixed-length buffers */
19699 function buf_array() {
19700 var bufs = [], blksz = 2048;
19701 var newblk = function ba_newblk(sz) {
19702 var o = new_buf(sz);
19703 prep_blob(o, 0);
19704 return o;
19705 };
19706
19707 var curbuf = newblk(blksz);
19708
19709 var endbuf = function ba_endbuf() {
19710 curbuf.length = curbuf.l;
19711 if(curbuf.length > 0) bufs.push(curbuf);
19712 curbuf = null;
19713 };
19714
19715 var next = function ba_next(sz) {
19716 if(sz < curbuf.length - curbuf.l) return curbuf;
19717 endbuf();
19718 return (curbuf = newblk(Math.max(sz+1, blksz)));
19719 };
19720
19721 var end = function ba_end() {
19722 endbuf();
19723 return __toBuffer([bufs]);
19724 };
19725
19726 var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); };
19727
19728 return { next:next, push:push, end:end, _bufs:bufs };
19729 }
19730
19731 function write_record(ba, type, payload, length) {
19732 var t = evert_RE[type], l;
19733 if(!length) length = RecordEnum[t].p || (payload||[]).length || 0;
19734 l = 1 + (t >= 0x80 ? 1 : 0) + 1 + length;
19735 if(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;
19736 var o = ba.next(l);
19737 if(t <= 0x7F) o.write_shift(1, t);
19738 else {
19739 o.write_shift(1, (t & 0x7F) + 0x80);
19740 o.write_shift(1, (t >> 7));
19741 }
19742 for(var i = 0; i != 4; ++i) {
19743 if(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }
19744 else { o.write_shift(1, length); break; }
19745 }
19746 if(length > 0 && is_buf(payload)) ba.push(payload);
19747 }
19748
19749 /* [MS-XLSB] 2.5.143 */
19750 function parse_StrRun(data, length) {
19751 return { ich: data.read_shift(2), ifnt: data.read_shift(2) };
19752 }
19753
19754 /* [MS-XLSB] 2.1.7.121 */
19755 function parse_RichStr(data, length) {
19756 var start = data.l;
19757 var flags = data.read_shift(1);
19758 var str = parse_XLWideString(data);
19759 var rgsStrRun = [];
19760 var z = { t: str, h: str };
19761 if((flags & 1) !== 0) { /* fRichStr */
19762 /* TODO: formatted string */
19763 var dwSizeStrRun = data.read_shift(4);
19764 for(var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));
19765 z.r = rgsStrRun;
19766 }
19767 else z.r = "<t>" + escapexml(str) + "</t>";
19768 if((flags & 2) !== 0) { /* fExtStr */
19769 /* TODO: phonetic string */
19770 }
19771 data.l = start + length;
19772 return z;
19773 }
19774 function write_RichStr(str, o) {
19775 /* TODO: formatted string */
19776 if(o == null) o = new_buf(5+2*str.t.length);
19777 o.write_shift(1,0);
19778 write_XLWideString(str.t, o);
19779 return o;
19780 }
19781
19782 /* [MS-XLSB] 2.5.9 */
19783 function parse_Cell(data) {
19784 var col = data.read_shift(4);
19785 var iStyleRef = data.read_shift(2);
19786 iStyleRef += data.read_shift(1) <<16;
19787 var fPhShow = data.read_shift(1);
19788 return { c:col, iStyleRef: iStyleRef };
19789 }
19790 function write_Cell(cell, o) {
19791 if(o == null) o = new_buf(8);
19792 o.write_shift(-4, cell.c);
19793 o.write_shift(3, cell.iStyleRef === undefined ? cell.iStyleRef : cell.s);
19794 o.write_shift(1, 0); /* fPhShow */
19795 return o;
19796 }
19797
19798
19799 /* [MS-XLSB] 2.5.21 */
19800 function parse_CodeName (data, length) { return parse_XLWideString(data, length); }
19801
19802 /* [MS-XLSB] 2.5.166 */
19803 function parse_XLNullableWideString(data) {
19804 var cchCharacters = data.read_shift(4);
19805 return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data.read_shift(cchCharacters, 'dbcs');
19806 }
19807 function write_XLNullableWideString(data, o) {
19808 if(!o) o = new_buf(127);
19809 o.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);
19810 if(data.length > 0) o.write_shift(0, data, 'dbcs');
19811 return o;
19812 }
19813
19814 /* [MS-XLSB] 2.5.168 */
19815 function parse_XLWideString(data) {
19816 var cchCharacters = data.read_shift(4);
19817 return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, 'dbcs');
19818 }
19819 function write_XLWideString(data, o) {
19820 if(o == null) o = new_buf(4+2*data.length);
19821 o.write_shift(4, data.length);
19822 if(data.length > 0) o.write_shift(0, data, 'dbcs');
19823 return o;
19824 }
19825
19826 /* [MS-XLSB] 2.5.114 */
19827 var parse_RelID = parse_XLNullableWideString;
19828 var write_RelID = write_XLNullableWideString;
19829
19830
19831 /* [MS-XLSB] 2.5.122 */
19832 function parse_RkNumber(data) {
19833 var b = data.slice(data.l, data.l+4);
19834 var fX100 = b[0] & 1, fInt = b[0] & 2;
19835 data.l+=4;
19836 b[0] &= 0xFC;
19837 var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2;
19838 return fX100 ? RK/100 : RK;
19839 }
19840
19841 /* [MS-XLSB] 2.5.153 */
19842 function parse_UncheckedRfX(data) {
19843 var cell = {s: {}, e: {}};
19844 cell.s.r = data.read_shift(4);
19845 cell.e.r = data.read_shift(4);
19846 cell.s.c = data.read_shift(4);
19847 cell.e.c = data.read_shift(4);
19848 return cell;
19849 }
19850
19851 function write_UncheckedRfX(r, o) {
19852 if(!o) o = new_buf(16);
19853 o.write_shift(4, r.s.r);
19854 o.write_shift(4, r.e.r);
19855 o.write_shift(4, r.s.c);
19856 o.write_shift(4, r.e.c);
19857 return o;
19858 }
19859
19860 /* [MS-XLSB] 2.5.171 */
19861 function parse_Xnum(data, length) { return data.read_shift(8, 'f'); }
19862 function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, 'f', data); }
19863
19864 /* [MS-XLSB] 2.5.198.2 */
19865 var BErr = {
19866 0x00: "#NULL!",
19867 0x07: "#DIV/0!",
19868 0x0F: "#VALUE!",
19869 0x17: "#REF!",
19870 0x1D: "#NAME?",
19871 0x24: "#NUM!",
19872 0x2A: "#N/A",
19873 0x2B: "#GETTING_DATA",
19874 0xFF: "#WTF?"
19875 };
19876 var RBErr = evert_num(BErr);
19877
19878 /* [MS-XLSB] 2.4.321 BrtColor */
19879 function parse_BrtColor(data, length) {
19880 var out = {};
19881 var d = data.read_shift(1);
19882 out.fValidRGB = d & 1;
19883 out.xColorType = d >>> 1;
19884 out.index = data.read_shift(1);
19885 out.nTintAndShade = data.read_shift(2, 'i');
19886 out.bRed = data.read_shift(1);
19887 out.bGreen = data.read_shift(1);
19888 out.bBlue = data.read_shift(1);
19889 out.bAlpha = data.read_shift(1);
19890 }
19891
19892 /* [MS-XLSB] 2.5.52 */
19893 function parse_FontFlags(data, length) {
19894 var d = data.read_shift(1);
19895 data.l++;
19896 var out = {
19897 fItalic: d & 0x2,
19898 fStrikeout: d & 0x8,
19899 fOutline: d & 0x10,
19900 fShadow: d & 0x20,
19901 fCondense: d & 0x40,
19902 fExtend: d & 0x80
19903 };
19904 return out;
19905 }
19906 /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
19907 /* 12.3 Part Summary <SpreadsheetML> */
19908 /* 14.2 Part Summary <DrawingML> */
19909 /* [MS-XLSX] 2.1 Part Enumerations */
19910 /* [MS-XLSB] 2.1.7 Part Enumeration */
19911 var ct2type = {
19912 /* Workbook */
19913 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
19914
19915 /* Worksheet */
19916 "application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */
19917
19918 /* Chartsheet */
19919 "application/vnd.ms-excel.chartsheet": "TODO",
19920 "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": "TODO",
19921
19922 /* Dialogsheet */
19923 "application/vnd.ms-excel.dialogsheet": "TODO",
19924 "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": "TODO",
19925
19926 /* Macrosheet */
19927 "application/vnd.ms-excel.macrosheet": "TODO",
19928 "application/vnd.ms-excel.macrosheet+xml": "TODO",
19929 "application/vnd.ms-excel.intlmacrosheet": "TODO",
19930 "application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */
19931
19932 /* File Properties */
19933 "application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
19934 "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
19935 "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
19936
19937 /* Custom Data Properties */
19938 "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
19939
19940 /* Comments */
19941 "application/vnd.ms-excel.comments": "comments",
19942 "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": "comments",
19943
19944 /* PivotTable */
19945 "application/vnd.ms-excel.pivotTable": "TODO",
19946 "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
19947
19948 /* Calculation Chain */
19949 "application/vnd.ms-excel.calcChain": "calcchains",
19950 "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
19951
19952 /* Printer Settings */
19953 "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
19954
19955 /* ActiveX */
19956 "application/vnd.ms-office.activeX": "TODO",
19957 "application/vnd.ms-office.activeX+xml": "TODO",
19958
19959 /* Custom Toolbars */
19960 "application/vnd.ms-excel.attachedToolbars": "TODO",
19961
19962 /* External Data Connections */
19963 "application/vnd.ms-excel.connections": "TODO",
19964 "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
19965
19966 /* External Links */
19967 "application/vnd.ms-excel.externalLink": "TODO",
19968 "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "TODO",
19969
19970 /* Metadata */
19971 "application/vnd.ms-excel.sheetMetadata": "TODO",
19972 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO",
19973
19974 /* PivotCache */
19975 "application/vnd.ms-excel.pivotCacheDefinition": "TODO",
19976 "application/vnd.ms-excel.pivotCacheRecords": "TODO",
19977 "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
19978 "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
19979
19980 /* Query Table */
19981 "application/vnd.ms-excel.queryTable": "TODO",
19982 "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
19983
19984 /* Shared Workbook */
19985 "application/vnd.ms-excel.userNames": "TODO",
19986 "application/vnd.ms-excel.revisionHeaders": "TODO",
19987 "application/vnd.ms-excel.revisionLog": "TODO",
19988 "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
19989 "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
19990 "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
19991
19992 /* Single Cell Table */
19993 "application/vnd.ms-excel.tableSingleCells": "TODO",
19994 "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
19995
19996 /* Slicer */
19997 "application/vnd.ms-excel.slicer": "TODO",
19998 "application/vnd.ms-excel.slicerCache": "TODO",
19999 "application/vnd.ms-excel.slicer+xml": "TODO",
20000 "application/vnd.ms-excel.slicerCache+xml": "TODO",
20001
20002 /* Sort Map */
20003 "application/vnd.ms-excel.wsSortMap": "TODO",
20004
20005 /* Table */
20006 "application/vnd.ms-excel.table": "TODO",
20007 "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
20008
20009 /* Themes */
20010 "application/vnd.openxmlformats-officedocument.theme+xml": "themes",
20011
20012 /* Timeline */
20013 "application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */
20014 "application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */
20015
20016 /* VBA */
20017 "application/vnd.ms-office.vbaProject": "vba",
20018 "application/vnd.ms-office.vbaProjectSignature": "vba",
20019
20020 /* Volatile Dependencies */
20021 "application/vnd.ms-office.volatileDependencies": "TODO",
20022 "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
20023
20024 /* Control Properties */
20025 "application/vnd.ms-excel.controlproperties+xml": "TODO",
20026
20027 /* Data Model */
20028 "application/vnd.openxmlformats-officedocument.model+data": "TODO",
20029
20030 /* Survey */
20031 "application/vnd.ms-excel.Survey+xml": "TODO",
20032
20033 /* Drawing */
20034 "application/vnd.openxmlformats-officedocument.drawing+xml": "TODO",
20035 "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
20036 "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
20037 "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
20038 "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
20039 "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
20040 "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
20041
20042 /* VML */
20043 "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
20044
20045 "application/vnd.openxmlformats-package.relationships+xml": "rels",
20046 "application/vnd.openxmlformats-officedocument.oleObject": "TODO",
20047
20048 "sheet": "js"
20049 };
20050
20051 var CT_LIST = (function(){
20052 var o = {
20053 workbooks: {
20054 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
20055 xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
20056 xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
20057 xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
20058 },
20059 strs: { /* Shared Strings */
20060 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
20061 xlsb: "application/vnd.ms-excel.sharedStrings"
20062 },
20063 sheets: {
20064 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
20065 xlsb: "application/vnd.ms-excel.worksheet"
20066 },
20067 styles: {/* Styles */
20068 xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
20069 xlsb: "application/vnd.ms-excel.styles"
20070 }
20071 };
20072 keys(o).forEach(function(k) { if(!o[k].xlsm) o[k].xlsm = o[k].xlsx; });
20073 keys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });
20074 return o;
20075 })();
20076
20077 var type2ct = evert_arr(ct2type);
20078
20079 XMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';
20080
20081 function parse_ct(data, opts) {
20082 var ctext = {};
20083 if(!data || !data.match) return data;
20084 var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
20085 coreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],
20086 TODO:[], rels:[], xmlns: "" };
20087 (data.match(tagregex)||[]).forEach(function(x) {
20088 var y = parsexmltag(x);
20089 switch(y[0].replace(nsregex,"<")) {
20090 case '<?xml': break;
20091 case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
20092 case '<Default': ctext[y.Extension] = y.ContentType; break;
20093 case '<Override':
20094 if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
20095 else if(opts.WTF) console.error(y);
20096 break;
20097 }
20098 });
20099 if(ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns);
20100 ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
20101 ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
20102 ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
20103 ct.defaults = ctext;
20104 delete ct.calcchains;
20105 return ct;
20106 }
20107
20108 var CTYPE_XML_ROOT = writextag('Types', null, {
20109 'xmlns': XMLNS.CT,
20110 'xmlns:xsd': XMLNS.xsd,
20111 'xmlns:xsi': XMLNS.xsi
20112 });
20113
20114 var CTYPE_DEFAULTS = [
20115 ['xml', 'application/xml'],
20116 ['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
20117 ['rels', type2ct.rels[0]]
20118 ].map(function(x) {
20119 return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
20120 });
20121
20122 function write_ct(ct, opts) {
20123 var o = [], v;
20124 o[o.length] = (XML_HEADER);
20125 o[o.length] = (CTYPE_XML_ROOT);
20126 o = o.concat(CTYPE_DEFAULTS);
20127 var f1 = function(w) {
20128 if(ct[w] && ct[w].length > 0) {
20129 v = ct[w][0];
20130 o[o.length] = (writextag('Override', null, {
20131 'PartName': (v[0] == '/' ? "":"/") + v,
20132 'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
20133 }));
20134 }
20135 };
20136 var f2 = function(w) {
20137 ct[w].forEach(function(v) {
20138 o[o.length] = (writextag('Override', null, {
20139 'PartName': (v[0] == '/' ? "":"/") + v,
20140 'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
20141 }));
20142 });
20143 };
20144 var f3 = function(t) {
20145 (ct[t]||[]).forEach(function(v) {
20146 o[o.length] = (writextag('Override', null, {
20147 'PartName': (v[0] == '/' ? "":"/") + v,
20148 'ContentType': type2ct[t][0]
20149 }));
20150 });
20151 };
20152 f1('workbooks');
20153 f2('sheets');
20154 f3('themes');
20155 ['strs', 'styles'].forEach(f1);
20156 ['coreprops', 'extprops', 'custprops'].forEach(f3);
20157 if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
20158 return o.join("");
20159 }
20160 /* 9.3.2 OPC Relationships Markup */
20161 var RELS = {
20162 WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
20163 SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
20164 };
20165
20166 function parse_rels(data, currentFilePath) {
20167 if (!data) return data;
20168 if (currentFilePath.charAt(0) !== '/') {
20169 currentFilePath = '/'+currentFilePath;
20170 }
20171 var rels = {};
20172 var hash = {};
20173 var resolveRelativePathIntoAbsolute = function (to) {
20174 var toksFrom = currentFilePath.split('/');
20175 toksFrom.pop(); // folder path
20176 var toksTo = to.split('/');
20177 var reversed = [];
20178 while (toksTo.length !== 0) {
20179 var tokTo = toksTo.shift();
20180 if (tokTo === '..') {
20181 toksFrom.pop();
20182 } else if (tokTo !== '.') {
20183 toksFrom.push(tokTo);
20184 }
20185 }
20186 return toksFrom.join('/');
20187 };
20188
20189 data.match(tagregex).forEach(function(x) {
20190 var y = parsexmltag(x);
20191 /* 9.3.2.2 OPC_Relationships */
20192 if (y[0] === '<Relationship') {
20193 var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode;
20194 var canonictarget = y.TargetMode === 'External' ? y.Target : resolveRelativePathIntoAbsolute(y.Target);
20195 rels[canonictarget] = rel;
20196 hash[y.Id] = rel;
20197 }
20198 });
20199 rels["!id"] = hash;
20200 return rels;
20201 }
20202
20203 XMLNS.RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';
20204
20205 var RELS_ROOT = writextag('Relationships', null, {
20206 //'xmlns:ns0': XMLNS.RELS,
20207 'xmlns': XMLNS.RELS
20208 });
20209
20210 /* TODO */
20211 function write_rels(rels) {
20212 var o = [];
20213 o[o.length] = (XML_HEADER);
20214 o[o.length] = (RELS_ROOT);
20215 keys(rels['!id']).forEach(function(rid) { var rel = rels['!id'][rid];
20216 o[o.length] = (writextag('Relationship', null, rel));
20217 });
20218 if(o.length>2){ o[o.length] = ('</Relationships>'); o[1]=o[1].replace("/>",">"); }
20219 return o.join("");
20220 }
20221 /* ECMA-376 Part II 11.1 Core Properties Part */
20222 /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
20223 var CORE_PROPS = [
20224 ["cp:category", "Category"],
20225 ["cp:contentStatus", "ContentStatus"],
20226 ["cp:keywords", "Keywords"],
20227 ["cp:lastModifiedBy", "LastAuthor"],
20228 ["cp:lastPrinted", "LastPrinted"],
20229 ["cp:revision", "RevNumber"],
20230 ["cp:version", "Version"],
20231 ["dc:creator", "Author"],
20232 ["dc:description", "Comments"],
20233 ["dc:identifier", "Identifier"],
20234 ["dc:language", "Language"],
20235 ["dc:subject", "Subject"],
20236 ["dc:title", "Title"],
20237 ["dcterms:created", "CreatedDate", 'date'],
20238 ["dcterms:modified", "ModifiedDate", 'date']
20239 ];
20240
20241 XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
20242 RELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';
20243
20244 var CORE_PROPS_REGEX = (function() {
20245 var r = new Array(CORE_PROPS.length);
20246 for(var i = 0; i < CORE_PROPS.length; ++i) {
20247 var f = CORE_PROPS[i];
20248 var g = "(?:"+ f[0].substr(0,f[0].indexOf(":")) +":)"+ f[0].substr(f[0].indexOf(":")+1);
20249 r[i] = new RegExp("<" + g + "[^>]*>(.*)<\/" + g + ">");
20250 }
20251 return r;
20252 })();
20253
20254 function parse_core_props(data) {
20255 var p = {};
20256
20257 for(var i = 0; i < CORE_PROPS.length; ++i) {
20258 var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);
20259 if(cur != null && cur.length > 0) p[f[1]] = cur[1];
20260 if(f[2] === 'date' && p[f[1]]) p[f[1]] = new Date(p[f[1]]);
20261 }
20262
20263 return p;
20264 }
20265
20266 var CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {
20267 //'xmlns': XMLNS.CORE_PROPS,
20268 'xmlns:cp': XMLNS.CORE_PROPS,
20269 'xmlns:dc': XMLNS.dc,
20270 'xmlns:dcterms': XMLNS.dcterms,
20271 'xmlns:dcmitype': XMLNS.dcmitype,
20272 'xmlns:xsi': XMLNS.xsi
20273 });
20274
20275 function cp_doit(f, g, h, o, p) {
20276 if(p[f] != null || g == null || g === "") return;
20277 p[f] = g;
20278 o[o.length] = (h ? writextag(f,g,h) : writetag(f,g));
20279 }
20280
20281 function write_core_props(cp, opts) {
20282 var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};
20283 if(!cp) return o.join("");
20284
20285
20286 if(cp.CreatedDate != null) cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p);
20287 if(cp.ModifiedDate != null) cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {"xsi:type":"dcterms:W3CDTF"}, o, p);
20288
20289 for(var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; cp_doit(f[0], cp[f[1]], null, o, p); }
20290 if(o.length>2){ o[o.length] = ('</cp:coreProperties>'); o[1]=o[1].replace("/>",">"); }
20291 return o.join("");
20292 }
20293 /* 15.2.12.3 Extended File Properties Part */
20294 /* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
20295 var EXT_PROPS = [
20296 ["Application", "Application", "string"],
20297 ["AppVersion", "AppVersion", "string"],
20298 ["Company", "Company", "string"],
20299 ["DocSecurity", "DocSecurity", "string"],
20300 ["Manager", "Manager", "string"],
20301 ["HyperlinksChanged", "HyperlinksChanged", "bool"],
20302 ["SharedDoc", "SharedDoc", "bool"],
20303 ["LinksUpToDate", "LinksUpToDate", "bool"],
20304 ["ScaleCrop", "ScaleCrop", "bool"],
20305 ["HeadingPairs", "HeadingPairs", "raw"],
20306 ["TitlesOfParts", "TitlesOfParts", "raw"]
20307 ];
20308
20309 XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
20310 RELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';
20311
20312 function parse_ext_props(data, p) {
20313 var q = {}; if(!p) p = {};
20314
20315 EXT_PROPS.forEach(function(f) {
20316 switch(f[2]) {
20317 case "string": p[f[1]] = (data.match(matchtag(f[0]))||[])[1]; break;
20318 case "bool": p[f[1]] = (data.match(matchtag(f[0]))||[])[1] === "true"; break;
20319 case "raw":
20320 var cur = data.match(new RegExp("<" + f[0] + "[^>]*>(.*)<\/" + f[0] + ">"));
20321 if(cur && cur.length > 0) q[f[1]] = cur[1];
20322 break;
20323 }
20324 });
20325
20326 if(q.HeadingPairs && q.TitlesOfParts) {
20327 var v = parseVector(q.HeadingPairs);
20328 var j = 0, widx = 0;
20329 for(var i = 0; i !== v.length; ++i) {
20330 switch(v[i].v) {
20331 case "Worksheets": widx = j; p.Worksheets = +(v[++i].v); break;
20332 case "Named Ranges": ++i; break; // TODO: Handle Named Ranges
20333 }
20334 }
20335 var parts = parseVector(q.TitlesOfParts).map(function(x) { return utf8read(x.v); });
20336 p.SheetNames = parts.slice(widx, widx + p.Worksheets);
20337 }
20338 return p;
20339 }
20340
20341 var EXT_PROPS_XML_ROOT = writextag('Properties', null, {
20342 'xmlns': XMLNS.EXT_PROPS,
20343 'xmlns:vt': XMLNS.vt
20344 });
20345
20346 function write_ext_props(cp, opts) {
20347 var o = [], p = {}, W = writextag;
20348 if(!cp) cp = {};
20349 cp.Application = "SheetJS";
20350 o[o.length] = (XML_HEADER);
20351 o[o.length] = (EXT_PROPS_XML_ROOT);
20352
20353 EXT_PROPS.forEach(function(f) {
20354 if(cp[f[1]] === undefined) return;
20355 var v;
20356 switch(f[2]) {
20357 case 'string': v = cp[f[1]]; break;
20358 case 'bool': v = cp[f[1]] ? 'true' : 'false'; break;
20359 }
20360 if(v !== undefined) o[o.length] = (W(f[0], v));
20361 });
20362
20363 /* TODO: HeadingPairs, TitlesOfParts */
20364 o[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', '<vt:lpstr>Worksheets</vt:lpstr>')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:"variant"})));
20365 o[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return "<vt:lpstr>" + s + "</vt:lpstr>"; }).join(""), {size: cp.Worksheets, baseType:"lpstr"})));
20366 if(o.length>2){ o[o.length] = ('</Properties>'); o[1]=o[1].replace("/>",">"); }
20367 return o.join("");
20368 }
20369 /* 15.2.12.2 Custom File Properties Part */
20370 XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
20371 RELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';
20372
20373 var custregex = /<[^>]+>[^<]*/g;
20374 function parse_cust_props(data, opts) {
20375 var p = {}, name;
20376 var m = data.match(custregex);
20377 if(m) for(var i = 0; i != m.length; ++i) {
20378 var x = m[i], y = parsexmltag(x);
20379 switch(y[0]) {
20380 case '<?xml': break;
20381 case '<Properties':
20382 if(y.xmlns !== XMLNS.CUST_PROPS) throw "unrecognized xmlns " + y.xmlns;
20383 if(y.xmlnsvt && y.xmlnsvt !== XMLNS.vt) throw "unrecognized vt " + y.xmlnsvt;
20384 break;
20385 case '<property': name = y.name; break;
20386 case '</property>': name = null; break;
20387 default: if (x.indexOf('<vt:') === 0) {
20388 var toks = x.split('>');
20389 var type = toks[0].substring(4), text = toks[1];
20390 /* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
20391 switch(type) {
20392 case 'lpstr': case 'lpwstr': case 'bstr': case 'lpwstr':
20393 p[name] = unescapexml(text);
20394 break;
20395 case 'bool':
20396 p[name] = parsexmlbool(text, '<vt:bool>');
20397 break;
20398 case 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':
20399 p[name] = parseInt(text, 10);
20400 break;
20401 case 'r4': case 'r8': case 'decimal':
20402 p[name] = parseFloat(text);
20403 break;
20404 case 'filetime': case 'date':
20405 p[name] = new Date(text);
20406 break;
20407 case 'cy': case 'error':
20408 p[name] = unescapexml(text);
20409 break;
20410 default:
20411 if(typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);
20412 }
20413 } else if(x.substr(0,2) === "</") {
20414 } else if(opts.WTF) throw new Error(x);
20415 }
20416 }
20417 return p;
20418 }
20419
20420 var CUST_PROPS_XML_ROOT = writextag('Properties', null, {
20421 'xmlns': XMLNS.CUST_PROPS,
20422 'xmlns:vt': XMLNS.vt
20423 });
20424
20425 function write_cust_props(cp, opts) {
20426 var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
20427 if(!cp) return o.join("");
20428 var pid = 1;
20429 keys(cp).forEach(function custprop(k) { ++pid;
20430 o[o.length] = (writextag('property', write_vt(cp[k]), {
20431 'fmtid': '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}',
20432 'pid': pid,
20433 'name': k
20434 }));
20435 });
20436 if(o.length>2){ o[o.length] = '</Properties>'; o[1]=o[1].replace("/>",">"); }
20437 return o.join("");
20438 }
20439 /* 18.4.1 charset to codepage mapping */
20440 var CS2CP = {
20441 0: 1252, /* ANSI */
20442 1: 65001, /* DEFAULT */
20443 2: 65001, /* SYMBOL */
20444 77: 10000, /* MAC */
20445 128: 932, /* SHIFTJIS */
20446 129: 949, /* HANGUL */
20447 130: 1361, /* JOHAB */
20448 134: 936, /* GB2312 */
20449 136: 950, /* CHINESEBIG5 */
20450 161: 1253, /* GREEK */
20451 162: 1254, /* TURKISH */
20452 163: 1258, /* VIETNAMESE */
20453 177: 1255, /* HEBREW */
20454 178: 1256, /* ARABIC */
20455 186: 1257, /* BALTIC */
20456 204: 1251, /* RUSSIAN */
20457 222: 874, /* THAI */
20458 238: 1250, /* EASTEUROPE */
20459 255: 1252, /* OEM */
20460 69: 6969 /* MISC */
20461 };
20462
20463 /* Parse a list of <r> tags */
20464 var parse_rs = (function parse_rs_factory() {
20465 var tregex = matchtag("t"), rpregex = matchtag("rPr"), rregex = /<r>/g, rend = /<\/r>/, nlregex = /\r\n/g;
20466 /* 18.4.7 rPr CT_RPrElt */
20467 var parse_rpr = function parse_rpr(rpr, intro, outro) {
20468 var font = {}, cp = 65001;
20469 var m = rpr.match(tagregex), i = 0;
20470 if(m) for(;i!=m.length; ++i) {
20471 var y = parsexmltag(m[i]);
20472 switch(y[0]) {
20473 /* 18.8.12 condense CT_BooleanProperty */
20474 /* ** not required . */
20475 case '<condense': break;
20476 /* 18.8.17 extend CT_BooleanProperty */
20477 /* ** not required . */
20478 case '<extend': break;
20479 /* 18.8.36 shadow CT_BooleanProperty */
20480 /* ** not required . */
20481 case '<shadow':
20482 /* falls through */
20483 case '<shadow/>': break;
20484
20485 /* 18.4.1 charset CT_IntProperty TODO */
20486 case '<charset':
20487 if(y.val == '1') break;
20488 cp = CS2CP[parseInt(y.val, 10)];
20489 break;
20490
20491 /* 18.4.2 outline CT_BooleanProperty TODO */
20492 case '<outline':
20493 /* falls through */
20494 case '<outline/>': break;
20495
20496 /* 18.4.5 rFont CT_FontName */
20497 case '<rFont': font.name = y.val; break;
20498
20499 /* 18.4.11 sz CT_FontSize */
20500 case '<sz': font.sz = y.val; break;
20501
20502 /* 18.4.10 strike CT_BooleanProperty */
20503 case '<strike':
20504 if(!y.val) break;
20505 /* falls through */
20506 case '<strike/>': font.strike = 1; break;
20507 case '</strike>': break;
20508
20509 /* 18.4.13 u CT_UnderlineProperty */
20510 case '<u':
20511 if(!y.val) break;
20512 /* falls through */
20513 case '<u/>': font.u = 1; break;
20514 case '</u>': break;
20515
20516 /* 18.8.2 b */
20517 case '<b':
20518 if(!y.val) break;
20519 /* falls through */
20520 case '<b/>': font.b = 1; break;
20521 case '</b>': break;
20522
20523 /* 18.8.26 i */
20524 case '<i':
20525 if(!y.val) break;
20526 /* falls through */
20527 case '<i/>': font.i = 1; break;
20528 case '</i>': break;
20529
20530 /* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
20531 case '<color':
20532 if(y.rgb) font.color = y.rgb.substr(2,6);
20533 break;
20534
20535 /* 18.8.18 family ST_FontFamily */
20536 case '<family': font.family = y.val; break;
20537
20538 /* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
20539 case '<vertAlign': break;
20540
20541 /* 18.8.35 scheme CT_FontScheme TODO */
20542 case '<scheme': break;
20543
20544 default:
20545 if(y[0].charCodeAt(1) !== 47) throw 'Unrecognized rich format ' + y[0];
20546 }
20547 }
20548 /* TODO: These should be generated styles, not inline */
20549 var style = [];
20550 if(font.b) style.push("font-weight: bold;");
20551 if(font.i) style.push("font-style: italic;");
20552 intro.push('<span style="' + style.join("") + '">');
20553 outro.push("</span>");
20554 return cp;
20555 };
20556
20557 /* 18.4.4 r CT_RElt */
20558 function parse_r(r) {
20559 var terms = [[],"",[]];
20560 /* 18.4.12 t ST_Xstring */
20561 var t = r.match(tregex), cp = 65001;
20562 if(!isval(t)) return "";
20563 terms[1] = t[1];
20564
20565 var rpr = r.match(rpregex);
20566 if(isval(rpr)) cp = parse_rpr(rpr[1], terms[0], terms[2]);
20567
20568 return terms[0].join("") + terms[1].replace(nlregex,'<br/>') + terms[2].join("");
20569 }
20570 return function parse_rs(rs) {
20571 return rs.replace(rregex,"").split(rend).map(parse_r).join("");
20572 };
20573 })();
20574
20575 /* 18.4.8 si CT_Rst */
20576 var sitregex = /<t[^>]*>([^<]*)<\/t>/g, sirregex = /<r>/;
20577 function parse_si(x, opts) {
20578 var html = opts ? opts.cellHTML : true;
20579 var z = {};
20580 if(!x) return null;
20581 var y;
20582 /* 18.4.12 t ST_Xstring (Plaintext String) */
20583 if(x.charCodeAt(1) === 116) {
20584 z.t = utf8read(unescapexml(x.substr(x.indexOf(">")+1).split(/<\/t>/)[0]));
20585 z.r = x;
20586 if(html) z.h = z.t;
20587 }
20588 /* 18.4.4 r CT_RElt (Rich Text Run) */
20589 else if((y = x.match(sirregex))) {
20590 z.r = x;
20591 z.t = utf8read(unescapexml(x.match(sitregex).join("").replace(tagregex,"")));
20592 if(html) z.h = parse_rs(x);
20593 }
20594 /* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */
20595 /* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */
20596 return z;
20597 }
20598
20599 /* 18.4 Shared String Table */
20600 var sstr0 = /<sst([^>]*)>([\s\S]*)<\/sst>/;
20601 var sstr1 = /<(?:si|sstItem)>/g;
20602 var sstr2 = /<\/(?:si|sstItem)>/;
20603 function parse_sst_xml(data, opts) {
20604 var s = [], ss;
20605 /* 18.4.9 sst CT_Sst */
20606 var sst = data.match(sstr0);
20607 if(isval(sst)) {
20608 ss = sst[2].replace(sstr1,"").split(sstr2);
20609 for(var i = 0; i != ss.length; ++i) {
20610 var o = parse_si(ss[i], opts);
20611 if(o != null) s[s.length] = o;
20612 }
20613 sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
20614 }
20615 return s;
20616 }
20617
20618 RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
20619 var straywsregex = /^\s|\s$|[\t\n\r]/;
20620 function write_sst_xml(sst, opts) {
20621 if(!opts.bookSST) return "";
20622 var o = [XML_HEADER];
20623 o[o.length] = (writextag('sst', null, {
20624 xmlns: XMLNS.main[0],
20625 count: sst.Count,
20626 uniqueCount: sst.Unique
20627 }));
20628 for(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;
20629 var s = sst[i];
20630 var sitag = "<si>";
20631 if(s.r) sitag += s.r;
20632 else {
20633 sitag += "<t";
20634 if(s.t.match(straywsregex)) sitag += ' xml:space="preserve"';
20635 sitag += ">" + escapexml(s.t) + "</t>";
20636 }
20637 sitag += "</si>";
20638 o[o.length] = (sitag);
20639 }
20640 if(o.length>2){ o[o.length] = ('</sst>'); o[1]=o[1].replace("/>",">"); }
20641 return o.join("");
20642 }
20643 /* [MS-XLSB] 2.4.219 BrtBeginSst */
20644 function parse_BrtBeginSst(data, length) {
20645 return [data.read_shift(4), data.read_shift(4)];
20646 }
20647
20648 /* [MS-XLSB] 2.1.7.45 Shared Strings */
20649 function parse_sst_bin(data, opts) {
20650 var s = [];
20651 var pass = false;
20652 recordhopper(data, function hopper_sst(val, R, RT) {
20653 switch(R.n) {
20654 case 'BrtBeginSst': s.Count = val[0]; s.Unique = val[1]; break;
20655 case 'BrtSSTItem': s.push(val); break;
20656 case 'BrtEndSst': return true;
20657 /* TODO: produce a test case with a future record */
20658 case 'BrtFRTBegin': pass = true; break;
20659 case 'BrtFRTEnd': pass = false; break;
20660 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n);
20661 }
20662 });
20663 return s;
20664 }
20665
20666 function write_BrtBeginSst(sst, o) {
20667 if(!o) o = new_buf(8);
20668 o.write_shift(4, sst.Count);
20669 o.write_shift(4, sst.Unique);
20670 return o;
20671 }
20672
20673 var write_BrtSSTItem = write_RichStr;
20674
20675 function write_sst_bin(sst, opts) {
20676 var ba = buf_array();
20677 write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst));
20678 for(var i = 0; i < sst.length; ++i) write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i]));
20679 write_record(ba, "BrtEndSst");
20680 return ba.end();
20681 }
20682 function hex2RGB(h) {
20683 var o = h.substr(h[0]==="#"?1:0,6);
20684 return [parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16),parseInt(o.substr(0,2),16)];
20685 }
20686 function rgb2Hex(rgb) {
20687 for(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);
20688 return o.toString(16).toUpperCase().substr(1);
20689 }
20690
20691 function rgb2HSL(rgb) {
20692 var R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;
20693 var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;
20694 if(C === 0) return [0, 0, R];
20695
20696 var H6 = 0, S = 0, L2 = (M + m);
20697 S = C / (L2 > 1 ? 2 - L2 : L2);
20698 switch(M){
20699 case R: H6 = ((G - B) / C + 6)%6; break;
20700 case G: H6 = ((B - R) / C + 2); break;
20701 case B: H6 = ((R - G) / C + 4); break;
20702 }
20703 return [H6 / 6, S, L2 / 2];
20704 }
20705
20706 function hsl2RGB(hsl){
20707 var H = hsl[0], S = hsl[1], L = hsl[2];
20708 var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;
20709 var rgb = [m,m,m], h6 = 6*H;
20710
20711 var X;
20712 if(S !== 0) switch(h6|0) {
20713 case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;
20714 case 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;
20715 case 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;
20716 case 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;
20717 case 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;
20718 case 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;
20719 }
20720 for(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);
20721 return rgb;
20722 }
20723
20724 /* 18.8.3 bgColor tint algorithm */
20725 function rgb_tint(hex, tint) {
20726 if(tint === 0) return hex;
20727 var hsl = rgb2HSL(hex2RGB(hex));
20728 if (tint < 0) hsl[2] = hsl[2] * (1 + tint);
20729 else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);
20730 return rgb2Hex(hsl2RGB(hsl));
20731 }
20732
20733 /* 18.3.1.13 width calculations */
20734 var DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;
20735 function width2px(width) { return (( width + ((128/MDW)|0)/256 )* MDW )|0; }
20736 function px2char(px) { return (((px - 5)/MDW * 100 + 0.5)|0)/100; }
20737 function char2width(chr) { return (((chr * MDW + 5)/MDW*256)|0)/256; }
20738 function cycle_width(collw) { return char2width(px2char(width2px(collw))); }
20739 function find_mdw(collw, coll) {
20740 if(cycle_width(collw) != collw) {
20741 for(MDW=DEF_MDW; MDW>MIN_MDW; --MDW) if(cycle_width(collw) === collw) break;
20742 if(MDW === MIN_MDW) for(MDW=DEF_MDW+1; MDW<MAX_MDW; ++MDW) if(cycle_width(collw) === collw) break;
20743 if(MDW === MAX_MDW) MDW = DEF_MDW;
20744 }
20745 }
20746 var styles = {}; // shared styles
20747
20748 var themes = {}; // shared themes
20749
20750 /* 18.8.21 fills CT_Fills */
20751 function parse_fills(t, opts) {
20752 styles.Fills = [];
20753 var fill = {};
20754 t[0].match(tagregex).forEach(function(x) {
20755 var y = parsexmltag(x);
20756 switch(y[0]) {
20757 case '<fills': case '<fills>': case '</fills>': break;
20758
20759 /* 18.8.20 fill CT_Fill */
20760 case '<fill>': break;
20761 case '</fill>': styles.Fills.push(fill); fill = {}; break;
20762
20763 /* 18.8.32 patternFill CT_PatternFill */
20764 case '<patternFill':
20765 if(y.patternType) fill.patternType = y.patternType;
20766 break;
20767 case '<patternFill/>': case '</patternFill>': break;
20768
20769 /* 18.8.3 bgColor CT_Color */
20770 case '<bgColor':
20771 if(!fill.bgColor) fill.bgColor = {};
20772 if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10);
20773 if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10);
20774 if(y.tint) fill.bgColor.tint = parseFloat(y.tint);
20775 /* Excel uses ARGB strings */
20776 if(y.rgb) fill.bgColor.rgb = y.rgb.substring(y.rgb.length - 6);
20777 break;
20778 case '<bgColor/>': case '</bgColor>': break;
20779
20780 /* 18.8.19 fgColor CT_Color */
20781 case '<fgColor':
20782 if(!fill.fgColor) fill.fgColor = {};
20783 if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10);
20784 if(y.tint) fill.fgColor.tint = parseFloat(y.tint);
20785 /* Excel uses ARGB strings */
20786 if(y.rgb) fill.fgColor.rgb = y.rgb.substring(y.rgb.length - 6);
20787 break;
20788 case '<bgColor/>': case '</fgColor>': break;
20789
20790 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills';
20791 }
20792 });
20793 }
20794
20795 /* 18.8.31 numFmts CT_NumFmts */
20796 function parse_numFmts(t, opts) {
20797 styles.NumberFmt = [];
20798 var k = keys(SSF._table);
20799 for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];
20800 var m = t[0].match(tagregex);
20801 for(i=0; i < m.length; ++i) {
20802 var y = parsexmltag(m[i]);
20803 switch(y[0]) {
20804 case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break;
20805 case '<numFmt': {
20806 var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10);
20807 styles.NumberFmt[j] = f; if(j>0) SSF.load(f,j);
20808 } break;
20809 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts';
20810 }
20811 }
20812 }
20813
20814 function write_numFmts(NF, opts) {
20815 var o = ["<numFmts>"];
20816 [[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) {
20817 for(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));
20818 });
20819 if(o.length === 1) return "";
20820 o[o.length] = ("</numFmts>");
20821 o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">");
20822 return o.join("");
20823 }
20824
20825 /* 18.8.10 cellXfs CT_CellXfs */
20826 function parse_cellXfs(t, opts) {
20827 styles.CellXf = [];
20828 t[0].match(tagregex).forEach(function(x) {
20829 var y = parsexmltag(x);
20830 switch(y[0]) {
20831 case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break;
20832
20833 /* 18.8.45 xf CT_Xf */
20834 case '<xf': delete y[0];
20835 if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10);
20836 if(y.fillId) y.fillId = parseInt(y.fillId, 10);
20837 styles.CellXf.push(y); break;
20838 case '</xf>': break;
20839
20840 /* 18.8.1 alignment CT_CellAlignment */
20841 case '<alignment': case '<alignment/>': break;
20842
20843 /* 18.8.33 protection CT_CellProtection */
20844 case '<protection': case '</protection>': case '<protection/>': break;
20845
20846 case '<extLst': case '</extLst>': break;
20847 case '<ext': break;
20848 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs';
20849 }
20850 });
20851 }
20852
20853 function write_cellXfs(cellXfs) {
20854 var o = [];
20855 o[o.length] = (writextag('cellXfs',null));
20856 cellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); });
20857 o[o.length] = ("</cellXfs>");
20858 if(o.length === 2) return "";
20859 o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">");
20860 return o.join("");
20861 }
20862
20863 /* 18.8 Styles CT_Stylesheet*/
20864 var parse_sty_xml= (function make_pstyx() {
20865 var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/;
20866 var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/;
20867 var fillsRegex = /<fills([^>]*)>.*<\/fills>/;
20868
20869 return function parse_sty_xml(data, opts) {
20870 /* 18.8.39 styleSheet CT_Stylesheet */
20871 var t;
20872
20873 /* numFmts CT_NumFmts ? */
20874 if((t=data.match(numFmtRegex))) parse_numFmts(t, opts);
20875
20876 /* fonts CT_Fonts ? */
20877 // if((t=data.match(/<fonts([^>]*)>.*<\/fonts>/))) parse_fonts(t, opts);
20878
20879 /* fills CT_Fills */
20880 if((t=data.match(fillsRegex))) parse_fills(t, opts);
20881
20882 /* borders CT_Borders ? */
20883 /* cellStyleXfs CT_CellStyleXfs ? */
20884
20885 /* cellXfs CT_CellXfs ? */
20886 if((t=data.match(cellXfRegex))) parse_cellXfs(t, opts);
20887
20888 /* dxfs CT_Dxfs ? */
20889 /* tableStyles CT_TableStyles ? */
20890 /* colors CT_Colors ? */
20891 /* extLst CT_ExtensionList ? */
20892
20893 return styles;
20894 };
20895 })();
20896
20897 var STYLES_XML_ROOT = writextag('styleSheet', null, {
20898 'xmlns': XMLNS.main[0],
20899 'xmlns:vt': XMLNS.vt
20900 });
20901
20902 RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
20903
20904 function write_sty_xml(wb, opts) {
20905 var o = [XML_HEADER, STYLES_XML_ROOT], w;
20906 if((w = write_numFmts(wb.SSF)) != null) o[o.length] = w;
20907 o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>');
20908 o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>');
20909 o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>');
20910 o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>');
20911 if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);
20912 o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>');
20913 o[o.length] = ('<dxfs count="0"/>');
20914 o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>');
20915
20916 if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace("/>",">"); }
20917 return o.join("");
20918 }
20919 /* [MS-XLSB] 2.4.651 BrtFmt */
20920 function parse_BrtFmt(data, length) {
20921 var ifmt = data.read_shift(2);
20922 var stFmtCode = parse_XLWideString(data,length-2);
20923 return [ifmt, stFmtCode];
20924 }
20925
20926 /* [MS-XLSB] 2.4.653 BrtFont TODO */
20927 function parse_BrtFont(data, length) {
20928 var out = {flags:{}};
20929 out.dyHeight = data.read_shift(2);
20930 out.grbit = parse_FontFlags(data, 2);
20931 out.bls = data.read_shift(2);
20932 out.sss = data.read_shift(2);
20933 out.uls = data.read_shift(1);
20934 out.bFamily = data.read_shift(1);
20935 out.bCharSet = data.read_shift(1);
20936 data.l++;
20937 out.brtColor = parse_BrtColor(data, 8);
20938 out.bFontScheme = data.read_shift(1);
20939 out.name = parse_XLWideString(data, length - 21);
20940
20941 out.flags.Bold = out.bls === 0x02BC;
20942 out.flags.Italic = out.grbit.fItalic;
20943 out.flags.Strikeout = out.grbit.fStrikeout;
20944 out.flags.Outline = out.grbit.fOutline;
20945 out.flags.Shadow = out.grbit.fShadow;
20946 out.flags.Condense = out.grbit.fCondense;
20947 out.flags.Extend = out.grbit.fExtend;
20948 out.flags.Sub = out.sss & 0x2;
20949 out.flags.Sup = out.sss & 0x1;
20950 return out;
20951 }
20952
20953 /* [MS-XLSB] 2.4.816 BrtXF */
20954 function parse_BrtXF(data, length) {
20955 var ixfeParent = data.read_shift(2);
20956 var ifmt = data.read_shift(2);
20957 parsenoop(data, length-4);
20958 return {ixfe:ixfeParent, ifmt:ifmt };
20959 }
20960
20961 /* [MS-XLSB] 2.1.7.50 Styles */
20962 function parse_sty_bin(data, opts) {
20963 styles.NumberFmt = [];
20964 for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
20965
20966 styles.CellXf = [];
20967 var state = ""; /* TODO: this should be a stack */
20968 var pass = false;
20969 recordhopper(data, function hopper_sty(val, R, RT) {
20970 switch(R.n) {
20971 case 'BrtFmt':
20972 styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
20973 break;
20974 case 'BrtFont': break; /* TODO */
20975 case 'BrtKnownFonts': break; /* TODO */
20976 case 'BrtFill': break; /* TODO */
20977 case 'BrtBorder': break; /* TODO */
20978 case 'BrtXF':
20979 if(state === "CELLXFS") {
20980 styles.CellXf.push(val);
20981 }
20982 break; /* TODO */
20983 case 'BrtStyle': break; /* TODO */
20984 case 'BrtDXF': break; /* TODO */
20985 case 'BrtMRUColor': break; /* TODO */
20986 case 'BrtIndexedColor': break; /* TODO */
20987 case 'BrtBeginStyleSheet': break;
20988 case 'BrtEndStyleSheet': break;
20989 case 'BrtBeginTableStyle': break;
20990 case 'BrtTableStyleElement': break;
20991 case 'BrtEndTableStyle': break;
20992 case 'BrtBeginFmts': state = "FMTS"; break;
20993 case 'BrtEndFmts': state = ""; break;
20994 case 'BrtBeginFonts': state = "FONTS"; break;
20995 case 'BrtEndFonts': state = ""; break;
20996 case 'BrtACBegin': state = "ACFONTS"; break;
20997 case 'BrtACEnd': state = ""; break;
20998 case 'BrtBeginFills': state = "FILLS"; break;
20999 case 'BrtEndFills': state = ""; break;
21000 case 'BrtBeginBorders': state = "BORDERS"; break;
21001 case 'BrtEndBorders': state = ""; break;
21002 case 'BrtBeginCellStyleXFs': state = "CELLSTYLEXFS"; break;
21003 case 'BrtEndCellStyleXFs': state = ""; break;
21004 case 'BrtBeginCellXFs': state = "CELLXFS"; break;
21005 case 'BrtEndCellXFs': state = ""; break;
21006 case 'BrtBeginStyles': state = "STYLES"; break;
21007 case 'BrtEndStyles': state = ""; break;
21008 case 'BrtBeginDXFs': state = "DXFS"; break;
21009 case 'BrtEndDXFs': state = ""; break;
21010 case 'BrtBeginTableStyles': state = "TABLESTYLES"; break;
21011 case 'BrtEndTableStyles': state = ""; break;
21012 case 'BrtBeginColorPalette': state = "COLORPALETTE"; break;
21013 case 'BrtEndColorPalette': state = ""; break;
21014 case 'BrtBeginIndexedColors': state = "INDEXEDCOLORS"; break;
21015 case 'BrtEndIndexedColors': state = ""; break;
21016 case 'BrtBeginMRUColors': state = "MRUCOLORS"; break;
21017 case 'BrtEndMRUColors': state = ""; break;
21018 case 'BrtFRTBegin': pass = true; break;
21019 case 'BrtFRTEnd': pass = false; break;
21020 case 'BrtBeginStyleSheetExt14': break;
21021 case 'BrtBeginSlicerStyles': break;
21022 case 'BrtEndSlicerStyles': break;
21023 case 'BrtBeginTimelineStylesheetExt15': break;
21024 case 'BrtEndTimelineStylesheetExt15': break;
21025 case 'BrtBeginTimelineStyles': break;
21026 case 'BrtEndTimelineStyles': break;
21027 case 'BrtEndStyleSheetExt14': break;
21028 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n);
21029 }
21030 });
21031 return styles;
21032 }
21033
21034 /* [MS-XLSB] 2.1.7.50 Styles */
21035 function write_sty_bin(data, opts) {
21036 var ba = buf_array();
21037 write_record(ba, "BrtBeginStyleSheet");
21038 /* [FMTS] */
21039 /* [FONTS] */
21040 /* [FILLS] */
21041 /* [BORDERS] */
21042 /* CELLSTYLEXFS */
21043 /* CELLXFS*/
21044 /* STYLES */
21045 /* DXFS */
21046 /* TABLESTYLES */
21047 /* [COLORPALETTE] */
21048 /* FRTSTYLESHEET*/
21049 write_record(ba, "BrtEndStyleSheet");
21050 return ba.end();
21051 }
21052 RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
21053
21054 /* 20.1.6.2 clrScheme CT_ColorScheme */
21055 function parse_clrScheme(t, opts) {
21056 themes.themeElements.clrScheme = [];
21057 var color = {};
21058 t[0].match(tagregex).forEach(function(x) {
21059 var y = parsexmltag(x);
21060 switch(y[0]) {
21061 case '<a:clrScheme': case '</a:clrScheme>': break;
21062
21063 /* 20.1.2.3.32 srgbClr CT_SRgbColor */
21064 case '<a:srgbClr': color.rgb = y.val; break;
21065
21066 /* 20.1.2.3.33 sysClr CT_SystemColor */
21067 case '<a:sysClr': color.rgb = y.lastClr; break;
21068
21069 /* 20.1.4.1.9 dk1 (Dark 1) */
21070 case '<a:dk1>':
21071 case '</a:dk1>':
21072 /* 20.1.4.1.10 dk2 (Dark 2) */
21073 case '<a:dk2>':
21074 case '</a:dk2>':
21075 /* 20.1.4.1.22 lt1 (Light 1) */
21076 case '<a:lt1>':
21077 case '</a:lt1>':
21078 /* 20.1.4.1.23 lt2 (Light 2) */
21079 case '<a:lt2>':
21080 case '</a:lt2>':
21081 /* 20.1.4.1.1 accent1 (Accent 1) */
21082 case '<a:accent1>':
21083 case '</a:accent1>':
21084 /* 20.1.4.1.2 accent2 (Accent 2) */
21085 case '<a:accent2>':
21086 case '</a:accent2>':
21087 /* 20.1.4.1.3 accent3 (Accent 3) */
21088 case '<a:accent3>':
21089 case '</a:accent3>':
21090 /* 20.1.4.1.4 accent4 (Accent 4) */
21091 case '<a:accent4>':
21092 case '</a:accent4>':
21093 /* 20.1.4.1.5 accent5 (Accent 5) */
21094 case '<a:accent5>':
21095 case '</a:accent5>':
21096 /* 20.1.4.1.6 accent6 (Accent 6) */
21097 case '<a:accent6>':
21098 case '</a:accent6>':
21099 /* 20.1.4.1.19 hlink (Hyperlink) */
21100 case '<a:hlink>':
21101 case '</a:hlink>':
21102 /* 20.1.4.1.15 folHlink (Followed Hyperlink) */
21103 case '<a:folHlink>':
21104 case '</a:folHlink>':
21105 if (y[0][1] === '/') {
21106 themes.themeElements.clrScheme.push(color);
21107 color = {};
21108 } else {
21109 color.name = y[0].substring(3, y[0].length - 1);
21110 }
21111 break;
21112
21113 default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in clrScheme';
21114 }
21115 });
21116 }
21117
21118 var clrsregex = /<a:clrScheme([^>]*)>.*<\/a:clrScheme>/;
21119 /* 14.2.7 Theme Part */
21120 function parse_theme_xml(data, opts) {
21121 if(!data || data.length === 0) return themes;
21122 themes.themeElements = {};
21123
21124 var t;
21125
21126 /* clrScheme CT_ColorScheme */
21127 if((t=data.match(clrsregex))) parse_clrScheme(t, opts);
21128
21129 return themes;
21130 }
21131
21132 function write_theme() { return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>'; }
21133 /* 18.6 Calculation Chain */
21134 function parse_cc_xml(data, opts) {
21135 var d = [];
21136 var l = 0, i = 1;
21137 (data.match(tagregex)||[]).forEach(function(x) {
21138 var y = parsexmltag(x);
21139 switch(y[0]) {
21140 case '<?xml': break;
21141 /* 18.6.2 calcChain CT_CalcChain 1 */
21142 case '<calcChain': case '<calcChain>': case '</calcChain>': break;
21143 /* 18.6.1 c CT_CalcCell 1 */
21144 case '<c': delete y[0]; if(y.i) i = y.i; else y.i = i; d.push(y); break;
21145 }
21146 });
21147 return d;
21148 }
21149
21150 function write_cc_xml(data, opts) { }
21151 /* [MS-XLSB] 2.6.4.1 */
21152 function parse_BrtCalcChainItem$(data, length) {
21153 var out = {};
21154 out.i = data.read_shift(4);
21155 var cell = {};
21156 cell.r = data.read_shift(4);
21157 cell.c = data.read_shift(4);
21158 out.r = encode_cell(cell);
21159 var flags = data.read_shift(1);
21160 if(flags & 0x2) out.l = '1';
21161 if(flags & 0x8) out.a = '1';
21162 return out;
21163 }
21164
21165 /* 18.6 Calculation Chain */
21166 function parse_cc_bin(data, opts) {
21167 var out = [];
21168 var pass = false;
21169 recordhopper(data, function hopper_cc(val, R, RT) {
21170 switch(R.n) {
21171 case 'BrtCalcChainItem$': out.push(val); break;
21172 case 'BrtBeginCalcChain$': break;
21173 case 'BrtEndCalcChain$': break;
21174 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n);
21175 }
21176 });
21177 return out;
21178 }
21179
21180 function write_cc_bin(data, opts) { }
21181
21182 function parse_comments(zip, dirComments, sheets, sheetRels, opts) {
21183 for(var i = 0; i != dirComments.length; ++i) {
21184 var canonicalpath=dirComments[i];
21185 var comments=parse_cmnt(getzipdata(zip, canonicalpath.replace(/^\//,''), true), canonicalpath, opts);
21186 if(!comments || !comments.length) continue;
21187 // find the sheets targeted by these comments
21188 var sheetNames = keys(sheets);
21189 for(var j = 0; j != sheetNames.length; ++j) {
21190 var sheetName = sheetNames[j];
21191 var rels = sheetRels[sheetName];
21192 if(rels) {
21193 var rel = rels[canonicalpath];
21194 if(rel) insertCommentsIntoSheet(sheetName, sheets[sheetName], comments);
21195 }
21196 }
21197 }
21198 }
21199
21200 function insertCommentsIntoSheet(sheetName, sheet, comments) {
21201 comments.forEach(function(comment) {
21202 var cell = sheet[comment.ref];
21203 if (!cell) {
21204 cell = {};
21205 sheet[comment.ref] = cell;
21206 var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
21207 var thisCell = decode_cell(comment.ref);
21208 if(range.s.r > thisCell.r) range.s.r = thisCell.r;
21209 if(range.e.r < thisCell.r) range.e.r = thisCell.r;
21210 if(range.s.c > thisCell.c) range.s.c = thisCell.c;
21211 if(range.e.c < thisCell.c) range.e.c = thisCell.c;
21212 var encoded = encode_range(range);
21213 if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
21214 }
21215
21216 if (!cell.c) cell.c = [];
21217 var o = {a: comment.author, t: comment.t, r: comment.r};
21218 if(comment.h) o.h = comment.h;
21219 cell.c.push(o);
21220 });
21221 }
21222
21223 /* 18.7.3 CT_Comment */
21224 function parse_comments_xml(data, opts) {
21225 if(data.match(/<(?:\w+:)?comments *\/>/)) return [];
21226 var authors = [];
21227 var commentList = [];
21228 data.match(/<(?:\w+:)?authors>([^\u2603]*)<\/(?:\w+:)?authors>/)[1].split(/<\/\w*:?author>/).forEach(function(x) {
21229 if(x === "" || x.trim() === "") return;
21230 authors.push(x.match(/<(?:\w+:)?author[^>]*>(.*)/)[1]);
21231 });
21232 (data.match(/<(?:\w+:)?commentList>([^\u2603]*)<\/(?:\w+:)?commentList>/)||["",""])[1].split(/<\/\w*:?comment>/).forEach(function(x, index) {
21233 if(x === "" || x.trim() === "") return;
21234 var y = parsexmltag(x.match(/<(?:\w+:)?comment[^>]*>/)[0]);
21235 var comment = { author: y.authorId && authors[y.authorId] ? authors[y.authorId] : undefined, ref: y.ref, guid: y.guid };
21236 var cell = decode_cell(y.ref);
21237 if(opts.sheetRows && opts.sheetRows <= cell.r) return;
21238 var textMatch = x.match(/<text>([^\u2603]*)<\/text>/);
21239 if (!textMatch || !textMatch[1]) return; // a comment may contain an empty text tag.
21240 var rt = parse_si(textMatch[1]);
21241 comment.r = rt.r;
21242 comment.t = rt.t;
21243 if(opts.cellHTML) comment.h = rt.h;
21244 commentList.push(comment);
21245 });
21246 return commentList;
21247 }
21248
21249 function write_comments_xml(data, opts) { }
21250 /* [MS-XLSB] 2.4.28 BrtBeginComment */
21251 function parse_BrtBeginComment(data, length) {
21252 var out = {};
21253 out.iauthor = data.read_shift(4);
21254 var rfx = parse_UncheckedRfX(data, 16);
21255 out.rfx = rfx.s;
21256 out.ref = encode_cell(rfx.s);
21257 data.l += 16; /*var guid = parse_GUID(data); */
21258 return out;
21259 }
21260
21261 /* [MS-XLSB] 2.4.324 BrtCommentAuthor */
21262 var parse_BrtCommentAuthor = parse_XLWideString;
21263
21264 /* [MS-XLSB] 2.4.325 BrtCommentText */
21265 var parse_BrtCommentText = parse_RichStr;
21266
21267 /* [MS-XLSB] 2.1.7.8 Comments */
21268 function parse_comments_bin(data, opts) {
21269 var out = [];
21270 var authors = [];
21271 var c = {};
21272 var pass = false;
21273 recordhopper(data, function hopper_cmnt(val, R, RT) {
21274 switch(R.n) {
21275 case 'BrtCommentAuthor': authors.push(val); break;
21276 case 'BrtBeginComment': c = val; break;
21277 case 'BrtCommentText': c.t = val.t; c.h = val.h; c.r = val.r; break;
21278 case 'BrtEndComment':
21279 c.author = authors[c.iauthor];
21280 delete c.iauthor;
21281 if(opts.sheetRows && opts.sheetRows <= c.rfx.r) break;
21282 delete c.rfx; out.push(c); break;
21283 case 'BrtBeginComments': break;
21284 case 'BrtEndComments': break;
21285 case 'BrtBeginCommentAuthors': break;
21286 case 'BrtEndCommentAuthors': break;
21287 case 'BrtBeginCommentList': break;
21288 case 'BrtEndCommentList': break;
21289 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n);
21290 }
21291 });
21292 return out;
21293 }
21294
21295 function write_comments_bin(data, opts) { }
21296 /* [MS-XLSB] 2.5.97.4 CellParsedFormula TODO: use similar logic to js-xls */
21297 function parse_CellParsedFormula(data, length) {
21298 var cce = data.read_shift(4);
21299 return parsenoop(data, length-4);
21300 }
21301 var strs = {}; // shared strings
21302 var _ssfopts = {}; // spreadsheet formatting options
21303
21304 RELS.WS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet";
21305
21306 function get_sst_id(sst, str) {
21307 for(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; }
21308 sst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len;
21309 }
21310
21311 function get_cell_style(styles, cell, opts) {
21312 var z = opts.revssf[cell.z != null ? cell.z : "General"];
21313 for(var i = 0, len = styles.length; i != len; ++i) if(styles[i].numFmtId === z) return i;
21314 styles[len] = {
21315 numFmtId:z,
21316 fontId:0,
21317 fillId:0,
21318 borderId:0,
21319 xfId:0,
21320 applyNumberFormat:1
21321 };
21322 return len;
21323 }
21324
21325 function safe_format(p, fmtid, fillid, opts) {
21326 try {
21327 if(fmtid === 0) {
21328 if(p.t === 'n') {
21329 if((p.v|0) === p.v) p.w = SSF._general_int(p.v,_ssfopts);
21330 else p.w = SSF._general_num(p.v,_ssfopts);
21331 }
21332 else if(p.v === undefined) return "";
21333 else p.w = SSF._general(p.v,_ssfopts);
21334 }
21335 else p.w = SSF.format(fmtid,p.v,_ssfopts);
21336 if(opts.cellNF) p.z = SSF._table[fmtid];
21337 } catch(e) { if(opts.WTF) throw e; }
21338 if(fillid) try {
21339 p.s = styles.Fills[fillid];
21340 if (p.s.fgColor && p.s.fgColor.theme) {
21341 p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);
21342 if(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;
21343 }
21344 if (p.s.bgColor && p.s.bgColor.theme) {
21345 p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);
21346 if(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;
21347 }
21348 } catch(e) { if(opts.WTF) throw e; }
21349 }
21350 function parse_ws_xml_dim(ws, s) {
21351 var d = safe_decode_range(s);
21352 if(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws["!ref"] = encode_range(d);
21353 }
21354 var mergecregex = /<mergeCell ref="[A-Z0-9:]+"\s*\/>/g;
21355 var sheetdataregex = /<(?:\w+:)?sheetData>([^\u2603]*)<\/(?:\w+:)?sheetData>/;
21356 var hlinkregex = /<hyperlink[^>]*\/>/g;
21357 var dimregex = /"(\w*:\w*)"/;
21358 var colregex = /<col[^>]*\/>/g;
21359 /* 18.3 Worksheets */
21360 function parse_ws_xml(data, opts, rels) {
21361 if(!data) return data;
21362 /* 18.3.1.99 worksheet CT_Worksheet */
21363 var s = {};
21364
21365 /* 18.3.1.35 dimension CT_SheetDimension ? */
21366 var ridx = data.indexOf("<dimension");
21367 if(ridx > 0) {
21368 var ref = data.substr(ridx,50).match(dimregex);
21369 if(ref != null) parse_ws_xml_dim(s, ref[1]);
21370 }
21371
21372 /* 18.3.1.55 mergeCells CT_MergeCells */
21373 var mergecells = [];
21374 if(data.indexOf("</mergeCells>")!==-1) {
21375 var merges = data.match(mergecregex);
21376 for(ridx = 0; ridx != merges.length; ++ridx)
21377 mergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf("\"")+1));
21378 }
21379
21380 /* 18.3.1.17 cols CT_Cols */
21381 var columns = [];
21382 if(opts.cellStyles && data.indexOf("</cols>")!==-1) {
21383 /* 18.3.1.13 col CT_Col */
21384 var cols = data.match(colregex);
21385 parse_ws_xml_cols(columns, cols);
21386 }
21387
21388 var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };
21389
21390 /* 18.3.1.80 sheetData CT_SheetData ? */
21391 var mtch=data.match(sheetdataregex);
21392 if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess);
21393
21394 /* 18.3.1.48 hyperlinks CT_Hyperlinks */
21395 if(data.indexOf("</hyperlinks>")!==-1) parse_ws_xml_hlinks(s, data.match(hlinkregex), rels);
21396
21397 if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
21398 if(opts.sheetRows > 0 && s["!ref"]) {
21399 var tmpref = safe_decode_range(s["!ref"]);
21400 if(opts.sheetRows < +tmpref.e.r) {
21401 tmpref.e.r = opts.sheetRows - 1;
21402 if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
21403 if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
21404 if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
21405 if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
21406 s["!fullref"] = s["!ref"];
21407 s["!ref"] = encode_range(tmpref);
21408 }
21409 }
21410 if(mergecells.length > 0) s["!merges"] = mergecells;
21411 if(columns.length > 0) s["!cols"] = columns;
21412 return s;
21413 }
21414
21415
21416 function parse_ws_xml_hlinks(s, data, rels) {
21417 for(var i = 0; i != data.length; ++i) {
21418 var val = parsexmltag(data[i], true);
21419 if(!val.ref) return;
21420 var rel = rels['!id'][val.id];
21421 if(rel) {
21422 val.Target = rel.Target;
21423 if(val.location) val.Target += "#"+val.location;
21424 val.Rel = rel;
21425 }
21426 var rng = safe_decode_range(val.ref);
21427 for(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {
21428 var addr = encode_cell({c:C,r:R});
21429 if(!s[addr]) s[addr] = {t:"str",v:undefined};
21430 s[addr].l = val;
21431 }
21432 }
21433 }
21434
21435 function parse_ws_xml_cols(columns, cols) {
21436 var seencol = false;
21437 for(var coli = 0; coli != cols.length; ++coli) {
21438 var coll = parsexmltag(cols[coli], true);
21439 var colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;
21440 delete coll.min; delete coll.max;
21441 if(!seencol && coll.width) { seencol = true; find_mdw(+coll.width, coll); }
21442 if(coll.width) {
21443 coll.wpx = width2px(+coll.width);
21444 coll.wch = px2char(coll.wpx);
21445 coll.MDW = MDW;
21446 }
21447 while(colm <= colM) columns[colm++] = coll;
21448 }
21449 }
21450
21451 function write_ws_xml_cols(ws, cols) {
21452 var o = ["<cols>"], col, width;
21453 for(var i = 0; i != cols.length; ++i) {
21454 if(!(col = cols[i])) continue;
21455 var p = {min:i+1,max:i+1};
21456 /* wch (chars), wpx (pixels) */
21457 width = -1;
21458 if(col.wpx) width = px2char(col.wpx);
21459 else if(col.wch) width = col.wch;
21460 if(width > -1) { p.width = char2width(width); p.customWidth= 1; }
21461 o[o.length] = (writextag('col', null, p));
21462 }
21463 o[o.length] = "</cols>";
21464 return o.join("");
21465 }
21466
21467 function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) {
21468 if(cell.v === undefined) return "";
21469 var vv = "";
21470 switch(cell.t) {
21471 case 'b': vv = cell.v ? "1" : "0"; break;
21472 case 'n': case 'e': vv = ''+cell.v; break;
21473 default: vv = cell.v; break;
21474 }
21475 var v = writetag('v', escapexml(vv)), o = {r:ref};
21476 /* TODO: cell style */
21477 var os = get_cell_style(opts.cellXfs, cell, opts);
21478 if(os !== 0) o.s = os;
21479 switch(cell.t) {
21480 case 'n': break;
21481 case 'b': o.t = "b"; break;
21482 case 'e': o.t = "e"; break;
21483 default:
21484 if(opts.bookSST) {
21485 v = writetag('v', ''+get_sst_id(opts.Strings, cell.v));
21486 o.t = "s"; break;
21487 }
21488 o.t = "str"; break;
21489 }
21490 return writextag('c', v, o);
21491 }
21492
21493 var parse_ws_xml_data = (function parse_ws_xml_data_factory() {
21494 var cellregex = /<(?:\w+:)?c /, rowregex = /<\/(?:\w+:)?row>/;
21495 var rregex = /r=["']([^"']*)["']/, isregex = /<is>([\S\s]*?)<\/is>/;
21496 var match_v = matchtag("v"), match_f = matchtag("f");
21497
21498 return function parse_ws_xml_data(sdata, s, opts, guess) {
21499 var ri = 0, x = "", cells = [], cref = [], idx = 0, i=0, cc=0, d="", p;
21500 var tag;
21501 var sstr;
21502 var fmtid = 0, fillid = 0, do_format = Array.isArray(styles.CellXf), cf;
21503 for(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {
21504 x = marr[mt].trim();
21505 var xlen = x.length;
21506 if(xlen === 0) continue;
21507
21508 /* 18.3.1.73 row CT_Row */
21509 for(ri = 0; ri < xlen; ++ri) if(x.charCodeAt(ri) === 62) break; ++ri;
21510 tag = parsexmltag(x.substr(0,ri), true);
21511 var tagr = parseInt(tag.r, 10);
21512 if(opts.sheetRows && opts.sheetRows < tagr) continue;
21513 if(guess.s.r > tagr - 1) guess.s.r = tagr - 1;
21514 if(guess.e.r < tagr - 1) guess.e.r = tagr - 1;
21515
21516 /* 18.3.1.4 c CT_Cell */
21517 cells = x.substr(ri).split(cellregex);
21518 for(ri = 1, cellen = cells.length; ri != cellen; ++ri) {
21519 x = cells[ri].trim();
21520 if(x.length === 0) continue;
21521 cref = x.match(rregex); idx = ri; i=0; cc=0;
21522 x = "<c " + x;
21523 if(cref !== null && cref.length === 2) {
21524 idx = 0; d=cref[1];
21525 for(i=0; i != d.length; ++i) {
21526 if((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;
21527 idx = 26*idx + cc;
21528 }
21529 --idx;
21530 }
21531
21532 for(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;
21533 tag = parsexmltag(x.substr(0,i), true);
21534 d = x.substr(i);
21535 p = {t:""};
21536
21537 if((cref=d.match(match_v))!== null) p.v=unescapexml(cref[1]);
21538 if(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]);
21539
21540 /* SCHEMA IS ACTUALLY INCORRECT HERE. IF A CELL HAS NO T, EMIT "" */
21541 if(tag.t === undefined && p.v === undefined) {
21542 if(!opts.sheetStubs) continue;
21543 p.t = "str";
21544 }
21545 else p.t = tag.t || "n";
21546 if(guess.s.c > idx) guess.s.c = idx;
21547 if(guess.e.c < idx) guess.e.c = idx;
21548 /* 18.18.11 t ST_CellType */
21549 switch(p.t) {
21550 case 'n': p.v = parseFloat(p.v); break;
21551 case 's':
21552 sstr = strs[parseInt(p.v, 10)];
21553 p.v = sstr.t;
21554 p.r = sstr.r;
21555 if(opts.cellHTML) p.h = sstr.h;
21556 break;
21557 case 'str': if(p.v != null) p.v = utf8read(p.v); else p.v = ""; break;
21558 case 'inlineStr':
21559 cref = d.match(isregex);
21560 p.t = 'str';
21561 if(cref !== null) { sstr = parse_si(cref[1]); p.v = sstr.t; } else p.v = "";
21562 break; // inline string
21563 case 'b': p.v = parsexmlbool(p.v); break;
21564 case 'd':
21565 p.v = datenum(p.v);
21566 p.t = 'n';
21567 break;
21568 /* in case of error, stick value in .raw */
21569 case 'e': p.raw = RBErr[p.v]; break;
21570 }
21571 /* formatting */
21572 fmtid = fillid = 0;
21573 if(do_format && tag.s !== undefined) {
21574 cf = styles.CellXf[tag.s];
21575 if(cf != null) {
21576 if(cf.numFmtId != null) fmtid = cf.numFmtId;
21577 if(opts.cellStyles && cf.fillId != null) fillid = cf.fillId;
21578 }
21579 }
21580 safe_format(p, fmtid, fillid, opts);
21581 s[tag.r] = p;
21582 }
21583 }
21584 }; })();
21585
21586 function write_ws_xml_data(ws, opts, idx, wb) {
21587 var o = [], r = [], range = safe_decode_range(ws['!ref']), cell, ref, rr = "", cols = [], R, C;
21588 for(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);
21589 for(R = range.s.r; R <= range.e.r; ++R) {
21590 r = [];
21591 rr = encode_row(R);
21592 for(C = range.s.c; C <= range.e.c; ++C) {
21593 ref = cols[C] + rr;
21594 if(ws[ref] === undefined) continue;
21595 if((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell);
21596 }
21597 if(r.length > 0) o[o.length] = (writextag('row', r.join(""), {r:rr}));
21598 }
21599 return o.join("");
21600 }
21601
21602 var WS_XML_ROOT = writextag('worksheet', null, {
21603 'xmlns': XMLNS.main[0],
21604 'xmlns:r': XMLNS.r
21605 });
21606
21607 function write_ws_xml(idx, opts, wb) {
21608 var o = [XML_HEADER, WS_XML_ROOT];
21609 var s = wb.SheetNames[idx], sidx = 0, rdata = "";
21610 var ws = wb.Sheets[s];
21611 if(ws === undefined) ws = {};
21612 var ref = ws['!ref']; if(ref === undefined) ref = 'A1';
21613 o[o.length] = (writextag('dimension', null, {'ref': ref}));
21614
21615 if(ws['!cols'] !== undefined && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));
21616 o[sidx = o.length] = '<sheetData/>';
21617 if(ws['!ref'] !== undefined) {
21618 rdata = write_ws_xml_data(ws, opts, idx, wb);
21619 if(rdata.length > 0) o[o.length] = (rdata);
21620 }
21621 if(o.length>sidx+1) { o[o.length] = ('</sheetData>'); o[sidx]=o[sidx].replace("/>",">"); }
21622
21623 if(o.length>2) { o[o.length] = ('</worksheet>'); o[1]=o[1].replace("/>",">"); }
21624 return o.join("");
21625 }
21626
21627 /* [MS-XLSB] 2.4.718 BrtRowHdr */
21628 function parse_BrtRowHdr(data, length) {
21629 var z = [];
21630 z.r = data.read_shift(4);
21631 data.l += length-4;
21632 return z;
21633 }
21634
21635 /* [MS-XLSB] 2.4.812 BrtWsDim */
21636 var parse_BrtWsDim = parse_UncheckedRfX;
21637 var write_BrtWsDim = write_UncheckedRfX;
21638
21639 /* [MS-XLSB] 2.4.815 BrtWsProp */
21640 function parse_BrtWsProp(data, length) {
21641 var z = {};
21642 /* TODO: pull flags */
21643 data.l += 19;
21644 z.name = parse_CodeName(data, length - 19);
21645 return z;
21646 }
21647
21648 /* [MS-XLSB] 2.4.303 BrtCellBlank */
21649 function parse_BrtCellBlank(data, length) {
21650 var cell = parse_Cell(data);
21651 return [cell];
21652 }
21653 function write_BrtCellBlank(cell, val, o) {
21654 if(o == null) o = new_buf(8);
21655 return write_Cell(val, o);
21656 }
21657
21658
21659 /* [MS-XLSB] 2.4.304 BrtCellBool */
21660 function parse_BrtCellBool(data, length) {
21661 var cell = parse_Cell(data);
21662 var fBool = data.read_shift(1);
21663 return [cell, fBool, 'b'];
21664 }
21665
21666 /* [MS-XLSB] 2.4.305 BrtCellError */
21667 function parse_BrtCellError(data, length) {
21668 var cell = parse_Cell(data);
21669 var fBool = data.read_shift(1);
21670 return [cell, fBool, 'e'];
21671 }
21672
21673 /* [MS-XLSB] 2.4.308 BrtCellIsst */
21674 function parse_BrtCellIsst(data, length) {
21675 var cell = parse_Cell(data);
21676 var isst = data.read_shift(4);
21677 return [cell, isst, 's'];
21678 }
21679
21680 /* [MS-XLSB] 2.4.310 BrtCellReal */
21681 function parse_BrtCellReal(data, length) {
21682 var cell = parse_Cell(data);
21683 var value = parse_Xnum(data);
21684 return [cell, value, 'n'];
21685 }
21686
21687 /* [MS-XLSB] 2.4.311 BrtCellRk */
21688 function parse_BrtCellRk(data, length) {
21689 var cell = parse_Cell(data);
21690 var value = parse_RkNumber(data);
21691 return [cell, value, 'n'];
21692 }
21693
21694 /* [MS-XLSB] 2.4.314 BrtCellSt */
21695 function parse_BrtCellSt(data, length) {
21696 var cell = parse_Cell(data);
21697 var value = parse_XLWideString(data);
21698 return [cell, value, 'str'];
21699 }
21700
21701 /* [MS-XLSB] 2.4.647 BrtFmlaBool */
21702 function parse_BrtFmlaBool(data, length, opts) {
21703 var cell = parse_Cell(data);
21704 var value = data.read_shift(1);
21705 var o = [cell, value, 'b'];
21706 if(opts.cellFormula) {
21707 var formula = parse_CellParsedFormula(data, length-9);
21708 o[3] = ""; /* TODO */
21709 }
21710 else data.l += length-9;
21711 return o;
21712 }
21713
21714 /* [MS-XLSB] 2.4.648 BrtFmlaError */
21715 function parse_BrtFmlaError(data, length, opts) {
21716 var cell = parse_Cell(data);
21717 var value = data.read_shift(1);
21718 var o = [cell, value, 'e'];
21719 if(opts.cellFormula) {
21720 var formula = parse_CellParsedFormula(data, length-9);
21721 o[3] = ""; /* TODO */
21722 }
21723 else data.l += length-9;
21724 return o;
21725 }
21726
21727 /* [MS-XLSB] 2.4.649 BrtFmlaNum */
21728 function parse_BrtFmlaNum(data, length, opts) {
21729 var cell = parse_Cell(data);
21730 var value = parse_Xnum(data);
21731 var o = [cell, value, 'n'];
21732 if(opts.cellFormula) {
21733 var formula = parse_CellParsedFormula(data, length - 16);
21734 o[3] = ""; /* TODO */
21735 }
21736 else data.l += length-16;
21737 return o;
21738 }
21739
21740 /* [MS-XLSB] 2.4.650 BrtFmlaString */
21741 function parse_BrtFmlaString(data, length, opts) {
21742 var start = data.l;
21743 var cell = parse_Cell(data);
21744 var value = parse_XLWideString(data);
21745 var o = [cell, value, 'str'];
21746 if(opts.cellFormula) {
21747 var formula = parse_CellParsedFormula(data, start + length - data.l);
21748 }
21749 else data.l = start + length;
21750 return o;
21751 }
21752
21753 /* [MS-XLSB] 2.4.676 BrtMergeCell */
21754 var parse_BrtMergeCell = parse_UncheckedRfX;
21755
21756 /* [MS-XLSB] 2.4.656 BrtHLink */
21757 function parse_BrtHLink(data, length, opts) {
21758 var end = data.l + length;
21759 var rfx = parse_UncheckedRfX(data, 16);
21760 var relId = parse_XLNullableWideString(data);
21761 var loc = parse_XLWideString(data);
21762 var tooltip = parse_XLWideString(data);
21763 var display = parse_XLWideString(data);
21764 data.l = end;
21765 return {rfx:rfx, relId:relId, loc:loc, tooltip:tooltip, display:display};
21766 }
21767
21768 /* [MS-XLSB] 2.1.7.61 Worksheet */
21769 function parse_ws_bin(data, opts, rels) {
21770 if(!data) return data;
21771 if(!rels) rels = {'!id':{}};
21772 var s = {};
21773
21774 var ref;
21775 var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };
21776
21777 var pass = false, end = false;
21778 var row, p, cf, R, C, addr, sstr, rr;
21779 var mergecells = [];
21780 recordhopper(data, function ws_parse(val, R) {
21781 if(end) return;
21782 switch(R.n) {
21783 case 'BrtWsDim': ref = val; break;
21784 case 'BrtRowHdr':
21785 row = val;
21786 if(opts.sheetRows && opts.sheetRows <= row.r) end=true;
21787 rr = encode_row(row.r);
21788 break;
21789
21790 case 'BrtFmlaBool':
21791 case 'BrtFmlaError':
21792 case 'BrtFmlaNum':
21793 case 'BrtFmlaString':
21794 case 'BrtCellBool':
21795 case 'BrtCellError':
21796 case 'BrtCellIsst':
21797 case 'BrtCellReal':
21798 case 'BrtCellRk':
21799 case 'BrtCellSt':
21800 p = {t:val[2]};
21801 switch(val[2]) {
21802 case 'n': p.v = val[1]; break;
21803 case 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;
21804 case 'b': p.v = val[1] ? true : false; break;
21805 case 'e': p.raw = val[1]; p.v = BErr[p.raw]; break;
21806 case 'str': p.v = utf8read(val[1]); break;
21807 }
21808 if(opts.cellFormula && val.length > 3) p.f = val[3];
21809 if((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.ifmt,null,opts);
21810 s[encode_col(C=val[0].c) + rr] = p;
21811 if(refguess.s.r > row.r) refguess.s.r = row.r;
21812 if(refguess.s.c > C) refguess.s.c = C;
21813 if(refguess.e.r < row.r) refguess.e.r = row.r;
21814 if(refguess.e.c < C) refguess.e.c = C;
21815 break;
21816
21817 case 'BrtCellBlank': if(!opts.sheetStubs) break;
21818 p = {t:'str',v:undefined};
21819 s[encode_col(C=val[0].c) + rr] = p;
21820 if(refguess.s.r > row.r) refguess.s.r = row.r;
21821 if(refguess.s.c > C) refguess.s.c = C;
21822 if(refguess.e.r < row.r) refguess.e.r = row.r;
21823 if(refguess.e.c < C) refguess.e.c = C;
21824 break;
21825
21826 /* Merge Cells */
21827 case 'BrtBeginMergeCells': break;
21828 case 'BrtEndMergeCells': break;
21829 case 'BrtMergeCell': mergecells.push(val); break;
21830
21831 case 'BrtHLink':
21832 var rel = rels['!id'][val.relId];
21833 if(rel) {
21834 val.Target = rel.Target;
21835 if(val.loc) val.Target += "#"+val.loc;
21836 val.Rel = rel;
21837 }
21838 for(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {
21839 addr = encode_cell({c:C,r:R});
21840 if(!s[addr]) s[addr] = {t:"str",v:undefined};
21841 s[addr].l = val;
21842 }
21843 break;
21844
21845 case 'BrtArrFmla': break; // TODO
21846 case 'BrtShrFmla': break; // TODO
21847 case 'BrtBeginSheet': break;
21848 case 'BrtWsProp': break; // TODO
21849 case 'BrtSheetCalcProp': break; // TODO
21850 case 'BrtBeginWsViews': break; // TODO
21851 case 'BrtBeginWsView': break; // TODO
21852 case 'BrtPane': break; // TODO
21853 case 'BrtSel': break; // TODO
21854 case 'BrtEndWsView': break; // TODO
21855 case 'BrtEndWsViews': break; // TODO
21856 case 'BrtACBegin': break; // TODO
21857 case 'BrtRwDescent': break; // TODO
21858 case 'BrtACEnd': break; // TODO
21859 case 'BrtWsFmtInfoEx14': break; // TODO
21860 case 'BrtWsFmtInfo': break; // TODO
21861 case 'BrtBeginColInfos': break; // TODO
21862 case 'BrtColInfo': break; // TODO
21863 case 'BrtEndColInfos': break; // TODO
21864 case 'BrtBeginSheetData': break; // TODO
21865 case 'BrtEndSheetData': break; // TODO
21866 case 'BrtSheetProtection': break; // TODO
21867 case 'BrtPrintOptions': break; // TODO
21868 case 'BrtMargins': break; // TODO
21869 case 'BrtPageSetup': break; // TODO
21870 case 'BrtFRTBegin': pass = true; break;
21871 case 'BrtFRTEnd': pass = false; break;
21872 case 'BrtEndSheet': break; // TODO
21873 case 'BrtDrawing': break; // TODO
21874 case 'BrtLegacyDrawing': break; // TODO
21875 case 'BrtLegacyDrawingHF': break; // TODO
21876 case 'BrtPhoneticInfo': break; // TODO
21877 case 'BrtBeginHeaderFooter': break; // TODO
21878 case 'BrtEndHeaderFooter': break; // TODO
21879 case 'BrtBrk': break; // TODO
21880 case 'BrtBeginRwBrk': break; // TODO
21881 case 'BrtEndRwBrk': break; // TODO
21882 case 'BrtBeginColBrk': break; // TODO
21883 case 'BrtEndColBrk': break; // TODO
21884 case 'BrtBeginUserShViews': break; // TODO
21885 case 'BrtBeginUserShView': break; // TODO
21886 case 'BrtEndUserShView': break; // TODO
21887 case 'BrtEndUserShViews': break; // TODO
21888 case 'BrtBkHim': break; // TODO
21889 case 'BrtBeginOleObjects': break; // TODO
21890 case 'BrtOleObject': break; // TODO
21891 case 'BrtEndOleObjects': break; // TODO
21892 case 'BrtBeginListParts': break; // TODO
21893 case 'BrtListPart': break; // TODO
21894 case 'BrtEndListParts': break; // TODO
21895 case 'BrtBeginSortState': break; // TODO
21896 case 'BrtBeginSortCond': break; // TODO
21897 case 'BrtEndSortCond': break; // TODO
21898 case 'BrtEndSortState': break; // TODO
21899 case 'BrtBeginConditionalFormatting': break; // TODO
21900 case 'BrtEndConditionalFormatting': break; // TODO
21901 case 'BrtBeginCFRule': break; // TODO
21902 case 'BrtEndCFRule': break; // TODO
21903 case 'BrtBeginDVals': break; // TODO
21904 case 'BrtDVal': break; // TODO
21905 case 'BrtEndDVals': break; // TODO
21906 case 'BrtRangeProtection': break; // TODO
21907 case 'BrtBeginDCon': break; // TODO
21908 case 'BrtEndDCon': break; // TODO
21909 case 'BrtBeginDRefs': break;
21910 case 'BrtDRef': break;
21911 case 'BrtEndDRefs': break;
21912
21913 /* ActiveX */
21914 case 'BrtBeginActiveXControls': break;
21915 case 'BrtActiveX': break;
21916 case 'BrtEndActiveXControls': break;
21917
21918 /* AutoFilter */
21919 case 'BrtBeginAFilter': break;
21920 case 'BrtEndAFilter': break;
21921 case 'BrtBeginFilterColumn': break;
21922 case 'BrtBeginFilters': break;
21923 case 'BrtFilter': break;
21924 case 'BrtEndFilters': break;
21925 case 'BrtEndFilterColumn': break;
21926 case 'BrtDynamicFilter': break;
21927 case 'BrtTop10Filter': break;
21928 case 'BrtBeginCustomFilters': break;
21929 case 'BrtCustomFilter': break;
21930 case 'BrtEndCustomFilters': break;
21931
21932 /* Smart Tags */
21933 case 'BrtBeginSmartTags': break;
21934 case 'BrtBeginCellSmartTags': break;
21935 case 'BrtBeginCellSmartTag': break;
21936 case 'BrtCellSmartTagProperty': break;
21937 case 'BrtEndCellSmartTag': break;
21938 case 'BrtEndCellSmartTags': break;
21939 case 'BrtEndSmartTags': break;
21940
21941 /* Cell Watch */
21942 case 'BrtBeginCellWatches': break;
21943 case 'BrtCellWatch': break;
21944 case 'BrtEndCellWatches': break;
21945
21946 /* Table */
21947 case 'BrtTable': break;
21948
21949 /* Ignore Cell Errors */
21950 case 'BrtBeginCellIgnoreECs': break;
21951 case 'BrtCellIgnoreEC': break;
21952 case 'BrtEndCellIgnoreECs': break;
21953
21954 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + R.n);
21955 }
21956 }, opts);
21957 if(!s["!ref"] && (refguess.s.r < 1000000 || ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0)) s["!ref"] = encode_range(ref);
21958 if(opts.sheetRows && s["!ref"]) {
21959 var tmpref = safe_decode_range(s["!ref"]);
21960 if(opts.sheetRows < +tmpref.e.r) {
21961 tmpref.e.r = opts.sheetRows - 1;
21962 if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
21963 if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
21964 if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
21965 if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
21966 s["!fullref"] = s["!ref"];
21967 s["!ref"] = encode_range(tmpref);
21968 }
21969 }
21970 if(mergecells.length > 0) s["!merges"] = mergecells;
21971 return s;
21972 }
21973
21974 /* TODO: something useful -- this is a stub */
21975 function write_ws_bin_cell(ba, cell, R, C, opts) {
21976 if(cell.v === undefined) return "";
21977 var vv = "";
21978 switch(cell.t) {
21979 case 'b': vv = cell.v ? "1" : "0"; break;
21980 case 'n': case 'e': vv = ''+cell.v; break;
21981 default: vv = cell.v; break;
21982 }
21983 var o = {r:R, c:C};
21984 /* TODO: cell style */
21985 o.s = get_cell_style(opts.cellXfs, cell, opts);
21986 switch(cell.t) {
21987 case 's': case 'str':
21988 if(opts.bookSST) {
21989 vv = get_sst_id(opts.Strings, cell.v);
21990 o.t = "s"; break;
21991 }
21992 o.t = "str"; break;
21993 case 'n': break;
21994 case 'b': o.t = "b"; break;
21995 case 'e': o.t = "e"; break;
21996 }
21997 write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
21998 }
21999
22000 function write_CELLTABLE(ba, ws, idx, opts, wb) {
22001 var range = safe_decode_range(ws['!ref'] || "A1"), ref, rr = "", cols = [];
22002 write_record(ba, 'BrtBeginSheetData');
22003 for(var R = range.s.r; R <= range.e.r; ++R) {
22004 rr = encode_row(R);
22005 /* [ACCELLTABLE] */
22006 /* BrtRowHdr */
22007 for(var C = range.s.c; C <= range.e.c; ++C) {
22008 /* *16384CELL */
22009 if(R === range.s.r) cols[C] = encode_col(C);
22010 ref = cols[C] + rr;
22011 if(!ws[ref]) continue;
22012 /* write cell */
22013 write_ws_bin_cell(ba, ws[ref], R, C, opts);
22014 }
22015 }
22016 write_record(ba, 'BrtEndSheetData');
22017 }
22018
22019 function write_ws_bin(idx, opts, wb) {
22020 var ba = buf_array();
22021 var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
22022 var r = safe_decode_range(ws['!ref'] || "A1");
22023 write_record(ba, "BrtBeginSheet");
22024 /* [BrtWsProp] */
22025 write_record(ba, "BrtWsDim", write_BrtWsDim(r));
22026 /* [WSVIEWS2] */
22027 /* [WSFMTINFO] */
22028 /* *COLINFOS */
22029 write_CELLTABLE(ba, ws, idx, opts, wb);
22030 /* [BrtSheetCalcProp] */
22031 /* [[BrtSheetProtectionIso] BrtSheetProtection] */
22032 /* *([BrtRangeProtectionIso] BrtRangeProtection) */
22033 /* [SCENMAN] */
22034 /* [AUTOFILTER] */
22035 /* [SORTSTATE] */
22036 /* [DCON] */
22037 /* [USERSHVIEWS] */
22038 /* [MERGECELLS] */
22039 /* [BrtPhoneticInfo] */
22040 /* *CONDITIONALFORMATTING */
22041 /* [DVALS] */
22042 /* *BrtHLink */
22043 /* [BrtPrintOptions] */
22044 /* [BrtMargins] */
22045 /* [BrtPageSetup] */
22046 /* [HEADERFOOTER] */
22047 /* [RWBRK] */
22048 /* [COLBRK] */
22049 /* *BrtBigName */
22050 /* [CELLWATCHES] */
22051 /* [IGNOREECS] */
22052 /* [SMARTTAGS] */
22053 /* [BrtDrawing] */
22054 /* [BrtLegacyDrawing] */
22055 /* [BrtLegacyDrawingHF] */
22056 /* [BrtBkHim] */
22057 /* [OLEOBJECTS] */
22058 /* [ACTIVEXCONTROLS] */
22059 /* [WEBPUBITEMS] */
22060 /* [LISTPARTS] */
22061 /* FRTWORKSHEET */
22062 write_record(ba, "BrtEndSheet");
22063 return ba.end();
22064 }
22065 /* 18.2.28 (CT_WorkbookProtection) Defaults */
22066 var WBPropsDef = [
22067 ['allowRefreshQuery', '0'],
22068 ['autoCompressPictures', '1'],
22069 ['backupFile', '0'],
22070 ['checkCompatibility', '0'],
22071 ['codeName', ''],
22072 ['date1904', '0'],
22073 ['dateCompatibility', '1'],
22074 //['defaultThemeVersion', '0'],
22075 ['filterPrivacy', '0'],
22076 ['hidePivotFieldList', '0'],
22077 ['promptedSolutions', '0'],
22078 ['publishItems', '0'],
22079 ['refreshAllConnections', false],
22080 ['saveExternalLinkValues', '1'],
22081 ['showBorderUnselectedTables', '1'],
22082 ['showInkAnnotation', '1'],
22083 ['showObjects', 'all'],
22084 ['showPivotChartFilter', '0']
22085 //['updateLinks', 'userSet']
22086 ];
22087
22088 /* 18.2.30 (CT_BookView) Defaults */
22089 var WBViewDef = [
22090 ['activeTab', '0'],
22091 ['autoFilterDateGrouping', '1'],
22092 ['firstSheet', '0'],
22093 ['minimized', '0'],
22094 ['showHorizontalScroll', '1'],
22095 ['showSheetTabs', '1'],
22096 ['showVerticalScroll', '1'],
22097 ['tabRatio', '600'],
22098 ['visibility', 'visible']
22099 //window{Height,Width}, {x,y}Window
22100 ];
22101
22102 /* 18.2.19 (CT_Sheet) Defaults */
22103 var SheetDef = [
22104 ['state', 'visible']
22105 ];
22106
22107 /* 18.2.2 (CT_CalcPr) Defaults */
22108 var CalcPrDef = [
22109 ['calcCompleted', 'true'],
22110 ['calcMode', 'auto'],
22111 ['calcOnSave', 'true'],
22112 ['concurrentCalc', 'true'],
22113 ['fullCalcOnLoad', 'false'],
22114 ['fullPrecision', 'true'],
22115 ['iterate', 'false'],
22116 ['iterateCount', '100'],
22117 ['iterateDelta', '0.001'],
22118 ['refMode', 'A1']
22119 ];
22120
22121 /* 18.2.3 (CT_CustomWorkbookView) Defaults */
22122 var CustomWBViewDef = [
22123 ['autoUpdate', 'false'],
22124 ['changesSavedWin', 'false'],
22125 ['includeHiddenRowCol', 'true'],
22126 ['includePrintSettings', 'true'],
22127 ['maximized', 'false'],
22128 ['minimized', 'false'],
22129 ['onlySync', 'false'],
22130 ['personalView', 'false'],
22131 ['showComments', 'commIndicator'],
22132 ['showFormulaBar', 'true'],
22133 ['showHorizontalScroll', 'true'],
22134 ['showObjects', 'all'],
22135 ['showSheetTabs', 'true'],
22136 ['showStatusbar', 'true'],
22137 ['showVerticalScroll', 'true'],
22138 ['tabRatio', '600'],
22139 ['xWindow', '0'],
22140 ['yWindow', '0']
22141 ];
22142
22143 function push_defaults_array(target, defaults) {
22144 for(var j = 0; j != target.length; ++j) { var w = target[j];
22145 for(var i=0; i != defaults.length; ++i) { var z = defaults[i];
22146 if(w[z[0]] == null) w[z[0]] = z[1];
22147 }
22148 }
22149 }
22150 function push_defaults(target, defaults) {
22151 for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];
22152 if(target[z[0]] == null) target[z[0]] = z[1];
22153 }
22154 }
22155
22156 function parse_wb_defaults(wb) {
22157 push_defaults(wb.WBProps, WBPropsDef);
22158 push_defaults(wb.CalcPr, CalcPrDef);
22159
22160 push_defaults_array(wb.WBView, WBViewDef);
22161 push_defaults_array(wb.Sheets, SheetDef);
22162
22163 _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
22164 }
22165 /* 18.2 Workbook */
22166 var wbnsregex = /<\w+:workbook/;
22167 function parse_wb_xml(data, opts) {
22168 var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
22169 var pass = false, xmlns = "xmlns";
22170 data.match(tagregex).forEach(function xml_wb(x) {
22171 var y = parsexmltag(x);
22172 switch(strip_ns(y[0])) {
22173 case '<?xml': break;
22174
22175 /* 18.2.27 workbook CT_Workbook 1 */
22176 case '<workbook':
22177 if(x.match(wbnsregex)) xmlns = "xmlns" + x.match(/<(\w+):/)[1];
22178 wb.xmlns = y[xmlns];
22179 break;
22180 case '</workbook>': break;
22181
22182 /* 18.2.13 fileVersion CT_FileVersion ? */
22183 case '<fileVersion': delete y[0]; wb.AppVersion = y; break;
22184 case '<fileVersion/>': break;
22185
22186 /* 18.2.12 fileSharing CT_FileSharing ? */
22187 case '<fileSharing': case '<fileSharing/>': break;
22188
22189 /* 18.2.28 workbookPr CT_WorkbookPr ? */
22190 case '<workbookPr': delete y[0]; wb.WBProps = y; break;
22191 case '<workbookPr/>': delete y[0]; wb.WBProps = y; break;
22192
22193 /* 18.2.29 workbookProtection CT_WorkbookProtection ? */
22194 case '<workbookProtection': break;
22195 case '<workbookProtection/>': break;
22196
22197 /* 18.2.1 bookViews CT_BookViews ? */
22198 case '<bookViews>': case '</bookViews>': break;
22199 /* 18.2.30 workbookView CT_BookView + */
22200 case '<workbookView': delete y[0]; wb.WBView.push(y); break;
22201
22202 /* 18.2.20 sheets CT_Sheets 1 */
22203 case '<sheets>': case '</sheets>': break; // aggregate sheet
22204 /* 18.2.19 sheet CT_Sheet + */
22205 case '<sheet': delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break;
22206
22207 /* 18.2.15 functionGroups CT_FunctionGroups ? */
22208 case '<functionGroups': case '<functionGroups/>': break;
22209 /* 18.2.14 functionGroup CT_FunctionGroup + */
22210 case '<functionGroup': break;
22211
22212 /* 18.2.9 externalReferences CT_ExternalReferences ? */
22213 case '<externalReferences': case '</externalReferences>': case '<externalReferences>': break;
22214 /* 18.2.8 externalReference CT_ExternalReference + */
22215 case '<externalReference': break;
22216
22217 /* 18.2.6 definedNames CT_DefinedNames ? */
22218 case '<definedNames/>': break;
22219 case '<definedNames>': case '<definedNames': pass=true; break;
22220 case '</definedNames>': pass=false; break;
22221 /* 18.2.5 definedName CT_DefinedName + */
22222 case '<definedName': case '<definedName/>': case '</definedName>': break;
22223
22224 /* 18.2.2 calcPr CT_CalcPr ? */
22225 case '<calcPr': delete y[0]; wb.CalcPr = y; break;
22226 case '<calcPr/>': delete y[0]; wb.CalcPr = y; break;
22227
22228 /* 18.2.16 oleSize CT_OleSize ? (ref required) */
22229 case '<oleSize': break;
22230
22231 /* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
22232 case '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;
22233 /* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
22234 case '<customWorkbookView': case '</customWorkbookView>': break;
22235
22236 /* 18.2.18 pivotCaches CT_PivotCaches ? */
22237 case '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;
22238 /* 18.2.17 pivotCache CT_PivotCache ? */
22239 case '<pivotCache': break;
22240
22241 /* 18.2.21 smartTagPr CT_SmartTagPr ? */
22242 case '<smartTagPr': case '<smartTagPr/>': break;
22243
22244 /* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
22245 case '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;
22246 /* 18.2.22 smartTagType CT_SmartTagType ? */
22247 case '<smartTagType': break;
22248
22249 /* 18.2.24 webPublishing CT_WebPublishing ? */
22250 case '<webPublishing': case '<webPublishing/>': break;
22251
22252 /* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
22253 case '<fileRecoveryPr': case '<fileRecoveryPr/>': break;
22254
22255 /* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
22256 case '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;
22257 /* 18.2.25 webPublishObject CT_WebPublishObject ? */
22258 case '<webPublishObject': break;
22259
22260 /* 18.2.10 extLst CT_ExtensionList ? */
22261 case '<extLst>': case '</extLst>': case '<extLst/>': break;
22262 /* 18.2.7 ext CT_Extension + */
22263 case '<ext': pass=true; break; //TODO: check with versions of excel
22264 case '</ext>': pass=false; break;
22265
22266 /* Others */
22267 case '<ArchID': break;
22268 case '<AlternateContent': pass=true; break;
22269 case '</AlternateContent>': pass=false; break;
22270
22271 default: if(!pass && opts.WTF) throw 'unrecognized ' + y[0] + ' in workbook';
22272 }
22273 });
22274 if(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns);
22275
22276 parse_wb_defaults(wb);
22277
22278 return wb;
22279 }
22280
22281 var WB_XML_ROOT = writextag('workbook', null, {
22282 'xmlns': XMLNS.main[0],
22283 //'xmlns:mx': XMLNS.mx,
22284 //'xmlns:s': XMLNS.main[0],
22285 'xmlns:r': XMLNS.r
22286 });
22287
22288 function safe1904(wb) {
22289 /* TODO: store date1904 somewhere else */
22290 try { return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false"; } catch(e) { return "false"; }
22291 }
22292
22293 function write_wb_xml(wb, opts) {
22294 var o = [XML_HEADER];
22295 o[o.length] = WB_XML_ROOT;
22296 o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb)}));
22297 o[o.length] = "<sheets>";
22298 for(var i = 0; i != wb.SheetNames.length; ++i)
22299 o[o.length] = (writextag('sheet',null,{name:wb.SheetNames[i].substr(0,31), sheetId:""+(i+1), "r:id":"rId"+(i+1)}));
22300 o[o.length] = "</sheets>";
22301 if(o.length>2){ o[o.length] = '</workbook>'; o[1]=o[1].replace("/>",">"); }
22302 return o.join("");
22303 }
22304 /* [MS-XLSB] 2.4.301 BrtBundleSh */
22305 function parse_BrtBundleSh(data, length) {
22306 var z = {};
22307 z.hsState = data.read_shift(4); //ST_SheetState
22308 z.iTabID = data.read_shift(4);
22309 z.strRelID = parse_RelID(data,length-8);
22310 z.name = parse_XLWideString(data);
22311 return z;
22312 }
22313 function write_BrtBundleSh(data, o) {
22314 if(!o) o = new_buf(127);
22315 o.write_shift(4, data.hsState);
22316 o.write_shift(4, data.iTabID);
22317 write_RelID(data.strRelID, o);
22318 write_XLWideString(data.name.substr(0,31), o);
22319 return o;
22320 }
22321
22322 /* [MS-XLSB] 2.4.807 BrtWbProp */
22323 function parse_BrtWbProp(data, length) {
22324 data.read_shift(4);
22325 var dwThemeVersion = data.read_shift(4);
22326 var strName = (length > 8) ? parse_XLWideString(data) : "";
22327 return [dwThemeVersion, strName];
22328 }
22329 function write_BrtWbProp(data, o) {
22330 if(!o) o = new_buf(8);
22331 o.write_shift(4, 0);
22332 o.write_shift(4, 0);
22333 return o;
22334 }
22335
22336 function parse_BrtFRTArchID$(data, length) {
22337 var o = {};
22338 data.read_shift(4);
22339 o.ArchID = data.read_shift(4);
22340 data.l += length - 8;
22341 return o;
22342 }
22343
22344 /* [MS-XLSB] 2.1.7.60 Workbook */
22345 function parse_wb_bin(data, opts) {
22346 var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
22347 var pass = false, z;
22348
22349 recordhopper(data, function hopper_wb(val, R) {
22350 switch(R.n) {
22351 case 'BrtBundleSh': wb.Sheets.push(val); break;
22352
22353 case 'BrtBeginBook': break;
22354 case 'BrtFileVersion': break;
22355 case 'BrtWbProp': break;
22356 case 'BrtACBegin': break;
22357 case 'BrtAbsPath15': break;
22358 case 'BrtACEnd': break;
22359 case 'BrtWbFactoid': break;
22360 /*case 'BrtBookProtectionIso': break;*/
22361 case 'BrtBookProtection': break;
22362 case 'BrtBeginBookViews': break;
22363 case 'BrtBookView': break;
22364 case 'BrtEndBookViews': break;
22365 case 'BrtBeginBundleShs': break;
22366 case 'BrtEndBundleShs': break;
22367 case 'BrtBeginFnGroup': break;
22368 case 'BrtEndFnGroup': break;
22369 case 'BrtBeginExternals': break;
22370 case 'BrtSupSelf': break;
22371 case 'BrtSupBookSrc': break;
22372 case 'BrtExternSheet': break;
22373 case 'BrtEndExternals': break;
22374 case 'BrtName': break;
22375 case 'BrtCalcProp': break;
22376 case 'BrtUserBookView': break;
22377 case 'BrtBeginPivotCacheIDs': break;
22378 case 'BrtBeginPivotCacheID': break;
22379 case 'BrtEndPivotCacheID': break;
22380 case 'BrtEndPivotCacheIDs': break;
22381 case 'BrtWebOpt': break;
22382 case 'BrtFileRecover': break;
22383 case 'BrtFileSharing': break;
22384 /*case 'BrtBeginWebPubItems': break;
22385 case 'BrtBeginWebPubItem': break;
22386 case 'BrtEndWebPubItem': break;
22387 case 'BrtEndWebPubItems': break;*/
22388
22389 /* Smart Tags */
22390 case 'BrtBeginSmartTagTypes': break;
22391 case 'BrtSmartTagType': break;
22392 case 'BrtEndSmartTagTypes': break;
22393
22394 case 'BrtFRTBegin': pass = true; break;
22395 case 'BrtFRTArchID$': break;
22396 case 'BrtWorkBookPr15': break;
22397 case 'BrtFRTEnd': pass = false; break;
22398 case 'BrtEndBook': break;
22399 default: if(!pass || opts.WTF) throw new Error("Unexpected record " + R.n);
22400 }
22401 });
22402
22403 parse_wb_defaults(wb);
22404
22405 return wb;
22406 }
22407
22408 /* [MS-XLSB] 2.1.7.60 Workbook */
22409 function write_BUNDLESHS(ba, wb, opts) {
22410 write_record(ba, "BrtBeginBundleShs");
22411 for(var idx = 0; idx != wb.SheetNames.length; ++idx) {
22412 var d = { hsState: 0, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };
22413 write_record(ba, "BrtBundleSh", write_BrtBundleSh(d));
22414 }
22415 write_record(ba, "BrtEndBundleShs");
22416 }
22417
22418 /* [MS-XLSB] 2.4.643 BrtFileVersion */
22419 function write_BrtFileVersion(data, o) {
22420 if(!o) o = new_buf(127);
22421 for(var i = 0; i != 4; ++i) o.write_shift(4, 0);
22422 write_XLWideString("SheetJS", o);
22423 write_XLWideString(XLSX.version, o);
22424 write_XLWideString(XLSX.version, o);
22425 write_XLWideString("7262", o);
22426 o.length = o.l;
22427 return o;
22428 }
22429
22430 /* [MS-XLSB] 2.1.7.60 Workbook */
22431 function write_BOOKVIEWS(ba, wb, opts) {
22432 write_record(ba, "BrtBeginBookViews");
22433 /* 1*(BrtBookView *FRT) */
22434 write_record(ba, "BrtEndBookViews");
22435 }
22436
22437 /* [MS-XLSB] 2.4.302 BrtCalcProp */
22438 function write_BrtCalcProp(data, o) {
22439 if(!o) o = new_buf(26);
22440 o.write_shift(4,0); /* force recalc */
22441 o.write_shift(4,1);
22442 o.write_shift(4,0);
22443 write_Xnum(0, o);
22444 o.write_shift(-4, 1023);
22445 o.write_shift(1, 0x33);
22446 o.write_shift(1, 0x00);
22447 return o;
22448 }
22449
22450 function write_BrtFileRecover(data, o) {
22451 if(!o) o = new_buf(1);
22452 o.write_shift(1,0);
22453 return o;
22454 }
22455
22456 /* [MS-XLSB] 2.1.7.60 Workbook */
22457 function write_wb_bin(wb, opts) {
22458 var ba = buf_array();
22459 write_record(ba, "BrtBeginBook");
22460 write_record(ba, "BrtFileVersion", write_BrtFileVersion());
22461 /* [[BrtFileSharingIso] BrtFileSharing] */
22462 write_record(ba, "BrtWbProp", write_BrtWbProp());
22463 /* [ACABSPATH] */
22464 /* [[BrtBookProtectionIso] BrtBookProtection] */
22465 write_BOOKVIEWS(ba, wb, opts);
22466 write_BUNDLESHS(ba, wb, opts);
22467 /* [FNGROUP] */
22468 /* [EXTERNALS] */
22469 /* *BrtName */
22470 write_record(ba, "BrtCalcProp", write_BrtCalcProp());
22471 /* [BrtOleSize] */
22472 /* *(BrtUserBookView *FRT) */
22473 /* [PIVOTCACHEIDS] */
22474 /* [BrtWbFactoid] */
22475 /* [SMARTTAGTYPES] */
22476 /* [BrtWebOpt] */
22477 write_record(ba, "BrtFileRecover", write_BrtFileRecover());
22478 /* [WEBPUBITEMS] */
22479 /* [CRERRS] */
22480 /* FRTWORKBOOK */
22481 write_record(ba, "BrtEndBook");
22482
22483 return ba.end();
22484 }
22485 function parse_wb(data, name, opts) {
22486 return (name.substr(-4)===".bin" ? parse_wb_bin : parse_wb_xml)(data, opts);
22487 }
22488
22489 function parse_ws(data, name, opts, rels) {
22490 return (name.substr(-4)===".bin" ? parse_ws_bin : parse_ws_xml)(data, opts, rels);
22491 }
22492
22493 function parse_sty(data, name, opts) {
22494 return (name.substr(-4)===".bin" ? parse_sty_bin : parse_sty_xml)(data, opts);
22495 }
22496
22497 function parse_theme(data, name, opts) {
22498 return parse_theme_xml(data, opts);
22499 }
22500
22501 function parse_sst(data, name, opts) {
22502 return (name.substr(-4)===".bin" ? parse_sst_bin : parse_sst_xml)(data, opts);
22503 }
22504
22505 function parse_cmnt(data, name, opts) {
22506 return (name.substr(-4)===".bin" ? parse_comments_bin : parse_comments_xml)(data, opts);
22507 }
22508
22509 function parse_cc(data, name, opts) {
22510 return (name.substr(-4)===".bin" ? parse_cc_bin : parse_cc_xml)(data, opts);
22511 }
22512
22513 function write_wb(wb, name, opts) {
22514 return (name.substr(-4)===".bin" ? write_wb_bin : write_wb_xml)(wb, opts);
22515 }
22516
22517 function write_ws(data, name, opts, wb) {
22518 return (name.substr(-4)===".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb);
22519 }
22520
22521 function write_sty(data, name, opts) {
22522 return (name.substr(-4)===".bin" ? write_sty_bin : write_sty_xml)(data, opts);
22523 }
22524
22525 function write_sst(data, name, opts) {
22526 return (name.substr(-4)===".bin" ? write_sst_bin : write_sst_xml)(data, opts);
22527 }
19023 /* 22528 /*
19024 * Compression methods 22529 function write_cmnt(data, name, opts) {
19025 * This object is filled in as follow : 22530 return (name.substr(-4)===".bin" ? write_comments_bin : write_comments_xml)(data, opts);
19026 * name : { 22531 }
19027 * magic // the 2 bytes indentifying the compression method 22532
19028 * compress // function, take the uncompressed content and return it compressed. 22533 function write_cc(data, name, opts) {
19029 * uncompress // function, take the compressed content and return it uncompressed. 22534 return (name.substr(-4)===".bin" ? write_cc_bin : write_cc_xml)(data, opts);
19030 * } 22535 }
19031 * 22536 */
19032 * STORE is the default compression method, so it's included in this file. 22537 /* [MS-XLSB] 2.3 Record Enumeration */
19033 * Other methods should go to separated files : the user wants modularity. 22538 var RecordEnum = {
19034 */ 22539 0x0000: { n:"BrtRowHdr", f:parse_BrtRowHdr },
19035 JSZip.compressions = { 22540 0x0001: { n:"BrtCellBlank", f:parse_BrtCellBlank },
19036 "STORE" : { 22541 0x0002: { n:"BrtCellRk", f:parse_BrtCellRk },
19037 magic : "\x00\x00", 22542 0x0003: { n:"BrtCellError", f:parse_BrtCellError },
19038 compress : function (content) { 22543 0x0004: { n:"BrtCellBool", f:parse_BrtCellBool },
19039 return content; // no compression 22544 0x0005: { n:"BrtCellReal", f:parse_BrtCellReal },
19040 }, 22545 0x0006: { n:"BrtCellSt", f:parse_BrtCellSt },
19041 uncompress : function (content) { 22546 0x0007: { n:"BrtCellIsst", f:parse_BrtCellIsst },
19042 return content; // no compression 22547 0x0008: { n:"BrtFmlaString", f:parse_BrtFmlaString },
19043 } 22548 0x0009: { n:"BrtFmlaNum", f:parse_BrtFmlaNum },
19044 } 22549 0x000A: { n:"BrtFmlaBool", f:parse_BrtFmlaBool },
22550 0x000B: { n:"BrtFmlaError", f:parse_BrtFmlaError },
22551 0x0010: { n:"BrtFRTArchID$", f:parse_BrtFRTArchID$ },
22552 0x0013: { n:"BrtSSTItem", f:parse_RichStr },
22553 0x0014: { n:"BrtPCDIMissing", f:parsenoop },
22554 0x0015: { n:"BrtPCDINumber", f:parsenoop },
22555 0x0016: { n:"BrtPCDIBoolean", f:parsenoop },
22556 0x0017: { n:"BrtPCDIError", f:parsenoop },
22557 0x0018: { n:"BrtPCDIString", f:parsenoop },
22558 0x0019: { n:"BrtPCDIDatetime", f:parsenoop },
22559 0x001A: { n:"BrtPCDIIndex", f:parsenoop },
22560 0x001B: { n:"BrtPCDIAMissing", f:parsenoop },
22561 0x001C: { n:"BrtPCDIANumber", f:parsenoop },
22562 0x001D: { n:"BrtPCDIABoolean", f:parsenoop },
22563 0x001E: { n:"BrtPCDIAError", f:parsenoop },
22564 0x001F: { n:"BrtPCDIAString", f:parsenoop },
22565 0x0020: { n:"BrtPCDIADatetime", f:parsenoop },
22566 0x0021: { n:"BrtPCRRecord", f:parsenoop },
22567 0x0022: { n:"BrtPCRRecordDt", f:parsenoop },
22568 0x0023: { n:"BrtFRTBegin", f:parsenoop },
22569 0x0024: { n:"BrtFRTEnd", f:parsenoop },
22570 0x0025: { n:"BrtACBegin", f:parsenoop },
22571 0x0026: { n:"BrtACEnd", f:parsenoop },
22572 0x0027: { n:"BrtName", f:parsenoop },
22573 0x0028: { n:"BrtIndexRowBlock", f:parsenoop },
22574 0x002A: { n:"BrtIndexBlock", f:parsenoop },
22575 0x002B: { n:"BrtFont", f:parse_BrtFont },
22576 0x002C: { n:"BrtFmt", f:parse_BrtFmt },
22577 0x002D: { n:"BrtFill", f:parsenoop },
22578 0x002E: { n:"BrtBorder", f:parsenoop },
22579 0x002F: { n:"BrtXF", f:parse_BrtXF },
22580 0x0030: { n:"BrtStyle", f:parsenoop },
22581 0x0031: { n:"BrtCellMeta", f:parsenoop },
22582 0x0032: { n:"BrtValueMeta", f:parsenoop },
22583 0x0033: { n:"BrtMdb", f:parsenoop },
22584 0x0034: { n:"BrtBeginFmd", f:parsenoop },
22585 0x0035: { n:"BrtEndFmd", f:parsenoop },
22586 0x0036: { n:"BrtBeginMdx", f:parsenoop },
22587 0x0037: { n:"BrtEndMdx", f:parsenoop },
22588 0x0038: { n:"BrtBeginMdxTuple", f:parsenoop },
22589 0x0039: { n:"BrtEndMdxTuple", f:parsenoop },
22590 0x003A: { n:"BrtMdxMbrIstr", f:parsenoop },
22591 0x003B: { n:"BrtStr", f:parsenoop },
22592 0x003C: { n:"BrtColInfo", f:parsenoop },
22593 0x003E: { n:"BrtCellRString", f:parsenoop },
22594 0x003F: { n:"BrtCalcChainItem$", f:parse_BrtCalcChainItem$ },
22595 0x0040: { n:"BrtDVal", f:parsenoop },
22596 0x0041: { n:"BrtSxvcellNum", f:parsenoop },
22597 0x0042: { n:"BrtSxvcellStr", f:parsenoop },
22598 0x0043: { n:"BrtSxvcellBool", f:parsenoop },
22599 0x0044: { n:"BrtSxvcellErr", f:parsenoop },
22600 0x0045: { n:"BrtSxvcellDate", f:parsenoop },
22601 0x0046: { n:"BrtSxvcellNil", f:parsenoop },
22602 0x0080: { n:"BrtFileVersion", f:parsenoop },
22603 0x0081: { n:"BrtBeginSheet", f:parsenoop },
22604 0x0082: { n:"BrtEndSheet", f:parsenoop },
22605 0x0083: { n:"BrtBeginBook", f:parsenoop, p:0 },
22606 0x0084: { n:"BrtEndBook", f:parsenoop },
22607 0x0085: { n:"BrtBeginWsViews", f:parsenoop },
22608 0x0086: { n:"BrtEndWsViews", f:parsenoop },
22609 0x0087: { n:"BrtBeginBookViews", f:parsenoop },
22610 0x0088: { n:"BrtEndBookViews", f:parsenoop },
22611 0x0089: { n:"BrtBeginWsView", f:parsenoop },
22612 0x008A: { n:"BrtEndWsView", f:parsenoop },
22613 0x008B: { n:"BrtBeginCsViews", f:parsenoop },
22614 0x008C: { n:"BrtEndCsViews", f:parsenoop },
22615 0x008D: { n:"BrtBeginCsView", f:parsenoop },
22616 0x008E: { n:"BrtEndCsView", f:parsenoop },
22617 0x008F: { n:"BrtBeginBundleShs", f:parsenoop },
22618 0x0090: { n:"BrtEndBundleShs", f:parsenoop },
22619 0x0091: { n:"BrtBeginSheetData", f:parsenoop },
22620 0x0092: { n:"BrtEndSheetData", f:parsenoop },
22621 0x0093: { n:"BrtWsProp", f:parse_BrtWsProp },
22622 0x0094: { n:"BrtWsDim", f:parse_BrtWsDim, p:16 },
22623 0x0097: { n:"BrtPane", f:parsenoop },
22624 0x0098: { n:"BrtSel", f:parsenoop },
22625 0x0099: { n:"BrtWbProp", f:parse_BrtWbProp },
22626 0x009A: { n:"BrtWbFactoid", f:parsenoop },
22627 0x009B: { n:"BrtFileRecover", f:parsenoop },
22628 0x009C: { n:"BrtBundleSh", f:parse_BrtBundleSh },
22629 0x009D: { n:"BrtCalcProp", f:parsenoop },
22630 0x009E: { n:"BrtBookView", f:parsenoop },
22631 0x009F: { n:"BrtBeginSst", f:parse_BrtBeginSst },
22632 0x00A0: { n:"BrtEndSst", f:parsenoop },
22633 0x00A1: { n:"BrtBeginAFilter", f:parsenoop },
22634 0x00A2: { n:"BrtEndAFilter", f:parsenoop },
22635 0x00A3: { n:"BrtBeginFilterColumn", f:parsenoop },
22636 0x00A4: { n:"BrtEndFilterColumn", f:parsenoop },
22637 0x00A5: { n:"BrtBeginFilters", f:parsenoop },
22638 0x00A6: { n:"BrtEndFilters", f:parsenoop },
22639 0x00A7: { n:"BrtFilter", f:parsenoop },
22640 0x00A8: { n:"BrtColorFilter", f:parsenoop },
22641 0x00A9: { n:"BrtIconFilter", f:parsenoop },
22642 0x00AA: { n:"BrtTop10Filter", f:parsenoop },
22643 0x00AB: { n:"BrtDynamicFilter", f:parsenoop },
22644 0x00AC: { n:"BrtBeginCustomFilters", f:parsenoop },
22645 0x00AD: { n:"BrtEndCustomFilters", f:parsenoop },
22646 0x00AE: { n:"BrtCustomFilter", f:parsenoop },
22647 0x00AF: { n:"BrtAFilterDateGroupItem", f:parsenoop },
22648 0x00B0: { n:"BrtMergeCell", f:parse_BrtMergeCell },
22649 0x00B1: { n:"BrtBeginMergeCells", f:parsenoop },
22650 0x00B2: { n:"BrtEndMergeCells", f:parsenoop },
22651 0x00B3: { n:"BrtBeginPivotCacheDef", f:parsenoop },
22652 0x00B4: { n:"BrtEndPivotCacheDef", f:parsenoop },
22653 0x00B5: { n:"BrtBeginPCDFields", f:parsenoop },
22654 0x00B6: { n:"BrtEndPCDFields", f:parsenoop },
22655 0x00B7: { n:"BrtBeginPCDField", f:parsenoop },
22656 0x00B8: { n:"BrtEndPCDField", f:parsenoop },
22657 0x00B9: { n:"BrtBeginPCDSource", f:parsenoop },
22658 0x00BA: { n:"BrtEndPCDSource", f:parsenoop },
22659 0x00BB: { n:"BrtBeginPCDSRange", f:parsenoop },
22660 0x00BC: { n:"BrtEndPCDSRange", f:parsenoop },
22661 0x00BD: { n:"BrtBeginPCDFAtbl", f:parsenoop },
22662 0x00BE: { n:"BrtEndPCDFAtbl", f:parsenoop },
22663 0x00BF: { n:"BrtBeginPCDIRun", f:parsenoop },
22664 0x00C0: { n:"BrtEndPCDIRun", f:parsenoop },
22665 0x00C1: { n:"BrtBeginPivotCacheRecords", f:parsenoop },
22666 0x00C2: { n:"BrtEndPivotCacheRecords", f:parsenoop },
22667 0x00C3: { n:"BrtBeginPCDHierarchies", f:parsenoop },
22668 0x00C4: { n:"BrtEndPCDHierarchies", f:parsenoop },
22669 0x00C5: { n:"BrtBeginPCDHierarchy", f:parsenoop },
22670 0x00C6: { n:"BrtEndPCDHierarchy", f:parsenoop },
22671 0x00C7: { n:"BrtBeginPCDHFieldsUsage", f:parsenoop },
22672 0x00C8: { n:"BrtEndPCDHFieldsUsage", f:parsenoop },
22673 0x00C9: { n:"BrtBeginExtConnection", f:parsenoop },
22674 0x00CA: { n:"BrtEndExtConnection", f:parsenoop },
22675 0x00CB: { n:"BrtBeginECDbProps", f:parsenoop },
22676 0x00CC: { n:"BrtEndECDbProps", f:parsenoop },
22677 0x00CD: { n:"BrtBeginECOlapProps", f:parsenoop },
22678 0x00CE: { n:"BrtEndECOlapProps", f:parsenoop },
22679 0x00CF: { n:"BrtBeginPCDSConsol", f:parsenoop },
22680 0x00D0: { n:"BrtEndPCDSConsol", f:parsenoop },
22681 0x00D1: { n:"BrtBeginPCDSCPages", f:parsenoop },
22682 0x00D2: { n:"BrtEndPCDSCPages", f:parsenoop },
22683 0x00D3: { n:"BrtBeginPCDSCPage", f:parsenoop },
22684 0x00D4: { n:"BrtEndPCDSCPage", f:parsenoop },
22685 0x00D5: { n:"BrtBeginPCDSCPItem", f:parsenoop },
22686 0x00D6: { n:"BrtEndPCDSCPItem", f:parsenoop },
22687 0x00D7: { n:"BrtBeginPCDSCSets", f:parsenoop },
22688 0x00D8: { n:"BrtEndPCDSCSets", f:parsenoop },
22689 0x00D9: { n:"BrtBeginPCDSCSet", f:parsenoop },
22690 0x00DA: { n:"BrtEndPCDSCSet", f:parsenoop },
22691 0x00DB: { n:"BrtBeginPCDFGroup", f:parsenoop },
22692 0x00DC: { n:"BrtEndPCDFGroup", f:parsenoop },
22693 0x00DD: { n:"BrtBeginPCDFGItems", f:parsenoop },
22694 0x00DE: { n:"BrtEndPCDFGItems", f:parsenoop },
22695 0x00DF: { n:"BrtBeginPCDFGRange", f:parsenoop },
22696 0x00E0: { n:"BrtEndPCDFGRange", f:parsenoop },
22697 0x00E1: { n:"BrtBeginPCDFGDiscrete", f:parsenoop },
22698 0x00E2: { n:"BrtEndPCDFGDiscrete", f:parsenoop },
22699 0x00E3: { n:"BrtBeginPCDSDTupleCache", f:parsenoop },
22700 0x00E4: { n:"BrtEndPCDSDTupleCache", f:parsenoop },
22701 0x00E5: { n:"BrtBeginPCDSDTCEntries", f:parsenoop },
22702 0x00E6: { n:"BrtEndPCDSDTCEntries", f:parsenoop },
22703 0x00E7: { n:"BrtBeginPCDSDTCEMembers", f:parsenoop },
22704 0x00E8: { n:"BrtEndPCDSDTCEMembers", f:parsenoop },
22705 0x00E9: { n:"BrtBeginPCDSDTCEMember", f:parsenoop },
22706 0x00EA: { n:"BrtEndPCDSDTCEMember", f:parsenoop },
22707 0x00EB: { n:"BrtBeginPCDSDTCQueries", f:parsenoop },
22708 0x00EC: { n:"BrtEndPCDSDTCQueries", f:parsenoop },
22709 0x00ED: { n:"BrtBeginPCDSDTCQuery", f:parsenoop },
22710 0x00EE: { n:"BrtEndPCDSDTCQuery", f:parsenoop },
22711 0x00EF: { n:"BrtBeginPCDSDTCSets", f:parsenoop },
22712 0x00F0: { n:"BrtEndPCDSDTCSets", f:parsenoop },
22713 0x00F1: { n:"BrtBeginPCDSDTCSet", f:parsenoop },
22714 0x00F2: { n:"BrtEndPCDSDTCSet", f:parsenoop },
22715 0x00F3: { n:"BrtBeginPCDCalcItems", f:parsenoop },
22716 0x00F4: { n:"BrtEndPCDCalcItems", f:parsenoop },
22717 0x00F5: { n:"BrtBeginPCDCalcItem", f:parsenoop },
22718 0x00F6: { n:"BrtEndPCDCalcItem", f:parsenoop },
22719 0x00F7: { n:"BrtBeginPRule", f:parsenoop },
22720 0x00F8: { n:"BrtEndPRule", f:parsenoop },
22721 0x00F9: { n:"BrtBeginPRFilters", f:parsenoop },
22722 0x00FA: { n:"BrtEndPRFilters", f:parsenoop },
22723 0x00FB: { n:"BrtBeginPRFilter", f:parsenoop },
22724 0x00FC: { n:"BrtEndPRFilter", f:parsenoop },
22725 0x00FD: { n:"BrtBeginPNames", f:parsenoop },
22726 0x00FE: { n:"BrtEndPNames", f:parsenoop },
22727 0x00FF: { n:"BrtBeginPName", f:parsenoop },
22728 0x0100: { n:"BrtEndPName", f:parsenoop },
22729 0x0101: { n:"BrtBeginPNPairs", f:parsenoop },
22730 0x0102: { n:"BrtEndPNPairs", f:parsenoop },
22731 0x0103: { n:"BrtBeginPNPair", f:parsenoop },
22732 0x0104: { n:"BrtEndPNPair", f:parsenoop },
22733 0x0105: { n:"BrtBeginECWebProps", f:parsenoop },
22734 0x0106: { n:"BrtEndECWebProps", f:parsenoop },
22735 0x0107: { n:"BrtBeginEcWpTables", f:parsenoop },
22736 0x0108: { n:"BrtEndECWPTables", f:parsenoop },
22737 0x0109: { n:"BrtBeginECParams", f:parsenoop },
22738 0x010A: { n:"BrtEndECParams", f:parsenoop },
22739 0x010B: { n:"BrtBeginECParam", f:parsenoop },
22740 0x010C: { n:"BrtEndECParam", f:parsenoop },
22741 0x010D: { n:"BrtBeginPCDKPIs", f:parsenoop },
22742 0x010E: { n:"BrtEndPCDKPIs", f:parsenoop },
22743 0x010F: { n:"BrtBeginPCDKPI", f:parsenoop },
22744 0x0110: { n:"BrtEndPCDKPI", f:parsenoop },
22745 0x0111: { n:"BrtBeginDims", f:parsenoop },
22746 0x0112: { n:"BrtEndDims", f:parsenoop },
22747 0x0113: { n:"BrtBeginDim", f:parsenoop },
22748 0x0114: { n:"BrtEndDim", f:parsenoop },
22749 0x0115: { n:"BrtIndexPartEnd", f:parsenoop },
22750 0x0116: { n:"BrtBeginStyleSheet", f:parsenoop },
22751 0x0117: { n:"BrtEndStyleSheet", f:parsenoop },
22752 0x0118: { n:"BrtBeginSXView", f:parsenoop },
22753 0x0119: { n:"BrtEndSXVI", f:parsenoop },
22754 0x011A: { n:"BrtBeginSXVI", f:parsenoop },
22755 0x011B: { n:"BrtBeginSXVIs", f:parsenoop },
22756 0x011C: { n:"BrtEndSXVIs", f:parsenoop },
22757 0x011D: { n:"BrtBeginSXVD", f:parsenoop },
22758 0x011E: { n:"BrtEndSXVD", f:parsenoop },
22759 0x011F: { n:"BrtBeginSXVDs", f:parsenoop },
22760 0x0120: { n:"BrtEndSXVDs", f:parsenoop },
22761 0x0121: { n:"BrtBeginSXPI", f:parsenoop },
22762 0x0122: { n:"BrtEndSXPI", f:parsenoop },
22763 0x0123: { n:"BrtBeginSXPIs", f:parsenoop },
22764 0x0124: { n:"BrtEndSXPIs", f:parsenoop },
22765 0x0125: { n:"BrtBeginSXDI", f:parsenoop },
22766 0x0126: { n:"BrtEndSXDI", f:parsenoop },
22767 0x0127: { n:"BrtBeginSXDIs", f:parsenoop },
22768 0x0128: { n:"BrtEndSXDIs", f:parsenoop },
22769 0x0129: { n:"BrtBeginSXLI", f:parsenoop },
22770 0x012A: { n:"BrtEndSXLI", f:parsenoop },
22771 0x012B: { n:"BrtBeginSXLIRws", f:parsenoop },
22772 0x012C: { n:"BrtEndSXLIRws", f:parsenoop },
22773 0x012D: { n:"BrtBeginSXLICols", f:parsenoop },
22774 0x012E: { n:"BrtEndSXLICols", f:parsenoop },
22775 0x012F: { n:"BrtBeginSXFormat", f:parsenoop },
22776 0x0130: { n:"BrtEndSXFormat", f:parsenoop },
22777 0x0131: { n:"BrtBeginSXFormats", f:parsenoop },
22778 0x0132: { n:"BrtEndSxFormats", f:parsenoop },
22779 0x0133: { n:"BrtBeginSxSelect", f:parsenoop },
22780 0x0134: { n:"BrtEndSxSelect", f:parsenoop },
22781 0x0135: { n:"BrtBeginISXVDRws", f:parsenoop },
22782 0x0136: { n:"BrtEndISXVDRws", f:parsenoop },
22783 0x0137: { n:"BrtBeginISXVDCols", f:parsenoop },
22784 0x0138: { n:"BrtEndISXVDCols", f:parsenoop },
22785 0x0139: { n:"BrtEndSXLocation", f:parsenoop },
22786 0x013A: { n:"BrtBeginSXLocation", f:parsenoop },
22787 0x013B: { n:"BrtEndSXView", f:parsenoop },
22788 0x013C: { n:"BrtBeginSXTHs", f:parsenoop },
22789 0x013D: { n:"BrtEndSXTHs", f:parsenoop },
22790 0x013E: { n:"BrtBeginSXTH", f:parsenoop },
22791 0x013F: { n:"BrtEndSXTH", f:parsenoop },
22792 0x0140: { n:"BrtBeginISXTHRws", f:parsenoop },
22793 0x0141: { n:"BrtEndISXTHRws", f:parsenoop },
22794 0x0142: { n:"BrtBeginISXTHCols", f:parsenoop },
22795 0x0143: { n:"BrtEndISXTHCols", f:parsenoop },
22796 0x0144: { n:"BrtBeginSXTDMPS", f:parsenoop },
22797 0x0145: { n:"BrtEndSXTDMPs", f:parsenoop },
22798 0x0146: { n:"BrtBeginSXTDMP", f:parsenoop },
22799 0x0147: { n:"BrtEndSXTDMP", f:parsenoop },
22800 0x0148: { n:"BrtBeginSXTHItems", f:parsenoop },
22801 0x0149: { n:"BrtEndSXTHItems", f:parsenoop },
22802 0x014A: { n:"BrtBeginSXTHItem", f:parsenoop },
22803 0x014B: { n:"BrtEndSXTHItem", f:parsenoop },
22804 0x014C: { n:"BrtBeginMetadata", f:parsenoop },
22805 0x014D: { n:"BrtEndMetadata", f:parsenoop },
22806 0x014E: { n:"BrtBeginEsmdtinfo", f:parsenoop },
22807 0x014F: { n:"BrtMdtinfo", f:parsenoop },
22808 0x0150: { n:"BrtEndEsmdtinfo", f:parsenoop },
22809 0x0151: { n:"BrtBeginEsmdb", f:parsenoop },
22810 0x0152: { n:"BrtEndEsmdb", f:parsenoop },
22811 0x0153: { n:"BrtBeginEsfmd", f:parsenoop },
22812 0x0154: { n:"BrtEndEsfmd", f:parsenoop },
22813 0x0155: { n:"BrtBeginSingleCells", f:parsenoop },
22814 0x0156: { n:"BrtEndSingleCells", f:parsenoop },
22815 0x0157: { n:"BrtBeginList", f:parsenoop },
22816 0x0158: { n:"BrtEndList", f:parsenoop },
22817 0x0159: { n:"BrtBeginListCols", f:parsenoop },
22818 0x015A: { n:"BrtEndListCols", f:parsenoop },
22819 0x015B: { n:"BrtBeginListCol", f:parsenoop },
22820 0x015C: { n:"BrtEndListCol", f:parsenoop },
22821 0x015D: { n:"BrtBeginListXmlCPr", f:parsenoop },
22822 0x015E: { n:"BrtEndListXmlCPr", f:parsenoop },
22823 0x015F: { n:"BrtListCCFmla", f:parsenoop },
22824 0x0160: { n:"BrtListTrFmla", f:parsenoop },
22825 0x0161: { n:"BrtBeginExternals", f:parsenoop },
22826 0x0162: { n:"BrtEndExternals", f:parsenoop },
22827 0x0163: { n:"BrtSupBookSrc", f:parsenoop },
22828 0x0165: { n:"BrtSupSelf", f:parsenoop },
22829 0x0166: { n:"BrtSupSame", f:parsenoop },
22830 0x0167: { n:"BrtSupTabs", f:parsenoop },
22831 0x0168: { n:"BrtBeginSupBook", f:parsenoop },
22832 0x0169: { n:"BrtPlaceholderName", f:parsenoop },
22833 0x016A: { n:"BrtExternSheet", f:parsenoop },
22834 0x016B: { n:"BrtExternTableStart", f:parsenoop },
22835 0x016C: { n:"BrtExternTableEnd", f:parsenoop },
22836 0x016E: { n:"BrtExternRowHdr", f:parsenoop },
22837 0x016F: { n:"BrtExternCellBlank", f:parsenoop },
22838 0x0170: { n:"BrtExternCellReal", f:parsenoop },
22839 0x0171: { n:"BrtExternCellBool", f:parsenoop },
22840 0x0172: { n:"BrtExternCellError", f:parsenoop },
22841 0x0173: { n:"BrtExternCellString", f:parsenoop },
22842 0x0174: { n:"BrtBeginEsmdx", f:parsenoop },
22843 0x0175: { n:"BrtEndEsmdx", f:parsenoop },
22844 0x0176: { n:"BrtBeginMdxSet", f:parsenoop },
22845 0x0177: { n:"BrtEndMdxSet", f:parsenoop },
22846 0x0178: { n:"BrtBeginMdxMbrProp", f:parsenoop },
22847 0x0179: { n:"BrtEndMdxMbrProp", f:parsenoop },
22848 0x017A: { n:"BrtBeginMdxKPI", f:parsenoop },
22849 0x017B: { n:"BrtEndMdxKPI", f:parsenoop },
22850 0x017C: { n:"BrtBeginEsstr", f:parsenoop },
22851 0x017D: { n:"BrtEndEsstr", f:parsenoop },
22852 0x017E: { n:"BrtBeginPRFItem", f:parsenoop },
22853 0x017F: { n:"BrtEndPRFItem", f:parsenoop },
22854 0x0180: { n:"BrtBeginPivotCacheIDs", f:parsenoop },
22855 0x0181: { n:"BrtEndPivotCacheIDs", f:parsenoop },
22856 0x0182: { n:"BrtBeginPivotCacheID", f:parsenoop },
22857 0x0183: { n:"BrtEndPivotCacheID", f:parsenoop },
22858 0x0184: { n:"BrtBeginISXVIs", f:parsenoop },
22859 0x0185: { n:"BrtEndISXVIs", f:parsenoop },
22860 0x0186: { n:"BrtBeginColInfos", f:parsenoop },
22861 0x0187: { n:"BrtEndColInfos", f:parsenoop },
22862 0x0188: { n:"BrtBeginRwBrk", f:parsenoop },
22863 0x0189: { n:"BrtEndRwBrk", f:parsenoop },
22864 0x018A: { n:"BrtBeginColBrk", f:parsenoop },
22865 0x018B: { n:"BrtEndColBrk", f:parsenoop },
22866 0x018C: { n:"BrtBrk", f:parsenoop },
22867 0x018D: { n:"BrtUserBookView", f:parsenoop },
22868 0x018E: { n:"BrtInfo", f:parsenoop },
22869 0x018F: { n:"BrtCUsr", f:parsenoop },
22870 0x0190: { n:"BrtUsr", f:parsenoop },
22871 0x0191: { n:"BrtBeginUsers", f:parsenoop },
22872 0x0193: { n:"BrtEOF", f:parsenoop },
22873 0x0194: { n:"BrtUCR", f:parsenoop },
22874 0x0195: { n:"BrtRRInsDel", f:parsenoop },
22875 0x0196: { n:"BrtRREndInsDel", f:parsenoop },
22876 0x0197: { n:"BrtRRMove", f:parsenoop },
22877 0x0198: { n:"BrtRREndMove", f:parsenoop },
22878 0x0199: { n:"BrtRRChgCell", f:parsenoop },
22879 0x019A: { n:"BrtRREndChgCell", f:parsenoop },
22880 0x019B: { n:"BrtRRHeader", f:parsenoop },
22881 0x019C: { n:"BrtRRUserView", f:parsenoop },
22882 0x019D: { n:"BrtRRRenSheet", f:parsenoop },
22883 0x019E: { n:"BrtRRInsertSh", f:parsenoop },
22884 0x019F: { n:"BrtRRDefName", f:parsenoop },
22885 0x01A0: { n:"BrtRRNote", f:parsenoop },
22886 0x01A1: { n:"BrtRRConflict", f:parsenoop },
22887 0x01A2: { n:"BrtRRTQSIF", f:parsenoop },
22888 0x01A3: { n:"BrtRRFormat", f:parsenoop },
22889 0x01A4: { n:"BrtRREndFormat", f:parsenoop },
22890 0x01A5: { n:"BrtRRAutoFmt", f:parsenoop },
22891 0x01A6: { n:"BrtBeginUserShViews", f:parsenoop },
22892 0x01A7: { n:"BrtBeginUserShView", f:parsenoop },
22893 0x01A8: { n:"BrtEndUserShView", f:parsenoop },
22894 0x01A9: { n:"BrtEndUserShViews", f:parsenoop },
22895 0x01AA: { n:"BrtArrFmla", f:parsenoop },
22896 0x01AB: { n:"BrtShrFmla", f:parsenoop },
22897 0x01AC: { n:"BrtTable", f:parsenoop },
22898 0x01AD: { n:"BrtBeginExtConnections", f:parsenoop },
22899 0x01AE: { n:"BrtEndExtConnections", f:parsenoop },
22900 0x01AF: { n:"BrtBeginPCDCalcMems", f:parsenoop },
22901 0x01B0: { n:"BrtEndPCDCalcMems", f:parsenoop },
22902 0x01B1: { n:"BrtBeginPCDCalcMem", f:parsenoop },
22903 0x01B2: { n:"BrtEndPCDCalcMem", f:parsenoop },
22904 0x01B3: { n:"BrtBeginPCDHGLevels", f:parsenoop },
22905 0x01B4: { n:"BrtEndPCDHGLevels", f:parsenoop },
22906 0x01B5: { n:"BrtBeginPCDHGLevel", f:parsenoop },
22907 0x01B6: { n:"BrtEndPCDHGLevel", f:parsenoop },
22908 0x01B7: { n:"BrtBeginPCDHGLGroups", f:parsenoop },
22909 0x01B8: { n:"BrtEndPCDHGLGroups", f:parsenoop },
22910 0x01B9: { n:"BrtBeginPCDHGLGroup", f:parsenoop },
22911 0x01BA: { n:"BrtEndPCDHGLGroup", f:parsenoop },
22912 0x01BB: { n:"BrtBeginPCDHGLGMembers", f:parsenoop },
22913 0x01BC: { n:"BrtEndPCDHGLGMembers", f:parsenoop },
22914 0x01BD: { n:"BrtBeginPCDHGLGMember", f:parsenoop },
22915 0x01BE: { n:"BrtEndPCDHGLGMember", f:parsenoop },
22916 0x01BF: { n:"BrtBeginQSI", f:parsenoop },
22917 0x01C0: { n:"BrtEndQSI", f:parsenoop },
22918 0x01C1: { n:"BrtBeginQSIR", f:parsenoop },
22919 0x01C2: { n:"BrtEndQSIR", f:parsenoop },
22920 0x01C3: { n:"BrtBeginDeletedNames", f:parsenoop },
22921 0x01C4: { n:"BrtEndDeletedNames", f:parsenoop },
22922 0x01C5: { n:"BrtBeginDeletedName", f:parsenoop },
22923 0x01C6: { n:"BrtEndDeletedName", f:parsenoop },
22924 0x01C7: { n:"BrtBeginQSIFs", f:parsenoop },
22925 0x01C8: { n:"BrtEndQSIFs", f:parsenoop },
22926 0x01C9: { n:"BrtBeginQSIF", f:parsenoop },
22927 0x01CA: { n:"BrtEndQSIF", f:parsenoop },
22928 0x01CB: { n:"BrtBeginAutoSortScope", f:parsenoop },
22929 0x01CC: { n:"BrtEndAutoSortScope", f:parsenoop },
22930 0x01CD: { n:"BrtBeginConditionalFormatting", f:parsenoop },
22931 0x01CE: { n:"BrtEndConditionalFormatting", f:parsenoop },
22932 0x01CF: { n:"BrtBeginCFRule", f:parsenoop },
22933 0x01D0: { n:"BrtEndCFRule", f:parsenoop },
22934 0x01D1: { n:"BrtBeginIconSet", f:parsenoop },
22935 0x01D2: { n:"BrtEndIconSet", f:parsenoop },
22936 0x01D3: { n:"BrtBeginDatabar", f:parsenoop },
22937 0x01D4: { n:"BrtEndDatabar", f:parsenoop },
22938 0x01D5: { n:"BrtBeginColorScale", f:parsenoop },
22939 0x01D6: { n:"BrtEndColorScale", f:parsenoop },
22940 0x01D7: { n:"BrtCFVO", f:parsenoop },
22941 0x01D8: { n:"BrtExternValueMeta", f:parsenoop },
22942 0x01D9: { n:"BrtBeginColorPalette", f:parsenoop },
22943 0x01DA: { n:"BrtEndColorPalette", f:parsenoop },
22944 0x01DB: { n:"BrtIndexedColor", f:parsenoop },
22945 0x01DC: { n:"BrtMargins", f:parsenoop },
22946 0x01DD: { n:"BrtPrintOptions", f:parsenoop },
22947 0x01DE: { n:"BrtPageSetup", f:parsenoop },
22948 0x01DF: { n:"BrtBeginHeaderFooter", f:parsenoop },
22949 0x01E0: { n:"BrtEndHeaderFooter", f:parsenoop },
22950 0x01E1: { n:"BrtBeginSXCrtFormat", f:parsenoop },
22951 0x01E2: { n:"BrtEndSXCrtFormat", f:parsenoop },
22952 0x01E3: { n:"BrtBeginSXCrtFormats", f:parsenoop },
22953 0x01E4: { n:"BrtEndSXCrtFormats", f:parsenoop },
22954 0x01E5: { n:"BrtWsFmtInfo", f:parsenoop },
22955 0x01E6: { n:"BrtBeginMgs", f:parsenoop },
22956 0x01E7: { n:"BrtEndMGs", f:parsenoop },
22957 0x01E8: { n:"BrtBeginMGMaps", f:parsenoop },
22958 0x01E9: { n:"BrtEndMGMaps", f:parsenoop },
22959 0x01EA: { n:"BrtBeginMG", f:parsenoop },
22960 0x01EB: { n:"BrtEndMG", f:parsenoop },
22961 0x01EC: { n:"BrtBeginMap", f:parsenoop },
22962 0x01ED: { n:"BrtEndMap", f:parsenoop },
22963 0x01EE: { n:"BrtHLink", f:parse_BrtHLink },
22964 0x01EF: { n:"BrtBeginDCon", f:parsenoop },
22965 0x01F0: { n:"BrtEndDCon", f:parsenoop },
22966 0x01F1: { n:"BrtBeginDRefs", f:parsenoop },
22967 0x01F2: { n:"BrtEndDRefs", f:parsenoop },
22968 0x01F3: { n:"BrtDRef", f:parsenoop },
22969 0x01F4: { n:"BrtBeginScenMan", f:parsenoop },
22970 0x01F5: { n:"BrtEndScenMan", f:parsenoop },
22971 0x01F6: { n:"BrtBeginSct", f:parsenoop },
22972 0x01F7: { n:"BrtEndSct", f:parsenoop },
22973 0x01F8: { n:"BrtSlc", f:parsenoop },
22974 0x01F9: { n:"BrtBeginDXFs", f:parsenoop },
22975 0x01FA: { n:"BrtEndDXFs", f:parsenoop },
22976 0x01FB: { n:"BrtDXF", f:parsenoop },
22977 0x01FC: { n:"BrtBeginTableStyles", f:parsenoop },
22978 0x01FD: { n:"BrtEndTableStyles", f:parsenoop },
22979 0x01FE: { n:"BrtBeginTableStyle", f:parsenoop },
22980 0x01FF: { n:"BrtEndTableStyle", f:parsenoop },
22981 0x0200: { n:"BrtTableStyleElement", f:parsenoop },
22982 0x0201: { n:"BrtTableStyleClient", f:parsenoop },
22983 0x0202: { n:"BrtBeginVolDeps", f:parsenoop },
22984 0x0203: { n:"BrtEndVolDeps", f:parsenoop },
22985 0x0204: { n:"BrtBeginVolType", f:parsenoop },
22986 0x0205: { n:"BrtEndVolType", f:parsenoop },
22987 0x0206: { n:"BrtBeginVolMain", f:parsenoop },
22988 0x0207: { n:"BrtEndVolMain", f:parsenoop },
22989 0x0208: { n:"BrtBeginVolTopic", f:parsenoop },
22990 0x0209: { n:"BrtEndVolTopic", f:parsenoop },
22991 0x020A: { n:"BrtVolSubtopic", f:parsenoop },
22992 0x020B: { n:"BrtVolRef", f:parsenoop },
22993 0x020C: { n:"BrtVolNum", f:parsenoop },
22994 0x020D: { n:"BrtVolErr", f:parsenoop },
22995 0x020E: { n:"BrtVolStr", f:parsenoop },
22996 0x020F: { n:"BrtVolBool", f:parsenoop },
22997 0x0210: { n:"BrtBeginCalcChain$", f:parsenoop },
22998 0x0211: { n:"BrtEndCalcChain$", f:parsenoop },
22999 0x0212: { n:"BrtBeginSortState", f:parsenoop },
23000 0x0213: { n:"BrtEndSortState", f:parsenoop },
23001 0x0214: { n:"BrtBeginSortCond", f:parsenoop },
23002 0x0215: { n:"BrtEndSortCond", f:parsenoop },
23003 0x0216: { n:"BrtBookProtection", f:parsenoop },
23004 0x0217: { n:"BrtSheetProtection", f:parsenoop },
23005 0x0218: { n:"BrtRangeProtection", f:parsenoop },
23006 0x0219: { n:"BrtPhoneticInfo", f:parsenoop },
23007 0x021A: { n:"BrtBeginECTxtWiz", f:parsenoop },
23008 0x021B: { n:"BrtEndECTxtWiz", f:parsenoop },
23009 0x021C: { n:"BrtBeginECTWFldInfoLst", f:parsenoop },
23010 0x021D: { n:"BrtEndECTWFldInfoLst", f:parsenoop },
23011 0x021E: { n:"BrtBeginECTwFldInfo", f:parsenoop },
23012 0x0224: { n:"BrtFileSharing", f:parsenoop },
23013 0x0225: { n:"BrtOleSize", f:parsenoop },
23014 0x0226: { n:"BrtDrawing", f:parsenoop },
23015 0x0227: { n:"BrtLegacyDrawing", f:parsenoop },
23016 0x0228: { n:"BrtLegacyDrawingHF", f:parsenoop },
23017 0x0229: { n:"BrtWebOpt", f:parsenoop },
23018 0x022A: { n:"BrtBeginWebPubItems", f:parsenoop },
23019 0x022B: { n:"BrtEndWebPubItems", f:parsenoop },
23020 0x022C: { n:"BrtBeginWebPubItem", f:parsenoop },
23021 0x022D: { n:"BrtEndWebPubItem", f:parsenoop },
23022 0x022E: { n:"BrtBeginSXCondFmt", f:parsenoop },
23023 0x022F: { n:"BrtEndSXCondFmt", f:parsenoop },
23024 0x0230: { n:"BrtBeginSXCondFmts", f:parsenoop },
23025 0x0231: { n:"BrtEndSXCondFmts", f:parsenoop },
23026 0x0232: { n:"BrtBkHim", f:parsenoop },
23027 0x0234: { n:"BrtColor", f:parsenoop },
23028 0x0235: { n:"BrtBeginIndexedColors", f:parsenoop },
23029 0x0236: { n:"BrtEndIndexedColors", f:parsenoop },
23030 0x0239: { n:"BrtBeginMRUColors", f:parsenoop },
23031 0x023A: { n:"BrtEndMRUColors", f:parsenoop },
23032 0x023C: { n:"BrtMRUColor", f:parsenoop },
23033 0x023D: { n:"BrtBeginDVals", f:parsenoop },
23034 0x023E: { n:"BrtEndDVals", f:parsenoop },
23035 0x0241: { n:"BrtSupNameStart", f:parsenoop },
23036 0x0242: { n:"BrtSupNameValueStart", f:parsenoop },
23037 0x0243: { n:"BrtSupNameValueEnd", f:parsenoop },
23038 0x0244: { n:"BrtSupNameNum", f:parsenoop },
23039 0x0245: { n:"BrtSupNameErr", f:parsenoop },
23040 0x0246: { n:"BrtSupNameSt", f:parsenoop },
23041 0x0247: { n:"BrtSupNameNil", f:parsenoop },
23042 0x0248: { n:"BrtSupNameBool", f:parsenoop },
23043 0x0249: { n:"BrtSupNameFmla", f:parsenoop },
23044 0x024A: { n:"BrtSupNameBits", f:parsenoop },
23045 0x024B: { n:"BrtSupNameEnd", f:parsenoop },
23046 0x024C: { n:"BrtEndSupBook", f:parsenoop },
23047 0x024D: { n:"BrtCellSmartTagProperty", f:parsenoop },
23048 0x024E: { n:"BrtBeginCellSmartTag", f:parsenoop },
23049 0x024F: { n:"BrtEndCellSmartTag", f:parsenoop },
23050 0x0250: { n:"BrtBeginCellSmartTags", f:parsenoop },
23051 0x0251: { n:"BrtEndCellSmartTags", f:parsenoop },
23052 0x0252: { n:"BrtBeginSmartTags", f:parsenoop },
23053 0x0253: { n:"BrtEndSmartTags", f:parsenoop },
23054 0x0254: { n:"BrtSmartTagType", f:parsenoop },
23055 0x0255: { n:"BrtBeginSmartTagTypes", f:parsenoop },
23056 0x0256: { n:"BrtEndSmartTagTypes", f:parsenoop },
23057 0x0257: { n:"BrtBeginSXFilters", f:parsenoop },
23058 0x0258: { n:"BrtEndSXFilters", f:parsenoop },
23059 0x0259: { n:"BrtBeginSXFILTER", f:parsenoop },
23060 0x025A: { n:"BrtEndSXFilter", f:parsenoop },
23061 0x025B: { n:"BrtBeginFills", f:parsenoop },
23062 0x025C: { n:"BrtEndFills", f:parsenoop },
23063 0x025D: { n:"BrtBeginCellWatches", f:parsenoop },
23064 0x025E: { n:"BrtEndCellWatches", f:parsenoop },
23065 0x025F: { n:"BrtCellWatch", f:parsenoop },
23066 0x0260: { n:"BrtBeginCRErrs", f:parsenoop },
23067 0x0261: { n:"BrtEndCRErrs", f:parsenoop },
23068 0x0262: { n:"BrtCrashRecErr", f:parsenoop },
23069 0x0263: { n:"BrtBeginFonts", f:parsenoop },
23070 0x0264: { n:"BrtEndFonts", f:parsenoop },
23071 0x0265: { n:"BrtBeginBorders", f:parsenoop },
23072 0x0266: { n:"BrtEndBorders", f:parsenoop },
23073 0x0267: { n:"BrtBeginFmts", f:parsenoop },
23074 0x0268: { n:"BrtEndFmts", f:parsenoop },
23075 0x0269: { n:"BrtBeginCellXFs", f:parsenoop },
23076 0x026A: { n:"BrtEndCellXFs", f:parsenoop },
23077 0x026B: { n:"BrtBeginStyles", f:parsenoop },
23078 0x026C: { n:"BrtEndStyles", f:parsenoop },
23079 0x0271: { n:"BrtBigName", f:parsenoop },
23080 0x0272: { n:"BrtBeginCellStyleXFs", f:parsenoop },
23081 0x0273: { n:"BrtEndCellStyleXFs", f:parsenoop },
23082 0x0274: { n:"BrtBeginComments", f:parsenoop },
23083 0x0275: { n:"BrtEndComments", f:parsenoop },
23084 0x0276: { n:"BrtBeginCommentAuthors", f:parsenoop },
23085 0x0277: { n:"BrtEndCommentAuthors", f:parsenoop },
23086 0x0278: { n:"BrtCommentAuthor", f:parse_BrtCommentAuthor },
23087 0x0279: { n:"BrtBeginCommentList", f:parsenoop },
23088 0x027A: { n:"BrtEndCommentList", f:parsenoop },
23089 0x027B: { n:"BrtBeginComment", f:parse_BrtBeginComment},
23090 0x027C: { n:"BrtEndComment", f:parsenoop },
23091 0x027D: { n:"BrtCommentText", f:parse_BrtCommentText },
23092 0x027E: { n:"BrtBeginOleObjects", f:parsenoop },
23093 0x027F: { n:"BrtOleObject", f:parsenoop },
23094 0x0280: { n:"BrtEndOleObjects", f:parsenoop },
23095 0x0281: { n:"BrtBeginSxrules", f:parsenoop },
23096 0x0282: { n:"BrtEndSxRules", f:parsenoop },
23097 0x0283: { n:"BrtBeginActiveXControls", f:parsenoop },
23098 0x0284: { n:"BrtActiveX", f:parsenoop },
23099 0x0285: { n:"BrtEndActiveXControls", f:parsenoop },
23100 0x0286: { n:"BrtBeginPCDSDTCEMembersSortBy", f:parsenoop },
23101 0x0288: { n:"BrtBeginCellIgnoreECs", f:parsenoop },
23102 0x0289: { n:"BrtCellIgnoreEC", f:parsenoop },
23103 0x028A: { n:"BrtEndCellIgnoreECs", f:parsenoop },
23104 0x028B: { n:"BrtCsProp", f:parsenoop },
23105 0x028C: { n:"BrtCsPageSetup", f:parsenoop },
23106 0x028D: { n:"BrtBeginUserCsViews", f:parsenoop },
23107 0x028E: { n:"BrtEndUserCsViews", f:parsenoop },
23108 0x028F: { n:"BrtBeginUserCsView", f:parsenoop },
23109 0x0290: { n:"BrtEndUserCsView", f:parsenoop },
23110 0x0291: { n:"BrtBeginPcdSFCIEntries", f:parsenoop },
23111 0x0292: { n:"BrtEndPCDSFCIEntries", f:parsenoop },
23112 0x0293: { n:"BrtPCDSFCIEntry", f:parsenoop },
23113 0x0294: { n:"BrtBeginListParts", f:parsenoop },
23114 0x0295: { n:"BrtListPart", f:parsenoop },
23115 0x0296: { n:"BrtEndListParts", f:parsenoop },
23116 0x0297: { n:"BrtSheetCalcProp", f:parsenoop },
23117 0x0298: { n:"BrtBeginFnGroup", f:parsenoop },
23118 0x0299: { n:"BrtFnGroup", f:parsenoop },
23119 0x029A: { n:"BrtEndFnGroup", f:parsenoop },
23120 0x029B: { n:"BrtSupAddin", f:parsenoop },
23121 0x029C: { n:"BrtSXTDMPOrder", f:parsenoop },
23122 0x029D: { n:"BrtCsProtection", f:parsenoop },
23123 0x029F: { n:"BrtBeginWsSortMap", f:parsenoop },
23124 0x02A0: { n:"BrtEndWsSortMap", f:parsenoop },
23125 0x02A1: { n:"BrtBeginRRSort", f:parsenoop },
23126 0x02A2: { n:"BrtEndRRSort", f:parsenoop },
23127 0x02A3: { n:"BrtRRSortItem", f:parsenoop },
23128 0x02A4: { n:"BrtFileSharingIso", f:parsenoop },
23129 0x02A5: { n:"BrtBookProtectionIso", f:parsenoop },
23130 0x02A6: { n:"BrtSheetProtectionIso", f:parsenoop },
23131 0x02A7: { n:"BrtCsProtectionIso", f:parsenoop },
23132 0x02A8: { n:"BrtRangeProtectionIso", f:parsenoop },
23133 0x0400: { n:"BrtRwDescent", f:parsenoop },
23134 0x0401: { n:"BrtKnownFonts", f:parsenoop },
23135 0x0402: { n:"BrtBeginSXTupleSet", f:parsenoop },
23136 0x0403: { n:"BrtEndSXTupleSet", f:parsenoop },
23137 0x0404: { n:"BrtBeginSXTupleSetHeader", f:parsenoop },
23138 0x0405: { n:"BrtEndSXTupleSetHeader", f:parsenoop },
23139 0x0406: { n:"BrtSXTupleSetHeaderItem", f:parsenoop },
23140 0x0407: { n:"BrtBeginSXTupleSetData", f:parsenoop },
23141 0x0408: { n:"BrtEndSXTupleSetData", f:parsenoop },
23142 0x0409: { n:"BrtBeginSXTupleSetRow", f:parsenoop },
23143 0x040A: { n:"BrtEndSXTupleSetRow", f:parsenoop },
23144 0x040B: { n:"BrtSXTupleSetRowItem", f:parsenoop },
23145 0x040C: { n:"BrtNameExt", f:parsenoop },
23146 0x040D: { n:"BrtPCDH14", f:parsenoop },
23147 0x040E: { n:"BrtBeginPCDCalcMem14", f:parsenoop },
23148 0x040F: { n:"BrtEndPCDCalcMem14", f:parsenoop },
23149 0x0410: { n:"BrtSXTH14", f:parsenoop },
23150 0x0411: { n:"BrtBeginSparklineGroup", f:parsenoop },
23151 0x0412: { n:"BrtEndSparklineGroup", f:parsenoop },
23152 0x0413: { n:"BrtSparkline", f:parsenoop },
23153 0x0414: { n:"BrtSXDI14", f:parsenoop },
23154 0x0415: { n:"BrtWsFmtInfoEx14", f:parsenoop },
23155 0x0416: { n:"BrtBeginConditionalFormatting14", f:parsenoop },
23156 0x0417: { n:"BrtEndConditionalFormatting14", f:parsenoop },
23157 0x0418: { n:"BrtBeginCFRule14", f:parsenoop },
23158 0x0419: { n:"BrtEndCFRule14", f:parsenoop },
23159 0x041A: { n:"BrtCFVO14", f:parsenoop },
23160 0x041B: { n:"BrtBeginDatabar14", f:parsenoop },
23161 0x041C: { n:"BrtBeginIconSet14", f:parsenoop },
23162 0x041D: { n:"BrtDVal14", f:parsenoop },
23163 0x041E: { n:"BrtBeginDVals14", f:parsenoop },
23164 0x041F: { n:"BrtColor14", f:parsenoop },
23165 0x0420: { n:"BrtBeginSparklines", f:parsenoop },
23166 0x0421: { n:"BrtEndSparklines", f:parsenoop },
23167 0x0422: { n:"BrtBeginSparklineGroups", f:parsenoop },
23168 0x0423: { n:"BrtEndSparklineGroups", f:parsenoop },
23169 0x0425: { n:"BrtSXVD14", f:parsenoop },
23170 0x0426: { n:"BrtBeginSxview14", f:parsenoop },
23171 0x0427: { n:"BrtEndSxview14", f:parsenoop },
23172 0x042A: { n:"BrtBeginPCD14", f:parsenoop },
23173 0x042B: { n:"BrtEndPCD14", f:parsenoop },
23174 0x042C: { n:"BrtBeginExtConn14", f:parsenoop },
23175 0x042D: { n:"BrtEndExtConn14", f:parsenoop },
23176 0x042E: { n:"BrtBeginSlicerCacheIDs", f:parsenoop },
23177 0x042F: { n:"BrtEndSlicerCacheIDs", f:parsenoop },
23178 0x0430: { n:"BrtBeginSlicerCacheID", f:parsenoop },
23179 0x0431: { n:"BrtEndSlicerCacheID", f:parsenoop },
23180 0x0433: { n:"BrtBeginSlicerCache", f:parsenoop },
23181 0x0434: { n:"BrtEndSlicerCache", f:parsenoop },
23182 0x0435: { n:"BrtBeginSlicerCacheDef", f:parsenoop },
23183 0x0436: { n:"BrtEndSlicerCacheDef", f:parsenoop },
23184 0x0437: { n:"BrtBeginSlicersEx", f:parsenoop },
23185 0x0438: { n:"BrtEndSlicersEx", f:parsenoop },
23186 0x0439: { n:"BrtBeginSlicerEx", f:parsenoop },
23187 0x043A: { n:"BrtEndSlicerEx", f:parsenoop },
23188 0x043B: { n:"BrtBeginSlicer", f:parsenoop },
23189 0x043C: { n:"BrtEndSlicer", f:parsenoop },
23190 0x043D: { n:"BrtSlicerCachePivotTables", f:parsenoop },
23191 0x043E: { n:"BrtBeginSlicerCacheOlapImpl", f:parsenoop },
23192 0x043F: { n:"BrtEndSlicerCacheOlapImpl", f:parsenoop },
23193 0x0440: { n:"BrtBeginSlicerCacheLevelsData", f:parsenoop },
23194 0x0441: { n:"BrtEndSlicerCacheLevelsData", f:parsenoop },
23195 0x0442: { n:"BrtBeginSlicerCacheLevelData", f:parsenoop },
23196 0x0443: { n:"BrtEndSlicerCacheLevelData", f:parsenoop },
23197 0x0444: { n:"BrtBeginSlicerCacheSiRanges", f:parsenoop },
23198 0x0445: { n:"BrtEndSlicerCacheSiRanges", f:parsenoop },
23199 0x0446: { n:"BrtBeginSlicerCacheSiRange", f:parsenoop },
23200 0x0447: { n:"BrtEndSlicerCacheSiRange", f:parsenoop },
23201 0x0448: { n:"BrtSlicerCacheOlapItem", f:parsenoop },
23202 0x0449: { n:"BrtBeginSlicerCacheSelections", f:parsenoop },
23203 0x044A: { n:"BrtSlicerCacheSelection", f:parsenoop },
23204 0x044B: { n:"BrtEndSlicerCacheSelections", f:parsenoop },
23205 0x044C: { n:"BrtBeginSlicerCacheNative", f:parsenoop },
23206 0x044D: { n:"BrtEndSlicerCacheNative", f:parsenoop },
23207 0x044E: { n:"BrtSlicerCacheNativeItem", f:parsenoop },
23208 0x044F: { n:"BrtRangeProtection14", f:parsenoop },
23209 0x0450: { n:"BrtRangeProtectionIso14", f:parsenoop },
23210 0x0451: { n:"BrtCellIgnoreEC14", f:parsenoop },
23211 0x0457: { n:"BrtList14", f:parsenoop },
23212 0x0458: { n:"BrtCFIcon", f:parsenoop },
23213 0x0459: { n:"BrtBeginSlicerCachesPivotCacheIDs", f:parsenoop },
23214 0x045A: { n:"BrtEndSlicerCachesPivotCacheIDs", f:parsenoop },
23215 0x045B: { n:"BrtBeginSlicers", f:parsenoop },
23216 0x045C: { n:"BrtEndSlicers", f:parsenoop },
23217 0x045D: { n:"BrtWbProp14", f:parsenoop },
23218 0x045E: { n:"BrtBeginSXEdit", f:parsenoop },
23219 0x045F: { n:"BrtEndSXEdit", f:parsenoop },
23220 0x0460: { n:"BrtBeginSXEdits", f:parsenoop },
23221 0x0461: { n:"BrtEndSXEdits", f:parsenoop },
23222 0x0462: { n:"BrtBeginSXChange", f:parsenoop },
23223 0x0463: { n:"BrtEndSXChange", f:parsenoop },
23224 0x0464: { n:"BrtBeginSXChanges", f:parsenoop },
23225 0x0465: { n:"BrtEndSXChanges", f:parsenoop },
23226 0x0466: { n:"BrtSXTupleItems", f:parsenoop },
23227 0x0468: { n:"BrtBeginSlicerStyle", f:parsenoop },
23228 0x0469: { n:"BrtEndSlicerStyle", f:parsenoop },
23229 0x046A: { n:"BrtSlicerStyleElement", f:parsenoop },
23230 0x046B: { n:"BrtBeginStyleSheetExt14", f:parsenoop },
23231 0x046C: { n:"BrtEndStyleSheetExt14", f:parsenoop },
23232 0x046D: { n:"BrtBeginSlicerCachesPivotCacheID", f:parsenoop },
23233 0x046E: { n:"BrtEndSlicerCachesPivotCacheID", f:parsenoop },
23234 0x046F: { n:"BrtBeginConditionalFormattings", f:parsenoop },
23235 0x0470: { n:"BrtEndConditionalFormattings", f:parsenoop },
23236 0x0471: { n:"BrtBeginPCDCalcMemExt", f:parsenoop },
23237 0x0472: { n:"BrtEndPCDCalcMemExt", f:parsenoop },
23238 0x0473: { n:"BrtBeginPCDCalcMemsExt", f:parsenoop },
23239 0x0474: { n:"BrtEndPCDCalcMemsExt", f:parsenoop },
23240 0x0475: { n:"BrtPCDField14", f:parsenoop },
23241 0x0476: { n:"BrtBeginSlicerStyles", f:parsenoop },
23242 0x0477: { n:"BrtEndSlicerStyles", f:parsenoop },
23243 0x0478: { n:"BrtBeginSlicerStyleElements", f:parsenoop },
23244 0x0479: { n:"BrtEndSlicerStyleElements", f:parsenoop },
23245 0x047A: { n:"BrtCFRuleExt", f:parsenoop },
23246 0x047B: { n:"BrtBeginSXCondFmt14", f:parsenoop },
23247 0x047C: { n:"BrtEndSXCondFmt14", f:parsenoop },
23248 0x047D: { n:"BrtBeginSXCondFmts14", f:parsenoop },
23249 0x047E: { n:"BrtEndSXCondFmts14", f:parsenoop },
23250 0x0480: { n:"BrtBeginSortCond14", f:parsenoop },
23251 0x0481: { n:"BrtEndSortCond14", f:parsenoop },
23252 0x0482: { n:"BrtEndDVals14", f:parsenoop },
23253 0x0483: { n:"BrtEndIconSet14", f:parsenoop },
23254 0x0484: { n:"BrtEndDatabar14", f:parsenoop },
23255 0x0485: { n:"BrtBeginColorScale14", f:parsenoop },
23256 0x0486: { n:"BrtEndColorScale14", f:parsenoop },
23257 0x0487: { n:"BrtBeginSxrules14", f:parsenoop },
23258 0x0488: { n:"BrtEndSxrules14", f:parsenoop },
23259 0x0489: { n:"BrtBeginPRule14", f:parsenoop },
23260 0x048A: { n:"BrtEndPRule14", f:parsenoop },
23261 0x048B: { n:"BrtBeginPRFilters14", f:parsenoop },
23262 0x048C: { n:"BrtEndPRFilters14", f:parsenoop },
23263 0x048D: { n:"BrtBeginPRFilter14", f:parsenoop },
23264 0x048E: { n:"BrtEndPRFilter14", f:parsenoop },
23265 0x048F: { n:"BrtBeginPRFItem14", f:parsenoop },
23266 0x0490: { n:"BrtEndPRFItem14", f:parsenoop },
23267 0x0491: { n:"BrtBeginCellIgnoreECs14", f:parsenoop },
23268 0x0492: { n:"BrtEndCellIgnoreECs14", f:parsenoop },
23269 0x0493: { n:"BrtDxf14", f:parsenoop },
23270 0x0494: { n:"BrtBeginDxF14s", f:parsenoop },
23271 0x0495: { n:"BrtEndDxf14s", f:parsenoop },
23272 0x0499: { n:"BrtFilter14", f:parsenoop },
23273 0x049A: { n:"BrtBeginCustomFilters14", f:parsenoop },
23274 0x049C: { n:"BrtCustomFilter14", f:parsenoop },
23275 0x049D: { n:"BrtIconFilter14", f:parsenoop },
23276 0x049E: { n:"BrtPivotCacheConnectionName", f:parsenoop },
23277 0x0800: { n:"BrtBeginDecoupledPivotCacheIDs", f:parsenoop },
23278 0x0801: { n:"BrtEndDecoupledPivotCacheIDs", f:parsenoop },
23279 0x0802: { n:"BrtDecoupledPivotCacheID", f:parsenoop },
23280 0x0803: { n:"BrtBeginPivotTableRefs", f:parsenoop },
23281 0x0804: { n:"BrtEndPivotTableRefs", f:parsenoop },
23282 0x0805: { n:"BrtPivotTableRef", f:parsenoop },
23283 0x0806: { n:"BrtSlicerCacheBookPivotTables", f:parsenoop },
23284 0x0807: { n:"BrtBeginSxvcells", f:parsenoop },
23285 0x0808: { n:"BrtEndSxvcells", f:parsenoop },
23286 0x0809: { n:"BrtBeginSxRow", f:parsenoop },
23287 0x080A: { n:"BrtEndSxRow", f:parsenoop },
23288 0x080C: { n:"BrtPcdCalcMem15", f:parsenoop },
23289 0x0813: { n:"BrtQsi15", f:parsenoop },
23290 0x0814: { n:"BrtBeginWebExtensions", f:parsenoop },
23291 0x0815: { n:"BrtEndWebExtensions", f:parsenoop },
23292 0x0816: { n:"BrtWebExtension", f:parsenoop },
23293 0x0817: { n:"BrtAbsPath15", f:parsenoop },
23294 0x0818: { n:"BrtBeginPivotTableUISettings", f:parsenoop },
23295 0x0819: { n:"BrtEndPivotTableUISettings", f:parsenoop },
23296 0x081B: { n:"BrtTableSlicerCacheIDs", f:parsenoop },
23297 0x081C: { n:"BrtTableSlicerCacheID", f:parsenoop },
23298 0x081D: { n:"BrtBeginTableSlicerCache", f:parsenoop },
23299 0x081E: { n:"BrtEndTableSlicerCache", f:parsenoop },
23300 0x081F: { n:"BrtSxFilter15", f:parsenoop },
23301 0x0820: { n:"BrtBeginTimelineCachePivotCacheIDs", f:parsenoop },
23302 0x0821: { n:"BrtEndTimelineCachePivotCacheIDs", f:parsenoop },
23303 0x0822: { n:"BrtTimelineCachePivotCacheID", f:parsenoop },
23304 0x0823: { n:"BrtBeginTimelineCacheIDs", f:parsenoop },
23305 0x0824: { n:"BrtEndTimelineCacheIDs", f:parsenoop },
23306 0x0825: { n:"BrtBeginTimelineCacheID", f:parsenoop },
23307 0x0826: { n:"BrtEndTimelineCacheID", f:parsenoop },
23308 0x0827: { n:"BrtBeginTimelinesEx", f:parsenoop },
23309 0x0828: { n:"BrtEndTimelinesEx", f:parsenoop },
23310 0x0829: { n:"BrtBeginTimelineEx", f:parsenoop },
23311 0x082A: { n:"BrtEndTimelineEx", f:parsenoop },
23312 0x082B: { n:"BrtWorkBookPr15", f:parsenoop },
23313 0x082C: { n:"BrtPCDH15", f:parsenoop },
23314 0x082D: { n:"BrtBeginTimelineStyle", f:parsenoop },
23315 0x082E: { n:"BrtEndTimelineStyle", f:parsenoop },
23316 0x082F: { n:"BrtTimelineStyleElement", f:parsenoop },
23317 0x0830: { n:"BrtBeginTimelineStylesheetExt15", f:parsenoop },
23318 0x0831: { n:"BrtEndTimelineStylesheetExt15", f:parsenoop },
23319 0x0832: { n:"BrtBeginTimelineStyles", f:parsenoop },
23320 0x0833: { n:"BrtEndTimelineStyles", f:parsenoop },
23321 0x0834: { n:"BrtBeginTimelineStyleElements", f:parsenoop },
23322 0x0835: { n:"BrtEndTimelineStyleElements", f:parsenoop },
23323 0x0836: { n:"BrtDxf15", f:parsenoop },
23324 0x0837: { n:"BrtBeginDxfs15", f:parsenoop },
23325 0x0838: { n:"brtEndDxfs15", f:parsenoop },
23326 0x0839: { n:"BrtSlicerCacheHideItemsWithNoData", f:parsenoop },
23327 0x083A: { n:"BrtBeginItemUniqueNames", f:parsenoop },
23328 0x083B: { n:"BrtEndItemUniqueNames", f:parsenoop },
23329 0x083C: { n:"BrtItemUniqueName", f:parsenoop },
23330 0x083D: { n:"BrtBeginExtConn15", f:parsenoop },
23331 0x083E: { n:"BrtEndExtConn15", f:parsenoop },
23332 0x083F: { n:"BrtBeginOledbPr15", f:parsenoop },
23333 0x0840: { n:"BrtEndOledbPr15", f:parsenoop },
23334 0x0841: { n:"BrtBeginDataFeedPr15", f:parsenoop },
23335 0x0842: { n:"BrtEndDataFeedPr15", f:parsenoop },
23336 0x0843: { n:"BrtTextPr15", f:parsenoop },
23337 0x0844: { n:"BrtRangePr15", f:parsenoop },
23338 0x0845: { n:"BrtDbCommand15", f:parsenoop },
23339 0x0846: { n:"BrtBeginDbTables15", f:parsenoop },
23340 0x0847: { n:"BrtEndDbTables15", f:parsenoop },
23341 0x0848: { n:"BrtDbTable15", f:parsenoop },
23342 0x0849: { n:"BrtBeginDataModel", f:parsenoop },
23343 0x084A: { n:"BrtEndDataModel", f:parsenoop },
23344 0x084B: { n:"BrtBeginModelTables", f:parsenoop },
23345 0x084C: { n:"BrtEndModelTables", f:parsenoop },
23346 0x084D: { n:"BrtModelTable", f:parsenoop },
23347 0x084E: { n:"BrtBeginModelRelationships", f:parsenoop },
23348 0x084F: { n:"BrtEndModelRelationships", f:parsenoop },
23349 0x0850: { n:"BrtModelRelationship", f:parsenoop },
23350 0x0851: { n:"BrtBeginECTxtWiz15", f:parsenoop },
23351 0x0852: { n:"BrtEndECTxtWiz15", f:parsenoop },
23352 0x0853: { n:"BrtBeginECTWFldInfoLst15", f:parsenoop },
23353 0x0854: { n:"BrtEndECTWFldInfoLst15", f:parsenoop },
23354 0x0855: { n:"BrtBeginECTWFldInfo15", f:parsenoop },
23355 0x0856: { n:"BrtFieldListActiveItem", f:parsenoop },
23356 0x0857: { n:"BrtPivotCacheIdVersion", f:parsenoop },
23357 0x0858: { n:"BrtSXDI15", f:parsenoop },
23358 0xFFFF: { n:"", f:parsenoop }
19045 }; 23359 };
19046 23360
19047 /* 23361 var evert_RE = evert_key(RecordEnum, 'n');
19048 * List features that require a modern browser, and if the current browser support them. 23362 function fix_opts_func(defaults) {
19049 */ 23363 return function fix_opts(opts) {
19050 JSZip.support = { 23364 for(var i = 0; i != defaults.length; ++i) {
19051 // contains true if JSZip can read/generate ArrayBuffer, false otherwise. 23365 var d = defaults[i];
19052 arraybuffer : (function(){ 23366 if(opts[d[0]] === undefined) opts[d[0]] = d[1];
19053 return typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined"; 23367 if(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);
19054 })(), 23368 }
19055 // contains true if JSZip can read/generate Uint8Array, false otherwise. 23369 };
19056 uint8array : (function(){ 23370 }
19057 return typeof Uint8Array !== "undefined"; 23371
19058 })(), 23372 var fix_read_opts = fix_opts_func([
19059 // contains true if JSZip can read/generate Blob, false otherwise. 23373 ['cellNF', false], /* emit cell number format string as .z */
19060 blob : (function(){ 23374 ['cellHTML', true], /* emit html string as .h */
19061 // the spec started with BlobBuilder then replaced it with a construtor for Blob. 23375 ['cellFormula', true], /* emit formulae as .f */
19062 // Result : we have browsers that : 23376 ['cellStyles', false], /* emits style/theme as .s */
19063 // * know the BlobBuilder (but with prefix) 23377
19064 // * know the Blob constructor 23378 ['sheetStubs', false], /* emit empty cells */
19065 // * know about Blob but not about how to build them 23379 ['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */
19066 // About the "=== 0" test : if given the wrong type, it may be converted to a string. 23380
19067 // Instead of an empty content, we will get "[object Uint8Array]" for example. 23381 ['bookDeps', false], /* parse calculation chains */
19068 if (typeof ArrayBuffer === "undefined") { 23382 ['bookSheets', false], /* only try to get sheet names (no Sheets) */
19069 return false; 23383 ['bookProps', false], /* only try to get properties (no Sheets) */
19070 } 23384 ['bookFiles', false], /* include raw file structure (keys, files) */
19071 var buffer = new ArrayBuffer(0); 23385 ['bookVBA', false], /* include vba raw data (vbaraw) */
19072 try { 23386
19073 return new Blob([buffer], { type: "application/zip" }).size === 0; 23387 ['WTF', false] /* WTF mode (throws errors) */
19074 } 23388 ]);
19075 catch(e) {} 23389
19076 23390
19077 try { 23391 var fix_write_opts = fix_opts_func([
19078 var builder = new (window.BlobBuilder || window.WebKitBlobBuilder || 23392 ['bookSST', false], /* Generate Shared String Table */
19079 window.MozBlobBuilder || window.MSBlobBuilder)(); 23393
19080 builder.append(buffer); 23394 ['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */
19081 return builder.getBlob('application/zip').size === 0; 23395
19082 } 23396 ['WTF', false] /* WTF mode (throws errors) */
19083 catch(e) {} 23397 ]);
19084 23398 function safe_parse_wbrels(wbrels, sheets) {
19085 return false; 23399 if(!wbrels) return 0;
19086 })() 23400 try {
23401 wbrels = sheets.map(function pwbr(w) { return [w.name, wbrels['!id'][w.id].Target]; });
23402 } catch(e) { return null; }
23403 return !wbrels || wbrels.length === 0 ? null : wbrels;
23404 }
23405
23406 function safe_parse_ws(zip, path, relsPath, sheet, sheetRels, sheets, opts) {
23407 try {
23408 sheetRels[sheet]=parse_rels(getzipdata(zip, relsPath, true), path);
23409 sheets[sheet]=parse_ws(getzipdata(zip, path),path,opts,sheetRels[sheet]);
23410 } catch(e) { if(opts.WTF) throw e; }
23411 }
23412
23413 var nodirs = function nodirs(x){return x.substr(-1) != '/';};
23414 function parse_zip(zip, opts) {
23415 make_ssf(SSF);
23416 opts = opts || {};
23417 fix_read_opts(opts);
23418 reset_cp();
23419 var entries = keys(zip.files).filter(nodirs).sort();
23420 var dir = parse_ct(getzipdata(zip, '[Content_Types].xml'), opts);
23421 var xlsb = false;
23422 var sheets, binname;
23423 if(dir.workbooks.length === 0) {
23424 binname = "xl/workbook.xml";
23425 if(getzipdata(zip,binname, true)) dir.workbooks.push(binname);
23426 }
23427 if(dir.workbooks.length === 0) {
23428 binname = "xl/workbook.bin";
23429 if(!getzipfile(zip,binname,true)) throw new Error("Could not find workbook");
23430 dir.workbooks.push(binname);
23431 xlsb = true;
23432 }
23433 if(dir.workbooks[0].substr(-3) == "bin") xlsb = true;
23434 if(xlsb) set_cp(1200);
23435
23436 if(!opts.bookSheets && !opts.bookProps) {
23437 strs = [];
23438 if(dir.sst) strs=parse_sst(getzipdata(zip, dir.sst.replace(/^\//,'')), dir.sst, opts);
23439
23440 styles = {};
23441 if(dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//,'')),dir.style, opts);
23442
23443 themes = {};
23444 if(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipdata(zip, dir.themes[0].replace(/^\//,''), true),dir.themes[0], opts);
23445 }
23446
23447 var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//,'')), dir.workbooks[0], opts);
23448
23449 var props = {}, propdata = "";
23450
23451 if(dir.coreprops.length !== 0) {
23452 propdata = getzipdata(zip, dir.coreprops[0].replace(/^\//,''), true);
23453 if(propdata) props = parse_core_props(propdata);
23454 if(dir.extprops.length !== 0) {
23455 propdata = getzipdata(zip, dir.extprops[0].replace(/^\//,''), true);
23456 if(propdata) parse_ext_props(propdata, props);
23457 }
23458 }
23459
23460 var custprops = {};
23461 if(!opts.bookSheets || opts.bookProps) {
23462 if (dir.custprops.length !== 0) {
23463 propdata = getzipdata(zip, dir.custprops[0].replace(/^\//,''), true);
23464 if(propdata) custprops = parse_cust_props(propdata, opts);
23465 }
23466 }
23467
23468 var out = {};
23469 if(opts.bookSheets || opts.bookProps) {
23470 if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;
23471 else if(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });
23472 if(opts.bookProps) { out.Props = props; out.Custprops = custprops; }
23473 if(typeof sheets !== 'undefined') out.SheetNames = sheets;
23474 if(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;
23475 }
23476 sheets = {};
23477
23478 var deps = {};
23479 if(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//,'')),dir.calcchain,opts);
23480
23481 var i=0;
23482 var sheetRels = {};
23483 var path, relsPath;
23484 if(!props.Worksheets) {
23485 var wbsheets = wb.Sheets;
23486 props.Worksheets = wbsheets.length;
23487 props.SheetNames = [];
23488 for(var j = 0; j != wbsheets.length; ++j) {
23489 props.SheetNames[j] = wbsheets[j].name;
23490 }
23491 }
23492
23493 var wbext = xlsb ? "bin" : "xml";
23494 var wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';
23495 var wbrels = parse_rels(getzipdata(zip, wbrelsfile, true), wbrelsfile);
23496 if(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);
23497 /* Numbers iOS hack */
23498 var nmode = (getzipdata(zip,"xl/worksheets/sheet.xml",true))?1:0;
23499 for(i = 0; i != props.Worksheets; ++i) {
23500 if(wbrels) path = 'xl/' + (wbrels[i][1]).replace(/[\/]?xl\//, "");
23501 else {
23502 path = 'xl/worksheets/sheet'+(i+1-nmode)+"." + wbext;
23503 path = path.replace(/sheet0\./,"sheet.");
23504 }
23505 relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels");
23506 safe_parse_ws(zip, path, relsPath, props.SheetNames[i], sheetRels, sheets, opts);
23507 }
23508
23509 if(dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts);
23510
23511 out = {
23512 Directory: dir,
23513 Workbook: wb,
23514 Props: props,
23515 Custprops: custprops,
23516 Deps: deps,
23517 Sheets: sheets,
23518 SheetNames: props.SheetNames,
23519 Strings: strs,
23520 Styles: styles,
23521 Themes: themes,
23522 SSF: SSF.get_table()
23523 };
23524 if(opts.bookFiles) {
23525 out.keys = entries;
23526 out.files = zip.files;
23527 }
23528 if(opts.bookVBA) {
23529 if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,dir.vba[0],true);
23530 else if(dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true);
23531 }
23532 return out;
23533 }
23534 function add_rels(rels, rId, f, type, relobj) {
23535 if(!relobj) relobj = {};
23536 if(!rels['!id']) rels['!id'] = {};
23537 relobj.Id = 'rId' + rId;
23538 relobj.Type = type;
23539 relobj.Target = f;
23540 if(rels['!id'][relobj.Id]) throw new Error("Cannot rewrite rId " + rId);
23541 rels['!id'][relobj.Id] = relobj;
23542 rels[('/' + relobj.Target).replace("//","/")] = relobj;
23543 }
23544
23545 function write_zip(wb, opts) {
23546 if(wb && !wb.SSF) {
23547 wb.SSF = SSF.get_table();
23548 }
23549 if(wb && wb.SSF) {
23550 make_ssf(SSF); SSF.load_table(wb.SSF);
23551 opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
23552 }
23553 opts.rels = {}; opts.wbrels = {};
23554 opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;
23555 var wbext = opts.bookType == "xlsb" ? "bin" : "xml";
23556 var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [],
23557 coreprops: [], extprops: [], custprops: [], strs:[], comments: [], vba: [],
23558 TODO:[], rels:[], xmlns: "" };
23559 fix_write_opts(opts = opts || {});
23560 var zip = new jszip();
23561 var f = "", rId = 0;
23562
23563 opts.cellXfs = [];
23564 get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}});
23565
23566 f = "docProps/core.xml";
23567 zip.file(f, write_core_props(wb.Props, opts));
23568 ct.coreprops.push(f);
23569 add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
23570
23571 f = "docProps/app.xml";
23572 if(!wb.Props) wb.Props = {};
23573 wb.Props.SheetNames = wb.SheetNames;
23574 wb.Props.Worksheets = wb.SheetNames.length;
23575 zip.file(f, write_ext_props(wb.Props, opts));
23576 ct.extprops.push(f);
23577 add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
23578
23579 if(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {
23580 f = "docProps/custom.xml";
23581 zip.file(f, write_cust_props(wb.Custprops, opts));
23582 ct.custprops.push(f);
23583 add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
23584 }
23585
23586 f = "xl/workbook." + wbext;
23587 zip.file(f, write_wb(wb, f, opts));
23588 ct.workbooks.push(f);
23589 add_rels(opts.rels, 1, f, RELS.WB);
23590
23591 for(rId=1;rId <= wb.SheetNames.length; ++rId) {
23592 f = "xl/worksheets/sheet" + rId + "." + wbext;
23593 zip.file(f, write_ws(rId-1, f, opts, wb));
23594 ct.sheets.push(f);
23595 add_rels(opts.wbrels, rId, "worksheets/sheet" + rId + "." + wbext, RELS.WS);
23596 }
23597
23598 if(opts.Strings != null && opts.Strings.length > 0) {
23599 f = "xl/sharedStrings." + wbext;
23600 zip.file(f, write_sst(opts.Strings, f, opts));
23601 ct.strs.push(f);
23602 add_rels(opts.wbrels, ++rId, "sharedStrings." + wbext, RELS.SST);
23603 }
23604
23605 /* TODO: something more intelligent with themes */
23606
23607 f = "xl/theme/theme1.xml";
23608 zip.file(f, write_theme());
23609 ct.themes.push(f);
23610 add_rels(opts.wbrels, ++rId, "theme/theme1.xml", RELS.THEME);
23611
23612 /* TODO: something more intelligent with styles */
23613
23614 f = "xl/styles." + wbext;
23615 zip.file(f, write_sty(wb, f, opts));
23616 ct.styles.push(f);
23617 add_rels(opts.wbrels, ++rId, "styles." + wbext, RELS.STY);
23618
23619 zip.file("[Content_Types].xml", write_ct(ct, opts));
23620 zip.file('_rels/.rels', write_rels(opts.rels));
23621 zip.file('xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));
23622 return zip;
23623 }
23624 function readSync(data, opts) {
23625 var zip, d = data;
23626 var o = opts||{};
23627 if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64";
23628 switch(o.type) {
23629 case "base64": zip = new jszip(d, { base64:true }); break;
23630 case "binary": zip = new jszip(d, { base64:false }); break;
23631 case "buffer": zip = new jszip(d); break;
23632 case "file": zip=new jszip(d=_fs.readFileSync(data)); break;
23633 default: throw new Error("Unrecognized type " + o.type);
23634 }
23635 return parse_zip(zip, o);
23636 }
23637
23638 function readFileSync(data, opts) {
23639 var o = opts||{}; o.type = 'file';
23640 return readSync(data, o);
23641 }
23642
23643 function writeSync(wb, opts) {
23644 var o = opts||{};
23645 var z = write_zip(wb, o);
23646 switch(o.type) {
23647 case "base64": return z.generate({type:"base64"});
23648 case "binary": return z.generate({type:"string"});
23649 case "buffer": return z.generate({type:"nodebuffer"});
23650 case "file": return _fs.writeFileSync(o.file, z.generate({type:"nodebuffer"}));
23651 default: throw new Error("Unrecognized type " + o.type);
23652 }
23653 }
23654
23655 function writeFileSync(wb, filename, opts) {
23656 var o = opts||{}; o.type = 'file';
23657 o.file = filename;
23658 switch(o.file.substr(-5).toLowerCase()) {
23659 case '.xlsm': o.bookType = 'xlsm'; break;
23660 case '.xlsb': o.bookType = 'xlsb'; break;
23661 }
23662 return writeSync(wb, o);
23663 }
23664
23665 function decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }
23666 function encode_row(row) { return "" + (row + 1); }
23667 function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/,"$1$$$2"); }
23668 function unfix_row(cstr) { return cstr.replace(/\$(\d+)$/,"$1"); }
23669
23670 function decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }
23671 function encode_col(col) { var s=""; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }
23672 function fix_col(cstr) { return cstr.replace(/^([A-Z])/,"$$$1"); }
23673 function unfix_col(cstr) { return cstr.replace(/^\$([A-Z])/,"$1"); }
23674
23675 function split_cell(cstr) { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/,"$1,$2").split(","); }
23676 function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
23677 function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }
23678 function fix_cell(cstr) { return fix_col(fix_row(cstr)); }
23679 function unfix_cell(cstr) { return unfix_col(unfix_row(cstr)); }
23680 function decode_range(range) { var x =range.split(":").map(decode_cell); return {s:x[0],e:x[x.length-1]}; }
23681 function encode_range(cs,ce) {
23682 if(ce === undefined || typeof ce === 'number') return encode_range(cs.s, cs.e);
23683 if(typeof cs !== 'string') cs = encode_cell(cs); if(typeof ce !== 'string') ce = encode_cell(ce);
23684 return cs == ce ? cs : cs + ":" + ce;
23685 }
23686
23687 function safe_decode_range(range) {
23688 var o = {s:{c:0,r:0},e:{c:0,r:0}};
23689 var idx = 0, i = 0, cc = 0;
23690 var len = range.length;
23691 for(idx = 0; i < len; ++i) {
23692 if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;
23693 idx = 26*idx + cc;
23694 }
23695 o.s.c = --idx;
23696
23697 for(idx = 0; i < len; ++i) {
23698 if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;
23699 idx = 10*idx + cc;
23700 }
23701 o.s.r = --idx;
23702
23703 if(i === len || range.charCodeAt(++i) === 58) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }
23704
23705 for(idx = 0; i != len; ++i) {
23706 if((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;
23707 idx = 26*idx + cc;
23708 }
23709 o.e.c = --idx;
23710
23711 for(idx = 0; i != len; ++i) {
23712 if((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;
23713 idx = 10*idx + cc;
23714 }
23715 o.e.r = --idx;
23716 return o;
23717 }
23718
23719 function safe_format_cell(cell, v) {
23720 if(cell.z !== undefined) try { return (cell.w = SSF.format(cell.z, v)); } catch(e) { }
23721 if(!cell.XF) return v;
23722 try { return (cell.w = SSF.format(cell.XF.ifmt||0, v)); } catch(e) { return ''+v; }
23723 }
23724
23725 function format_cell(cell, v) {
23726 if(cell == null || cell.t == null) return "";
23727 if(cell.w !== undefined) return cell.w;
23728 if(v === undefined) return safe_format_cell(cell, cell.v);
23729 return safe_format_cell(cell, v);
23730 }
23731
23732 function sheet_to_json(sheet, opts){
23733 var val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v;
23734 var o = opts != null ? opts : {};
23735 var raw = o.raw;
23736 if(sheet == null || sheet["!ref"] == null) return [];
23737 range = o.range !== undefined ? o.range : sheet["!ref"];
23738 if(o.header === 1) header = 1;
23739 else if(o.header === "A") header = 2;
23740 else if(Array.isArray(o.header)) header = 3;
23741 switch(typeof range) {
23742 case 'string': r = safe_decode_range(range); break;
23743 case 'number': r = safe_decode_range(sheet["!ref"]); r.s.r = range; break;
23744 default: r = range;
23745 }
23746 if(header > 0) offset = 0;
23747 var rr = encode_row(r.s.r);
23748 var cols = new Array(r.e.c-r.s.c+1);
23749 var out = new Array(r.e.r-r.s.r-offset+1);
23750 var outi = 0;
23751 for(C = r.s.c; C <= r.e.c; ++C) {
23752 cols[C] = encode_col(C);
23753 val = sheet[cols[C] + rr];
23754 switch(header) {
23755 case 1: hdr[C] = C; break;
23756 case 2: hdr[C] = cols[C]; break;
23757 case 3: hdr[C] = o.header[C - r.s.c]; break;
23758 default:
23759 if(val === undefined) continue;
23760 hdr[C] = format_cell(val);
23761 }
23762 }
23763
23764 for (R = r.s.r + offset; R <= r.e.r; ++R) {
23765 rr = encode_row(R);
23766 isempty = true;
23767 row = header === 1 ? [] : Object.create({ __rowNum__ : R });
23768 for (C = r.s.c; C <= r.e.c; ++C) {
23769 val = sheet[cols[C] + rr];
23770 if(val === undefined || val.t === undefined) continue;
23771 v = val.v;
23772 switch(val.t){
23773 case 'e': continue;
23774 case 's': case 'str': break;
23775 case 'b': case 'n': break;
23776 default: throw 'unrecognized type ' + val.t;
23777 }
23778 if(v !== undefined) {
23779 row[hdr[C]] = raw ? v : format_cell(val,v);
23780 isempty = false;
23781 }
23782 }
23783 if(isempty === false) out[outi++] = row;
23784 }
23785 out.length = outi;
23786 return out;
23787 }
23788
23789 function sheet_to_row_object_array(sheet, opts) { return sheet_to_json(sheet, opts != null ? opts : {}); }
23790
23791 function sheet_to_csv(sheet, opts) {
23792 var out = "", txt = "", qreg = /"/g;
23793 var o = opts == null ? {} : opts;
23794 if(sheet == null || sheet["!ref"] == null) return "";
23795 var r = safe_decode_range(sheet["!ref"]);
23796 var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0);
23797 var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0);
23798 var row = "", rr = "", cols = [];
23799 var i = 0, cc = 0, val;
23800 var R = 0, C = 0;
23801 for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);
23802 for(R = r.s.r; R <= r.e.r; ++R) {
23803 row = "";
23804 rr = encode_row(R);
23805 for(C = r.s.c; C <= r.e.c; ++C) {
23806 val = sheet[cols[C] + rr];
23807 txt = val !== undefined ? ''+format_cell(val) : "";
23808 for(i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) {
23809 txt = "\"" + txt.replace(qreg, '""') + "\""; break; }
23810 row += (C === r.s.c ? "" : FS) + txt;
23811 }
23812 out += row + RS;
23813 }
23814 return out;
23815 }
23816 var make_csv = sheet_to_csv;
23817
23818 function sheet_to_formulae(sheet) {
23819 var cmds, y = "", x, val="";
23820 if(sheet == null || sheet["!ref"] == null) return "";
23821 var r = safe_decode_range(sheet['!ref']), rr = "", cols = [], C;
23822 cmds = new Array((r.e.r-r.s.r+1)*(r.e.c-r.s.c+1));
23823 var i = 0;
23824 for(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);
23825 for(var R = r.s.r; R <= r.e.r; ++R) {
23826 rr = encode_row(R);
23827 for(C = r.s.c; C <= r.e.c; ++C) {
23828 y = cols[C] + rr;
23829 x = sheet[y];
23830 val = "";
23831 if(x === undefined) continue;
23832 if(x.f != null) val = x.f;
23833 else if(x.w !== undefined) val = "'" + x.w;
23834 else if(x.v === undefined) continue;
23835 else val = ""+x.v;
23836 cmds[i++] = y + "=" + val;
23837 }
23838 }
23839 cmds.length = i;
23840 return cmds;
23841 }
23842
23843 var utils = {
23844 encode_col: encode_col,
23845 encode_row: encode_row,
23846 encode_cell: encode_cell,
23847 encode_range: encode_range,
23848 decode_col: decode_col,
23849 decode_row: decode_row,
23850 split_cell: split_cell,
23851 decode_cell: decode_cell,
23852 decode_range: decode_range,
23853 format_cell: format_cell,
23854 get_formulae: sheet_to_formulae,
23855 make_csv: sheet_to_csv,
23856 make_json: sheet_to_json,
23857 make_formulae: sheet_to_formulae,
23858 sheet_to_csv: sheet_to_csv,
23859 sheet_to_json: sheet_to_json,
23860 sheet_to_formulae: sheet_to_formulae,
23861 sheet_to_row_object_array: sheet_to_row_object_array
19087 }; 23862 };
19088 23863 XLSX.parseZip = parse_zip;
19089 JSZip.utils = { 23864 XLSX.read = readSync;
19090 /** 23865 XLSX.readFile = readFileSync;
19091 * Convert a string to a "binary string" : a string containing only char codes between 0 and 255. 23866 XLSX.write = writeSync;
19092 * @param {string} str the string to transform. 23867 XLSX.writeFile = writeFileSync;
19093 * @return {String} the binary string. 23868 XLSX.utils = utils;
19094 */ 23869 XLSX.SSF = SSF;
19095 string2binary : function (str) { 23870 })(typeof exports !== 'undefined' ? exports : XLSX);
19096 var result = "";
19097 for (var i = 0; i < str.length; i++) {
19098 result += String.fromCharCode(str.charCodeAt(i) & 0xff);
19099 }
19100 return result;
19101 },
19102 /**
19103 * Create a Uint8Array from the string.
19104 * @param {string} str the string to transform.
19105 * @return {Uint8Array} the typed array.
19106 * @throws {Error} an Error if the browser doesn't support the requested feature.
19107 */
19108 string2Uint8Array : function (str) {
19109 if (!JSZip.support.uint8array) {
19110 throw new Error("Uint8Array is not supported by this browser");
19111 }
19112 var buffer = new ArrayBuffer(str.length);
19113 var bufferView = new Uint8Array(buffer);
19114 for(var i = 0; i < str.length; i++) {
19115 bufferView[i] = str.charCodeAt(i);
19116 }
19117
19118 return bufferView;
19119 },
19120
19121 /**
19122 * Create a string from the Uint8Array.
19123 * @param {Uint8Array} array the array to transform.
19124 * @return {string} the string.
19125 * @throws {Error} an Error if the browser doesn't support the requested feature.
19126 */
19127 uint8Array2String : function (array) {
19128 if (!JSZip.support.uint8array) {
19129 throw new Error("Uint8Array is not supported by this browser");
19130 }
19131 var result = "";
19132 for(var i = 0; i < array.length; i++) {
19133 result += String.fromCharCode(array[i]);
19134 }
19135
19136 return result;
19137 },
19138 /**
19139 * Create a blob from the given string.
19140 * @param {string} str the string to transform.
19141 * @return {Blob} the string.
19142 * @throws {Error} an Error if the browser doesn't support the requested feature.
19143 */
19144 string2Blob : function (str) {
19145 if (!JSZip.support.blob) {
19146 throw new Error("Blob is not supported by this browser");
19147 }
19148
19149 var buffer = JSZip.utils.string2Uint8Array(str).buffer;
19150 try {
19151 // Blob constructor
19152 return new Blob([buffer], { type: "application/zip" });
19153 }
19154 catch(e) {}
19155
19156 try {
19157 // deprecated, browser only, old way
19158 var builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||
19159 window.MozBlobBuilder || window.MSBlobBuilder)();
19160 builder.append(buffer);
19161 return builder.getBlob('application/zip');
19162 }
19163 catch(e) {}
19164
19165 // well, fuck ?!
19166 throw new Error("Bug : can't construct the Blob.");
19167 }
19168 };
19169
19170 /**
19171 *
19172 * Base64 encode / decode
19173 * http://www.webtoolkit.info/
19174 *
19175 * Hacked so that it doesn't utf8 en/decode everything
19176 **/
19177 var JSZipBase64 = (function() {
19178 // private property
19179 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
19180
19181 return {
19182 // public method for encoding
19183 encode : function(input, utf8) {
19184 var output = "";
19185 var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
19186 var i = 0;
19187
19188 while (i < input.length) {
19189
19190 chr1 = input.charCodeAt(i++);
19191 chr2 = input.charCodeAt(i++);
19192 chr3 = input.charCodeAt(i++);
19193
19194 enc1 = chr1 >> 2;
19195 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
19196 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
19197 enc4 = chr3 & 63;
19198
19199 if (isNaN(chr2)) {
19200 enc3 = enc4 = 64;
19201 } else if (isNaN(chr3)) {
19202 enc4 = 64;
19203 }
19204
19205 output = output +
19206 _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
19207 _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
19208
19209 }
19210
19211 return output;
19212 },
19213
19214 // public method for decoding
19215 decode : function(input, utf8) {
19216 var output = "";
19217 var chr1, chr2, chr3;
19218 var enc1, enc2, enc3, enc4;
19219 var i = 0;
19220
19221 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
19222
19223 while (i < input.length) {
19224
19225 enc1 = _keyStr.indexOf(input.charAt(i++));
19226 enc2 = _keyStr.indexOf(input.charAt(i++));
19227 enc3 = _keyStr.indexOf(input.charAt(i++));
19228 enc4 = _keyStr.indexOf(input.charAt(i++));
19229
19230 chr1 = (enc1 << 2) | (enc2 >> 4);
19231 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
19232 chr3 = ((enc3 & 3) << 6) | enc4;
19233
19234 output = output + String.fromCharCode(chr1);
19235
19236 if (enc3 != 64) {
19237 output = output + String.fromCharCode(chr2);
19238 }
19239 if (enc4 != 64) {
19240 output = output + String.fromCharCode(chr3);
19241 }
19242
19243 }
19244
19245 return output;
19246
19247 }
19248 };
19249 }());
19250
19251 // enforcing Stuk's coding style
19252 // vim: set shiftwidth=3 softtabstop=3:
19253 /*
19254 * Port of a script by Masanao Izumo.
19255 *
19256 * Only changes : wrap all the variables in a function and add the
19257 * main function to JSZip (DEFLATE compression method).
19258 * Everything else was written by M. Izumo.
19259 *
19260 * Original code can be found here: http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt
19261 */
19262
19263 if(!JSZip) {
19264 throw "JSZip not defined";
19265 }
19266
19267 /*
19268 * Original:
19269 * http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt
19270 */
19271
19272 (function(){
19273
19274 /* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
19275 * Version: 1.0.1
19276 * LastModified: Dec 25 1999
19277 */
19278
19279 /* Interface:
19280 * data = zip_deflate(src);
19281 */
19282
19283 /* constant parameters */
19284 var zip_WSIZE = 32768; // Sliding Window size
19285 var zip_STORED_BLOCK = 0;
19286 var zip_STATIC_TREES = 1;
19287 var zip_DYN_TREES = 2;
19288
19289 /* for deflate */
19290 var zip_DEFAULT_LEVEL = 6;
19291 var zip_FULL_SEARCH = true;
19292 var zip_INBUFSIZ = 32768; // Input buffer size
19293 var zip_INBUF_EXTRA = 64; // Extra buffer
19294 var zip_OUTBUFSIZ = 1024 * 8;
19295 var zip_window_size = 2 * zip_WSIZE;
19296 var zip_MIN_MATCH = 3;
19297 var zip_MAX_MATCH = 258;
19298 var zip_BITS = 16;
19299 // for SMALL_MEM
19300 var zip_LIT_BUFSIZE = 0x2000;
19301 var zip_HASH_BITS = 13;
19302 // for MEDIUM_MEM
19303 // var zip_LIT_BUFSIZE = 0x4000;
19304 // var zip_HASH_BITS = 14;
19305 // for BIG_MEM
19306 // var zip_LIT_BUFSIZE = 0x8000;
19307 // var zip_HASH_BITS = 15;
19308 if(zip_LIT_BUFSIZE > zip_INBUFSIZ)
19309 alert("error: zip_INBUFSIZ is too small");
19310 if((zip_WSIZE<<1) > (1<<zip_BITS))
19311 alert("error: zip_WSIZE is too large");
19312 if(zip_HASH_BITS > zip_BITS-1)
19313 alert("error: zip_HASH_BITS is too large");
19314 if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258)
19315 alert("error: Code too clever");
19316 var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE;
19317 var zip_HASH_SIZE = 1 << zip_HASH_BITS;
19318 var zip_HASH_MASK = zip_HASH_SIZE - 1;
19319 var zip_WMASK = zip_WSIZE - 1;
19320 var zip_NIL = 0; // Tail of hash chains
19321 var zip_TOO_FAR = 4096;
19322 var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1;
19323 var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD;
19324 var zip_SMALLEST = 1;
19325 var zip_MAX_BITS = 15;
19326 var zip_MAX_BL_BITS = 7;
19327 var zip_LENGTH_CODES = 29;
19328 var zip_LITERALS =256;
19329 var zip_END_BLOCK = 256;
19330 var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES;
19331 var zip_D_CODES = 30;
19332 var zip_BL_CODES = 19;
19333 var zip_REP_3_6 = 16;
19334 var zip_REPZ_3_10 = 17;
19335 var zip_REPZ_11_138 = 18;
19336 var zip_HEAP_SIZE = 2 * zip_L_CODES + 1;
19337 var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) /
19338 zip_MIN_MATCH);
19339
19340 /* variables */
19341 var zip_free_queue;
19342 var zip_qhead, zip_qtail;
19343 var zip_initflag;
19344 var zip_outbuf = null;
19345 var zip_outcnt, zip_outoff;
19346 var zip_complete;
19347 var zip_window;
19348 var zip_d_buf;
19349 var zip_l_buf;
19350 var zip_prev;
19351 var zip_bi_buf;
19352 var zip_bi_valid;
19353 var zip_block_start;
19354 var zip_ins_h;
19355 var zip_hash_head;
19356 var zip_prev_match;
19357 var zip_match_available;
19358 var zip_match_length;
19359 var zip_prev_length;
19360 var zip_strstart;
19361 var zip_match_start;
19362 var zip_eofile;
19363 var zip_lookahead;
19364 var zip_max_chain_length;
19365 var zip_max_lazy_match;
19366 var zip_compr_level;
19367 var zip_good_match;
19368 var zip_nice_match;
19369 var zip_dyn_ltree;
19370 var zip_dyn_dtree;
19371 var zip_static_ltree;
19372 var zip_static_dtree;
19373 var zip_bl_tree;
19374 var zip_l_desc;
19375 var zip_d_desc;
19376 var zip_bl_desc;
19377 var zip_bl_count;
19378 var zip_heap;
19379 var zip_heap_len;
19380 var zip_heap_max;
19381 var zip_depth;
19382 var zip_length_code;
19383 var zip_dist_code;
19384 var zip_base_length;
19385 var zip_base_dist;
19386 var zip_flag_buf;
19387 var zip_last_lit;
19388 var zip_last_dist;
19389 var zip_last_flags;
19390 var zip_flags;
19391 var zip_flag_bit;
19392 var zip_opt_len;
19393 var zip_static_len;
19394 var zip_deflate_data;
19395 var zip_deflate_pos;
19396
19397 /* objects (deflate) */
19398
19399 var zip_DeflateCT = function() {
19400 this.fc = 0; // frequency count or bit string
19401 this.dl = 0; // father node in Huffman tree or length of bit string
19402 }
19403
19404 var zip_DeflateTreeDesc = function() {
19405 this.dyn_tree = null; // the dynamic tree
19406 this.static_tree = null; // corresponding static tree or NULL
19407 this.extra_bits = null; // extra bits for each code or NULL
19408 this.extra_base = 0; // base index for extra_bits
19409 this.elems = 0; // max number of elements in the tree
19410 this.max_length = 0; // max bit length for the codes
19411 this.max_code = 0; // largest code with non zero frequency
19412 }
19413
19414 /* Values for max_lazy_match, good_match and max_chain_length, depending on
19415 * the desired pack level (0..9). The values given below have been tuned to
19416 * exclude worst case performance for pathological files. Better values may be
19417 * found for specific files.
19418 */
19419 var zip_DeflateConfiguration = function(a, b, c, d) {
19420 this.good_length = a; // reduce lazy search above this match length
19421 this.max_lazy = b; // do not perform lazy search above this match length
19422 this.nice_length = c; // quit search above this match length
19423 this.max_chain = d;
19424 }
19425
19426 var zip_DeflateBuffer = function() {
19427 this.next = null;
19428 this.len = 0;
19429 this.ptr = new Array(zip_OUTBUFSIZ);
19430 this.off = 0;
19431 }
19432
19433 /* constant tables */
19434 var zip_extra_lbits = new Array(
19435 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);
19436 var zip_extra_dbits = new Array(
19437 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);
19438 var zip_extra_blbits = new Array(
19439 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7);
19440 var zip_bl_order = new Array(
19441 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15);
19442 var zip_configuration_table = new Array(
19443 new zip_DeflateConfiguration(0, 0, 0, 0),
19444 new zip_DeflateConfiguration(4, 4, 8, 4),
19445 new zip_DeflateConfiguration(4, 5, 16, 8),
19446 new zip_DeflateConfiguration(4, 6, 32, 32),
19447 new zip_DeflateConfiguration(4, 4, 16, 16),
19448 new zip_DeflateConfiguration(8, 16, 32, 32),
19449 new zip_DeflateConfiguration(8, 16, 128, 128),
19450 new zip_DeflateConfiguration(8, 32, 128, 256),
19451 new zip_DeflateConfiguration(32, 128, 258, 1024),
19452 new zip_DeflateConfiguration(32, 258, 258, 4096));
19453
19454
19455 /* routines (deflate) */
19456
19457 var zip_deflate_start = function(level) {
19458 var i;
19459
19460 if(!level)
19461 level = zip_DEFAULT_LEVEL;
19462 else if(level < 1)
19463 level = 1;
19464 else if(level > 9)
19465 level = 9;
19466
19467 zip_compr_level = level;
19468 zip_initflag = false;
19469 zip_eofile = false;
19470 if(zip_outbuf != null)
19471 return;
19472
19473 zip_free_queue = zip_qhead = zip_qtail = null;
19474 zip_outbuf = new Array(zip_OUTBUFSIZ);
19475 zip_window = new Array(zip_window_size);
19476 zip_d_buf = new Array(zip_DIST_BUFSIZE);
19477 zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA);
19478 zip_prev = new Array(1 << zip_BITS);
19479 zip_dyn_ltree = new Array(zip_HEAP_SIZE);
19480 for(i = 0; i < zip_HEAP_SIZE; i++)
19481 zip_dyn_ltree[i] = new zip_DeflateCT();
19482 zip_dyn_dtree = new Array(2*zip_D_CODES+1);
19483 for(i = 0; i < 2*zip_D_CODES+1; i++)
19484 zip_dyn_dtree[i] = new zip_DeflateCT();
19485 zip_static_ltree = new Array(zip_L_CODES+2);
19486 for(i = 0; i < zip_L_CODES+2; i++)
19487 zip_static_ltree[i] = new zip_DeflateCT();
19488 zip_static_dtree = new Array(zip_D_CODES);
19489 for(i = 0; i < zip_D_CODES; i++)
19490 zip_static_dtree[i] = new zip_DeflateCT();
19491 zip_bl_tree = new Array(2*zip_BL_CODES+1);
19492 for(i = 0; i < 2*zip_BL_CODES+1; i++)
19493 zip_bl_tree[i] = new zip_DeflateCT();
19494 zip_l_desc = new zip_DeflateTreeDesc();
19495 zip_d_desc = new zip_DeflateTreeDesc();
19496 zip_bl_desc = new zip_DeflateTreeDesc();
19497 zip_bl_count = new Array(zip_MAX_BITS+1);
19498 zip_heap = new Array(2*zip_L_CODES+1);
19499 zip_depth = new Array(2*zip_L_CODES+1);
19500 zip_length_code = new Array(zip_MAX_MATCH-zip_MIN_MATCH+1);
19501 zip_dist_code = new Array(512);
19502 zip_base_length = new Array(zip_LENGTH_CODES);
19503 zip_base_dist = new Array(zip_D_CODES);
19504 zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8));
19505 }
19506
19507 var zip_deflate_end = function() {
19508 zip_free_queue = zip_qhead = zip_qtail = null;
19509 zip_outbuf = null;
19510 zip_window = null;
19511 zip_d_buf = null;
19512 zip_l_buf = null;
19513 zip_prev = null;
19514 zip_dyn_ltree = null;
19515 zip_dyn_dtree = null;
19516 zip_static_ltree = null;
19517 zip_static_dtree = null;
19518 zip_bl_tree = null;
19519 zip_l_desc = null;
19520 zip_d_desc = null;
19521 zip_bl_desc = null;
19522 zip_bl_count = null;
19523 zip_heap = null;
19524 zip_depth = null;
19525 zip_length_code = null;
19526 zip_dist_code = null;
19527 zip_base_length = null;
19528 zip_base_dist = null;
19529 zip_flag_buf = null;
19530 }
19531
19532 var zip_reuse_queue = function(p) {
19533 p.next = zip_free_queue;
19534 zip_free_queue = p;
19535 }
19536
19537 var zip_new_queue = function() {
19538 var p;
19539
19540 if(zip_free_queue != null)
19541 {
19542 p = zip_free_queue;
19543 zip_free_queue = zip_free_queue.next;
19544 }
19545 else
19546 p = new zip_DeflateBuffer();
19547 p.next = null;
19548 p.len = p.off = 0;
19549
19550 return p;
19551 }
19552
19553 var zip_head1 = function(i) {
19554 return zip_prev[zip_WSIZE + i];
19555 }
19556
19557 var zip_head2 = function(i, val) {
19558 return zip_prev[zip_WSIZE + i] = val;
19559 }
19560
19561 /* put_byte is used for the compressed output, put_ubyte for the
19562 * uncompressed output. However unlzw() uses window for its
19563 * suffix table instead of its output buffer, so it does not use put_ubyte
19564 * (to be cleaned up).
19565 */
19566 var zip_put_byte = function(c) {
19567 zip_outbuf[zip_outoff + zip_outcnt++] = c;
19568 if(zip_outoff + zip_outcnt == zip_OUTBUFSIZ)
19569 zip_qoutbuf();
19570 }
19571
19572 /* Output a 16 bit value, lsb first */
19573 var zip_put_short = function(w) {
19574 w &= 0xffff;
19575 if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) {
19576 zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff);
19577 zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8);
19578 } else {
19579 zip_put_byte(w & 0xff);
19580 zip_put_byte(w >>> 8);
19581 }
19582 }
19583
19584 /* ==========================================================================
19585 * Insert string s in the dictionary and set match_head to the previous head
19586 * of the hash chain (the most recent string with same hash key). Return
19587 * the previous length of the hash chain.
19588 * IN assertion: all calls to to INSERT_STRING are made with consecutive
19589 * input characters and the first MIN_MATCH bytes of s are valid
19590 * (except for the last MIN_MATCH-1 bytes of the input file).
19591 */
19592 var zip_INSERT_STRING = function() {
19593 zip_ins_h = ((zip_ins_h << zip_H_SHIFT)
19594 ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff))
19595 & zip_HASH_MASK;
19596 zip_hash_head = zip_head1(zip_ins_h);
19597 zip_prev[zip_strstart & zip_WMASK] = zip_hash_head;
19598 zip_head2(zip_ins_h, zip_strstart);
19599 }
19600
19601 /* Send a code of the given tree. c and tree must not have side effects */
19602 var zip_SEND_CODE = function(c, tree) {
19603 zip_send_bits(tree[c].fc, tree[c].dl);
19604 }
19605
19606 /* Mapping from a distance to a distance code. dist is the distance - 1 and
19607 * must not have side effects. dist_code[256] and dist_code[257] are never
19608 * used.
19609 */
19610 var zip_D_CODE = function(dist) {
19611 return (dist < 256 ? zip_dist_code[dist]
19612 : zip_dist_code[256 + (dist>>7)]) & 0xff;
19613 }
19614
19615 /* ==========================================================================
19616 * Compares to subtrees, using the tree depth as tie breaker when
19617 * the subtrees have equal frequency. This minimizes the worst case length.
19618 */
19619 var zip_SMALLER = function(tree, n, m) {
19620 return tree[n].fc < tree[m].fc ||
19621 (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]);
19622 }
19623
19624 /* ==========================================================================
19625 * read string data
19626 */
19627 var zip_read_buff = function(buff, offset, n) {
19628 var i;
19629 for(i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++)
19630 buff[offset + i] =
19631 zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff;
19632 return i;
19633 }
19634
19635 /* ==========================================================================
19636 * Initialize the "longest match" routines for a new file
19637 */
19638 var zip_lm_init = function() {
19639 var j;
19640
19641 /* Initialize the hash table. */
19642 for(j = 0; j < zip_HASH_SIZE; j++)
19643 // zip_head2(j, zip_NIL);
19644 zip_prev[zip_WSIZE + j] = 0;
19645 /* prev will be initialized on the fly */
19646
19647 /* Set the default configuration parameters:
19648 */
19649 zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy;
19650 zip_good_match = zip_configuration_table[zip_compr_level].good_length;
19651 if(!zip_FULL_SEARCH)
19652 zip_nice_match = zip_configuration_table[zip_compr_level].nice_length;
19653 zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain;
19654
19655 zip_strstart = 0;
19656 zip_block_start = 0;
19657
19658 zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE);
19659 if(zip_lookahead <= 0) {
19660 zip_eofile = true;
19661 zip_lookahead = 0;
19662 return;
19663 }
19664 zip_eofile = false;
19665 /* Make sure that we always have enough lookahead. This is important
19666 * if input comes from a device such as a tty.
19667 */
19668 while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile)
19669 zip_fill_window();
19670
19671 /* If lookahead < MIN_MATCH, ins_h is garbage, but this is
19672 * not important since only literal bytes will be emitted.
19673 */
19674 zip_ins_h = 0;
19675 for(j = 0; j < zip_MIN_MATCH - 1; j++) {
19676 // UPDATE_HASH(ins_h, window[j]);
19677 zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK;
19678 }
19679 }
19680
19681 /* ==========================================================================
19682 * Set match_start to the longest match starting at the given string and
19683 * return its length. Matches shorter or equal to prev_length are discarded,
19684 * in which case the result is equal to prev_length and match_start is
19685 * garbage.
19686 * IN assertions: cur_match is the head of the hash chain for the current
19687 * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
19688 */
19689 var zip_longest_match = function(cur_match) {
19690 var chain_length = zip_max_chain_length; // max hash chain length
19691 var scanp = zip_strstart; // current string
19692 var matchp; // matched string
19693 var len; // length of current match
19694 var best_len = zip_prev_length; // best match length so far
19695
19696 /* Stop when cur_match becomes <= limit. To simplify the code,
19697 * we prevent matches with the string of window index 0.
19698 */
19699 var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL);
19700
19701 var strendp = zip_strstart + zip_MAX_MATCH;
19702 var scan_end1 = zip_window[scanp + best_len - 1];
19703 var scan_end = zip_window[scanp + best_len];
19704
19705 /* Do not waste too much time if we already have a good match: */
19706 if(zip_prev_length >= zip_good_match)
19707 chain_length >>= 2;
19708
19709 // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead");
19710
19711 do {
19712 // Assert(cur_match < encoder->strstart, "no future");
19713 matchp = cur_match;
19714
19715 /* Skip to next match if the match length cannot increase
19716 * or if the match length is less than 2:
19717 */
19718 if(zip_window[matchp + best_len] != scan_end ||
19719 zip_window[matchp + best_len - 1] != scan_end1 ||
19720 zip_window[matchp] != zip_window[scanp] ||
19721 zip_window[++matchp] != zip_window[scanp + 1]) {
19722 continue;
19723 }
19724
19725 /* The check at best_len-1 can be removed because it will be made
19726 * again later. (This heuristic is not always a win.)
19727 * It is not necessary to compare scan[2] and match[2] since they
19728 * are always equal when the other bytes match, given that
19729 * the hash keys are equal and that HASH_BITS >= 8.
19730 */
19731 scanp += 2;
19732 matchp++;
19733
19734 /* We check for insufficient lookahead only every 8th comparison;
19735 * the 256th check will be made at strstart+258.
19736 */
19737 do {
19738 } while(zip_window[++scanp] == zip_window[++matchp] &&
19739 zip_window[++scanp] == zip_window[++matchp] &&
19740 zip_window[++scanp] == zip_window[++matchp] &&
19741 zip_window[++scanp] == zip_window[++matchp] &&
19742 zip_window[++scanp] == zip_window[++matchp] &&
19743 zip_window[++scanp] == zip_window[++matchp] &&
19744 zip_window[++scanp] == zip_window[++matchp] &&
19745 zip_window[++scanp] == zip_window[++matchp] &&
19746 scanp < strendp);
19747
19748 len = zip_MAX_MATCH - (strendp - scanp);
19749 scanp = strendp - zip_MAX_MATCH;
19750
19751 if(len > best_len) {
19752 zip_match_start = cur_match;
19753 best_len = len;
19754 if(zip_FULL_SEARCH) {
19755 if(len >= zip_MAX_MATCH) break;
19756 } else {
19757 if(len >= zip_nice_match) break;
19758 }
19759
19760 scan_end1 = zip_window[scanp + best_len-1];
19761 scan_end = zip_window[scanp + best_len];
19762 }
19763 } while((cur_match = zip_prev[cur_match & zip_WMASK]) > limit
19764 && --chain_length != 0);
19765
19766 return best_len;
19767 }
19768
19769 /* ==========================================================================
19770 * Fill the window when the lookahead becomes insufficient.
19771 * Updates strstart and lookahead, and sets eofile if end of input file.
19772 * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0
19773 * OUT assertions: at least one byte has been read, or eofile is set;
19774 * file reads are performed for at least two bytes (required for the
19775 * translate_eol option).
19776 */
19777 var zip_fill_window = function() {
19778 var n, m;
19779
19780 // Amount of free space at the end of the window.
19781 var more = zip_window_size - zip_lookahead - zip_strstart;
19782
19783 /* If the window is almost full and there is insufficient lookahead,
19784 * move the upper half to the lower one to make room in the upper half.
19785 */
19786 if(more == -1) {
19787 /* Very unlikely, but possible on 16 bit machine if strstart == 0
19788 * and lookahead == 1 (input done one byte at time)
19789 */
19790 more--;
19791 } else if(zip_strstart >= zip_WSIZE + zip_MAX_DIST) {
19792 /* By the IN assertion, the window is not empty so we can't confuse
19793 * more == 0 with more == 64K on a 16 bit machine.
19794 */
19795 // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM");
19796
19797 // System.arraycopy(window, WSIZE, window, 0, WSIZE);
19798 for(n = 0; n < zip_WSIZE; n++)
19799 zip_window[n] = zip_window[n + zip_WSIZE];
19800
19801 zip_match_start -= zip_WSIZE;
19802 zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */
19803 zip_block_start -= zip_WSIZE;
19804
19805 for(n = 0; n < zip_HASH_SIZE; n++) {
19806 m = zip_head1(n);
19807 zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL);
19808 }
19809 for(n = 0; n < zip_WSIZE; n++) {
19810 /* If n is not on any hash chain, prev[n] is garbage but
19811 * its value will never be used.
19812 */
19813 m = zip_prev[n];
19814 zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL);
19815 }
19816 more += zip_WSIZE;
19817 }
19818 // At this point, more >= 2
19819 if(!zip_eofile) {
19820 n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more);
19821 if(n <= 0)
19822 zip_eofile = true;
19823 else
19824 zip_lookahead += n;
19825 }
19826 }
19827
19828 /* ==========================================================================
19829 * Processes a new input file and return its compressed length. This
19830 * function does not perform lazy evaluationof matches and inserts
19831 * new strings in the dictionary only for unmatched strings or for short
19832 * matches. It is used only for the fast compression options.
19833 */
19834 var zip_deflate_fast = function() {
19835 while(zip_lookahead != 0 && zip_qhead == null) {
19836 var flush; // set if current block must be flushed
19837
19838 /* Insert the string window[strstart .. strstart+2] in the
19839 * dictionary, and set hash_head to the head of the hash chain:
19840 */
19841 zip_INSERT_STRING();
19842
19843 /* Find the longest match, discarding those <= prev_length.
19844 * At this point we have always match_length < MIN_MATCH
19845 */
19846 if(zip_hash_head != zip_NIL &&
19847 zip_strstart - zip_hash_head <= zip_MAX_DIST) {
19848 /* To simplify the code, we prevent matches with the string
19849 * of window index 0 (in particular we have to avoid a match
19850 * of the string with itself at the start of the input file).
19851 */
19852 zip_match_length = zip_longest_match(zip_hash_head);
19853 /* longest_match() sets match_start */
19854 if(zip_match_length > zip_lookahead)
19855 zip_match_length = zip_lookahead;
19856 }
19857 if(zip_match_length >= zip_MIN_MATCH) {
19858 // check_match(strstart, match_start, match_length);
19859
19860 flush = zip_ct_tally(zip_strstart - zip_match_start,
19861 zip_match_length - zip_MIN_MATCH);
19862 zip_lookahead -= zip_match_length;
19863
19864 /* Insert new strings in the hash table only if the match length
19865 * is not too large. This saves time but degrades compression.
19866 */
19867 if(zip_match_length <= zip_max_lazy_match) {
19868 zip_match_length--; // string at strstart already in hash table
19869 do {
19870 zip_strstart++;
19871 zip_INSERT_STRING();
19872 /* strstart never exceeds WSIZE-MAX_MATCH, so there are
19873 * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
19874 * these bytes are garbage, but it does not matter since
19875 * the next lookahead bytes will be emitted as literals.
19876 */
19877 } while(--zip_match_length != 0);
19878 zip_strstart++;
19879 } else {
19880 zip_strstart += zip_match_length;
19881 zip_match_length = 0;
19882 zip_ins_h = zip_window[zip_strstart] & 0xff;
19883 // UPDATE_HASH(ins_h, window[strstart + 1]);
19884 zip_ins_h = ((zip_ins_h<<zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK;
19885
19886 //#if MIN_MATCH != 3
19887 // Call UPDATE_HASH() MIN_MATCH-3 more times
19888 //#endif
19889
19890 }
19891 } else {
19892 /* No match, output a literal byte */
19893 flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff);
19894 zip_lookahead--;
19895 zip_strstart++;
19896 }
19897 if(flush) {
19898 zip_flush_block(0);
19899 zip_block_start = zip_strstart;
19900 }
19901
19902 /* Make sure that we always have enough lookahead, except
19903 * at the end of the input file. We need MAX_MATCH bytes
19904 * for the next match, plus MIN_MATCH bytes to insert the
19905 * string following the next match.
19906 */
19907 while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile)
19908 zip_fill_window();
19909 }
19910 }
19911
19912 var zip_deflate_better = function() {
19913 /* Process the input block. */
19914 while(zip_lookahead != 0 && zip_qhead == null) {
19915 /* Insert the string window[strstart .. strstart+2] in the
19916 * dictionary, and set hash_head to the head of the hash chain:
19917 */
19918 zip_INSERT_STRING();
19919
19920 /* Find the longest match, discarding those <= prev_length.
19921 */
19922 zip_prev_length = zip_match_length;
19923 zip_prev_match = zip_match_start;
19924 zip_match_length = zip_MIN_MATCH - 1;
19925
19926 if(zip_hash_head != zip_NIL &&
19927 zip_prev_length < zip_max_lazy_match &&
19928 zip_strstart - zip_hash_head <= zip_MAX_DIST) {
19929 /* To simplify the code, we prevent matches with the string
19930 * of window index 0 (in particular we have to avoid a match
19931 * of the string with itself at the start of the input file).
19932 */
19933 zip_match_length = zip_longest_match(zip_hash_head);
19934 /* longest_match() sets match_start */
19935 if(zip_match_length > zip_lookahead)
19936 zip_match_length = zip_lookahead;
19937
19938 /* Ignore a length 3 match if it is too distant: */
19939 if(zip_match_length == zip_MIN_MATCH &&
19940 zip_strstart - zip_match_start > zip_TOO_FAR) {
19941 /* If prev_match is also MIN_MATCH, match_start is garbage
19942 * but we will ignore the current match anyway.
19943 */
19944 zip_match_length--;
19945 }
19946 }
19947 /* If there was a match at the previous step and the current
19948 * match is not better, output the previous match:
19949 */
19950 if(zip_prev_length >= zip_MIN_MATCH &&
19951 zip_match_length <= zip_prev_length) {
19952 var flush; // set if current block must be flushed
19953
19954 // check_match(strstart - 1, prev_match, prev_length);
19955 flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match,
19956 zip_prev_length - zip_MIN_MATCH);
19957
19958 /* Insert in hash table all strings up to the end of the match.
19959 * strstart-1 and strstart are already inserted.
19960 */
19961 zip_lookahead -= zip_prev_length - 1;
19962 zip_prev_length -= 2;
19963 do {
19964 zip_strstart++;
19965 zip_INSERT_STRING();
19966 /* strstart never exceeds WSIZE-MAX_MATCH, so there are
19967 * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
19968 * these bytes are garbage, but it does not matter since the
19969 * next lookahead bytes will always be emitted as literals.
19970 */
19971 } while(--zip_prev_length != 0);
19972 zip_match_available = 0;
19973 zip_match_length = zip_MIN_MATCH - 1;
19974 zip_strstart++;
19975 if(flush) {
19976 zip_flush_block(0);
19977 zip_block_start = zip_strstart;
19978 }
19979 } else if(zip_match_available != 0) {
19980 /* If there was no match at the previous position, output a
19981 * single literal. If there was a match but the current match
19982 * is longer, truncate the previous match to a single literal.
19983 */
19984 if(zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) {
19985 zip_flush_block(0);
19986 zip_block_start = zip_strstart;
19987 }
19988 zip_strstart++;
19989 zip_lookahead--;
19990 } else {
19991 /* There is no previous match to compare with, wait for
19992 * the next step to decide.
19993 */
19994 zip_match_available = 1;
19995 zip_strstart++;
19996 zip_lookahead--;
19997 }
19998
19999 /* Make sure that we always have enough lookahead, except
20000 * at the end of the input file. We need MAX_MATCH bytes
20001 * for the next match, plus MIN_MATCH bytes to insert the
20002 * string following the next match.
20003 */
20004 while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile)
20005 zip_fill_window();
20006 }
20007 }
20008
20009 var zip_init_deflate = function() {
20010 if(zip_eofile)
20011 return;
20012 zip_bi_buf = 0;
20013 zip_bi_valid = 0;
20014 zip_ct_init();
20015 zip_lm_init();
20016
20017 zip_qhead = null;
20018 zip_outcnt = 0;
20019 zip_outoff = 0;
20020
20021 if(zip_compr_level <= 3)
20022 {
20023 zip_prev_length = zip_MIN_MATCH - 1;
20024 zip_match_length = 0;
20025 }
20026 else
20027 {
20028 zip_match_length = zip_MIN_MATCH - 1;
20029 zip_match_available = 0;
20030 }
20031
20032 zip_complete = false;
20033 }
20034
20035 /* ==========================================================================
20036 * Same as above, but achieves better compression. We use a lazy
20037 * evaluation for matches: a match is finally adopted only if there is
20038 * no better match at the next window position.
20039 */
20040 var zip_deflate_internal = function(buff, off, buff_size) {
20041 var n;
20042
20043 if(!zip_initflag)
20044 {
20045 zip_init_deflate();
20046 zip_initflag = true;
20047 if(zip_lookahead == 0) { // empty
20048 zip_complete = true;
20049 return 0;
20050 }
20051 }
20052
20053 if((n = zip_qcopy(buff, off, buff_size)) == buff_size)
20054 return buff_size;
20055
20056 if(zip_complete)
20057 return n;
20058
20059 if(zip_compr_level <= 3) // optimized for speed
20060 zip_deflate_fast();
20061 else
20062 zip_deflate_better();
20063 if(zip_lookahead == 0) {
20064 if(zip_match_available != 0)
20065 zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff);
20066 zip_flush_block(1);
20067 zip_complete = true;
20068 }
20069 return n + zip_qcopy(buff, n + off, buff_size - n);
20070 }
20071
20072 var zip_qcopy = function(buff, off, buff_size) {
20073 var n, i, j;
20074
20075 n = 0;
20076 while(zip_qhead != null && n < buff_size)
20077 {
20078 i = buff_size - n;
20079 if(i > zip_qhead.len)
20080 i = zip_qhead.len;
20081 // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i);
20082 for(j = 0; j < i; j++)
20083 buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j];
20084
20085 zip_qhead.off += i;
20086 zip_qhead.len -= i;
20087 n += i;
20088 if(zip_qhead.len == 0) {
20089 var p;
20090 p = zip_qhead;
20091 zip_qhead = zip_qhead.next;
20092 zip_reuse_queue(p);
20093 }
20094 }
20095
20096 if(n == buff_size)
20097 return n;
20098
20099 if(zip_outoff < zip_outcnt) {
20100 i = buff_size - n;
20101 if(i > zip_outcnt - zip_outoff)
20102 i = zip_outcnt - zip_outoff;
20103 // System.arraycopy(outbuf, outoff, buff, off + n, i);
20104 for(j = 0; j < i; j++)
20105 buff[off + n + j] = zip_outbuf[zip_outoff + j];
20106 zip_outoff += i;
20107 n += i;
20108 if(zip_outcnt == zip_outoff)
20109 zip_outcnt = zip_outoff = 0;
20110 }
20111 return n;
20112 }
20113
20114 /* ==========================================================================
20115 * Allocate the match buffer, initialize the various tables and save the
20116 * location of the internal file attribute (ascii/binary) and method
20117 * (DEFLATE/STORE).
20118 */
20119 var zip_ct_init = function() {
20120 var n; // iterates over tree elements
20121 var bits; // bit counter
20122 var length; // length value
20123 var code; // code value
20124 var dist; // distance index
20125
20126 if(zip_static_dtree[0].dl != 0) return; // ct_init already called
20127
20128 zip_l_desc.dyn_tree = zip_dyn_ltree;
20129 zip_l_desc.static_tree = zip_static_ltree;
20130 zip_l_desc.extra_bits = zip_extra_lbits;
20131 zip_l_desc.extra_base = zip_LITERALS + 1;
20132 zip_l_desc.elems = zip_L_CODES;
20133 zip_l_desc.max_length = zip_MAX_BITS;
20134 zip_l_desc.max_code = 0;
20135
20136 zip_d_desc.dyn_tree = zip_dyn_dtree;
20137 zip_d_desc.static_tree = zip_static_dtree;
20138 zip_d_desc.extra_bits = zip_extra_dbits;
20139 zip_d_desc.extra_base = 0;
20140 zip_d_desc.elems = zip_D_CODES;
20141 zip_d_desc.max_length = zip_MAX_BITS;
20142 zip_d_desc.max_code = 0;
20143
20144 zip_bl_desc.dyn_tree = zip_bl_tree;
20145 zip_bl_desc.static_tree = null;
20146 zip_bl_desc.extra_bits = zip_extra_blbits;
20147 zip_bl_desc.extra_base = 0;
20148 zip_bl_desc.elems = zip_BL_CODES;
20149 zip_bl_desc.max_length = zip_MAX_BL_BITS;
20150 zip_bl_desc.max_code = 0;
20151
20152 // Initialize the mapping length (0..255) -> length code (0..28)
20153 length = 0;
20154 for(code = 0; code < zip_LENGTH_CODES-1; code++) {
20155 zip_base_length[code] = length;
20156 for(n = 0; n < (1<<zip_extra_lbits[code]); n++)
20157 zip_length_code[length++] = code;
20158 }
20159 // Assert (length == 256, "ct_init: length != 256");
20160
20161 /* Note that the length 255 (match length 258) can be represented
20162 * in two different ways: code 284 + 5 bits or code 285, so we
20163 * overwrite length_code[255] to use the best encoding:
20164 */
20165 zip_length_code[length-1] = code;
20166
20167 /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
20168 dist = 0;
20169 for(code = 0 ; code < 16; code++) {
20170 zip_base_dist[code] = dist;
20171 for(n = 0; n < (1<<zip_extra_dbits[code]); n++) {
20172 zip_dist_code[dist++] = code;
20173 }
20174 }
20175 // Assert (dist == 256, "ct_init: dist != 256");
20176 dist >>= 7; // from now on, all distances are divided by 128
20177 for( ; code < zip_D_CODES; code++) {
20178 zip_base_dist[code] = dist << 7;
20179 for(n = 0; n < (1<<(zip_extra_dbits[code]-7)); n++)
20180 zip_dist_code[256 + dist++] = code;
20181 }
20182 // Assert (dist == 256, "ct_init: 256+dist != 512");
20183
20184 // Construct the codes of the static literal tree
20185 for(bits = 0; bits <= zip_MAX_BITS; bits++)
20186 zip_bl_count[bits] = 0;
20187 n = 0;
20188 while(n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; }
20189 while(n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; }
20190 while(n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; }
20191 while(n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; }
20192 /* Codes 286 and 287 do not exist, but we must include them in the
20193 * tree construction to get a canonical Huffman tree (longest code
20194 * all ones)
20195 */
20196 zip_gen_codes(zip_static_ltree, zip_L_CODES + 1);
20197
20198 /* The static distance tree is trivial: */
20199 for(n = 0; n < zip_D_CODES; n++) {
20200 zip_static_dtree[n].dl = 5;
20201 zip_static_dtree[n].fc = zip_bi_reverse(n, 5);
20202 }
20203
20204 // Initialize the first block of the first file:
20205 zip_init_block();
20206 }
20207
20208 /* ==========================================================================
20209 * Initialize a new block.
20210 */
20211 var zip_init_block = function() {
20212 var n; // iterates over tree elements
20213
20214 // Initialize the trees.
20215 for(n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0;
20216 for(n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0;
20217 for(n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0;
20218
20219 zip_dyn_ltree[zip_END_BLOCK].fc = 1;
20220 zip_opt_len = zip_static_len = 0;
20221 zip_last_lit = zip_last_dist = zip_last_flags = 0;
20222 zip_flags = 0;
20223 zip_flag_bit = 1;
20224 }
20225
20226 /* ==========================================================================
20227 * Restore the heap property by moving down the tree starting at node k,
20228 * exchanging a node with the smallest of its two sons if necessary, stopping
20229 * when the heap property is re-established (each father smaller than its
20230 * two sons).
20231 */
20232 var zip_pqdownheap = function(
20233 tree, // the tree to restore
20234 k) { // node to move down
20235 var v = zip_heap[k];
20236 var j = k << 1; // left son of k
20237
20238 while(j <= zip_heap_len) {
20239 // Set j to the smallest of the two sons:
20240 if(j < zip_heap_len &&
20241 zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j]))
20242 j++;
20243
20244 // Exit if v is smaller than both sons
20245 if(zip_SMALLER(tree, v, zip_heap[j]))
20246 break;
20247
20248 // Exchange v with the smallest son
20249 zip_heap[k] = zip_heap[j];
20250 k = j;
20251
20252 // And continue down the tree, setting j to the left son of k
20253 j <<= 1;
20254 }
20255 zip_heap[k] = v;
20256 }
20257
20258 /* ==========================================================================
20259 * Compute the optimal bit lengths for a tree and update the total bit length
20260 * for the current block.
20261 * IN assertion: the fields freq and dad are set, heap[heap_max] and
20262 * above are the tree nodes sorted by increasing frequency.
20263 * OUT assertions: the field len is set to the optimal bit length, the
20264 * array bl_count contains the frequencies for each bit length.
20265 * The length opt_len is updated; static_len is also updated if stree is
20266 * not null.
20267 */
20268 var zip_gen_bitlen = function(desc) { // the tree descriptor
20269 var tree = desc.dyn_tree;
20270 var extra = desc.extra_bits;
20271 var base = desc.extra_base;
20272 var max_code = desc.max_code;
20273 var max_length = desc.max_length;
20274 var stree = desc.static_tree;
20275 var h; // heap index
20276 var n, m; // iterate over the tree elements
20277 var bits; // bit length
20278 var xbits; // extra bits
20279 var f; // frequency
20280 var overflow = 0; // number of elements with bit length too large
20281
20282 for(bits = 0; bits <= zip_MAX_BITS; bits++)
20283 zip_bl_count[bits] = 0;
20284
20285 /* In a first pass, compute the optimal bit lengths (which may
20286 * overflow in the case of the bit length tree).
20287 */
20288 tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap
20289
20290 for(h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) {
20291 n = zip_heap[h];
20292 bits = tree[tree[n].dl].dl + 1;
20293 if(bits > max_length) {
20294 bits = max_length;
20295 overflow++;
20296 }
20297 tree[n].dl = bits;
20298 // We overwrite tree[n].dl which is no longer needed
20299
20300 if(n > max_code)
20301 continue; // not a leaf node
20302
20303 zip_bl_count[bits]++;
20304 xbits = 0;
20305 if(n >= base)
20306 xbits = extra[n - base];
20307 f = tree[n].fc;
20308 zip_opt_len += f * (bits + xbits);
20309 if(stree != null)
20310 zip_static_len += f * (stree[n].dl + xbits);
20311 }
20312 if(overflow == 0)
20313 return;
20314
20315 // This happens for example on obj2 and pic of the Calgary corpus
20316
20317 // Find the first bit length which could increase:
20318 do {
20319 bits = max_length - 1;
20320 while(zip_bl_count[bits] == 0)
20321 bits--;
20322 zip_bl_count[bits]--; // move one leaf down the tree
20323 zip_bl_count[bits + 1] += 2; // move one overflow item as its brother
20324 zip_bl_count[max_length]--;
20325 /* The brother of the overflow item also moves one step up,
20326 * but this does not affect bl_count[max_length]
20327 */
20328 overflow -= 2;
20329 } while(overflow > 0);
20330
20331 /* Now recompute all bit lengths, scanning in increasing frequency.
20332 * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
20333 * lengths instead of fixing only the wrong ones. This idea is taken
20334 * from 'ar' written by Haruhiko Okumura.)
20335 */
20336 for(bits = max_length; bits != 0; bits--) {
20337 n = zip_bl_count[bits];
20338 while(n != 0) {
20339 m = zip_heap[--h];
20340 if(m > max_code)
20341 continue;
20342 if(tree[m].dl != bits) {
20343 zip_opt_len += (bits - tree[m].dl) * tree[m].fc;
20344 tree[m].fc = bits;
20345 }
20346 n--;
20347 }
20348 }
20349 }
20350
20351 /* ==========================================================================
20352 * Generate the codes for a given tree and bit counts (which need not be
20353 * optimal).
20354 * IN assertion: the array bl_count contains the bit length statistics for
20355 * the given tree and the field len is set for all tree elements.
20356 * OUT assertion: the field code is set for all tree elements of non
20357 * zero code length.
20358 */
20359 var zip_gen_codes = function(tree, // the tree to decorate
20360 max_code) { // largest code with non zero frequency
20361 var next_code = new Array(zip_MAX_BITS+1); // next code value for each bit length
20362 var code = 0; // running code value
20363 var bits; // bit index
20364 var n; // code index
20365
20366 /* The distribution counts are first used to generate the code values
20367 * without bit reversal.
20368 */
20369 for(bits = 1; bits <= zip_MAX_BITS; bits++) {
20370 code = ((code + zip_bl_count[bits-1]) << 1);
20371 next_code[bits] = code;
20372 }
20373
20374 /* Check that the bit counts in bl_count are consistent. The last code
20375 * must be all ones.
20376 */
20377 // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
20378 // "inconsistent bit counts");
20379 // Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
20380
20381 for(n = 0; n <= max_code; n++) {
20382 var len = tree[n].dl;
20383 if(len == 0)
20384 continue;
20385 // Now reverse the bits
20386 tree[n].fc = zip_bi_reverse(next_code[len]++, len);
20387
20388 // Tracec(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
20389 // n, (isgraph(n) ? n : ' '), len, tree[n].fc, next_code[len]-1));
20390 }
20391 }
20392
20393 /* ==========================================================================
20394 * Construct one Huffman tree and assigns the code bit strings and lengths.
20395 * Update the total bit length for the current block.
20396 * IN assertion: the field freq is set for all tree elements.
20397 * OUT assertions: the fields len and code are set to the optimal bit length
20398 * and corresponding code. The length opt_len is updated; static_len is
20399 * also updated if stree is not null. The field max_code is set.
20400 */
20401 var zip_build_tree = function(desc) { // the tree descriptor
20402 var tree = desc.dyn_tree;
20403 var stree = desc.static_tree;
20404 var elems = desc.elems;
20405 var n, m; // iterate over heap elements
20406 var max_code = -1; // largest code with non zero frequency
20407 var node = elems; // next internal node of the tree
20408
20409 /* Construct the initial heap, with least frequent element in
20410 * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
20411 * heap[0] is not used.
20412 */
20413 zip_heap_len = 0;
20414 zip_heap_max = zip_HEAP_SIZE;
20415
20416 for(n = 0; n < elems; n++) {
20417 if(tree[n].fc != 0) {
20418 zip_heap[++zip_heap_len] = max_code = n;
20419 zip_depth[n] = 0;
20420 } else
20421 tree[n].dl = 0;
20422 }
20423
20424 /* The pkzip format requires that at least one distance code exists,
20425 * and that at least one bit should be sent even if there is only one
20426 * possible code. So to avoid special checks later on we force at least
20427 * two codes of non zero frequency.
20428 */
20429 while(zip_heap_len < 2) {
20430 var xnew = zip_heap[++zip_heap_len] = (max_code < 2 ? ++max_code : 0);
20431 tree[xnew].fc = 1;
20432 zip_depth[xnew] = 0;
20433 zip_opt_len--;
20434 if(stree != null)
20435 zip_static_len -= stree[xnew].dl;
20436 // new is 0 or 1 so it does not have extra bits
20437 }
20438 desc.max_code = max_code;
20439
20440 /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
20441 * establish sub-heaps of increasing lengths:
20442 */
20443 for(n = zip_heap_len >> 1; n >= 1; n--)
20444 zip_pqdownheap(tree, n);
20445
20446 /* Construct the Huffman tree by repeatedly combining the least two
20447 * frequent nodes.
20448 */
20449 do {
20450 n = zip_heap[zip_SMALLEST];
20451 zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--];
20452 zip_pqdownheap(tree, zip_SMALLEST);
20453
20454 m = zip_heap[zip_SMALLEST]; // m = node of next least frequency
20455
20456 // keep the nodes sorted by frequency
20457 zip_heap[--zip_heap_max] = n;
20458 zip_heap[--zip_heap_max] = m;
20459
20460 // Create a new node father of n and m
20461 tree[node].fc = tree[n].fc + tree[m].fc;
20462 // depth[node] = (char)(MAX(depth[n], depth[m]) + 1);
20463 if(zip_depth[n] > zip_depth[m] + 1)
20464 zip_depth[node] = zip_depth[n];
20465 else
20466 zip_depth[node] = zip_depth[m] + 1;
20467 tree[n].dl = tree[m].dl = node;
20468
20469 // and insert the new node in the heap
20470 zip_heap[zip_SMALLEST] = node++;
20471 zip_pqdownheap(tree, zip_SMALLEST);
20472
20473 } while(zip_heap_len >= 2);
20474
20475 zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST];
20476
20477 /* At this point, the fields freq and dad are set. We can now
20478 * generate the bit lengths.
20479 */
20480 zip_gen_bitlen(desc);
20481
20482 // The field len is now set, we can generate the bit codes
20483 zip_gen_codes(tree, max_code);
20484 }
20485
20486 /* ==========================================================================
20487 * Scan a literal or distance tree to determine the frequencies of the codes
20488 * in the bit length tree. Updates opt_len to take into account the repeat
20489 * counts. (The contribution of the bit length codes will be added later
20490 * during the construction of bl_tree.)
20491 */
20492 var zip_scan_tree = function(tree,// the tree to be scanned
20493 max_code) { // and its largest code of non zero frequency
20494 var n; // iterates over all tree elements
20495 var prevlen = -1; // last emitted length
20496 var curlen; // length of current code
20497 var nextlen = tree[0].dl; // length of next code
20498 var count = 0; // repeat count of the current code
20499 var max_count = 7; // max repeat count
20500 var min_count = 4; // min repeat count
20501
20502 if(nextlen == 0) {
20503 max_count = 138;
20504 min_count = 3;
20505 }
20506 tree[max_code + 1].dl = 0xffff; // guard
20507
20508 for(n = 0; n <= max_code; n++) {
20509 curlen = nextlen;
20510 nextlen = tree[n + 1].dl;
20511 if(++count < max_count && curlen == nextlen)
20512 continue;
20513 else if(count < min_count)
20514 zip_bl_tree[curlen].fc += count;
20515 else if(curlen != 0) {
20516 if(curlen != prevlen)
20517 zip_bl_tree[curlen].fc++;
20518 zip_bl_tree[zip_REP_3_6].fc++;
20519 } else if(count <= 10)
20520 zip_bl_tree[zip_REPZ_3_10].fc++;
20521 else
20522 zip_bl_tree[zip_REPZ_11_138].fc++;
20523 count = 0; prevlen = curlen;
20524 if(nextlen == 0) {
20525 max_count = 138;
20526 min_count = 3;
20527 } else if(curlen == nextlen) {
20528 max_count = 6;
20529 min_count = 3;
20530 } else {
20531 max_count = 7;
20532 min_count = 4;
20533 }
20534 }
20535 }
20536
20537 /* ==========================================================================
20538 * Send a literal or distance tree in compressed form, using the codes in
20539 * bl_tree.
20540 */
20541 var zip_send_tree = function(tree, // the tree to be scanned
20542 max_code) { // and its largest code of non zero frequency
20543 var n; // iterates over all tree elements
20544 var prevlen = -1; // last emitted length
20545 var curlen; // length of current code
20546 var nextlen = tree[0].dl; // length of next code
20547 var count = 0; // repeat count of the current code
20548 var max_count = 7; // max repeat count
20549 var min_count = 4; // min repeat count
20550
20551 /* tree[max_code+1].dl = -1; */ /* guard already set */
20552 if(nextlen == 0) {
20553 max_count = 138;
20554 min_count = 3;
20555 }
20556
20557 for(n = 0; n <= max_code; n++) {
20558 curlen = nextlen;
20559 nextlen = tree[n+1].dl;
20560 if(++count < max_count && curlen == nextlen) {
20561 continue;
20562 } else if(count < min_count) {
20563 do { zip_SEND_CODE(curlen, zip_bl_tree); } while(--count != 0);
20564 } else if(curlen != 0) {
20565 if(curlen != prevlen) {
20566 zip_SEND_CODE(curlen, zip_bl_tree);
20567 count--;
20568 }
20569 // Assert(count >= 3 && count <= 6, " 3_6?");
20570 zip_SEND_CODE(zip_REP_3_6, zip_bl_tree);
20571 zip_send_bits(count - 3, 2);
20572 } else if(count <= 10) {
20573 zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree);
20574 zip_send_bits(count-3, 3);
20575 } else {
20576 zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree);
20577 zip_send_bits(count-11, 7);
20578 }
20579 count = 0;
20580 prevlen = curlen;
20581 if(nextlen == 0) {
20582 max_count = 138;
20583 min_count = 3;
20584 } else if(curlen == nextlen) {
20585 max_count = 6;
20586 min_count = 3;
20587 } else {
20588 max_count = 7;
20589 min_count = 4;
20590 }
20591 }
20592 }
20593
20594 /* ==========================================================================
20595 * Construct the Huffman tree for the bit lengths and return the index in
20596 * bl_order of the last bit length code to send.
20597 */
20598 var zip_build_bl_tree = function() {
20599 var max_blindex; // index of last bit length code of non zero freq
20600
20601 // Determine the bit length frequencies for literal and distance trees
20602 zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code);
20603 zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code);
20604
20605 // Build the bit length tree:
20606 zip_build_tree(zip_bl_desc);
20607 /* opt_len now includes the length of the tree representations, except
20608 * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
20609 */
20610
20611 /* Determine the number of bit length codes to send. The pkzip format
20612 * requires that at least 4 bit length codes be sent. (appnote.txt says
20613 * 3 but the actual value used is 4.)
20614 */
20615 for(max_blindex = zip_BL_CODES-1; max_blindex >= 3; max_blindex--) {
20616 if(zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break;
20617 }
20618 /* Update opt_len to include the bit length tree and counts */
20619 zip_opt_len += 3*(max_blindex+1) + 5+5+4;
20620 // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
20621 // encoder->opt_len, encoder->static_len));
20622
20623 return max_blindex;
20624 }
20625
20626 /* ==========================================================================
20627 * Send the header for a block using dynamic Huffman trees: the counts, the
20628 * lengths of the bit length codes, the literal tree and the distance tree.
20629 * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
20630 */
20631 var zip_send_all_trees = function(lcodes, dcodes, blcodes) { // number of codes for each tree
20632 var rank; // index in bl_order
20633
20634 // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
20635 // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
20636 // "too many codes");
20637 // Tracev((stderr, "\nbl counts: "));
20638 zip_send_bits(lcodes-257, 5); // not +255 as stated in appnote.txt
20639 zip_send_bits(dcodes-1, 5);
20640 zip_send_bits(blcodes-4, 4); // not -3 as stated in appnote.txt
20641 for(rank = 0; rank < blcodes; rank++) {
20642 // Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
20643 zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3);
20644 }
20645
20646 // send the literal tree
20647 zip_send_tree(zip_dyn_ltree,lcodes-1);
20648
20649 // send the distance tree
20650 zip_send_tree(zip_dyn_dtree,dcodes-1);
20651 }
20652
20653 /* ==========================================================================
20654 * Determine the best encoding for the current block: dynamic trees, static
20655 * trees or store, and output the encoded block to the zip file.
20656 */
20657 var zip_flush_block = function(eof) { // true if this is the last block for a file
20658 var opt_lenb, static_lenb; // opt_len and static_len in bytes
20659 var max_blindex; // index of last bit length code of non zero freq
20660 var stored_len; // length of input block
20661
20662 stored_len = zip_strstart - zip_block_start;
20663 zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items
20664
20665 // Construct the literal and distance trees
20666 zip_build_tree(zip_l_desc);
20667 // Tracev((stderr, "\nlit data: dyn %ld, stat %ld",
20668 // encoder->opt_len, encoder->static_len));
20669
20670 zip_build_tree(zip_d_desc);
20671 // Tracev((stderr, "\ndist data: dyn %ld, stat %ld",
20672 // encoder->opt_len, encoder->static_len));
20673 /* At this point, opt_len and static_len are the total bit lengths of
20674 * the compressed block data, excluding the tree representations.
20675 */
20676
20677 /* Build the bit length tree for the above two trees, and get the index
20678 * in bl_order of the last bit length code to send.
20679 */
20680 max_blindex = zip_build_bl_tree();
20681
20682 // Determine the best encoding. Compute first the block length in bytes
20683 opt_lenb = (zip_opt_len +3+7)>>3;
20684 static_lenb = (zip_static_len+3+7)>>3;
20685
20686 // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ",
20687 // opt_lenb, encoder->opt_len,
20688 // static_lenb, encoder->static_len, stored_len,
20689 // encoder->last_lit, encoder->last_dist));
20690
20691 if(static_lenb <= opt_lenb)
20692 opt_lenb = static_lenb;
20693 if(stored_len + 4 <= opt_lenb // 4: two words for the lengths
20694 && zip_block_start >= 0) {
20695 var i;
20696
20697 /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
20698 * Otherwise we can't have processed more than WSIZE input bytes since
20699 * the last block flush, because compression would have been
20700 * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
20701 * transform a block into a stored block.
20702 */
20703 zip_send_bits((zip_STORED_BLOCK<<1)+eof, 3); /* send block type */
20704 zip_bi_windup(); /* align on byte boundary */
20705 zip_put_short(stored_len);
20706 zip_put_short(~stored_len);
20707
20708 // copy block
20709 /*
20710 p = &window[block_start];
20711 for(i = 0; i < stored_len; i++)
20712 put_byte(p[i]);
20713 */
20714 for(i = 0; i < stored_len; i++)
20715 zip_put_byte(zip_window[zip_block_start + i]);
20716
20717 } else if(static_lenb == opt_lenb) {
20718 zip_send_bits((zip_STATIC_TREES<<1)+eof, 3);
20719 zip_compress_block(zip_static_ltree, zip_static_dtree);
20720 } else {
20721 zip_send_bits((zip_DYN_TREES<<1)+eof, 3);
20722 zip_send_all_trees(zip_l_desc.max_code+1,
20723 zip_d_desc.max_code+1,
20724 max_blindex+1);
20725 zip_compress_block(zip_dyn_ltree, zip_dyn_dtree);
20726 }
20727
20728 zip_init_block();
20729
20730 if(eof != 0)
20731 zip_bi_windup();
20732 }
20733
20734 /* ==========================================================================
20735 * Save the match info and tally the frequency counts. Return true if
20736 * the current block must be flushed.
20737 */
20738 var zip_ct_tally = function(
20739 dist, // distance of matched string
20740 lc) { // match length-MIN_MATCH or unmatched char (if dist==0)
20741 zip_l_buf[zip_last_lit++] = lc;
20742 if(dist == 0) {
20743 // lc is the unmatched char
20744 zip_dyn_ltree[lc].fc++;
20745 } else {
20746 // Here, lc is the match length - MIN_MATCH
20747 dist--; // dist = match distance - 1
20748 // Assert((ush)dist < (ush)MAX_DIST &&
20749 // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
20750 // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match");
20751
20752 zip_dyn_ltree[zip_length_code[lc]+zip_LITERALS+1].fc++;
20753 zip_dyn_dtree[zip_D_CODE(dist)].fc++;
20754
20755 zip_d_buf[zip_last_dist++] = dist;
20756 zip_flags |= zip_flag_bit;
20757 }
20758 zip_flag_bit <<= 1;
20759
20760 // Output the flags if they fill a byte
20761 if((zip_last_lit & 7) == 0) {
20762 zip_flag_buf[zip_last_flags++] = zip_flags;
20763 zip_flags = 0;
20764 zip_flag_bit = 1;
20765 }
20766 // Try to guess if it is profitable to stop the current block here
20767 if(zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) {
20768 // Compute an upper bound for the compressed length
20769 var out_length = zip_last_lit * 8;
20770 var in_length = zip_strstart - zip_block_start;
20771 var dcode;
20772
20773 for(dcode = 0; dcode < zip_D_CODES; dcode++) {
20774 out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]);
20775 }
20776 out_length >>= 3;
20777 // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ",
20778 // encoder->last_lit, encoder->last_dist, in_length, out_length,
20779 // 100L - out_length*100L/in_length));
20780 if(zip_last_dist < parseInt(zip_last_lit/2) &&
20781 out_length < parseInt(in_length/2))
20782 return true;
20783 }
20784 return (zip_last_lit == zip_LIT_BUFSIZE-1 ||
20785 zip_last_dist == zip_DIST_BUFSIZE);
20786 /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K
20787 * on 16 bit machines and because stored blocks are restricted to
20788 * 64K-1 bytes.
20789 */
20790 }
20791
20792 /* ==========================================================================
20793 * Send the block data compressed using the given Huffman trees
20794 */
20795 var zip_compress_block = function(
20796 ltree, // literal tree
20797 dtree) { // distance tree
20798 var dist; // distance of matched string
20799 var lc; // match length or unmatched char (if dist == 0)
20800 var lx = 0; // running index in l_buf
20801 var dx = 0; // running index in d_buf
20802 var fx = 0; // running index in flag_buf
20803 var flag = 0; // current flags
20804 var code; // the code to send
20805 var extra; // number of extra bits to send
20806
20807 if(zip_last_lit != 0) do {
20808 if((lx & 7) == 0)
20809 flag = zip_flag_buf[fx++];
20810 lc = zip_l_buf[lx++] & 0xff;
20811 if((flag & 1) == 0) {
20812 zip_SEND_CODE(lc, ltree); /* send a literal byte */
20813 // Tracecv(isgraph(lc), (stderr," '%c' ", lc));
20814 } else {
20815 // Here, lc is the match length - MIN_MATCH
20816 code = zip_length_code[lc];
20817 zip_SEND_CODE(code+zip_LITERALS+1, ltree); // send the length code
20818 extra = zip_extra_lbits[code];
20819 if(extra != 0) {
20820 lc -= zip_base_length[code];
20821 zip_send_bits(lc, extra); // send the extra length bits
20822 }
20823 dist = zip_d_buf[dx++];
20824 // Here, dist is the match distance - 1
20825 code = zip_D_CODE(dist);
20826 // Assert (code < D_CODES, "bad d_code");
20827
20828 zip_SEND_CODE(code, dtree); // send the distance code
20829 extra = zip_extra_dbits[code];
20830 if(extra != 0) {
20831 dist -= zip_base_dist[code];
20832 zip_send_bits(dist, extra); // send the extra distance bits
20833 }
20834 } // literal or match pair ?
20835 flag >>= 1;
20836 } while(lx < zip_last_lit);
20837
20838 zip_SEND_CODE(zip_END_BLOCK, ltree);
20839 }
20840
20841 /* ==========================================================================
20842 * Send a value on a given number of bits.
20843 * IN assertion: length <= 16 and value fits in length bits.
20844 */
20845 var zip_Buf_size = 16; // bit size of bi_buf
20846 var zip_send_bits = function(
20847 value, // value to send
20848 length) { // number of bits
20849 /* If not enough room in bi_buf, use (valid) bits from bi_buf and
20850 * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
20851 * unused bits in value.
20852 */
20853 if(zip_bi_valid > zip_Buf_size - length) {
20854 zip_bi_buf |= (value << zip_bi_valid);
20855 zip_put_short(zip_bi_buf);
20856 zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid));
20857 zip_bi_valid += length - zip_Buf_size;
20858 } else {
20859 zip_bi_buf |= value << zip_bi_valid;
20860 zip_bi_valid += length;
20861 }
20862 }
20863
20864 /* ==========================================================================
20865 * Reverse the first len bits of a code, using straightforward code (a faster
20866 * method would use a table)
20867 * IN assertion: 1 <= len <= 15
20868 */
20869 var zip_bi_reverse = function(
20870 code, // the value to invert
20871 len) { // its bit length
20872 var res = 0;
20873 do {
20874 res |= code & 1;
20875 code >>= 1;
20876 res <<= 1;
20877 } while(--len > 0);
20878 return res >> 1;
20879 }
20880
20881 /* ==========================================================================
20882 * Write out any remaining bits in an incomplete byte.
20883 */
20884 var zip_bi_windup = function() {
20885 if(zip_bi_valid > 8) {
20886 zip_put_short(zip_bi_buf);
20887 } else if(zip_bi_valid > 0) {
20888 zip_put_byte(zip_bi_buf);
20889 }
20890 zip_bi_buf = 0;
20891 zip_bi_valid = 0;
20892 }
20893
20894 var zip_qoutbuf = function() {
20895 if(zip_outcnt != 0) {
20896 var q, i;
20897 q = zip_new_queue();
20898 if(zip_qhead == null)
20899 zip_qhead = zip_qtail = q;
20900 else
20901 zip_qtail = zip_qtail.next = q;
20902 q.len = zip_outcnt - zip_outoff;
20903 // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len);
20904 for(i = 0; i < q.len; i++)
20905 q.ptr[i] = zip_outbuf[zip_outoff + i];
20906 zip_outcnt = zip_outoff = 0;
20907 }
20908 }
20909
20910 var zip_deflate = function(str, level) {
20911 var i, j;
20912
20913 zip_deflate_data = str;
20914 zip_deflate_pos = 0;
20915 if(typeof level == "undefined")
20916 level = zip_DEFAULT_LEVEL;
20917 zip_deflate_start(level);
20918
20919 var buff = new Array(1024);
20920 var aout = [];
20921 while((i = zip_deflate_internal(buff, 0, buff.length)) > 0) {
20922 var cbuf = new Array(i);
20923 for(j = 0; j < i; j++){
20924 cbuf[j] = String.fromCharCode(buff[j]);
20925 }
20926 aout[aout.length] = cbuf.join("");
20927 }
20928 zip_deflate_data = null; // G.C.
20929 return aout.join("");
20930 }
20931
20932 //
20933 // end of the script of Masanao Izumo.
20934 //
20935
20936 // we add the compression method for JSZip
20937 if(!JSZip.compressions["DEFLATE"]) {
20938 JSZip.compressions["DEFLATE"] = {
20939 magic : "\x08\x00",
20940 compress : zip_deflate
20941 }
20942 } else {
20943 JSZip.compressions["DEFLATE"].compress = zip_deflate;
20944 }
20945
20946 })();
20947
20948 // enforcing Stuk's coding style
20949 // vim: set shiftwidth=3 softtabstop=3:
20950 /*
20951 * Port of a script by Masanao Izumo.
20952 *
20953 * Only changes : wrap all the variables in a function and add the
20954 * main function to JSZip (DEFLATE compression method).
20955 * Everything else was written by M. Izumo.
20956 *
20957 * Original code can be found here: http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt
20958 */
20959
20960 if(!JSZip) {
20961 throw "JSZip not defined";
20962 }
20963
20964 /*
20965 * Original:
20966 * http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt
20967 */
20968
20969 (function(){
20970 // the original implementation leaks a global variable.
20971 // Defining the variable here doesn't break anything.
20972 var zip_fixed_bd;
20973
20974 /* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
20975 * Version: 1.0.0.1
20976 * LastModified: Dec 25 1999
20977 */
20978
20979 /* Interface:
20980 * data = zip_inflate(src);
20981 */
20982
20983 /* constant parameters */
20984 var zip_WSIZE = 32768; // Sliding Window size
20985 var zip_STORED_BLOCK = 0;
20986 var zip_STATIC_TREES = 1;
20987 var zip_DYN_TREES = 2;
20988
20989 /* for inflate */
20990 var zip_lbits = 9; // bits in base literal/length lookup table
20991 var zip_dbits = 6; // bits in base distance lookup table
20992 var zip_INBUFSIZ = 32768; // Input buffer size
20993 var zip_INBUF_EXTRA = 64; // Extra buffer
20994
20995 /* variables (inflate) */
20996 var zip_slide;
20997 var zip_wp; // current position in slide
20998 var zip_fixed_tl = null; // inflate static
20999 var zip_fixed_td; // inflate static
21000 var zip_fixed_bl, fixed_bd; // inflate static
21001 var zip_bit_buf; // bit buffer
21002 var zip_bit_len; // bits in bit buffer
21003 var zip_method;
21004 var zip_eof;
21005 var zip_copy_leng;
21006 var zip_copy_dist;
21007 var zip_tl, zip_td; // literal/length and distance decoder tables
21008 var zip_bl, zip_bd; // number of bits decoded by tl and td
21009
21010 var zip_inflate_data;
21011 var zip_inflate_pos;
21012
21013
21014 /* constant tables (inflate) */
21015 var zip_MASK_BITS = new Array(
21016 0x0000,
21017 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
21018 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff);
21019 // Tables for deflate from PKZIP's appnote.txt.
21020 var zip_cplens = new Array( // Copy lengths for literal codes 257..285
21021 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
21022 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0);
21023 /* note: see note #13 above about the 258 in this list. */
21024 var zip_cplext = new Array( // Extra bits for literal codes 257..285
21025 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
21026 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid
21027 var zip_cpdist = new Array( // Copy offsets for distance codes 0..29
21028 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
21029 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
21030 8193, 12289, 16385, 24577);
21031 var zip_cpdext = new Array( // Extra bits for distance codes
21032 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
21033 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
21034 12, 12, 13, 13);
21035 var zip_border = new Array( // Order of the bit length code lengths
21036 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);
21037 /* objects (inflate) */
21038
21039 function zip_HuftList() {
21040 this.next = null;
21041 this.list = null;
21042 }
21043
21044 function zip_HuftNode() {
21045 this.e = 0; // number of extra bits or operation
21046 this.b = 0; // number of bits in this code or subcode
21047
21048 // union
21049 this.n = 0; // literal, length base, or distance base
21050 this.t = null; // (zip_HuftNode) pointer to next level of table
21051 }
21052
21053 function zip_HuftBuild(b, // code lengths in bits (all assumed <= BMAX)
21054 n, // number of codes (assumed <= N_MAX)
21055 s, // number of simple-valued codes (0..s-1)
21056 d, // list of base values for non-simple codes
21057 e, // list of extra bits for non-simple codes
21058 mm // maximum lookup bits
21059 ) {
21060 this.BMAX = 16; // maximum bit length of any code
21061 this.N_MAX = 288; // maximum number of codes in any set
21062 this.status = 0; // 0: success, 1: incomplete table, 2: bad input
21063 this.root = null; // (zip_HuftList) starting table
21064 this.m = 0; // maximum lookup bits, returns actual
21065
21066 /* Given a list of code lengths and a maximum table size, make a set of
21067 tables to decode that set of codes. Return zero on success, one if
21068 the given code set is incomplete (the tables are still built in this
21069 case), two if the input is invalid (all zero length codes or an
21070 oversubscribed set of lengths), and three if not enough memory.
21071 The code with value 256 is special, and the tables are constructed
21072 so that no bits beyond that code are fetched when that code is
21073 decoded. */
21074 {
21075 var a; // counter for codes of length k
21076 var c = new Array(this.BMAX+1); // bit length count table
21077 var el; // length of EOB code (value 256)
21078 var f; // i repeats in table every f entries
21079 var g; // maximum code length
21080 var h; // table level
21081 var i; // counter, current code
21082 var j; // counter
21083 var k; // number of bits in current code
21084 var lx = new Array(this.BMAX+1); // stack of bits per table
21085 var p; // pointer into c[], b[], or v[]
21086 var pidx; // index of p
21087 var q; // (zip_HuftNode) points to current table
21088 var r = new zip_HuftNode(); // table entry for structure assignment
21089 var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack
21090 var v = new Array(this.N_MAX); // values in order of bit length
21091 var w;
21092 var x = new Array(this.BMAX+1);// bit offsets, then code stack
21093 var xp; // pointer into x or c
21094 var y; // number of dummy codes added
21095 var z; // number of entries in current table
21096 var o;
21097 var tail; // (zip_HuftList)
21098
21099 tail = this.root = null;
21100 for(i = 0; i < c.length; i++)
21101 c[i] = 0;
21102 for(i = 0; i < lx.length; i++)
21103 lx[i] = 0;
21104 for(i = 0; i < u.length; i++)
21105 u[i] = null;
21106 for(i = 0; i < v.length; i++)
21107 v[i] = 0;
21108 for(i = 0; i < x.length; i++)
21109 x[i] = 0;
21110
21111 // Generate counts for each bit length
21112 el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any
21113 p = b; pidx = 0;
21114 i = n;
21115 do {
21116 c[p[pidx]]++; // assume all entries <= BMAX
21117 pidx++;
21118 } while(--i > 0);
21119 if(c[0] == n) { // null input--all zero length codes
21120 this.root = null;
21121 this.m = 0;
21122 this.status = 0;
21123 return;
21124 }
21125
21126 // Find minimum and maximum length, bound *m by those
21127 for(j = 1; j <= this.BMAX; j++)
21128 if(c[j] != 0)
21129 break;
21130 k = j; // minimum code length
21131 if(mm < j)
21132 mm = j;
21133 for(i = this.BMAX; i != 0; i--)
21134 if(c[i] != 0)
21135 break;
21136 g = i; // maximum code length
21137 if(mm > i)
21138 mm = i;
21139
21140 // Adjust last length count to fill out codes, if needed
21141 for(y = 1 << j; j < i; j++, y <<= 1)
21142 if((y -= c[j]) < 0) {
21143 this.status = 2; // bad input: more codes than bits
21144 this.m = mm;
21145 return;
21146 }
21147 if((y -= c[i]) < 0) {
21148 this.status = 2;
21149 this.m = mm;
21150 return;
21151 }
21152 c[i] += y;
21153
21154 // Generate starting offsets into the value table for each length
21155 x[1] = j = 0;
21156 p = c;
21157 pidx = 1;
21158 xp = 2;
21159 while(--i > 0) // note that i == g from above
21160 x[xp++] = (j += p[pidx++]);
21161
21162 // Make a table of values in order of bit lengths
21163 p = b; pidx = 0;
21164 i = 0;
21165 do {
21166 if((j = p[pidx++]) != 0)
21167 v[x[j]++] = i;
21168 } while(++i < n);
21169 n = x[g]; // set n to length of v
21170
21171 // Generate the Huffman codes and for each, make the table entries
21172 x[0] = i = 0; // first Huffman code is zero
21173 p = v; pidx = 0; // grab values in bit order
21174 h = -1; // no tables yet--level -1
21175 w = lx[0] = 0; // no bits decoded yet
21176 q = null; // ditto
21177 z = 0; // ditto
21178
21179 // go through the bit lengths (k already is bits in shortest code)
21180 for(; k <= g; k++) {
21181 a = c[k];
21182 while(a-- > 0) {
21183 // here i is the Huffman code of length k bits for value p[pidx]
21184 // make tables up to required level
21185 while(k > w + lx[1 + h]) {
21186 w += lx[1 + h]; // add bits already decoded
21187 h++;
21188
21189 // compute minimum size table less than or equal to *m bits
21190 z = (z = g - w) > mm ? mm : z; // upper limit
21191 if((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table
21192 // too few codes for k-w bit table
21193 f -= a + 1; // deduct codes from patterns left
21194 xp = k;
21195 while(++j < z) { // try smaller tables up to z bits
21196 if((f <<= 1) <= c[++xp])
21197 break; // enough codes to use up j bits
21198 f -= c[xp]; // else deduct codes from patterns
21199 }
21200 }
21201 if(w + j > el && w < el)
21202 j = el - w; // make EOB code end at table
21203 z = 1 << j; // table entries for j-bit table
21204 lx[1 + h] = j; // set table size in stack
21205
21206 // allocate and link in new table
21207 q = new Array(z);
21208 for(o = 0; o < z; o++) {
21209 q[o] = new zip_HuftNode();
21210 }
21211
21212 if(tail == null)
21213 tail = this.root = new zip_HuftList();
21214 else
21215 tail = tail.next = new zip_HuftList();
21216 tail.next = null;
21217 tail.list = q;
21218 u[h] = q; // table starts after link
21219
21220 /* connect to last table, if there is one */
21221 if(h > 0) {
21222 x[h] = i; // save pattern for backing up
21223 r.b = lx[h]; // bits to dump before this table
21224 r.e = 16 + j; // bits in this table
21225 r.t = q; // pointer to this table
21226 j = (i & ((1 << w) - 1)) >> (w - lx[h]);
21227 u[h-1][j].e = r.e;
21228 u[h-1][j].b = r.b;
21229 u[h-1][j].n = r.n;
21230 u[h-1][j].t = r.t;
21231 }
21232 }
21233
21234 // set up table entry in r
21235 r.b = k - w;
21236 if(pidx >= n)
21237 r.e = 99; // out of values--invalid code
21238 else if(p[pidx] < s) {
21239 r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code
21240 r.n = p[pidx++]; // simple code is just the value
21241 } else {
21242 r.e = e[p[pidx] - s]; // non-simple--look up in lists
21243 r.n = d[p[pidx++] - s];
21244 }
21245
21246 // fill code-like entries with r //
21247 f = 1 << (k - w);
21248 for(j = i >> w; j < z; j += f) {
21249 q[j].e = r.e;
21250 q[j].b = r.b;
21251 q[j].n = r.n;
21252 q[j].t = r.t;
21253 }
21254
21255 // backwards increment the k-bit code i
21256 for(j = 1 << (k - 1); (i & j) != 0; j >>= 1)
21257 i ^= j;
21258 i ^= j;
21259
21260 // backup over finished tables
21261 while((i & ((1 << w) - 1)) != x[h]) {
21262 w -= lx[h]; // don't need to update q
21263 h--;
21264 }
21265 }
21266 }
21267
21268 /* return actual size of base table */
21269 this.m = lx[1];
21270
21271 /* Return true (1) if we were given an incomplete table */
21272 this.status = ((y != 0 && g != 1) ? 1 : 0);
21273 } /* end of constructor */
21274 }
21275
21276
21277 /* routines (inflate) */
21278
21279 function zip_GET_BYTE() {
21280 if(zip_inflate_data.length == zip_inflate_pos)
21281 return -1;
21282 return zip_inflate_data.charCodeAt(zip_inflate_pos++) & 0xff;
21283 }
21284
21285 function zip_NEEDBITS(n) {
21286 while(zip_bit_len < n) {
21287 zip_bit_buf |= zip_GET_BYTE() << zip_bit_len;
21288 zip_bit_len += 8;
21289 }
21290 }
21291
21292 function zip_GETBITS(n) {
21293 return zip_bit_buf & zip_MASK_BITS[n];
21294 }
21295
21296 function zip_DUMPBITS(n) {
21297 zip_bit_buf >>= n;
21298 zip_bit_len -= n;
21299 }
21300
21301 function zip_inflate_codes(buff, off, size) {
21302 /* inflate (decompress) the codes in a deflated (compressed) block.
21303 Return an error code or zero if it all goes ok. */
21304 var e; // table entry flag/number of extra bits
21305 var t; // (zip_HuftNode) pointer to table entry
21306 var n;
21307
21308 if(size == 0)
21309 return 0;
21310
21311 // inflate the coded data
21312 n = 0;
21313 for(;;) { // do until end of block
21314 zip_NEEDBITS(zip_bl);
21315 t = zip_tl.list[zip_GETBITS(zip_bl)];
21316 e = t.e;
21317 while(e > 16) {
21318 if(e == 99)
21319 return -1;
21320 zip_DUMPBITS(t.b);
21321 e -= 16;
21322 zip_NEEDBITS(e);
21323 t = t.t[zip_GETBITS(e)];
21324 e = t.e;
21325 }
21326 zip_DUMPBITS(t.b);
21327
21328 if(e == 16) { // then it's a literal
21329 zip_wp &= zip_WSIZE - 1;
21330 buff[off + n++] = zip_slide[zip_wp++] = t.n;
21331 if(n == size)
21332 return size;
21333 continue;
21334 }
21335
21336 // exit if end of block
21337 if(e == 15)
21338 break;
21339
21340 // it's an EOB or a length
21341
21342 // get length of block to copy
21343 zip_NEEDBITS(e);
21344 zip_copy_leng = t.n + zip_GETBITS(e);
21345 zip_DUMPBITS(e);
21346
21347 // decode distance of block to copy
21348 zip_NEEDBITS(zip_bd);
21349 t = zip_td.list[zip_GETBITS(zip_bd)];
21350 e = t.e;
21351
21352 while(e > 16) {
21353 if(e == 99)
21354 return -1;
21355 zip_DUMPBITS(t.b);
21356 e -= 16;
21357 zip_NEEDBITS(e);
21358 t = t.t[zip_GETBITS(e)];
21359 e = t.e;
21360 }
21361 zip_DUMPBITS(t.b);
21362 zip_NEEDBITS(e);
21363 zip_copy_dist = zip_wp - t.n - zip_GETBITS(e);
21364 zip_DUMPBITS(e);
21365
21366 // do the copy
21367 while(zip_copy_leng > 0 && n < size) {
21368 zip_copy_leng--;
21369 zip_copy_dist &= zip_WSIZE - 1;
21370 zip_wp &= zip_WSIZE - 1;
21371 buff[off + n++] = zip_slide[zip_wp++]
21372 = zip_slide[zip_copy_dist++];
21373 }
21374
21375 if(n == size)
21376 return size;
21377 }
21378
21379 zip_method = -1; // done
21380 return n;
21381 }
21382
21383 function zip_inflate_stored(buff, off, size) {
21384 /* "decompress" an inflated type 0 (stored) block. */
21385 var n;
21386
21387 // go to byte boundary
21388 n = zip_bit_len & 7;
21389 zip_DUMPBITS(n);
21390
21391 // get the length and its complement
21392 zip_NEEDBITS(16);
21393 n = zip_GETBITS(16);
21394 zip_DUMPBITS(16);
21395 zip_NEEDBITS(16);
21396 if(n != ((~zip_bit_buf) & 0xffff))
21397 return -1; // error in compressed data
21398 zip_DUMPBITS(16);
21399
21400 // read and output the compressed data
21401 zip_copy_leng = n;
21402
21403 n = 0;
21404 while(zip_copy_leng > 0 && n < size) {
21405 zip_copy_leng--;
21406 zip_wp &= zip_WSIZE - 1;
21407 zip_NEEDBITS(8);
21408 buff[off + n++] = zip_slide[zip_wp++] =
21409 zip_GETBITS(8);
21410 zip_DUMPBITS(8);
21411 }
21412
21413 if(zip_copy_leng == 0)
21414 zip_method = -1; // done
21415 return n;
21416 }
21417
21418 function zip_inflate_fixed(buff, off, size) {
21419 /* decompress an inflated type 1 (fixed Huffman codes) block. We should
21420 either replace this with a custom decoder, or at least precompute the
21421 Huffman tables. */
21422
21423 // if first time, set up tables for fixed blocks
21424 if(zip_fixed_tl == null) {
21425 var i; // temporary variable
21426 var l = new Array(288); // length list for huft_build
21427 var h; // zip_HuftBuild
21428
21429 // literal table
21430 for(i = 0; i < 144; i++)
21431 l[i] = 8;
21432 for(; i < 256; i++)
21433 l[i] = 9;
21434 for(; i < 280; i++)
21435 l[i] = 7;
21436 for(; i < 288; i++) // make a complete, but wrong code set
21437 l[i] = 8;
21438 zip_fixed_bl = 7;
21439
21440 h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext,
21441 zip_fixed_bl);
21442 if(h.status != 0) {
21443 alert("HufBuild error: "+h.status);
21444 return -1;
21445 }
21446 zip_fixed_tl = h.root;
21447 zip_fixed_bl = h.m;
21448
21449 // distance table
21450 for(i = 0; i < 30; i++) // make an incomplete code set
21451 l[i] = 5;
21452 zip_fixed_bd = 5;
21453
21454 h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd);
21455 if(h.status > 1) {
21456 zip_fixed_tl = null;
21457 alert("HufBuild error: "+h.status);
21458 return -1;
21459 }
21460 zip_fixed_td = h.root;
21461 zip_fixed_bd = h.m;
21462 }
21463
21464 zip_tl = zip_fixed_tl;
21465 zip_td = zip_fixed_td;
21466 zip_bl = zip_fixed_bl;
21467 zip_bd = zip_fixed_bd;
21468 return zip_inflate_codes(buff, off, size);
21469 }
21470
21471 function zip_inflate_dynamic(buff, off, size) {
21472 // decompress an inflated type 2 (dynamic Huffman codes) block.
21473 var i; // temporary variables
21474 var j;
21475 var l; // last length
21476 var n; // number of lengths to get
21477 var t; // (zip_HuftNode) literal/length code table
21478 var nb; // number of bit length codes
21479 var nl; // number of literal/length codes
21480 var nd; // number of distance codes
21481 var ll = new Array(286+30); // literal/length and distance code lengths
21482 var h; // (zip_HuftBuild)
21483
21484 for(i = 0; i < ll.length; i++)
21485 ll[i] = 0;
21486
21487 // read in table lengths
21488 zip_NEEDBITS(5);
21489 nl = 257 + zip_GETBITS(5); // number of literal/length codes
21490 zip_DUMPBITS(5);
21491 zip_NEEDBITS(5);
21492 nd = 1 + zip_GETBITS(5); // number of distance codes
21493 zip_DUMPBITS(5);
21494 zip_NEEDBITS(4);
21495 nb = 4 + zip_GETBITS(4); // number of bit length codes
21496 zip_DUMPBITS(4);
21497 if(nl > 286 || nd > 30)
21498 return -1; // bad lengths
21499
21500 // read in bit-length-code lengths
21501 for(j = 0; j < nb; j++)
21502 {
21503 zip_NEEDBITS(3);
21504 ll[zip_border[j]] = zip_GETBITS(3);
21505 zip_DUMPBITS(3);
21506 }
21507 for(; j < 19; j++)
21508 ll[zip_border[j]] = 0;
21509
21510 // build decoding table for trees--single level, 7 bit lookup
21511 zip_bl = 7;
21512 h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl);
21513 if(h.status != 0)
21514 return -1; // incomplete code set
21515
21516 zip_tl = h.root;
21517 zip_bl = h.m;
21518
21519 // read in literal and distance code lengths
21520 n = nl + nd;
21521 i = l = 0;
21522 while(i < n) {
21523 zip_NEEDBITS(zip_bl);
21524 t = zip_tl.list[zip_GETBITS(zip_bl)];
21525 j = t.b;
21526 zip_DUMPBITS(j);
21527 j = t.n;
21528 if(j < 16) // length of code in bits (0..15)
21529 ll[i++] = l = j; // save last length in l
21530 else if(j == 16) { // repeat last length 3 to 6 times
21531 zip_NEEDBITS(2);
21532 j = 3 + zip_GETBITS(2);
21533 zip_DUMPBITS(2);
21534 if(i + j > n)
21535 return -1;
21536 while(j-- > 0)
21537 ll[i++] = l;
21538 } else if(j == 17) { // 3 to 10 zero length codes
21539 zip_NEEDBITS(3);
21540 j = 3 + zip_GETBITS(3);
21541 zip_DUMPBITS(3);
21542 if(i + j > n)
21543 return -1;
21544 while(j-- > 0)
21545 ll[i++] = 0;
21546 l = 0;
21547 } else { // j == 18: 11 to 138 zero length codes
21548 zip_NEEDBITS(7);
21549 j = 11 + zip_GETBITS(7);
21550 zip_DUMPBITS(7);
21551 if(i + j > n)
21552 return -1;
21553 while(j-- > 0)
21554 ll[i++] = 0;
21555 l = 0;
21556 }
21557 }
21558
21559 // build the decoding tables for literal/length and distance codes
21560 zip_bl = zip_lbits;
21561 h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl);
21562 if(zip_bl == 0) // no literals or lengths
21563 h.status = 1;
21564 if(h.status != 0) {
21565 if(h.status == 1)
21566 ;// **incomplete literal tree**
21567 return -1; // incomplete code set
21568 }
21569 zip_tl = h.root;
21570 zip_bl = h.m;
21571
21572 for(i = 0; i < nd; i++)
21573 ll[i] = ll[i + nl];
21574 zip_bd = zip_dbits;
21575 h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd);
21576 zip_td = h.root;
21577 zip_bd = h.m;
21578
21579 if(zip_bd == 0 && nl > 257) { // lengths but no distances
21580 // **incomplete distance tree**
21581 return -1;
21582 }
21583
21584 if(h.status == 1) {
21585 ;// **incomplete distance tree**
21586 }
21587 if(h.status != 0)
21588 return -1;
21589
21590 // decompress until an end-of-block code
21591 return zip_inflate_codes(buff, off, size);
21592 }
21593
21594 function zip_inflate_start() {
21595 var i;
21596
21597 if(zip_slide == null)
21598 zip_slide = new Array(2 * zip_WSIZE);
21599 zip_wp = 0;
21600 zip_bit_buf = 0;
21601 zip_bit_len = 0;
21602 zip_method = -1;
21603 zip_eof = false;
21604 zip_copy_leng = zip_copy_dist = 0;
21605 zip_tl = null;
21606 }
21607
21608 function zip_inflate_internal(buff, off, size) {
21609 // decompress an inflated entry
21610 var n, i;
21611
21612 n = 0;
21613 while(n < size) {
21614 if(zip_eof && zip_method == -1)
21615 return n;
21616
21617 if(zip_copy_leng > 0) {
21618 if(zip_method != zip_STORED_BLOCK) {
21619 // STATIC_TREES or DYN_TREES
21620 while(zip_copy_leng > 0 && n < size) {
21621 zip_copy_leng--;
21622 zip_copy_dist &= zip_WSIZE - 1;
21623 zip_wp &= zip_WSIZE - 1;
21624 buff[off + n++] = zip_slide[zip_wp++] =
21625 zip_slide[zip_copy_dist++];
21626 }
21627 } else {
21628 while(zip_copy_leng > 0 && n < size) {
21629 zip_copy_leng--;
21630 zip_wp &= zip_WSIZE - 1;
21631 zip_NEEDBITS(8);
21632 buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8);
21633 zip_DUMPBITS(8);
21634 }
21635 if(zip_copy_leng == 0)
21636 zip_method = -1; // done
21637 }
21638 if(n == size)
21639 return n;
21640 }
21641
21642 if(zip_method == -1) {
21643 if(zip_eof)
21644 break;
21645
21646 // read in last block bit
21647 zip_NEEDBITS(1);
21648 if(zip_GETBITS(1) != 0)
21649 zip_eof = true;
21650 zip_DUMPBITS(1);
21651
21652 // read in block type
21653 zip_NEEDBITS(2);
21654 zip_method = zip_GETBITS(2);
21655 zip_DUMPBITS(2);
21656 zip_tl = null;
21657 zip_copy_leng = 0;
21658 }
21659
21660 switch(zip_method) {
21661 case 0: // zip_STORED_BLOCK
21662 i = zip_inflate_stored(buff, off + n, size - n);
21663 break;
21664
21665 case 1: // zip_STATIC_TREES
21666 if(zip_tl != null)
21667 i = zip_inflate_codes(buff, off + n, size - n);
21668 else
21669 i = zip_inflate_fixed(buff, off + n, size - n);
21670 break;
21671
21672 case 2: // zip_DYN_TREES
21673 if(zip_tl != null)
21674 i = zip_inflate_codes(buff, off + n, size - n);
21675 else
21676 i = zip_inflate_dynamic(buff, off + n, size - n);
21677 break;
21678
21679 default: // error
21680 i = -1;
21681 break;
21682 }
21683
21684 if(i == -1) {
21685 if(zip_eof)
21686 return 0;
21687 return -1;
21688 }
21689 n += i;
21690 }
21691 return n;
21692 }
21693
21694 function zip_inflate(str) {
21695 var out, buff;
21696 var i, j;
21697
21698 zip_inflate_start();
21699 zip_inflate_data = str;
21700 zip_inflate_pos = 0;
21701
21702 buff = new Array(1024);
21703 out = "";
21704 while((i = zip_inflate_internal(buff, 0, buff.length)) > 0) {
21705 for(j = 0; j < i; j++)
21706 out += String.fromCharCode(buff[j]);
21707 }
21708 zip_inflate_data = null; // G.C.
21709 return out;
21710 }
21711
21712 //
21713 // end of the script of Masanao Izumo.
21714 //
21715
21716 // we add the compression method for JSZip
21717 if(!JSZip.compressions["DEFLATE"]) {
21718 JSZip.compressions["DEFLATE"] = {
21719 magic : "\x08\x00",
21720 uncompress : zip_inflate
21721 }
21722 } else {
21723 JSZip.compressions["DEFLATE"].uncompress = zip_inflate;
21724 }
21725
21726 })();
21727
21728 // enforcing Stuk's coding style
21729 // vim: set shiftwidth=3 softtabstop=3:
21730 /**
21731
21732 JSZip - A Javascript class for generating and reading zip files
21733 <http://stuartk.com/jszip>
21734
21735 (c) 2011 David Duponchel <d.duponchel@gmail.com>
21736 Dual licenced under the MIT license or GPLv3. See LICENSE.markdown.
21737
21738 **/
21739 /*global JSZip,JSZipBase64 */
21740 (function () {
21741
21742 var MAX_VALUE_16BITS = 65535;
21743 var MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
21744
21745 /**
21746 * Prettify a string read as binary.
21747 * @param {string} str the string to prettify.
21748 * @return {string} a pretty string.
21749 */
21750 var pretty = function (str) {
21751 var res = '', code, i;
21752 for (i = 0; i < (str||"").length; i++) {
21753 code = str.charCodeAt(i);
21754 res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
21755 }
21756 return res;
21757 };
21758
21759 /**
21760 * Find a compression registered in JSZip.
21761 * @param {string} compressionMethod the method magic to find.
21762 * @return {Object|null} the JSZip compression object, null if none found.
21763 */
21764 var findCompression = function (compressionMethod) {
21765 for (var method in JSZip.compressions) {
21766 if( !JSZip.compressions.hasOwnProperty(method) ) { continue; }
21767 if (JSZip.compressions[method].magic === compressionMethod) {
21768 return JSZip.compressions[method];
21769 }
21770 }
21771 return null;
21772 };
21773
21774 // class StreamReader {{{
21775 /**
21776 * Read bytes from a stream.
21777 * Developer tip : when debugging, a watch on pretty(this.reader.stream.slice(this.reader.index))
21778 * is very useful :)
21779 * @constructor
21780 * @param {String|ArrayBuffer|Uint8Array} stream the stream to read.
21781 */
21782 function StreamReader(stream) {
21783 this.stream = "";
21784 if (JSZip.support.uint8array && stream instanceof Uint8Array) {
21785 this.stream = JSZip.utils.uint8Array2String(stream);
21786 } else if (JSZip.support.arraybuffer && stream instanceof ArrayBuffer) {
21787 var bufferView = new Uint8Array(stream);
21788 this.stream = JSZip.utils.uint8Array2String(bufferView);
21789 } else {
21790 this.stream = JSZip.utils.string2binary(stream);
21791 }
21792 this.index = 0;
21793 }
21794 StreamReader.prototype = {
21795 /**
21796 * Check that the offset will not go too far.
21797 * @param {string} offset the additional offset to check.
21798 * @throws {Error} an Error if the offset is out of bounds.
21799 */
21800 checkOffset : function (offset) {
21801 this.checkIndex(this.index + offset);
21802 },
21803 /**
21804 * Check that the specifed index will not be too far.
21805 * @param {string} newIndex the index to check.
21806 * @throws {Error} an Error if the index is out of bounds.
21807 */
21808 checkIndex : function (newIndex) {
21809 if (this.stream.length < newIndex || newIndex < 0) {
21810 throw new Error("End of stream reached (stream length = " +
21811 this.stream.length + ", asked index = " +
21812 (newIndex) + "). Corrupted zip ?");
21813 }
21814 },
21815 /**
21816 * Change the index.
21817 * @param {number} newIndex The new index.
21818 * @throws {Error} if the new index is out of the stream.
21819 */
21820 setIndex : function (newIndex) {
21821 this.checkIndex(newIndex);
21822 this.index = newIndex;
21823 },
21824 /**
21825 * Skip the next n bytes.
21826 * @param {number} n the number of bytes to skip.
21827 * @throws {Error} if the new index is out of the stream.
21828 */
21829 skip : function (n) {
21830 this.setIndex(this.index + n);
21831 },
21832 /**
21833 * Get the byte at the specified index.
21834 * @param {number} i the index to use.
21835 * @return {number} a byte.
21836 */
21837 byteAt : function(i) {
21838 return this.stream.charCodeAt(i);
21839 },
21840 /**
21841 * Get the next number with a given byte size.
21842 * @param {number} size the number of bytes to read.
21843 * @return {number} the corresponding number.
21844 */
21845 readInt : function (size) {
21846 var result = 0, i;
21847 this.checkOffset(size);
21848 for(i = this.index + size - 1; i >= this.index; i--) {
21849 result = (result << 8) + this.byteAt(i);
21850 }
21851 this.index += size;
21852 return result;
21853 },
21854 /**
21855 * Get the next string with a given byte size.
21856 * @param {number} size the number of bytes to read.
21857 * @return {string} the corresponding string.
21858 */
21859 readString : function (size) {
21860 this.checkOffset(size);
21861 // this will work because the constructor applied the "& 0xff" mask.
21862 var result = this.stream.slice(this.index, this.index + size);
21863 this.index += size;
21864 return result;
21865 },
21866 /**
21867 * Get the next date.
21868 * @return {Date} the date.
21869 */
21870 readDate : function () {
21871 var dostime = this.readInt(4);
21872 return new Date(
21873 ((dostime >> 25) & 0x7f) + 1980, // year
21874 ((dostime >> 21) & 0x0f) - 1, // month
21875 (dostime >> 16) & 0x1f, // day
21876 (dostime >> 11) & 0x1f, // hour
21877 (dostime >> 5) & 0x3f, // minute
21878 (dostime & 0x1f) << 1); // second
21879 }
21880 };
21881 // }}} end of StreamReader
21882
21883 // class ZipEntry {{{
21884 /**
21885 * An entry in the zip file.
21886 * @constructor
21887 * @param {Object} options Options of the current file.
21888 * @param {Object} loadOptions Options for loading the stream.
21889 */
21890 function ZipEntry(options, loadOptions) {
21891 this.options = options;
21892 this.loadOptions = loadOptions;
21893 }
21894 ZipEntry.prototype = {
21895 /**
21896 * say if the file is encrypted.
21897 * @return {boolean} true if the file is encrypted, false otherwise.
21898 */
21899 isEncrypted : function () {
21900 // bit 1 is set
21901 return (this.bitFlag & 0x0001) === 0x0001;
21902 },
21903 /**
21904 * say if the file has utf-8 filename/comment.
21905 * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
21906 */
21907 useUTF8 : function () {
21908 // bit 11 is set
21909 return (this.bitFlag & 0x0800) === 0x0800;
21910 },
21911 /**
21912 * Read the local part of a zip file and add the info in this object.
21913 * @param {StreamReader} reader the reader to use.
21914 */
21915 readLocalPart : function(reader) {
21916 var compression, localExtraFieldsLength;
21917
21918 // we already know everything from the central dir !
21919 // If the central dir data are false, we are doomed.
21920 // On the bright side, the local part is scary : zip64, data descriptors, both, etc.
21921 // The less data we get here, the more reliable this should be.
21922 // Let's skip the whole header and dash to the data !
21923 reader.skip(22);
21924 // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
21925 // Strangely, the filename here is OK.
21926 // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
21927 // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
21928 // Search "unzip mismatching "local" filename continuing with "central" filename version" on
21929 // the internet.
21930 //
21931 // I think I see the logic here : the central directory is used to display
21932 // content and the local directory is used to extract the files. Mixing / and \
21933 // may be used to display \ to windows users and use / when extracting the files.
21934 // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
21935 this.fileNameLength = reader.readInt(2);
21936 localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
21937 this.fileName = reader.readString(this.fileNameLength);
21938 reader.skip(localExtraFieldsLength);
21939
21940 if (this.compressedSize == -1 || this.uncompressedSize == -1) {
21941 throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " +
21942 "(compressedSize == -1 || uncompressedSize == -1)");
21943 }
21944 this.compressedFileData = reader.readString(this.compressedSize);
21945
21946 compression = findCompression(this.compressionMethod);
21947 if (compression === null) { // no compression found
21948 throw new Error("Corrupted zip : compression " + pretty(this.compressionMethod) +
21949 " unknown (inner file : " + this.fileName + ")");
21950 }
21951 this.uncompressedFileData = compression.uncompress(this.compressedFileData);
21952
21953 if (this.uncompressedFileData.length !== this.uncompressedSize) {
21954 throw new Error("Bug : uncompressed data size mismatch");
21955 }
21956
21957 if (this.loadOptions.checkCRC32 && JSZip.prototype.crc32(this.uncompressedFileData) !== this.crc32) {
21958 throw new Error("Corrupted zip : CRC32 mismatch");
21959 }
21960 },
21961
21962 /**
21963 * Read the central part of a zip file and add the info in this object.
21964 * @param {StreamReader} reader the reader to use.
21965 */
21966 readCentralPart : function(reader) {
21967 this.versionMadeBy = reader.readString(2);
21968 this.versionNeeded = reader.readInt(2);
21969 this.bitFlag = reader.readInt(2);
21970 this.compressionMethod = reader.readString(2);
21971 this.date = reader.readDate();
21972 this.crc32 = reader.readInt(4);
21973 this.compressedSize = reader.readInt(4);
21974 this.uncompressedSize = reader.readInt(4);
21975 this.fileNameLength = reader.readInt(2);
21976 this.extraFieldsLength = reader.readInt(2);
21977 this.fileCommentLength = reader.readInt(2);
21978 this.diskNumberStart = reader.readInt(2);
21979 this.internalFileAttributes = reader.readInt(2);
21980 this.externalFileAttributes = reader.readInt(4);
21981 this.localHeaderOffset = reader.readInt(4);
21982
21983 if (this.isEncrypted()) {
21984 throw new Error("Encrypted zip are not supported");
21985 }
21986
21987 this.fileName = reader.readString(this.fileNameLength);
21988 this.readExtraFields(reader);
21989 this.parseZIP64ExtraField(reader);
21990 this.fileComment = reader.readString(this.fileCommentLength);
21991
21992 // warning, this is true only for zip with madeBy == DOS (plateform dependent feature)
21993 this.dir = this.externalFileAttributes & 0x00000010 ? true : false;
21994 },
21995 /**
21996 * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
21997 * @param {StreamReader} reader the reader to use.
21998 */
21999 parseZIP64ExtraField : function(reader) {
22000
22001 if(!this.extraFields[0x0001]) {
22002 return;
22003 }
22004
22005 // should be something, preparing the extra reader
22006 var extraReader = new StreamReader(this.extraFields[0x0001].value);
22007
22008 // I really hope that these 64bits integer can fit in 32 bits integer, because js
22009 // won't let us have more.
22010 if(this.uncompressedSize === MAX_VALUE_32BITS) {
22011 this.uncompressedSize = extraReader.readInt(8);
22012 }
22013 if(this.compressedSize === MAX_VALUE_32BITS) {
22014 this.compressedSize = extraReader.readInt(8);
22015 }
22016 if(this.localHeaderOffset === MAX_VALUE_32BITS) {
22017 this.localHeaderOffset = extraReader.readInt(8);
22018 }
22019 if(this.diskNumberStart === MAX_VALUE_32BITS) {
22020 this.diskNumberStart = extraReader.readInt(4);
22021 }
22022 },
22023 /**
22024 * Read the central part of a zip file and add the info in this object.
22025 * @param {StreamReader} reader the reader to use.
22026 */
22027 readExtraFields : function(reader) {
22028 var start = reader.index,
22029 extraFieldId,
22030 extraFieldLength,
22031 extraFieldValue;
22032
22033 this.extraFields = this.extraFields || {};
22034
22035 while (reader.index < start + this.extraFieldsLength) {
22036 extraFieldId = reader.readInt(2);
22037 extraFieldLength = reader.readInt(2);
22038 extraFieldValue = reader.readString(extraFieldLength);
22039
22040 this.extraFields[extraFieldId] = {
22041 id: extraFieldId,
22042 length: extraFieldLength,
22043 value: extraFieldValue
22044 };
22045 }
22046 },
22047 /**
22048 * Apply an UTF8 transformation if needed.
22049 */
22050 handleUTF8 : function() {
22051 if (this.useUTF8()) {
22052 this.fileName = JSZip.prototype.utf8decode(this.fileName);
22053 this.fileComment = JSZip.prototype.utf8decode(this.fileComment);
22054 }
22055 }
22056 };
22057 // }}} end of ZipEntry
22058
22059 // class ZipEntries {{{
22060 /**
22061 * All the entries in the zip file.
22062 * @constructor
22063 * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
22064 * @param {Object} loadOptions Options for loading the stream.
22065 */
22066 function ZipEntries(data, loadOptions) {
22067 this.files = [];
22068 this.loadOptions = loadOptions;
22069 if (data) {
22070 this.load(data);
22071 }
22072 }
22073 ZipEntries.prototype = {
22074 /**
22075 * Check that the reader is on the speficied signature.
22076 * @param {string} expectedSignature the expected signature.
22077 * @throws {Error} if it is an other signature.
22078 */
22079 checkSignature : function(expectedSignature) {
22080 var signature = this.reader.readString(4);
22081 if (signature !== expectedSignature) {
22082 throw new Error("Corrupted zip or bug : unexpected signature " +
22083 "(" + pretty(signature) + ", expected " + pretty(expectedSignature) + ")");
22084 }
22085 },
22086 /**
22087 * Read the end of the central directory.
22088 */
22089 readBlockEndOfCentral : function () {
22090 this.diskNumber = this.reader.readInt(2);
22091 this.diskWithCentralDirStart = this.reader.readInt(2);
22092 this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
22093 this.centralDirRecords = this.reader.readInt(2);
22094 this.centralDirSize = this.reader.readInt(4);
22095 this.centralDirOffset = this.reader.readInt(4);
22096
22097 this.zipCommentLength = this.reader.readInt(2);
22098 this.zipComment = this.reader.readString(this.zipCommentLength);
22099 },
22100 /**
22101 * Read the end of the Zip 64 central directory.
22102 * Not merged with the method readEndOfCentral :
22103 * The end of central can coexist with its Zip64 brother,
22104 * I don't want to read the wrong number of bytes !
22105 */
22106 readBlockZip64EndOfCentral : function () {
22107 this.zip64EndOfCentralSize = this.reader.readInt(8);
22108 this.versionMadeBy = this.reader.readString(2);
22109 this.versionNeeded = this.reader.readInt(2);
22110 this.diskNumber = this.reader.readInt(4);
22111 this.diskWithCentralDirStart = this.reader.readInt(4);
22112 this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
22113 this.centralDirRecords = this.reader.readInt(8);
22114 this.centralDirSize = this.reader.readInt(8);
22115 this.centralDirOffset = this.reader.readInt(8);
22116
22117 this.zip64ExtensibleData = {};
22118 var extraDataSize = this.zip64EndOfCentralSize - 44,
22119 index = 0,
22120 extraFieldId,
22121 extraFieldLength,
22122 extraFieldValue;
22123 while(index < extraDataSize) {
22124 extraFieldId = this.reader.readInt(2);
22125 extraFieldLength = this.reader.readInt(4);
22126 extraFieldValue = this.reader.readString(extraFieldLength);
22127 this.zip64ExtensibleData[extraFieldId] = {
22128 id: extraFieldId,
22129 length: extraFieldLength,
22130 value: extraFieldValue
22131 };
22132 }
22133 },
22134 /**
22135 * Read the end of the Zip 64 central directory locator.
22136 */
22137 readBlockZip64EndOfCentralLocator : function () {
22138 this.diskWithZip64CentralDirStart = this.reader.readInt(4);
22139 this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
22140 this.disksCount = this.reader.readInt(4);
22141 if (this.disksCount > 1) {
22142 throw new Error("Multi-volumes zip are not supported");
22143 }
22144 },
22145 /**
22146 * Read the local files, based on the offset read in the central part.
22147 */
22148 readLocalFiles : function() {
22149 var i, file;
22150 for(i = 0; i < this.files.length; i++) {
22151 file = this.files[i];
22152 this.reader.setIndex(file.localHeaderOffset);
22153 this.checkSignature(JSZip.signature.LOCAL_FILE_HEADER);
22154 file.readLocalPart(this.reader);
22155 file.handleUTF8();
22156 }
22157 },
22158 /**
22159 * Read the central directory.
22160 */
22161 readCentralDir : function() {
22162 var file;
22163
22164 this.reader.setIndex(this.centralDirOffset);
22165 while(this.reader.readString(4) === JSZip.signature.CENTRAL_FILE_HEADER) {
22166 file = new ZipEntry({
22167 zip64: this.zip64
22168 }, this.loadOptions);
22169 file.readCentralPart(this.reader);
22170 this.files.push(file);
22171 }
22172 },
22173 /**
22174 * Read the end of central directory.
22175 */
22176 readEndOfCentral : function() {
22177 var offset = this.reader.stream.lastIndexOf(JSZip.signature.CENTRAL_DIRECTORY_END);
22178 if (offset === -1) {
22179 throw new Error("Corrupted zip : can't find end of central directory");
22180 }
22181 this.reader.setIndex(offset);
22182 this.checkSignature(JSZip.signature.CENTRAL_DIRECTORY_END);
22183 this.readBlockEndOfCentral();
22184
22185
22186 /* extract from the zip spec :
22187 4) If one of the fields in the end of central directory
22188 record is too small to hold required data, the field
22189 should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
22190 ZIP64 format record should be created.
22191 5) The end of central directory record and the
22192 Zip64 end of central directory locator record must
22193 reside on the same disk when splitting or spanning
22194 an archive.
22195 */
22196 if ( this.diskNumber === MAX_VALUE_16BITS
22197 || this.diskWithCentralDirStart === MAX_VALUE_16BITS
22198 || this.centralDirRecordsOnThisDisk === MAX_VALUE_16BITS
22199 || this.centralDirRecords === MAX_VALUE_16BITS
22200 || this.centralDirSize === MAX_VALUE_32BITS
22201 || this.centralDirOffset === MAX_VALUE_32BITS
22202 ) {
22203 this.zip64 = true;
22204
22205 /*
22206 Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
22207 the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
22208 all numbers as 64-bit double precision IEEE 754 floating point numbers.
22209 So, we have 53bits for integers and bitwise operations treat everything as 32bits.
22210 see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
22211 and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
22212 */
22213
22214 // should look for a zip64 EOCD locator
22215 offset = this.reader.stream.lastIndexOf(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
22216 if (offset === -1) {
22217 throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
22218 }
22219 this.reader.setIndex(offset);
22220 this.checkSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
22221 this.readBlockZip64EndOfCentralLocator();
22222
22223 // now the zip64 EOCD record
22224 this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
22225 this.checkSignature(JSZip.signature.ZIP64_CENTRAL_DIRECTORY_END);
22226 this.readBlockZip64EndOfCentral();
22227 }
22228 },
22229 /**
22230 * Read a zip file and create ZipEntries.
22231 * @param {String|ArrayBuffer|Uint8Array} data the binary string representing a zip file.
22232 */
22233 load : function(data) {
22234 this.reader = new StreamReader(data);
22235
22236 this.readEndOfCentral();
22237 this.readCentralDir();
22238 this.readLocalFiles();
22239 }
22240 };
22241 // }}} end of ZipEntries
22242
22243 /**
22244 * Implementation of the load method of JSZip.
22245 * It uses the above classes to decode a zip file, and load every files.
22246 * @param {String|ArrayBuffer|Uint8Array} data the data to load.
22247 * @param {Object} options Options for loading the stream.
22248 * options.base64 : is the stream in base64 ? default : false
22249 */
22250 JSZip.prototype.load = function(data, options) {
22251 var files, zipEntries, i, input;
22252 options = options || {};
22253 if(options.base64) {
22254 data = JSZipBase64.decode(data);
22255 }
22256
22257 zipEntries = new ZipEntries(data, options);
22258 files = zipEntries.files;
22259 for (i = 0; i < files.length; i++) {
22260 input = files[i];
22261 this.file(input.fileName, input.uncompressedFileData, {
22262 binary:true,
22263 optimizedBinaryString:true,
22264 date:input.date,
22265 dir:input.dir
22266 });
22267 }
22268
22269 return this;
22270 };
22271
22272 }());
22273 // enforcing Stuk's coding style
22274 // vim: set shiftwidth=3 softtabstop=3 foldmethod=marker:
22275 //! moment.js 23871 //! moment.js
22276 //! version : 2.5.1 23872 //! version : 2.5.1
22277 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors 23873 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
22278 //! license : MIT 23874 //! license : MIT
22279 //! momentjs.com 23875 //! momentjs.com
29664 $tip.appendTo('body').hide().css({position: 'absolute'}); 31260 $tip.appendTo('body').hide().css({position: 'absolute'});
29665 31261
29666 if(this.tooltipOptions.defaultTheme) { 31262 if(this.tooltipOptions.defaultTheme) {
29667 $tip.css({ 31263 $tip.css({
29668 'background': '#fff', 31264 'background': '#fff',
29669 'z-index': '21040',//***lchang 31265 'z-index': '1040',
29670 'padding': '0.4em 0.6em', 31266 'padding': '0.4em 0.6em',
29671 'border-radius': '0.5em', 31267 'border-radius': '0.5em',
29672 'font-size': '0.8em', 31268 'font-size': '0.8em',
29673 'border': '1px solid #111', 31269 'border': '1px solid #111',
29674 'display': 'none', 31270 'display': 'none',
30214 // this turns MapConfig.useGraphics auto-on, but uses circles as default 31810 // this turns MapConfig.useGraphics auto-on, but uses circles as default
30215 loadColorFromDataset : false, // if DataObject color should be loaded automatically (from column "color") 31811 loadColorFromDataset : false, // if DataObject color should be loaded automatically (from column "color")
30216 allowColumnRenaming : true, 31812 allowColumnRenaming : true,
30217 //proxy : 'php/proxy.php?address=', //set this if a HTTP proxy shall be used (e.g. to bypass X-Domain problems) 31813 //proxy : 'php/proxy.php?address=', //set this if a HTTP proxy shall be used (e.g. to bypass X-Domain problems)
30218 //colors for several datasets; rgb1 will be used for selected objects, rgb0 for unselected 31814 //colors for several datasets; rgb1 will be used for selected objects, rgb0 for unselected
30219 colors : [{//blue /***lchang changed the color set***/ 31815 colors : [{
30220 r1 : 0,
30221 g1 : 128,
30222 b1 : 255,
30223 r0 : 205,
30224 g0 : 230,
30225 b0 : 255
30226 },{//red
30227 r1 : 255, 31816 r1 : 255,
30228 g1 : 84, 31817 g1 : 101,
30229 b1 : 22, 31818 b1 : 0,
30230 r0 : 255, 31819 r0 : 253,
30231 g0 : 218, 31820 g0 : 229,
30232 b0 : 205 31821 b0 : 205
30233 }, {//purple 31822 }, {
30234 r1 : 132, 31823 r1 : 144,
30235 g1 : 0, 31824 g1 : 26,
30236 b1 : 255, 31825 b1 : 255,
30237 r0 : 231, 31826 r0 : 230,
30238 g0 : 205, 31827 g0 : 225,
30239 b0 : 255 31828 b0 : 255
30240 }, {//green 31829 }, {
30241 r1 : 0, 31830 r1 : 0,
30242 g1 : 225, 31831 g1 : 217,
30243 b1 : 116,
30244 r0 : 180,
30245 g0 : 225,
30246 b0 : 204
30247 }, {//yellow
30248 r1 : 255,
30249 g1 : 191,
30250 b1 : 0, 31832 b1 : 0,
30251 r0 : 255, 31833 r0 : 213,
30252 g0 : 243, 31834 g0 : 255,
30253 b0 : 205 31835 b0 : 213
31836 }, {
31837 r1 : 240,
31838 g1 : 220,
31839 b1 : 0,
31840 r0 : 247,
31841 g0 : 244,
31842 b0 : 197
30254 }] 31843 }]
30255 31844
30256 } 31845 }
30257 31846
30258 GeoTemConfig.ie = false; 31847 GeoTemConfig.ie = false;
30312 } 31901 }
30313 31902
30314 GeoTemConfig.applySettings = function(settings) { 31903 GeoTemConfig.applySettings = function(settings) {
30315 $.extend(this, settings); 31904 $.extend(this, settings);
30316 }; 31905 };
30317 function HSVtoRGB(h, s, v) { 31906
30318 var r, g, b, i, f, p, q, t;
30319 if (h && s === undefined && v === undefined) {
30320 s = h.s, v = h.v, h = h.h;
30321 }
30322 i = Math.floor(h * 6);
30323 f = h * 6 - i;
30324 p = v * (1 - s);
30325 q = v * (1 - f * s);
30326 t = v * (1 - (1 - f) * s);
30327 switch (i % 6) {
30328 case 0: r = v, g = t, b = p; break;
30329 case 1: r = q, g = v, b = p; break;
30330 case 2: r = p, g = v, b = t; break;
30331 case 3: r = p, g = q, b = v; break;
30332 case 4: r = t, g = p, b = v; break;
30333 case 5: r = v, g = p, b = q; break;
30334 }
30335 return {
30336 r: Math.floor(r * 255),
30337 g: Math.floor(g * 255),
30338 b: Math.floor(b * 255)
30339 };
30340 }
30341 //Keeps track of how many colors where assigned yet. 31907 //Keeps track of how many colors where assigned yet.
30342 GeoTemConfig.assignedColorCount = 0; 31908 GeoTemConfig.assignedColorCount = 0;
30343 GeoTemConfig.getColor = function(id){ 31909 GeoTemConfig.getColor = function(id){
30344 if (typeof GeoTemConfig.datasets[id].color === "undefined"){ 31910 if (typeof GeoTemConfig.datasets[id].color === "undefined"){
30345 var color; 31911 var color;
30346 31912
30347 while (true){ 31913 while (true){
30348 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){ 31914 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){
30349 var h=Math.random();
30350 var rgb=HSVtoRGB(h,1.0,1.0);
30351 var rgb0=HSVtoRGB(h,0.2,1.0);
30352 color = {
30353 r1 : rgb.r,
30354 g1 : rgb.g,
30355 b1 : rgb.b,
30356 r0 : rgb0.r,
30357 g0 : rgb0.g,
30358 b0 : rgb0.b
30359 };
30360 /*
30361 color = { 31915 color = {
30362 r1 : Math.floor((Math.random()*255)+1), 31916 r1 : Math.floor((Math.random()*255)+1),
30363 g1 : Math.floor((Math.random()*255)+1), 31917 g1 : Math.floor((Math.random()*255)+1),
30364 b1 : Math.floor((Math.random()*255)+1), 31918 b1 : Math.floor((Math.random()*255)+1),
30365 r0 : 230, 31919 r0 : 230,
30366 g0 : 230, 31920 g0 : 230,
30367 b0 : 230 31921 b0 : 230
30368 };*/ 31922 };
30369 } else 31923 } else
30370 color = GeoTemConfig.colors[GeoTemConfig.assignedColorCount]; 31924 color = GeoTemConfig.colors[GeoTemConfig.assignedColorCount];
30371 31925
30372 //make sure that no other dataset has this color 31926 //make sure that no other dataset has this color
30373 //TODO: one could also check that they are not too much alike 31927 //TODO: one could also check that they are not too much alike
30384 found = true; 31938 found = true;
30385 break; 31939 break;
30386 } 31940 }
30387 } 31941 }
30388 if (found === true){ 31942 if (found === true){
30389 //***lchang: GeoTemConfig.colors.length is never <= GeoTemConfig.assignedColorCount, so the GeoTemConfig.assignedColorCount never changes, and infinite loops occurs
30390 GeoTemConfig.assignedColorCount++;
30391 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){ 31943 if( GeoTemConfig.colors.length <= GeoTemConfig.assignedColorCount ){
30392 //next time skip over this color 31944 //next time skip over this color
30393 //GeoTemConfig.assignedColorCount++;//***lchang 31945 GeoTemConfig.assignedColorCount++;
30394 } 31946 }
30395 continue; 31947 continue;
30396 } else { 31948 } else {
30397 GeoTemConfig.colors.push(color); 31949 GeoTemConfig.colors.push(color);
30398 break; 31950 break;
30478 /** 32030 /**
30479 * returns the json object of the file from the given url 32031 * returns the json object of the file from the given url
30480 * @param {String} url the url of the file to load 32032 * @param {String} url the url of the file to load
30481 * @return json object of given file 32033 * @return json object of given file
30482 */ 32034 */
30483 GeoTemConfig.getJson = function(url) { 32035 GeoTemConfig.getJson = function(url,asyncFunc) {
32036 var async = false;
32037 if( asyncFunc ){
32038 async = true;
32039 }
32040
30484 var data; 32041 var data;
30485 $.ajax({ 32042 $.ajax({
30486 url : url, 32043 url : url,
30487 async : false, 32044 async : async,
30488 dataType : 'json', 32045 dataType : 'json',
30489 success : function(json) { 32046 success : function(json) {
30490 data = json; 32047 data = json;
32048 if (async){
32049 asyncFunc(data);
32050 }
30491 } 32051 }
30492 }); 32052 });
30493 return data; 32053
32054 if (async){
32055 return data;
32056 }
30494 } 32057 }
30495 32058
30496 GeoTemConfig.mergeObjects = function(set1, set2) { 32059 GeoTemConfig.mergeObjects = function(set1, set2) {
30497 var inside = []; 32060 var inside = [];
30498 var newSet = []; 32061 var newSet = [];
30620 tableContent[header] = ""+innerArray[j]; 32183 tableContent[header] = ""+innerArray[j];
30621 } 32184 }
30622 } 32185 }
30623 32186
30624 dataObject["tableContent"] = tableContent; 32187 dataObject["tableContent"] = tableContent;
30625 32188
30626 json.push(dataObject); 32189 json.push(dataObject);
30627 } 32190 }
30628 32191
30629
30630 return json; 32192 return json;
30631 }; 32193 };
30632 32194
30633 /** 32195 /**
30634 * returns the xml dom object of the file from the given url 32196 * returns the xml dom object of the file from the given url
30719 //can only be set on asynchronous now 32281 //can only be set on asynchronous now
30720 //req.responseType = "text"; 32282 //req.responseType = "text";
30721 var json; 32283 var json;
30722 req.onload = function() { 32284 req.onload = function() {
30723 json = GeoTemConfig.convertCsv(req.response); 32285 json = GeoTemConfig.convertCsv(req.response);
30724
30725 if( asyncFunc ) 32286 if( asyncFunc )
30726 asyncFunc(json); 32287 asyncFunc(json);
30727 }; 32288 };
30728
30729 req.send(); 32289 req.send();
30730 32290
30731 if( !async ){ 32291 if( !async ){
30732 return json; 32292 return json;
30733 } 32293 }
30734 32294 };
32295
32296 /**
32297 * loads a binary file
32298 * @param {String} url of the file to load
32299 * @return binary data
32300 */
32301 GeoTemConfig.getBinary = function(url,asyncFunc) {
32302 var async = true;
32303
32304 var req = new XMLHttpRequest();
32305 req.open("GET",url,async);
32306 req.responseType = "arraybuffer";
32307
32308 var binaryData;
32309 req.onload = function() {
32310 var arrayBuffer = req.response;
32311 asyncFunc(arrayBuffer);
32312 };
32313 req.send();
30735 }; 32314 };
30736 32315
30737 /** 32316 /**
30738 * returns a Date and a SimileAjax.DateTime granularity value for a given XML time 32317 * returns a Date and a SimileAjax.DateTime granularity value for a given XML time
30739 * @param {String} xmlTime the XML time as String 32318 * @param {String} xmlTime the XML time as String
31643 * @version date: 2012-07-27 33222 * @version date: 2012-07-27
31644 * 33223 *
31645 * @param {Object} parent parent to call filter functions 33224 * @param {Object} parent parent to call filter functions
31646 * @param {HTML object} parentDiv div to append filter buttons 33225 * @param {HTML object} parentDiv div to append filter buttons
31647 */ 33226 */
33227 FilterBarFactory = {
33228 filterBarArray :[],
33229 push : function(newFilterBar){
33230 FilterBarFactory.filterBarArray.push(newFilterBar);
33231 },
33232 resetAll : function(show) {
33233 $(FilterBarFactory.filterBarArray).each(function(){
33234 if (show) {
33235 this.filter.setAttribute('class', 'smallButton filter');
33236 this.filterInverse.setAttribute('class', 'smallButton filterInverse');
33237 this.cancelSelection.setAttribute('class', 'smallButton filterCancel');
33238 } else {
33239 this.filter.setAttribute('class', 'smallButton filterDisabled');
33240 this.filterInverse.setAttribute('class', 'smallButton filterInverseDisabled');
33241 this.cancelSelection.setAttribute('class', 'smallButton filterCancelDisabled');
33242 }
33243 });
33244 }
33245 };
33246
31648 function FilterBar(parent, parentDiv) { 33247 function FilterBar(parent, parentDiv) {
33248 FilterBarFactory.push(this);
31649 33249
31650 var bar = this; 33250 var bar = this;
31651 33251
31652 this.filter = document.createElement('div'); 33252 this.filter = document.createElement('div');
31653 this.filter.setAttribute('class', 'smallButton filterDisabled'); 33253 this.filter.setAttribute('class', 'smallButton filterDisabled');
31678 if ( typeof parentDiv != 'undefined') { 33278 if ( typeof parentDiv != 'undefined') {
31679 this.appendTo(parentDiv); 33279 this.appendTo(parentDiv);
31680 } 33280 }
31681 33281
31682 this.reset = function(show) { 33282 this.reset = function(show) {
31683 if (show) { 33283 FilterBarFactory.resetAll(show);
31684 this.filter.setAttribute('class', 'smallButton filter');
31685 this.filterInverse.setAttribute('class', 'smallButton filterInverse');
31686 this.cancelSelection.setAttribute('class', 'smallButton filterCancel');
31687 } else {
31688 this.filter.setAttribute('class', 'smallButton filterDisabled');
31689 this.filterInverse.setAttribute('class', 'smallButton filterInverseDisabled');
31690 this.cancelSelection.setAttribute('class', 'smallButton filterCancelDisabled');
31691 }
31692 }; 33284 };
31693 33285
31694 }; 33286 };
31695 /* 33287 /*
31696 * Selection.js 33288 * Selection.js
32465 */ 34057 */
32466 function MapConfig(options) { 34058 function MapConfig(options) {
32467 34059
32468 this.options = { 34060 this.options = {
32469 mapWidth : false, // false or desired width css definition for the map 34061 mapWidth : false, // false or desired width css definition for the map
32470 mapHeight : false, // false or desired height css definition for the map 34062 mapHeight : '580px', // false or desired height css definition for the map
32471 mapTitle : 'GeoTemCo Map View', // title will be shown in map header 34063 mapTitle : 'GeoTemCo Map View', // title will be shown in map header
32472 mapIndex : 0, // index = position in location array; for multiple locations the 2nd map refers to index 1 34064 mapIndex : 0, // index = position in location array; for multiple locations the 2nd map refers to index 1
32473 alternativeMap : [ 34065 alternativeMap : [
32474 /* { 34066 {
32475 name: 'Barrington Roman Empire', 34067 name: 'Barrington Roman Empire',
32476 url: 'http://pelagios.dme.ait.ac.at/tilesets/imperium/${z}/${x}/${y}.png', 34068 url: 'http://pelagios.dme.ait.ac.at/tilesets/imperium/${z}/${x}/${y}.png',
32477 type:'XYZ', 34069 type:'XYZ',
32478 attribution: "(c) Barrington Roman Empiry, <a href='http://pelagios.dme.ait.ac.at/maps/greco-roman/'>Pelagios</a>" 34070 attribution: "(c) Barrington Roman Empiry, <a href='http://pelagios.dme.ait.ac.at/maps/greco-roman/'>Pelagios</a>"
32479 }, 34071 },
32619 name: 'Historical Map of 500 BC', 34211 name: 'Historical Map of 500 BC',
32620 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms', 34212 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms',
32621 layer: 'historic:cntry500bc', 34213 layer: 'historic:cntry500bc',
32622 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>" 34214 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>"
32623 }, 34215 },
32624 */
32625 { 34216 {
32626 name: 'Historical Map of 1000 BC', 34217 name: 'Historical Map of 1000 BC',
32627 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms', 34218 url: 'http://geoserver.mpiwg-berlin.mpg.de/geoserver/mpiwg/wms',
32628 layer: 'historic:cntry1000bc', 34219 layer: 'historic:cntry1000bc',
32629 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>" 34220 attribution: "(c) <a href='http://webcache.googleusercontent.com/search?q=cache:NbaEeiehhzQJ:library.thinkquest.org/C006628/citations.html&client=ubuntu&hl=de&gl=de&strip=1'> ThinkQuest Team C006628</a>"
32696 ieHoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label in IE 34287 ieHoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label in IE
32697 hoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label 34288 hoveredLabel : "color: COLOR1; font-weight: bold;", // css code for a hovered place label
32698 circleGap : 0, // gap between the circles on the map (>=0) 34289 circleGap : 0, // gap between the circles on the map (>=0)
32699 circleOverlap : { 34290 circleOverlap : {
32700 type: 'area', // 'area' or 'diameter' is possible 34291 type: 'area', // 'area' or 'diameter' is possible
32701 overlap: 1 // the percentage of allowed overlap (0<=overlap<=1) 34292 overlap: 0 // the percentage of allowed overlap (0<=overlap<=1)
32702 }, // maximum allowed overlap in percent (if circleGap = 0, circleOverlap will be used) 34293 }, // maximum allowed overlap in percent (if circleGap = 0, circleOverlap will be used)
32703 minimumRadius : 1, // minimum radius of a circle with mimimal weight (>0) 34294 minimumRadius : 4, // minimum radius of a circle with mimimal weight (>0)
32704 circleOutline : 2, // false for no outline or a pixel value v with 0 < v 34295 circleOutline : 2, // false for no outline or a pixel value v with 0 < v
32705 circleOpacity : 'balloon', // 'balloon' for dynamic opacity of the circles or a value t with 0 <= t <= 1 34296 circleOpacity : 'balloon', // 'balloon' for dynamic opacity of the circles or a value t with 0 <= t <= 1
32706 minTransparency : 0.55, // maximum transparency of a circle 34297 minTransparency : 0.55, // maximum transparency of a circle
32707 maxTransparency : 0.8, // minimum transparency of a circle 34298 maxTransparency : 0.8, // minimum transparency of a circle
32708 binning : 'generic', // binning algorithm for the map, possible values are: 'generic', 'square', 'hexagonal', 'triangular' or false for 'no binning' 34299 binning : 'generic', // binning algorithm for the map, possible values are: 'generic', 'square', 'hexagonal', 'triangular' or false for 'no binning'
32714 binningSelection : false, // show/hide binning algorithms dropdown 34305 binningSelection : false, // show/hide binning algorithms dropdown
32715 mapSelectionTools : true, // show/hide map selector tools 34306 mapSelectionTools : true, // show/hide map selector tools
32716 dataInformation : true, // show/hide data information 34307 dataInformation : true, // show/hide data information
32717 overlayVisibility : false, // initial visibility of additional overlays 34308 overlayVisibility : false, // initial visibility of additional overlays
32718 //proxyHost : 'php/proxy.php?address=', //required for selectCountry feature, if the requested GeoServer and GeoTemCo are NOT on the same server 34309 //proxyHost : 'php/proxy.php?address=', //required for selectCountry feature, if the requested GeoServer and GeoTemCo are NOT on the same server
32719 placenameTagsStyle : 'value' // the style of the placenames "surrounding" a circle on hover. 'zoom' for tags based on zoom level (old behaviour), 'value' for new value-based 34310 placenameTagsStyle : 'value', // the style of the placenames "surrounding" a circle on hover. 'zoom' for tags based on zoom level (old behaviour), 'value' for new value-based
34311 hideUnselected : false //hide unselected circles (features) on highlight/selection
32720 34312
32721 }; 34313 };
32722 if ( typeof options != 'undefined') { 34314 if ( typeof options != 'undefined') {
32723 $.extend(this.options, options); 34315 $.extend(this.options, options);
32724 } 34316 }
32786 * @param {HTML object} div parent div to append the map gui 34378 * @param {HTML object} div parent div to append the map gui
32787 * @param {JSON} options map configuration 34379 * @param {JSON} options map configuration
32788 */ 34380 */
32789 function MapGui(map, div, options, iid) { 34381 function MapGui(map, div, options, iid) {
32790 34382
34383 var gui = this;
32791 this.map = map; 34384 this.map = map;
32792 34385
32793 this.container = div; 34386 this.container = div;
32794 if (options.mapWidth) { 34387 if (options.mapWidth) {
32795 this.container.style.width = options.mapWidth; 34388 this.container.style.width = options.mapWidth;
32881 map.navigation.activate(); 34474 map.navigation.activate();
32882 } 34475 }
32883 var lockMapControl = new MapControl(this.map, lockButton, 'lock', activateLock, deactivateLock); 34476 var lockMapControl = new MapControl(this.map, lockButton, 'lock', activateLock, deactivateLock);
32884 tools.appendChild(lockMapControl.button); 34477 tools.appendChild(lockMapControl.button);
32885 34478
32886 34479 this.fullscreenTitle = document.createElement("td");
32887 var gui = this; 34480 titles.appendChild(this.fullscreenTitle);
34481 this.fullscreenIcon = document.createElement("td");
34482 var fullscreenButton = document.createElement("div");
34483 $(fullscreenButton).addClass('mapControl');
34484 var prevWidth;
34485 var prevHeight;
34486 var prevParent;
34487 var activateFullscreen = function() {
34488 $div=$(div);
34489 $window = $(window);
34490
34491 prevWidth = $div.width();
34492 prevHeight = $div.height();
34493 prevParent = $div.parent();
34494
34495 $div.appendTo("body");
34496 $div.css("position","absolute");
34497 $div.css("top","0");
34498 $div.css("left","0");
34499 $div.css("z-Index","10000");
34500 $div.width($window.width());
34501 $div.height($window.height());
34502
34503 gui.resize();
34504 }
34505 var deactivateFullscreen = function() {
34506 $div=$(div);
34507
34508 $div.appendTo(prevParent);
34509 $div.css("position","relative");
34510 $div.width(prevWidth);
34511 $div.height(prevHeight);
34512
34513 gui.resize();
34514 }
34515 var fullscreenMapControl = new MapControl(this.map, fullscreenButton, 'fullscreen', activateFullscreen, deactivateFullscreen);
34516 tools.appendChild(fullscreenMapControl.button);
34517
32888 if (navigator.geolocation && options.geoLocation) { 34518 if (navigator.geolocation && options.geoLocation) {
32889 this.geoActive = false; 34519 this.geoActive = false;
32890 this.geoLocation = document.createElement("div"); 34520 this.geoLocation = document.createElement("div");
32891 this.geoLocation.setAttribute('class', 'geoLocationOff'); 34521 this.geoLocation.setAttribute('class', 'geoLocationOff');
32892 this.geoLocation.title = GeoTemConfig.getString('activateGeoLocation'); 34522 this.geoLocation.title = GeoTemConfig.getString('activateGeoLocation');
34242 35872
34243 /** 35873 /**
34244 * updates the the object layer of the map after selections had been executed in timeplot or table or zoom level has changed 35874 * updates the the object layer of the map after selections had been executed in timeplot or table or zoom level has changed
34245 */ 35875 */
34246 highlightChanged : function(mapObjects) { 35876 highlightChanged : function(mapObjects) {
35877 var hideEmptyCircles = false;
35878
35879 if (this.config.options.hideUnselected){
35880 var overallCnt = 0;
35881 for (var i in mapObjects){
35882 overallCnt += mapObjects[i].length;
35883 }
35884 if (overallCnt > 0){
35885 hideEmptyCircles = true;
35886 }
35887 }
35888
34247 if( !GeoTemConfig.highlightEvents ){ 35889 if( !GeoTemConfig.highlightEvents ){
34248 return; 35890 return;
34249 } 35891 }
34250 this.mds.clearOverlay(); 35892 this.mds.clearOverlay();
34251 if (this.selection.valid()) { 35893 if (this.selection.valid()) {
34255 } 35897 }
34256 var points = this.mds.getObjectsByZoom(); 35898 var points = this.mds.getObjectsByZoom();
34257 var polygon = this.openlayersMap.getExtent().toGeometry(); 35899 var polygon = this.openlayersMap.getExtent().toGeometry();
34258 for (var i in points ) { 35900 for (var i in points ) {
34259 for (var j in points[i] ) { 35901 for (var j in points[i] ) {
35902 var point = points[i][j];
35903
35904 if (hideEmptyCircles){
35905 point.feature.style.display = 'none';
35906 } else {
35907 point.feature.style.display = '';
35908 }
35909
34260 this.updatePoint(points[i][j], polygon); 35910 this.updatePoint(points[i][j], polygon);
34261 } 35911 }
34262 } 35912 }
34263 this.displayConnections(); 35913 this.displayConnections();
35914 this.objectLayer.redraw();
34264 }, 35915 },
34265 35916
34266 selectionChanged : function(selection) { 35917 selectionChanged : function(selection) {
34267 if( !GeoTemConfig.selectionEvents ){ 35918 if( !GeoTemConfig.selectionEvents ){
34268 return; 35919 return;
36733 if (this.activeTable != index) { 38384 if (this.activeTable != index) {
36734 if ( typeof this.activeTable != 'undefined') { 38385 if ( typeof this.activeTable != 'undefined') {
36735 this.tables[this.activeTable].hide(); 38386 this.tables[this.activeTable].hide();
36736 var c = GeoTemConfig.getColor(this.activeTable); 38387 var c = GeoTemConfig.getColor(this.activeTable);
36737 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r0 + ',' + c.g0 + ',' + c.b0 + ')'; 38388 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r0 + ',' + c.g0 + ',' + c.b0 + ')';
36738 this.tableTabs[this.activeTable].style.paddingBottom = '5px';
36739 } 38389 }
36740 this.activeTable = index; 38390 this.activeTable = index;
36741 this.tables[this.activeTable].show(); 38391 this.tables[this.activeTable].show();
36742 var c = GeoTemConfig.getColor(this.activeTable); 38392 var c = GeoTemConfig.getColor(this.activeTable);
36743 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r1 + ',' + c.g1 + ',' + c.b1 + ')'; 38393 this.tableTabs[this.activeTable].style.backgroundColor = 'rgb(' + c.r1 + ',' + c.g1 + ',' + c.b1 + ')';
36744 this.tableTabs[this.activeTable].style.paddingBottom = '8px';
36745 this.gui.tabs.style.borderBottom = '6px solid rgb(' + c.r1 + ',' + c.g1 + ',' + c.b1 + ')';
36746 this.core.triggerRise(index); 38394 this.core.triggerRise(index);
36747 } 38395 }
36748 38396
36749 }, 38397 },
36750 38398
37687 this.addKMLLoader(); 39335 this.addKMLLoader();
37688 this.addKMZLoader(); 39336 this.addKMZLoader();
37689 this.addCSVLoader(); 39337 this.addCSVLoader();
37690 this.addLocalKMLLoader(); 39338 this.addLocalKMLLoader();
37691 this.addLocalCSVLoader(); 39339 this.addLocalCSVLoader();
39340 this.addLocalXLSXLoader();
37692 39341
37693 // trigger change event on the select so 39342 // trigger change event on the select so
37694 // that only the first loader div will be shown 39343 // that only the first loader div will be shown
37695 $(this.parent.gui.loaderTypeSelect).change(); 39344 $(this.parent.gui.loaderTypeSelect).change();
37696 }, 39345 },
37999 if (dataSet != null) 39648 if (dataSet != null)
38000 dataLoader.distributeDataset(dataSet); 39649 dataLoader.distributeDataset(dataSet);
38001 },this)); 39650 },this));
38002 39651
38003 $(this.parent.gui.loaders).append(this.localStorageLoaderTab); 39652 $(this.parent.gui.loaders).append(this.localStorageLoaderTab);
38004 } 39653 },
39654
39655 addLocalXLSXLoader : function() {
39656 //taken from http://oss.sheetjs.com/js-xlsx/
39657 var fixdata = function(data) {
39658 var o = "", l = 0, w = 10240;
39659 for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
39660 o+=String.fromCharCode.apply(null, new Uint8Array(data.slice(o.length)));
39661 return o;
39662 }
39663
39664 $(this.parent.gui.loaderTypeSelect).append("<option value='LocalXLSXLoader'>local XLS/XLSX File</option>");
39665
39666 this.LocalXLSXLoader = document.createElement("div");
39667 $(this.LocalXLSXLoader).attr("id","LocalXLSXLoader");
39668
39669 this.xlsxFile = document.createElement("input");
39670 $(this.xlsxFile).attr("type","file");
39671 $(this.LocalXLSXLoader).append(this.xlsxFile);
39672
39673 this.loadLocalXLSXButton = document.createElement("button");
39674 $(this.loadLocalXLSXButton).text("load XLS/XLSX");
39675 $(this.LocalXLSXLoader).append(this.loadLocalXLSXButton);
39676
39677 $(this.loadLocalXLSXButton).click($.proxy(function(){
39678 var filelist = $(this.xlsxFile).get(0).files;
39679 if (filelist.length > 0){
39680 var file = filelist[0];
39681 var fileName = file.name;
39682 var reader = new FileReader();
39683
39684 reader.onloadend = ($.proxy(function(theFile) {
39685 return function(e) {
39686 var workbook;
39687 var json;
39688 if (fileName.toLowerCase().indexOf("xlsx")!=-1){
39689 workbook = XLSX.read(btoa(fixdata(reader.result)), {type: 'base64'});
39690 var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]);
39691 var json = GeoTemConfig.convertCsv(csv);
39692 } else {
39693 workbook = XLS.read(btoa(fixdata(reader.result)), {type: 'base64'});
39694 var csv = XLS.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]);
39695 var json = GeoTemConfig.convertCsv(csv);
39696 }
39697
39698 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName);
39699 if (dataSet != null)
39700 this.distributeDataset(dataSet);
39701 };
39702 }(file),this));
39703
39704 reader.readAsArrayBuffer(file);
39705 }
39706 },this));
39707
39708 $(this.parent.gui.loaders).append(this.LocalXLSXLoader);
39709 },
38005 }; 39710 };
38006 /* 39711 /*
38007 * DataloaderConfig.js 39712 * DataloaderConfig.js
38008 * 39713 *
38009 * Copyright (c) 2013, Sebastian Kruse. All rights reserved. 39714 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
38132 39837
38133 this.options = (new DataloaderConfig(options)).options; 39838 this.options = (new DataloaderConfig(options)).options;
38134 this.gui = new DataloaderGui(this, div, this.options); 39839 this.gui = new DataloaderGui(this, div, this.options);
38135 39840
38136 this.dataLoader = new Dataloader(this); 39841 this.dataLoader = new Dataloader(this);
39842
39843 this.datasets = [];
38137 } 39844 }
38138 39845
38139 DataloaderWidget.prototype = { 39846 DataloaderWidget.prototype = {
38140 39847
38141 initWidget : function() { 39848 initWidget : function() {
38174 }, 39881 },
38175 39882
38176 reset : function() { 39883 reset : function() {
38177 }, 39884 },
38178 39885
38179 loadFromURL : function() { 39886 loadRenames : function(){
38180 var dataLoaderWidget = this;
38181 //using jQuery-URL-Parser (https://github.com/skruse/jQuery-URL-Parser)
38182 var datasets = [];
38183 $.each($.url().param(),function(paramName, paramValue){
38184 //startsWith and endsWith defined in SIMILE Ajax (string.js)
38185 var fileName = dataLoaderWidget.dataLoader.getFileName(paramValue);
38186 var origURL = paramValue;
38187 if (typeof GeoTemConfig.proxy != 'undefined')
38188 paramValue = GeoTemConfig.proxy + paramValue;
38189 if (paramName.toLowerCase().startsWith("kml")){
38190 var kmlDoc = GeoTemConfig.getKml(paramValue);
38191 var dataSet = new Dataset(GeoTemConfig.loadKml(kmlDoc), fileName, origURL);
38192 if (dataSet != null){
38193 var datasetID = parseInt(paramName.substr(3));
38194 if (!isNaN(datasetID)){
38195 datasets[datasetID] = dataSet;
38196 } else {
38197 datasets.push(dataSet);
38198 }
38199 }
38200 }
38201 else if (paramName.toLowerCase().startsWith("csv")){
38202 var json = GeoTemConfig.getCsv(paramValue);
38203 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
38204 if (dataSet != null){
38205 var datasetID = parseInt(paramName.substr(3));
38206 if (!isNaN(datasetID)){
38207 datasets[datasetID] = dataSet;
38208 } else {
38209 datasets.push(dataSet);
38210 }
38211 }
38212 }
38213 else if (paramName.toLowerCase().startsWith("json")){
38214 var json = GeoTemConfig.getJson(paramValue);
38215 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
38216 if (dataSet != null){
38217 var datasetID = parseInt(paramName.substr(4));
38218 if (!isNaN(datasetID)){
38219 datasets[datasetID] = dataSet;
38220 } else {
38221 datasets.push(dataSet);
38222 }
38223 }
38224 }
38225 else if (paramName.toLowerCase().startsWith("local")){
38226 var csv = $.remember({name:encodeURIComponent(origURL)});
38227 //TODO: this is a bad idea and will be changed upon having a better
38228 //usage model for local stored data
38229 var fileName = origURL.substring("GeoBrowser_dataset_".length);
38230 var json = GeoTemConfig.convertCsv(csv);
38231 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL, "local");
38232 if (dataSet != null){
38233 var datasetID = parseInt(paramName.substr(5));
38234 if (!isNaN(datasetID)){
38235 datasets[datasetID] = dataSet;
38236 } else {
38237 datasets.push(dataSet);
38238 }
38239 }
38240 }
38241 });
38242 //load (optional!) attribute renames 39887 //load (optional!) attribute renames
38243 //each rename param is {latitude:..,longitude:..,place:..,date:..,timeSpanBegin:..,timeSpanEnd:..} 39888 //each rename param is {latitude:..,longitude:..,place:..,date:..,timeSpanBegin:..,timeSpanEnd:..}
38244 //examples: 39889 //examples:
38245 // &rename1={"latitude":"lat1","longitude":"lon1"} 39890 // &rename1={"latitude":"lat1","longitude":"lon1"}
38246 // &rename2=[{"latitude":"lat1","longitude":"lon1"},{"latitude":"lat2","longitude":"lon2"}] 39891 // &rename2=[{"latitude":"lat1","longitude":"lon1"},{"latitude":"lat2","longitude":"lon2"}]
39892 var dataLoaderWidget = this;
39893 var datasets = dataLoaderWidget.datasets;
38247 $.each($.url().param(),function(paramName, paramValue){ 39894 $.each($.url().param(),function(paramName, paramValue){
38248 if (paramName.toLowerCase().startsWith("rename")){ 39895 if (paramName.toLowerCase().startsWith("rename")){
38249 var datasetID = parseInt(paramName.substr(6)); 39896 var datasetID = parseInt(paramName.replace(/\D/g,''));
38250 var dataset; 39897 var dataset;
38251 if (isNaN(datasetID)){ 39898 if (isNaN(datasetID)){
38252 var dataset; 39899 var dataset;
38253 for (datasetID in datasets){ 39900 for (datasetID in datasets){
38254 break; 39901 break;
38325 renameFunc(0,renames.latitude,renames.longitude,renames.place,renames.date, 39972 renameFunc(0,renames.latitude,renames.longitude,renames.place,renames.date,
38326 renames.timeSpanBegin,renames.timeSpanEnd,renames.index); 39973 renames.timeSpanBegin,renames.timeSpanEnd,renames.index);
38327 } 39974 }
38328 } 39975 }
38329 }); 39976 });
39977 },
39978
39979 loadFilters : function(){
38330 //load (optional!) filters 39980 //load (optional!) filters
38331 //those will create a new(!) dataset, that only contains the filtered IDs 39981 //those will create a new(!) dataset, that only contains the filtered IDs
39982 var dataLoaderWidget = this;
39983 var datasets = dataLoaderWidget.datasets;
38332 $.each($.url().param(),function(paramName, paramValue){ 39984 $.each($.url().param(),function(paramName, paramValue){
38333 //startsWith and endsWith defined in SIMILE Ajax (string.js) 39985 //startsWith and endsWith defined in SIMILE Ajax (string.js)
38334 if (paramName.toLowerCase().startsWith("filter")){ 39986 if (paramName.toLowerCase().startsWith("filter")){
38335 var datasetID = parseInt(paramName.substr(6)); 39987 var datasetID = parseInt(paramName.replace(/\D/g,''));
38336 var dataset; 39988 var dataset;
38337 if (isNaN(datasetID)){ 39989 if (isNaN(datasetID)){
38338 var dataset; 39990 var dataset;
38339 for (datasetID in datasets){ 39991 for (datasetID in datasets){
38340 break; 39992 break;
38365 } else { 40017 } else {
38366 filterValues(paramValue); 40018 filterValues(paramValue);
38367 } 40019 }
38368 40020
38369 } 40021 }
38370 }); 40022 });
40023 },
40024
40025 loadColors : function(){
38371 //Load the (optional!) dataset colors 40026 //Load the (optional!) dataset colors
40027 var dataLoaderWidget = this;
40028 var datasets = dataLoaderWidget.datasets;
38372 $.each($.url().param(),function(paramName, paramValue){ 40029 $.each($.url().param(),function(paramName, paramValue){
38373 if (paramName.toLowerCase().startsWith("color")){ 40030 if (paramName.toLowerCase().startsWith("color")){
38374 //color is 1-based, index is 0-based! 40031 //color is 1-based, index is 0-based!
38375 var datasetID = parseInt(paramName.substring("color".length))-1; 40032 var datasetID = parseInt(paramName.replace(/\D/g,''));
38376 if (datasets.length > datasetID){ 40033 if (datasets.length > datasetID){
38377 if (typeof datasets[datasetID].color === "undefined"){ 40034 if (typeof datasets[datasetID].color === "undefined"){
38378 var color = new Object(); 40035 var color = new Object();
38379 var colorsSelectedUnselected = paramValue.split(","); 40036 var colorsSelectedUnselected = paramValue.split(",");
38380 if (colorsSelectedUnselected.length > 2) 40037 if (colorsSelectedUnselected.length > 2)
38406 40063
38407 datasets[datasetID].color = color; 40064 datasets[datasetID].color = color;
38408 } 40065 }
38409 } 40066 }
38410 } 40067 }
40068 });
40069 },
40070
40071 loadFromURL : function() {
40072 var dataLoaderWidget = this;
40073 dataLoaderWidget.datasets = [];
40074 //using jQuery-URL-Parser (https://github.com/skruse/jQuery-URL-Parser)
40075 var datasets = dataLoaderWidget.datasets;
40076 var parametersHash = $.url().param();
40077 var parametersArray = [];
40078 $.each(parametersHash,function(paramName, paramValue){
40079 parametersArray.push({paramName:paramName, paramValue:paramValue});
38411 }); 40080 });
38412 //delete undefined entries in the array
38413 //(can happen if the sequence given in the URL is not complete
38414 // e.g. kml0=..,kml2=..)
38415 //this also reorders the array, starting with 0
38416 var tempDatasets = [];
38417 for(var index in datasets){
38418 if (datasets[index] instanceof Dataset){
38419 tempDatasets.push(datasets[index]);
38420 }
38421 }
38422 datasets = tempDatasets;
38423 40081
38424 if (datasets.length > 0) 40082 var parseParam = function(paramNr){
38425 dataLoaderWidget.dataLoader.distributeDatasets(datasets); 40083
40084 if (paramNr==parametersArray.length){
40085 dataLoaderWidget.loadRenames();
40086 dataLoaderWidget.loadFilters();
40087 dataLoaderWidget.loadColors();
40088
40089 //delete undefined entries in the array
40090 //(can happen if the sequence given in the URL is not complete
40091 // e.g. kml0=..,kml2=..)
40092 //this also reorders the array, starting with 0
40093 var tempDatasets = [];
40094 for(var index in datasets){
40095 if (datasets[index] instanceof Dataset){
40096 tempDatasets.push(datasets[index]);
40097 }
40098 }
40099 datasets = tempDatasets;
40100
40101 if (datasets.length > 0){
40102 dataLoaderWidget.dataLoader.distributeDatasets(datasets);
40103 }
40104 return;
40105 }
40106
40107 var paramName = parametersArray[paramNr].paramName;
40108 var paramValue = parametersArray[paramNr].paramValue;
40109
40110 var datasetID = parseInt(paramName.replace(/\D/g,''));
40111
40112 //startsWith and endsWith defined in SIMILE Ajax (string.js)
40113 var fileName = dataLoaderWidget.dataLoader.getFileName(paramValue);
40114 var origURL = paramValue;
40115 if (typeof GeoTemConfig.proxy != 'undefined')
40116 paramValue = GeoTemConfig.proxy + paramValue;
40117 if (paramName.toLowerCase().startsWith("kml")){
40118 GeoTemConfig.getKml(paramValue, function(kmlDoc){
40119 var dataSet = new Dataset(GeoTemConfig.loadKml(kmlDoc), fileName, origURL);
40120 if (dataSet != null){
40121 if (!isNaN(datasetID)){
40122 datasets[datasetID] = dataSet;
40123 } else {
40124 datasets.push(dataSet);
40125 }
40126 }
40127 setTimeout(function(){parseParam(paramNr+1)},1);
40128 });
40129 }
40130 else if (paramName.toLowerCase().startsWith("csv")){
40131 GeoTemConfig.getCsv(paramValue,function(json){
40132 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
40133 if (dataSet != null){
40134 if (!isNaN(datasetID)){
40135 datasets[datasetID] = dataSet;
40136 } else {
40137 datasets.push(dataSet);
40138 }
40139 }
40140 setTimeout(function(){parseParam(paramNr+1)},1);
40141 });
40142 }
40143 else if (paramName.toLowerCase().startsWith("json")){
40144 GeoTemConfig.getJson(paramValue,function(json ){
40145 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
40146 if (dataSet != null){
40147 if (!isNaN(datasetID)){
40148 datasets[datasetID] = dataSet;
40149 } else {
40150 datasets.push(dataSet);
40151 }
40152 }
40153 setTimeout(function(){parseParam(paramNr+1)},1);
40154 });
40155 }
40156 else if (paramName.toLowerCase().startsWith("local")){
40157 var csv = $.remember({name:encodeURIComponent(origURL)});
40158 //TODO: this is a bad idea and will be changed upon having a better
40159 //usage model for local stored data
40160 var fileName = origURL.substring("GeoBrowser_dataset_".length);
40161 var json = GeoTemConfig.convertCsv(csv);
40162 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL, "local");
40163 if (dataSet != null){
40164 if (!isNaN(datasetID)){
40165 datasets[datasetID] = dataSet;
40166 } else {
40167 datasets.push(dataSet);
40168 }
40169 }
40170 setTimeout(function(){parseParam(paramNr+1)},1);
40171 } else if (paramName.toLowerCase().startsWith("xls")){
40172 GeoTemConfig.getBinary(paramValue,function(binaryData){
40173 var data = new Uint8Array(binaryData);
40174 var arr = new Array();
40175 for(var i = 0; i != data.length; ++i){
40176 arr[i] = String.fromCharCode(data[i]);
40177 }
40178
40179 var workbook;
40180 var json;
40181 if (paramName.toLowerCase().startsWith("xlsx")){
40182 workbook = XLSX.read(arr.join(""), {type:"binary"});
40183 var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]);
40184 var json = GeoTemConfig.convertCsv(csv);
40185 } else {
40186 workbook = XLS.read(arr.join(""), {type:"binary"});
40187 var csv = XLS.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]);
40188 var json = GeoTemConfig.convertCsv(csv);
40189 }
40190
40191 var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
40192 if (dataSet != null){
40193 if (!isNaN(datasetID)){
40194 datasets[datasetID] = dataSet;
40195 } else {
40196 datasets.push(dataSet);
40197 }
40198 }
40199 setTimeout(function(){parseParam(paramNr+1)},1);
40200 });
40201 } else {
40202 setTimeout(function(){parseParam(paramNr+1)},1);
40203 }
40204 };
40205
40206 if (parametersArray.length>0){
40207 parseParam(0)
40208 }
38426 } 40209 }
38427 }; 40210 };
38428 /* 40211 /*
38429 * FuzzyTimelineConfig.js 40212 * FuzzyTimelineConfig.js
38430 * 40213 *
39191 weight = this.weight * ticks.firstTickPercentage; 40974 weight = this.weight * ticks.firstTickPercentage;
39192 else if (i == ticks.lastTick) 40975 else if (i == ticks.lastTick)
39193 weight = this.weight * ticks.lastTickPercentage; 40976 weight = this.weight * ticks.lastTickPercentage;
39194 else 40977 else
39195 weight = this.weight; 40978 weight = this.weight;
39196
39197 weight = this.weight;
39198 } 40979 }
39199 40980
39200 chartDataCounter[i] += weight; 40981 chartDataCounter[i] += weight;
39201 //add this object to the hash 40982 //add this object to the hash
39202 if (typeof objectHash[i] === "undefined") 40983 if (typeof objectHash[i] === "undefined")
39967 moment.duration(10000, 'years'), 41748 moment.duration(10000, 'years'),
39968 ]; 41749 ];
39969 var overallSpan = rangeSlider.parent.overallMax-rangeSlider.parent.overallMin; 41750 var overallSpan = rangeSlider.parent.overallMax-rangeSlider.parent.overallMin;
39970 //only add spans that are not too small for the data 41751 //only add spans that are not too small for the data
39971 for (var i = 0; i < fixedSpans.length; i++){ 41752 for (var i = 0; i < fixedSpans.length; i++){
39972 if ( (fixedSpans[i].asMilliseconds() > (smallestSpan.asMilliseconds() * 0.5)) && 41753 if ( (fixedSpans[i].asMilliseconds() > (smallestSpan.asMilliseconds() * 0.25)) &&
39973 (fixedSpans[i].asMilliseconds() < overallSpan) 41754 (fixedSpans[i].asMilliseconds() < overallSpan)
39974 && 41755 &&
39975 ( 41756 (
39976 rangeSlider.parent.options.showAllPossibleSpans || 41757 rangeSlider.parent.options.showAllPossibleSpans ||
39977 ((rangeSlider.parent.overallMax-rangeSlider.parent.overallMin)/fixedSpans[i]<rangeSlider.options.maxBars) 41758 ((rangeSlider.parent.overallMax-rangeSlider.parent.overallMin)/fixedSpans[i]<rangeSlider.options.maxBars)
40311 selectionChanged : function(selection) { 42092 selectionChanged : function(selection) {
40312 var fuzzyTimeline = this; 42093 var fuzzyTimeline = this;
40313 if( !GeoTemConfig.selectionEvents ){ 42094 if( !GeoTemConfig.selectionEvents ){
40314 return; 42095 return;
40315 } 42096 }
40316 if (selection.valid()) 42097 if ((typeof selection.objects !== "undefined")&&
40317 fuzzyTimeline.selected = selection.objects; 42098 (selection.objects.length == GeoTemConfig.datasets.length)){
40318 else 42099 var objectCount = 0;
42100 for (var i=0, il=selection.objects.length; i < il; i++){
42101 objectCount += selection.objects[i].length;
42102 }
42103 if (objectCount > 0){
42104 fuzzyTimeline.selected = selection.objects;
42105 } else {
42106 delete fuzzyTimeline.selected;
42107 }
42108 } else
40319 delete fuzzyTimeline.selected; 42109 delete fuzzyTimeline.selected;
40320 if (fuzzyTimeline.viewMode === "density") 42110 if (fuzzyTimeline.viewMode === "density")
40321 this.density.selectionChanged(fuzzyTimeline.selected); 42111 this.density.selectionChanged(fuzzyTimeline.selected);
40322 else if (fuzzyTimeline.viewMode === "barchart") 42112 else if (fuzzyTimeline.viewMode === "barchart")
40323 this.rangeBars.selectionChanged(fuzzyTimeline.selected); 42113 this.rangeBars.selectionChanged(fuzzyTimeline.selected);
40732 var fuzzyTimeline = this; 42522 var fuzzyTimeline = this;
40733 var oldZoomFactor = fuzzyTimeline.zoomFactor; 42523 var oldZoomFactor = fuzzyTimeline.zoomFactor;
40734 fuzzyTimeline.zoomFactor = zoomFactor; 42524 fuzzyTimeline.zoomFactor = zoomFactor;
40735 if (zoomFactor > 1){ 42525 if (zoomFactor > 1){
40736 $(fuzzyTimeline.gui.plotDiv).width(zoomFactor*100+"%"); 42526 $(fuzzyTimeline.gui.plotDiv).width(zoomFactor*100+"%");
40737 //leave place for the scrollbar
40738 $(fuzzyTimeline.gui.plotDiv).height(fuzzyTimeline.gui.plotDIVHeight-20);
40739 } else{ 42527 } else{
40740 $(fuzzyTimeline.gui.plotDiv).width("100%"); 42528 $(fuzzyTimeline.gui.plotDiv).width("100%");
40741 $(fuzzyTimeline.gui.plotDiv).height(fuzzyTimeline.gui.plotDIVHeight); 42529 }
40742 } 42530 //leave place for the scrollbar
42531 $(fuzzyTimeline.gui.plotDiv).height(fuzzyTimeline.gui.plotDIVHeight-20);
40743 42532
40744 //fit handles 42533 //fit handles
40745 //this does not make much sense, as the selections are _completely_ different 42534 //this does not make much sense, as the selections are _completely_ different
40746 //for each scale rate, as the objects may reside in different "ticks" of the graph 42535 //for each scale rate, as the objects may reside in different "ticks" of the graph
40747 $(fuzzyTimeline.handles).each(function(){ 42536 $(fuzzyTimeline.handles).each(function(){
41597 43386
41598 if (chartData.length>0){ 43387 if (chartData.length>0){
41599 $(this.pieChartDiv).empty(); 43388 $(this.pieChartDiv).empty();
41600 43389
41601 //calculate height (flot NEEDS a height) 43390 //calculate height (flot NEEDS a height)
41602 var parentHeight = $(this.parent.gui.pieChartsDiv).outerHeight(true);// - $(this.parent.gui.columnSelectorDiv).outerHeight(true);//***lchang 43391 var parentHeight = $(this.parent.gui.pieChartsDiv).outerHeight(true) - $(this.parent.gui.columnSelectorDiv).outerHeight(true);
41603 var pieChartCount = 0; 43392 var pieChartCount = 0;
41604 $(this.parent.pieCharts).each(function(){ 43393 $(this.parent.pieCharts).each(function(){
41605 if (this instanceof PieChart) 43394 if (this instanceof PieChart)
41606 pieChartCount++; 43395 pieChartCount++;
41607 }); 43396 });
41608 var height = (parentHeight/pieChartCount) - $(this.informationDIV).outerHeight(true); 43397 var height = (parentHeight/pieChartCount) - $(this.informationDIV).outerHeight(true);
41609 if (pieChart.options.restrictPieChartSize !== false) 43398 if (pieChart.options.restrictPieChartSize !== false)
41610 height = Math.min(height, /*$(window).height()*/parentHeight * pieChart.options.restrictPieChartSize);//***lchang 43399 height = Math.min(height, $(window).height() * pieChart.options.restrictPieChartSize);
41611 if(height>300)
41612 height=300;
41613 if(height<150)
41614 height=150;
41615 $(this.pieChartDiv).height(height); 43400 $(this.pieChartDiv).height(height);
41616 43401
41617 $.plot($(this.pieChartDiv), chartData, 43402 $.plot($(this.pieChartDiv), chartData,
41618 { 43403 {
41619 series: { 43404 series: {
41759 43544
41760 this.dialog = $("<div></div>"); 43545 this.dialog = $("<div></div>");
41761 this.dialog.html("").dialog({modal: true}).dialog('open'); 43546 this.dialog.html("").dialog({modal: true}).dialog('open');
41762 43547
41763 //to asure that the dialog is above (z-index of) the toolbars 43548 //to asure that the dialog is above (z-index of) the toolbars
41764 $(".ui-front").css("z-index","20011"); 43549 $(".ui-front").css("z-index","10001");
41765 43550
41766 var allNumeric = this.loadValues(datasetIndex, columnName); 43551 var allNumeric = this.loadValues(datasetIndex, columnName);
41767 43552
41768 if (typeof allNumeric === "undefined") 43553 if (typeof allNumeric === "undefined")
41769 return; 43554 return;
42117 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de) 43902 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de)
42118 */ 43903 */
42119 function PieChartConfig(options) { 43904 function PieChartConfig(options) {
42120 43905
42121 this.options = { 43906 this.options = {
42122 restrictPieChartSize : 0.8, // restrict size to percantage of window size (false for no restriction) 43907 restrictPieChartSize : 0.25, // restrict size to percantage of window size (false for no restriction)
42123 localStoragePrefix : "GeoBrowser_PieChart_", // prefix for value name in LocalStorage 43908 localStoragePrefix : "GeoBrowser_PieChart_", // prefix for value name in LocalStorage
42124 allowLocalStorage : true, //whether LocalStorage save and load should be allowed (and buttons shown) 43909 allowLocalStorage : true, //whether LocalStorage save and load should be allowed (and buttons shown)
42125 }; 43910 };
42126 if ( typeof options != 'undefined') { 43911 if ( typeof options != 'undefined') {
42127 $.extend(this.options, options); 43912 $.extend(this.options, options);
42257 44042
42258 this.pieChartsDiv = document.createElement("div"); 44043 this.pieChartsDiv = document.createElement("div");
42259 this.pieChartsDiv.id = "pieChartsDivID"; 44044 this.pieChartsDiv.id = "pieChartsDivID";
42260 div.appendChild(this.pieChartsDiv); 44045 div.appendChild(this.pieChartsDiv);
42261 $(this.pieChartsDiv).height("100%"); 44046 $(this.pieChartsDiv).height("100%");
42262 var h=$(div).height();
42263 h-=30;
42264 $(this.pieChartsDiv).height(h);
42265 }; 44047 };
42266 44048
42267 PieChartGui.prototype = { 44049 PieChartGui.prototype = {
42268 44050
42269 refreshColumnSelector : function(){ 44051 refreshColumnSelector : function(){
43208 highlightChanged : function(objects) { 44990 highlightChanged : function(objects) {
43209 }, 44991 },
43210 44992
43211 selectionChanged : function(selection) { 44993 selectionChanged : function(selection) {
43212 }, 44994 },
44995 };
44996 /*
44997 * LineOverlay.js
44998 *
44999 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
45000 *
45001 * This library is free software; you can redistribute it and/or
45002 * modify it under the terms of the GNU Lesser General Public
45003 * License as published by the Free Software Foundation; either
45004 * version 3 of the License, or (at your option) any later version.
45005 *
45006 * This library is distributed in the hope that it will be useful,
45007 * but WITHOUT ANY WARRANTY; without even the implied warranty of
45008 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
45009 * Lesser General Public License for more details.
45010 *
45011 * You should have received a copy of the GNU Lesser General Public
45012 * License along with this library; if not, write to the Free Software
45013 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
45014 * MA 02110-1301 USA
45015 */
45016
45017 /**
45018 * @class LineOverlay
45019 * Implementation for an overlay showing lines between points
45020 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de)
45021 *
45022 * @param {HTML object} parent div to append the LineOverlay
45023 */
45024 function LineOverlay(parent) {
45025
45026 this.lineOverlay = this;
45027
45028 this.parent = parent;
45029 this.options = parent.options;
45030 this.attachedMapWidgets = parent.attachedMapWidgets;
45031
45032 this.overlays = [];
45033
45034 this.initialize();
45035 }
45036
45037 LineOverlay.prototype = {
45038
45039 initialize : function() {
45040 }
45041 };
45042 /*
45043 * LineOverlayConfig.js
45044 *
45045 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
45046 *
45047 * This library is free software; you can redistribute it and/or
45048 * modify it under the terms of the GNU Lesser General Public
45049 * License as published by the Free Software Foundation; either
45050 * version 3 of the License, or (at your option) any later version.
45051 *
45052 * This library is distributed in the hope that it will be useful,
45053 * but WITHOUT ANY WARRANTY; without even the implied warranty of
45054 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
45055 * Lesser General Public License for more details.
45056 *
45057 * You should have received a copy of the GNU Lesser General Public
45058 * License along with this library; if not, write to the Free Software
45059 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
45060 * MA 02110-1301 USA
45061 */
45062
45063 /**
45064 * @class LineOverlayConfig
45065 * LineOverlay Configuration File
45066 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de)
45067 */
45068 function LineOverlayConfig(options) {
45069 this.options = {
45070 showArrows : true,
45071 showLines : "both", //which directions will be shown: "both", "inbound", "outbound"
45072 onlyShowSelectedOrHighlighted : false, //only show lines in case of selection/highlight
45073 }
45074
45075 if ( typeof options != 'undefined') {
45076 $.extend(this.options, options);
45077 }
45078
45079 };
45080 /*
45081 * LineOverlayWidget.js
45082 *
45083 * Copyright (c) 2013, Sebastian Kruse. All rights reserved.
45084 *
45085 * This library is free software; you can redistribute it and/or
45086 * modify it under the terms of the GNU Lesser General Public
45087 * License as published by the Free Software Foundation; either
45088 * version 3 of the License, or (at your option) any later version.
45089 *
45090 * This library is distributed in the hope that it will be useful,
45091 * but WITHOUT ANY WARRANTY; without even the implied warranty of
45092 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
45093 * Lesser General Public License for more details.
45094 *
45095 * You should have received a copy of the GNU Lesser General Public
45096 * License along with this library; if not, write to the Free Software
45097 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
45098 * MA 02110-1301 USA
45099 */
45100
45101 //calculate angle between line and x-axis
45102 //credits: geometricnet (http://geometricnet.sourceforge.net/examples/directions.html)
45103 bearing = function(x1,y1,x2,y2) {
45104 b_x = 0;
45105 b_y = 1;
45106 a_x = x2 - x1;
45107 a_y = y2 - y1;
45108 angle_rad = Math.acos((a_x*b_x+a_y*b_y)/Math.sqrt(a_x*a_x+a_y*a_y)) ;
45109 angle = 360/(2*Math.PI)*angle_rad;
45110 if (a_x < 0) {
45111 return 360 - angle;
45112 } else {
45113 return angle;
45114 }
45115 };
45116
45117 /**
45118 * @class LineOverlayWidget
45119 * Implementation for the widget interactions of an overlay showing lines between points
45120 * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de)
45121 *
45122 * @param {WidgetWrapper} core wrapper for interaction to other widgets
45123 * @param {JSON} options user specified configuration that overwrites options in OverlayloaderConfig.js
45124 */
45125 LineOverlayWidget = function (core, options) {
45126
45127 this.core = core;
45128 this.core.setWidget(this);
45129
45130 this.options = (new LineOverlayConfig(options)).options;
45131
45132 this.attachedMapWidgets = new Array();
45133
45134 this.lineOverlay = new LineOverlay(this);
45135 this.lines = [];
45136 this.multiLineFeature;
45137
45138 this.selected = [];
45139 }
45140
45141 /**
45142 * @param {Number} dataSet number of dataSet in dataSet array
45143 * @param {Number} objectID number of DataObject in objects array
45144 */
45145
45146 function Line(objectStart, objectEnd ) {
45147 this.objectStart = objectStart;
45148 this.objectEnd = objectEnd;
45149 }
45150
45151 LineOverlayWidget.prototype = {
45152
45153 initWidget : function() {
45154 var lineOverlayWidget = this;
45155 this.drawLines();
45156 },
45157
45158 highlightChanged : function(objects) {
45159 if( !GeoTemConfig.highlightEvents ){
45160 return;
45161 }
45162 this.drawLines(GeoTemConfig.mergeObjects(objects,this.selected));
45163 },
45164
45165 selectionChanged : function(selection) {
45166 if( !GeoTemConfig.selectionEvents ){
45167 return;
45168 }
45169 if (selection.valid())
45170 this.selected = selection.objects;
45171 else
45172 this.selected = [];
45173
45174 this.drawLines(this.selected);
45175 },
45176
45177 triggerHighlight : function(item) {
45178 },
45179
45180 tableSelection : function() {
45181 },
45182
45183 deselection : function() {
45184 },
45185
45186 filtering : function() {
45187 },
45188
45189 inverseFiltering : function() {
45190 },
45191
45192 triggerRefining : function() {
45193 },
45194
45195 reset : function() {
45196 },
45197
45198 //identical to the function in PieChartWidget
45199 //here cause widgets may be used independed of each other
45200 getElementData : function(dataObject, watchedColumn, selectionFunction) {
45201 var columnData;
45202 if (watchedColumn.indexOf("[") === -1){
45203 columnData = dataObject[watchedColumn];
45204 if (typeof columnData === "undefined"){
45205 columnData = dataObject.tableContent[watchedColumn];
45206 };
45207 } else {
45208 try {
45209 var columnName = watchedColumn.split("[")[0];
45210 var IndexAndAttribute = watchedColumn.split("[")[1];
45211 if (IndexAndAttribute.indexOf("]") != -1){
45212 var arrayIndex = IndexAndAttribute.split("]")[0];
45213 var attribute = IndexAndAttribute.split("]")[1];
45214
45215 if (typeof attribute === "undefined")
45216 columnData = dataObject[columnName][arrayIndex];
45217 else{
45218 attribute = attribute.split(".")[1];
45219 columnData = dataObject[columnName][arrayIndex][attribute];
45220 }
45221 }
45222 } catch(e) {
45223 if (typeof console !== undefined)
45224 console.error(e);
45225
45226 delete columnData;
45227 }
45228 }
45229
45230 if ( (typeof columnData !== "undefined") && (typeof selectionFunction !== "undefined") )
45231 columnData = selectionFunction(columnData);
45232
45233 return(columnData);
45234 },
45235
45236 matchColumns : function(dataSet1, columnName1, dataSet2, columnName2) {
45237 var lineOverlayWidget = this;
45238 lineOverlayWidget.lines;
45239 $(GeoTemConfig.datasets[dataSet1].objects).each(function(){
45240 var object1 = this;
45241 var data1 = lineOverlayWidget.getElementData(object1, columnName1);
45242 //split because there could be multiple comma separated values
45243 data1 = data1.split(",");
45244
45245 $(GeoTemConfig.datasets[dataSet2].objects).each(function(){
45246 var object2 = this;
45247 //avoid reflexive and double entries
45248 if ((columnName1 === columnName2)&&(dataSet1 === dataSet2)&&(object1.index<=object2.index))
45249 return;
45250 var data2 = lineOverlayWidget.getElementData(object2, columnName2);
45251 //split because there could be multiple comma separated values
45252 data2 = data2.split(",");
45253
45254 //check if at least one pair matches
45255 for(var i = 0; i < data1.length; i++ ){
45256 var firstVal = data1[i];
45257 if (data2.indexOf(firstVal) !== -1){
45258 lineOverlayWidget.lines.push(new Line(object1, object2));
45259 break;
45260 }
45261 }
45262 });
45263 });
45264 },
45265
45266 getXYofObject : function(cs,dataObject){
45267 //iterata over datasets
45268 var x,y;
45269 var found = false;
45270 $(cs).each(function(){
45271 //iterate over circles
45272 $(this).each(function(){
45273 var circle = this;
45274 //iterata over objects in this circle;
45275 var index = $.inArray(dataObject,circle.elements);
45276 if (index !== -1){
45277 x = circle.feature.geometry.x;
45278 y = circle.feature.geometry.y;
45279 found = true;
45280 return false;
45281 }
45282 });
45283 //break loop
45284 if (found === true)
45285 return false;
45286 });
45287
45288 return ({x:x,y:y});
45289 },
45290
45291 /**
45292 * @param {DataObjects[][]} objects set of objects to limit to
45293 */
45294 drawLines : function(objects) {
45295 var flatObjects = [];
45296 if ( (typeof objects !== "undefined") &&
45297 (objects instanceof Array) &&
45298 (objects.length > 0) ) {
45299 $(objects).each(function(){
45300 $.merge(flatObjects, this);
45301 });
45302 }
45303 var lineOverlayWidget = this;
45304
45305 $(lineOverlayWidget.attachedMapWidgets).each(function(){
45306 var mapWidget = this.mapWidget;
45307 var lineLayer = this.lineLayer;
45308
45309 var map = mapWidget.openlayersMap;
45310 var cs = mapWidget.mds.getObjectsByZoom();
45311
45312 mapWidget.openlayersMap.setLayerIndex(lineLayer, 99);
45313
45314 lineLayer.removeAllFeatures();
45315
45316 var lineElements = [];
45317
45318 var checkIfLineInPreset = function(){return false;};
45319 if (lineOverlayWidget.options.showLines === "inbound"){
45320 checkIfLineInPreset = function(objectStart,objectEnd,flatObjects){
45321 return ($.inArray(objectEnd, flatObjects) === -1);
45322 };
45323 } else if (lineOverlayWidget.options.showLines === "outbound"){
45324 checkIfLineInPreset = function(objectStart,objectEnd,flatObjects){
45325 return ($.inArray(objectStart, flatObjects) === -1);
45326 };
45327 } else /*if (lineOverlayWidget.options.showLines === "both")*/{
45328 checkIfLineInPreset = function(objectStart,objectEnd,flatObjects){
45329 return ( ($.inArray(objectStart, flatObjects) === -1) &&
45330 ($.inArray(objectEnd, flatObjects) === -1) );
45331 };
45332 }
45333
45334 $(lineOverlayWidget.lines).each(function(){
45335 var line = this;
45336
45337 if ((lineOverlayWidget.options.onlyShowSelectedOrHighlighted === true) || (flatObjects.length > 0)){
45338 //if objects are limited, check whether start or end are within
45339 if (checkIfLineInPreset(line.objectStart, line.objectEnd, flatObjects))
45340 return;
45341 }
45342 //get XY-val of start Object
45343 var xyStart = lineOverlayWidget.getXYofObject(cs, line.objectStart);
45344 //continue if no valid XY-coords where found
45345 if ( (typeof xyStart.x === "undefined") && (typeof xyStart.y === "undefined") )
45346 return;
45347 var xyEnd = lineOverlayWidget.getXYofObject(cs, line.objectEnd);
45348 //continue if no valid XY-coords where found
45349 if ( (typeof xyEnd.x === "undefined") && (typeof xyEnd.y === "undefined") )
45350 return;
45351
45352 //do not draw 0-length lines (from same circle)
45353 if ( (xyStart.x === xyEnd.x) && (xyStart.y === xyEnd.y) )
45354 return;
45355
45356 var points = new Array(
45357 new OpenLayers.Geometry.Point(xyStart.x, xyStart.y),
45358 new OpenLayers.Geometry.Point(xyEnd.x, xyEnd.y)
45359 );
45360
45361 var line = new OpenLayers.Geometry.LineString(points);
45362
45363 //Only draw each line once. Unfortunately this check is faster
45364 //than drawing multiple lines.
45365 var found = false;
45366 $(lineElements).each(function(){
45367 var checkLine = this.line;
45368 if (( (checkLine.components[0].x === line.components[0].x) &&
45369 (checkLine.components[0].y === line.components[0].y) &&
45370 (checkLine.components[1].x === line.components[1].x) &&
45371 (checkLine.components[1].y === line.components[1].y) ) ||
45372 // if lines are "directional" (arrows) the opposite one isn't the same anymore!
45373 ( (lineOverlayWidget.options.showArrows === false) &&
45374 (checkLine.components[0].x === line.components[1].x) &&
45375 (checkLine.components[0].y === line.components[1].y) &&
45376 (checkLine.components[1].x === line.components[0].x) &&
45377 (checkLine.components[1].y === line.components[0].y) ) ){
45378 found = true;
45379 //increase width of this line
45380 this.width++;
45381 //and don't draw it again
45382 return false;
45383 }
45384 });
45385
45386 if (found === true)
45387 return;
45388
45389 lineElements.push({line:line,width:1});
45390 });
45391
45392 $(lineElements).each(function(){
45393 var line = this.line;
45394 var width = this.width;
45395
45396 if (lineOverlayWidget.options.showArrows === true){
45397 var xyStart = line.components[0];
45398 var xyEnd = line.components[1];
45399 var arrowFeature = new OpenLayers.Feature.Vector(
45400 new OpenLayers.Geometry.Point(xyEnd.x-((xyEnd.x-xyStart.x)*0.03), xyEnd.y-((xyEnd.y-xyStart.y)*0.03)),
45401 {
45402 type: "triangle",
45403 angle: bearing(xyStart.x,xyStart.y,xyEnd.x,xyEnd.y),
45404 width: width+1
45405 }
45406 );
45407 lineLayer.addFeatures(arrowFeature);
45408 }
45409
45410 var lineFeature = new OpenLayers.Feature.Vector(line,{width:width});
45411 lineLayer.addFeatures(lineFeature);
45412 });
45413 });
45414 },
45415
45416 attachMapWidget : function(mapWidget) {
45417 var styles = new OpenLayers.StyleMap({
45418 "default": {
45419 graphicName: "${type}",
45420 rotation: "${angle}",
45421 pointRadius: "${width}",
45422 strokeColor: '#0000ff',
45423 strokeOpacity: 0.5,
45424 strokeWidth: "${width}",
45425 fillOpacity: 1
45426 }
45427 });
45428
45429 var lineOverlayWidget = this;
45430 var lineLayer = new OpenLayers.Layer.Vector("Line Layer", {
45431 styleMap: styles,
45432 isBaseLayer:false
45433 });
45434 mapWidget.openlayersMap.addLayer(lineLayer);
45435 mapWidget.openlayersMap.setLayerIndex(lineLayer, 99);
45436 this.attachedMapWidgets.push({mapWidget:mapWidget,lineLayer:lineLayer});
45437 //register zoom event
45438 mapWidget.openlayersMap.events.register("zoomend", lineOverlayWidget, function(){
45439 this.drawLines(this.selected);
45440 });
45441 }
43213 }; 45442 };
43214 /* 45443 /*
43215 * DataObject.js 45444 * DataObject.js
43216 * 45445 *
43217 * Copyright (c) 2012, Stefan Jänicke. All rights reserved. 45446 * Copyright (c) 2012, Stefan Jänicke. All rights reserved.