forked from sheetjs/sheetjs
		
	version bump 0.12.3: cleanup
- PtgList and old Ptg record support - fleshed out ftab constants from macrosheet support - reimplemented / fixed / removed shim functions - demo refresh
This commit is contained in:
		
							parent
							
								
									8508ad4e94
								
							
						
					
					
						commit
						5dd16ae640
					
				@ -257,11 +257,15 @@ To use the shim, add the shim before the script tag that loads `xlsx.js`:
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<!-- add the shim first -->
 | 
			
		||||
<script type="text/javascript" src="shim.js"></script>
 | 
			
		||||
<script type="text/javascript" src="shim.min.js"></script>
 | 
			
		||||
<!-- after the shim is referenced, add the library -->
 | 
			
		||||
<script type="text/javascript" src="xlsx.full.min.js"></script>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The script also includes `IE_LoadFile` and `IE_SaveFile` for loading and saving
 | 
			
		||||
files in Internet Explorer versions 6-9.  The `xlsx.extendscript.js` script
 | 
			
		||||
bundles the shim in a format suitable for Photoshop and other Adobe products.
 | 
			
		||||
 | 
			
		||||
## Philosophy
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
@ -2050,7 +2054,7 @@ For the example sheet:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
> var o = XLSX.utils.sheet_to_formulae(ws);
 | 
			
		||||
> o.filter(function(v, i) { return i % 5 === 0; });
 | 
			
		||||
> [o[0], o[5], o[10], o[15], o[20]];
 | 
			
		||||
[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]
 | 
			
		||||
```
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
XLSX.version = '0.12.2';
 | 
			
		||||
XLSX.version = '0.12.3';
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,8 @@
 | 
			
		||||
function keys(o/*:any*/)/*:Array<any>*/ { return Object.keys(o); }
 | 
			
		||||
function keys(o/*:any*/)/*:Array<any>*/ {
 | 
			
		||||
	var ks = Object.keys(o), o2 = [];
 | 
			
		||||
	for(var i = 0; i < ks.length; ++i) if(o.hasOwnProperty(ks[i])) o2.push(ks[i]);
 | 
			
		||||
	return o2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function evert_key(obj/*:any*/, key/*:string*/)/*:EvertType*/ {
 | 
			
		||||
	var o = ([]/*:any*/), K = keys(obj);
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,12 @@ function getzipstr(zip, file/*:string*/, safe/*:?boolean*/)/*:?string*/ {
 | 
			
		||||
	try { return getzipstr(zip, file); } catch(e) { return null; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function zipentries(zip) {
 | 
			
		||||
	var k = keys(zip.files), o = [];
 | 
			
		||||
	for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
 | 
			
		||||
	return o.sort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var jszip;
 | 
			
		||||
/*:: declare var JSZip:any; */
 | 
			
		||||
/*global JSZip:true */
 | 
			
		||||
 | 
			
		||||
@ -100,7 +100,7 @@ function parse_PtgArea3d(blob, length, opts) {
 | 
			
		||||
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
 | 
			
		||||
function parse_PtgAreaErr(blob, length, opts) {
 | 
			
		||||
	var type = (blob[blob.l++] & 0x60) >> 5;
 | 
			
		||||
	blob.l += opts && opts.biff > 8 ? 12 : 8;
 | 
			
		||||
	blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
 | 
			
		||||
	return [type];
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
 | 
			
		||||
@ -232,8 +232,8 @@ function parse_PtgFunc(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
 | 
			
		||||
function parse_PtgFuncVar(blob, length, opts) {
 | 
			
		||||
	blob.l++;
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [0, blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	var type = blob[blob.l++];
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -430,12 +430,35 @@ var parse_PtgElfRw = parse_PtgElfLoc;
 | 
			
		||||
/* [MS-XLS] 2.5.198.55 */
 | 
			
		||||
var parse_PtgElfRwV = parse_PtgElfLoc;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 TODO */
 | 
			
		||||
var PtgListRT = [
 | 
			
		||||
	"Data",
 | 
			
		||||
	"All",
 | 
			
		||||
	"Headers",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Data2",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataHeaders",
 | 
			
		||||
	"??",
 | 
			
		||||
	"Totals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataTotals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Current"
 | 
			
		||||
];
 | 
			
		||||
function parse_PtgList(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var ixti = blob.read_shift(2);
 | 
			
		||||
	blob.l += 10;
 | 
			
		||||
	return {ixti: ixti};
 | 
			
		||||
	var flags = blob.read_shift(2);
 | 
			
		||||
	var idx = blob.read_shift(4);
 | 
			
		||||
	var c = blob.read_shift(2);
 | 
			
		||||
	var C = blob.read_shift(2);
 | 
			
		||||
	var rt = PtgListRT[(flags >> 2) & 0x1F];
 | 
			
		||||
	return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
 | 
			
		||||
function parse_PtgSxName(blob/*::, length, opts*/) {
 | 
			
		||||
@ -443,6 +466,32 @@ function parse_PtgSxName(blob/*::, length, opts*/) {
 | 
			
		||||
	return [blob.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [XLS] old spec */
 | 
			
		||||
function parse_PtgSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += 5;
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 1 : 4);
 | 
			
		||||
	return ["PTGSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgEndSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 4 : 5);
 | 
			
		||||
	return ["PTGENDSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemAreaN(blob/*::, length, opts*/) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemNoMemN(blob/*::, length, opts*/) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgAttrNoop(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	return [0, 0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
 | 
			
		||||
var PtgTypes = {
 | 
			
		||||
	/*::[*/0x01/*::]*/: { n:'PtgExp', f:parse_PtgExp },
 | 
			
		||||
@ -468,6 +517,8 @@ var PtgTypes = {
 | 
			
		||||
	/*::[*/0x15/*::]*/: { n:'PtgParen', f:parseread1 },
 | 
			
		||||
	/*::[*/0x16/*::]*/: { n:'PtgMissArg', f:parseread1 },
 | 
			
		||||
	/*::[*/0x17/*::]*/: { n:'PtgStr', f:parse_PtgStr },
 | 
			
		||||
	/*::[*/0x1A/*::]*/: { n:'PtgSheet', f:parse_PtgSheet },
 | 
			
		||||
	/*::[*/0x1B/*::]*/: { n:'PtgEndSheet', f:parse_PtgEndSheet },
 | 
			
		||||
	/*::[*/0x1C/*::]*/: { n:'PtgErr', f:parse_PtgErr },
 | 
			
		||||
	/*::[*/0x1D/*::]*/: { n:'PtgBool', f:parse_PtgBool },
 | 
			
		||||
	/*::[*/0x1E/*::]*/: { n:'PtgInt', f:parse_PtgInt },
 | 
			
		||||
@ -486,6 +537,8 @@ var PtgTypes = {
 | 
			
		||||
	/*::[*/0x2B/*::]*/: { n:'PtgAreaErr', f:parse_PtgAreaErr },
 | 
			
		||||
	/*::[*/0x2C/*::]*/: { n:'PtgRefN', f:parse_PtgRefN },
 | 
			
		||||
	/*::[*/0x2D/*::]*/: { n:'PtgAreaN', f:parse_PtgAreaN },
 | 
			
		||||
	/*::[*/0x2E/*::]*/: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
 | 
			
		||||
	/*::[*/0x2F/*::]*/: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
 | 
			
		||||
	/*::[*/0x39/*::]*/: { n:'PtgNameX', f:parse_PtgNameX },
 | 
			
		||||
	/*::[*/0x3A/*::]*/: { n:'PtgRef3d', f:parse_PtgRef3d },
 | 
			
		||||
	/*::[*/0x3B/*::]*/: { n:'PtgArea3d', f:parse_PtgArea3d },
 | 
			
		||||
@ -509,6 +562,9 @@ var PtgDupes = {
 | 
			
		||||
	/*::[*/0x4B/*::]*/: 0x2B, /*::[*/0x6B/*::]*/: 0x2B,
 | 
			
		||||
	/*::[*/0x4C/*::]*/: 0x2C, /*::[*/0x6C/*::]*/: 0x2C,
 | 
			
		||||
	/*::[*/0x4D/*::]*/: 0x2D, /*::[*/0x6D/*::]*/: 0x2D,
 | 
			
		||||
	/*::[*/0x4E/*::]*/: 0x2E, /*::[*/0x6E/*::]*/: 0x2E,
 | 
			
		||||
	/*::[*/0x4F/*::]*/: 0x2F, /*::[*/0x6F/*::]*/: 0x2F,
 | 
			
		||||
	/*::[*/0x58/*::]*/: 0x22, /*::[*/0x78/*::]*/: 0x22,
 | 
			
		||||
	/*::[*/0x59/*::]*/: 0x39, /*::[*/0x79/*::]*/: 0x39,
 | 
			
		||||
	/*::[*/0x5A/*::]*/: 0x3A, /*::[*/0x7A/*::]*/: 0x3A,
 | 
			
		||||
	/*::[*/0x5B/*::]*/: 0x3B, /*::[*/0x7B/*::]*/: 0x3B,
 | 
			
		||||
@ -533,6 +589,7 @@ var Ptg18 = {
 | 
			
		||||
	/*::[*/0xFF/*::]*/: {}
 | 
			
		||||
};
 | 
			
		||||
var Ptg19 = {
 | 
			
		||||
	/*::[*/0x00/*::]*/: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
 | 
			
		||||
	/*::[*/0x01/*::]*/: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
 | 
			
		||||
	/*::[*/0x02/*::]*/: { n:'PtgAttrIf', f:parse_PtgAttrIf },
 | 
			
		||||
	/*::[*/0x04/*::]*/: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
 | 
			
		||||
@ -589,10 +646,7 @@ function parse_Rgce(blob, length, opts) {
 | 
			
		||||
		length = target - blob.l;
 | 
			
		||||
		id = blob[blob.l];
 | 
			
		||||
		R = PtgTypes[id];
 | 
			
		||||
		if(id === 0x18 || id === 0x19) {
 | 
			
		||||
			id = blob[blob.l + 1];
 | 
			
		||||
			R = (id === 0x18 ? Ptg18 : Ptg19)[id];
 | 
			
		||||
		}
 | 
			
		||||
		if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
 | 
			
		||||
		if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
		else { ptgs.push([R.n, R.f(blob, length, opts)]); }
 | 
			
		||||
@ -919,6 +973,18 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
 | 
			
		||||
			case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
 | 
			
		||||
				stack.push("#REF!"); break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
				// $FlowIgnore
 | 
			
		||||
				stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemAreaN':
 | 
			
		||||
			case 'PtgMemNoMemN':
 | 
			
		||||
			case 'PtgAttrNoop':
 | 
			
		||||
			case 'PtgSheet':
 | 
			
		||||
			case 'PtgEndSheet':
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
 | 
			
		||||
@ -938,13 +1004,10 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
 | 
			
		||||
 | 
			
		||||
			case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
 | 
			
		||||
			default: throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
		}
 | 
			
		||||
		var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
 | 
			
		||||
		if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
		if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
			f = formula[0][last_sp];
 | 
			
		||||
			var _left = true;
 | 
			
		||||
			switch(f[1][0]) {
 | 
			
		||||
 | 
			
		||||
@ -885,6 +885,7 @@ var Ftab = {
 | 
			
		||||
var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0002/*::]*/: 1, /* ISNA */
 | 
			
		||||
	/*::[*/0x0003/*::]*/: 1, /* ISERROR */
 | 
			
		||||
	/*::[*/0x000A/*::]*/: 0, /* NA */
 | 
			
		||||
	/*::[*/0x000F/*::]*/: 1, /* SIN */
 | 
			
		||||
	/*::[*/0x0010/*::]*/: 1, /* COS */
 | 
			
		||||
	/*::[*/0x0011/*::]*/: 1, /* TAN */
 | 
			
		||||
@ -902,6 +903,8 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x001F/*::]*/: 3, /* MID */
 | 
			
		||||
	/*::[*/0x0020/*::]*/: 1, /* LEN */
 | 
			
		||||
	/*::[*/0x0021/*::]*/: 1, /* VALUE */
 | 
			
		||||
	/*::[*/0x0022/*::]*/: 0, /* TRUE */
 | 
			
		||||
	/*::[*/0x0023/*::]*/: 0, /* FALSE */
 | 
			
		||||
	/*::[*/0x0026/*::]*/: 1, /* NOT */
 | 
			
		||||
	/*::[*/0x0027/*::]*/: 2, /* MOD */
 | 
			
		||||
	/*::[*/0x0028/*::]*/: 3, /* DCOUNT */
 | 
			
		||||
@ -914,6 +917,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0030/*::]*/: 2, /* TEXT */
 | 
			
		||||
	/*::[*/0x0035/*::]*/: 1, /* GOTO */
 | 
			
		||||
	/*::[*/0x003D/*::]*/: 3, /* MIRR */
 | 
			
		||||
	/*::[*/0x003F/*::]*/: 0, /* RAND */
 | 
			
		||||
	/*::[*/0x0041/*::]*/: 3, /* DATE */
 | 
			
		||||
	/*::[*/0x0042/*::]*/: 3, /* TIME */
 | 
			
		||||
	/*::[*/0x0043/*::]*/: 1, /* DAY */
 | 
			
		||||
@ -923,6 +927,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0047/*::]*/: 1, /* HOUR */
 | 
			
		||||
	/*::[*/0x0048/*::]*/: 1, /* MINUTE */
 | 
			
		||||
	/*::[*/0x0049/*::]*/: 1, /* SECOND */
 | 
			
		||||
	/*::[*/0x004A/*::]*/: 0, /* NOW */
 | 
			
		||||
	/*::[*/0x004B/*::]*/: 1, /* AREAS */
 | 
			
		||||
	/*::[*/0x004C/*::]*/: 1, /* ROWS */
 | 
			
		||||
	/*::[*/0x004D/*::]*/: 1, /* COLUMNS */
 | 
			
		||||
@ -931,13 +936,18 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0053/*::]*/: 1, /* TRANSPOSE */
 | 
			
		||||
	/*::[*/0x0055/*::]*/: 0, /* STEP */
 | 
			
		||||
	/*::[*/0x0056/*::]*/: 1, /* TYPE */
 | 
			
		||||
	/*::[*/0x0059/*::]*/: 0, /* CALLER */
 | 
			
		||||
	/*::[*/0x005A/*::]*/: 1, /* DEREF */
 | 
			
		||||
	/*::[*/0x005E/*::]*/: 0, /* ACTIVE.CELL */
 | 
			
		||||
	/*::[*/0x005F/*::]*/: 0, /* SELECTION */
 | 
			
		||||
	/*::[*/0x0061/*::]*/: 2, /* ATAN2 */
 | 
			
		||||
	/*::[*/0x0062/*::]*/: 1, /* ASIN */
 | 
			
		||||
	/*::[*/0x0063/*::]*/: 1, /* ACOS */
 | 
			
		||||
	/*::[*/0x0065/*::]*/: 3, /* HLOOKUP */
 | 
			
		||||
	/*::[*/0x0066/*::]*/: 3, /* VLOOKUP */
 | 
			
		||||
	/*::[*/0x0069/*::]*/: 1, /* ISREF */
 | 
			
		||||
	/*::[*/0x006A/*::]*/: 1, /* GET.FORMULA */
 | 
			
		||||
	/*::[*/0x006C/*::]*/: 2, /* SET.VALUE */
 | 
			
		||||
	/*::[*/0x006F/*::]*/: 1, /* CHAR */
 | 
			
		||||
	/*::[*/0x0070/*::]*/: 1, /* LOWER */
 | 
			
		||||
	/*::[*/0x0071/*::]*/: 1, /* UPPER */
 | 
			
		||||
@ -963,6 +973,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x008E/*::]*/: 3, /* SLN */
 | 
			
		||||
	/*::[*/0x008F/*::]*/: 4, /* SYD */
 | 
			
		||||
	/*::[*/0x0090/*::]*/: 4, /* DDB */
 | 
			
		||||
	/*::[*/0x00A1/*::]*/: 1, /* DIALOG.BOX */
 | 
			
		||||
	/*::[*/0x00A2/*::]*/: 1, /* CLEAN */
 | 
			
		||||
	/*::[*/0x00A3/*::]*/: 1, /* MDETERM */
 | 
			
		||||
	/*::[*/0x00A4/*::]*/: 1, /* MINVERSE */
 | 
			
		||||
@ -974,6 +985,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x00B2/*::]*/: 2, /* EXECUTE */
 | 
			
		||||
	/*::[*/0x00B3/*::]*/: 1, /* TERMINATE */
 | 
			
		||||
	/*::[*/0x00B8/*::]*/: 1, /* FACT */
 | 
			
		||||
	/*::[*/0x00BA/*::]*/: 1, /* GET.WORKSPACE */
 | 
			
		||||
	/*::[*/0x00BD/*::]*/: 3, /* DPRODUCT */
 | 
			
		||||
	/*::[*/0x00BE/*::]*/: 1, /* ISNONTEXT */
 | 
			
		||||
	/*::[*/0x00C3/*::]*/: 3, /* DSTDEVP */
 | 
			
		||||
@ -989,6 +1001,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x00D5/*::]*/: 2, /* ROUNDDOWN */
 | 
			
		||||
	/*::[*/0x00D6/*::]*/: 1, /* ASC */
 | 
			
		||||
	/*::[*/0x00D7/*::]*/: 1, /* DBCS */
 | 
			
		||||
	/*::[*/0x00E1/*::]*/: 0, /* END.IF */
 | 
			
		||||
	/*::[*/0x00E5/*::]*/: 1, /* SINH */
 | 
			
		||||
	/*::[*/0x00E6/*::]*/: 1, /* COSH */
 | 
			
		||||
	/*::[*/0x00E7/*::]*/: 1, /* TANH */
 | 
			
		||||
 | 
			
		||||
@ -65,6 +65,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
					if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
 | 
			
		||||
					SheetNames.push(sheetag.name);
 | 
			
		||||
					Sheets[sheetag.name] = ws;
 | 
			
		||||
					intable = false;
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,6 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/
 | 
			
		||||
	} catch(e) { if(opts.WTF) throw e; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var nodirs = function nodirs(x/*:string*/)/*:boolean*/{return x.slice(-1) != '/';};
 | 
			
		||||
function strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; }
 | 
			
		||||
 | 
			
		||||
function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
@ -51,7 +50,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	/* Numbers */
 | 
			
		||||
	if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
 | 
			
		||||
 | 
			
		||||
	var entries = keys(zip.files).filter(nodirs).sort();
 | 
			
		||||
	var entries = zipentries(zip);
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')/*:?any*/));
 | 
			
		||||
	var xlsb = false;
 | 
			
		||||
	var sheets, binname;
 | 
			
		||||
 | 
			
		||||
@ -34,8 +34,12 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 | 
			
		||||
	f = "docProps/app.xml";
 | 
			
		||||
	if(wb.Props && wb.Props.SheetNames){/* empty */}
 | 
			
		||||
	else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
 | 
			
		||||
	// $FlowIgnore
 | 
			
		||||
	else wb.Props.SheetNames = wb.SheetNames.map(function(x,i) { return [(wb.Workbook.Sheets[i]||{}).Hidden != 2, x];}).filter(function(x) { return x[0]; }).map(function(x) { return x[1]; });
 | 
			
		||||
	else {
 | 
			
		||||
		var _sn = [];
 | 
			
		||||
		for(var _i = 0; _i < wb.SheetNames.length; ++_i)
 | 
			
		||||
			if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
 | 
			
		||||
		wb.Props.SheetNames = _sn;
 | 
			
		||||
	}
 | 
			
		||||
	wb.Props.Worksheets = wb.Props.SheetNames.length;
 | 
			
		||||
	zip.file(f, write_ext_props(wb.Props, opts));
 | 
			
		||||
	ct.extprops.push(f);
 | 
			
		||||
 | 
			
		||||
@ -191,7 +191,7 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet
 | 
			
		||||
	var hdr/*:Array<string>*/ = o.header || [], C = 0;
 | 
			
		||||
 | 
			
		||||
	js.forEach(function (JS, R/*:number*/) {
 | 
			
		||||
		keys(JS).filter(function(x) { return JS.hasOwnProperty(x); }).forEach(function(k) {
 | 
			
		||||
		keys(JS).forEach(function(k) {
 | 
			
		||||
			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
 | 
			
		||||
			var v = JS[k];
 | 
			
		||||
			var t = 'z';
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ SheetJSRhino.class: $(RHDEPS)
 | 
			
		||||
	javac -cp .:SheetJS.jar:rhino.jar SheetJSRhino.java
 | 
			
		||||
 | 
			
		||||
rhino.jar:
 | 
			
		||||
	if [ ! -e rhino ]; then git clone https://github.com/mozilla/rhino; fi
 | 
			
		||||
	if [ ! -e rhino ]; then git clone --depth=1 https://github.com/mozilla/rhino; fi
 | 
			
		||||
	#if [ ! -e rhino/build/rhino*/js.jar ]; then cd rhino; ant jar; fi
 | 
			
		||||
	#cp rhino/build/rhino*/js.jar rhino.jar
 | 
			
		||||
	if [ ! -e rhino/buildGradle/libs/rhino*.jar ]; then cd rhino; ./gradlew jar; fi
 | 
			
		||||
 | 
			
		||||
@ -20,4 +20,4 @@ worker.min.js: worker.js
 | 
			
		||||
.PHONY: init
 | 
			
		||||
init:
 | 
			
		||||
	@npm install rollup-plugin-node-resolve rollup-plugin-commonjs
 | 
			
		||||
	@mkdir -p node_modules; cd node_modules; ln -s ../../../ xlsx; cd -
 | 
			
		||||
	@mkdir -p node_modules; cd node_modules; if [ ! -e xlsx ]; then ln -s ../../../ xlsx; fi; cd -
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,13 @@
 | 
			
		||||
import resolve from 'rollup-plugin-node-resolve';
 | 
			
		||||
import commonjs from 'rollup-plugin-commonjs';
 | 
			
		||||
export default {
 | 
			
		||||
	input: 'app.js',
 | 
			
		||||
	output: {
 | 
			
		||||
		file: 'rollup.js',
 | 
			
		||||
		format: 'iife'
 | 
			
		||||
	},
 | 
			
		||||
	entry: 'app.js',
 | 
			
		||||
	dest: 'rollup.js',
 | 
			
		||||
	//dest: 'rollup.js',
 | 
			
		||||
	plugins: [
 | 
			
		||||
		resolve({
 | 
			
		||||
			module: false,
 | 
			
		||||
 | 
			
		||||
@ -2,12 +2,16 @@
 | 
			
		||||
import resolve from 'rollup-plugin-node-resolve';
 | 
			
		||||
import commonjs from 'rollup-plugin-commonjs';
 | 
			
		||||
export default {
 | 
			
		||||
	input: 'main.js',
 | 
			
		||||
	output: {
 | 
			
		||||
		file: 'rollup.node.js',
 | 
			
		||||
		format: 'cjs'
 | 
			
		||||
	},
 | 
			
		||||
	entry: 'main.js',
 | 
			
		||||
	dest: 'rollup.node.js',
 | 
			
		||||
	//dest: 'rollup.node.js',
 | 
			
		||||
	plugins: [
 | 
			
		||||
		resolve({
 | 
			
		||||
			module: false,
 | 
			
		||||
			browser: true,
 | 
			
		||||
			module: false
 | 
			
		||||
		}),
 | 
			
		||||
		commonjs()
 | 
			
		||||
	],
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,13 @@
 | 
			
		||||
import resolve from 'rollup-plugin-node-resolve';
 | 
			
		||||
import commonjs from 'rollup-plugin-commonjs';
 | 
			
		||||
export default {
 | 
			
		||||
	input: 'xlsxworker.js',
 | 
			
		||||
	output: {
 | 
			
		||||
		file: 'worker.js',
 | 
			
		||||
		format: 'iife'
 | 
			
		||||
	},
 | 
			
		||||
	entry: 'xlsxworker.js',
 | 
			
		||||
	dest: 'worker.js',
 | 
			
		||||
	//dest: 'worker.js',
 | 
			
		||||
	plugins: [
 | 
			
		||||
		resolve({
 | 
			
		||||
			module: false,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								dist/shim.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/shim.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										28
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										608
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										608
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -1,388 +1,146 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* shim.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* ES3/5 Compatibility shims and other utilities for older browsers. */
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 | 
			
		||||
if (!Object.keys) {
 | 
			
		||||
  Object.keys = (function () {
 | 
			
		||||
    var hasOwnProperty = Object.prototype.hasOwnProperty,
 | 
			
		||||
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
 | 
			
		||||
        dontEnums = [
 | 
			
		||||
          'toString',
 | 
			
		||||
          'toLocaleString',
 | 
			
		||||
          'valueOf',
 | 
			
		||||
          'hasOwnProperty',
 | 
			
		||||
          'isPrototypeOf',
 | 
			
		||||
          'propertyIsEnumerable',
 | 
			
		||||
          'constructor'
 | 
			
		||||
        ],
 | 
			
		||||
        dontEnumsLength = dontEnums.length;
 | 
			
		||||
if(!Object.keys) Object.keys = (function() {
 | 
			
		||||
  var hasOwnProperty = Object.prototype.hasOwnProperty,
 | 
			
		||||
      hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
 | 
			
		||||
      dontEnums = [
 | 
			
		||||
        'toString',
 | 
			
		||||
        'toLocaleString',
 | 
			
		||||
        'valueOf',
 | 
			
		||||
        'hasOwnProperty',
 | 
			
		||||
        'isPrototypeOf',
 | 
			
		||||
        'propertyIsEnumerable',
 | 
			
		||||
        'constructor'
 | 
			
		||||
      ],
 | 
			
		||||
      dontEnumsLength = dontEnums.length;
 | 
			
		||||
 | 
			
		||||
    return function (obj) {
 | 
			
		||||
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
 | 
			
		||||
  return function(obj) {
 | 
			
		||||
    if(typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
 | 
			
		||||
 | 
			
		||||
      var result = [];
 | 
			
		||||
    var result = [];
 | 
			
		||||
 | 
			
		||||
      for (var prop in obj) {
 | 
			
		||||
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
 | 
			
		||||
      }
 | 
			
		||||
    for(var prop in obj) if(hasOwnProperty.call(obj, prop)) result.push(prop);
 | 
			
		||||
 | 
			
		||||
      if (hasDontEnumBug) {
 | 
			
		||||
        for (var i=0; i < dontEnumsLength; i++) {
 | 
			
		||||
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return result;
 | 
			
		||||
    };
 | 
			
		||||
  })();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
 | 
			
		||||
if (!Array.prototype.filter)
 | 
			
		||||
{
 | 
			
		||||
  Array.prototype.filter = function(fun /*, thisp */)
 | 
			
		||||
  {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (this == null)
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var t = Object(this);
 | 
			
		||||
    var len = t.length >>> 0;
 | 
			
		||||
    if (typeof fun != "function")
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var res = [];
 | 
			
		||||
    var thisp = arguments[1];
 | 
			
		||||
    for (var i = 0; i < len; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (i in t)
 | 
			
		||||
      {
 | 
			
		||||
        var val = t[i]; // in case fun mutates this
 | 
			
		||||
        if (fun.call(thisp, val, i, t))
 | 
			
		||||
          res.push(val);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
    if(hasDontEnumBug)
 | 
			
		||||
      for(var i=0; i < dontEnumsLength; ++i)
 | 
			
		||||
        if(hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
 | 
			
		||||
    return result;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
 | 
			
		||||
if (!String.prototype.trim) {
 | 
			
		||||
  String.prototype.trim = function () {
 | 
			
		||||
    return this.replace(/^\s+|\s+$/g, '');
 | 
			
		||||
if(!String.prototype.trim) String.prototype.trim = function() {
 | 
			
		||||
  var s = this.replace(/^\s+/, '');
 | 
			
		||||
  for(var i = s.length - 1; i >=0 ; --i) if(!s.charAt(i).match(/^\s/)) return s.slice(0,i+1);
 | 
			
		||||
  return "";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.prototype.forEach) Array.prototype.forEach = function(cb) {
 | 
			
		||||
  var len = (this.length>>>0), self = (arguments[1]||void 0);
 | 
			
		||||
  for(var i=0; i<len; ++i) if(i in this) self ? cb.call(self, this[i], i, this) : cb(this[i], i, this);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.prototype.map) Array.prototype.map = function(cb) {
 | 
			
		||||
  var len = (this.length>>>0), self = (arguments[1]||void 0), A = new Array(len);
 | 
			
		||||
  for(var i=0; i<len; ++i) if(i in this) A[i] = self ? cb.call(self, this[i], i, this) : cb(this[i], i, this);
 | 
			
		||||
  return A;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.prototype.indexOf) Array.prototype.indexOf = function(needle) {
 | 
			
		||||
  var len = (this.length>>>0), i = ((arguments[1]|0)||0);
 | 
			
		||||
  for(i<0 && (i+=len)<0 && (i=0); i<len; ++i) if(this[i] === needle) return i;
 | 
			
		||||
  return -1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.isArray) Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; };
 | 
			
		||||
 | 
			
		||||
if(!Date.prototype.toISOString) Date.prototype.toISOString = (function() {
 | 
			
		||||
  function p(n,i) { return ('0000000' + n).slice(-(i||2)); }
 | 
			
		||||
 | 
			
		||||
  return function _toISOString() {
 | 
			
		||||
    var y = this.getUTCFullYear(), yr = "";
 | 
			
		||||
    if(y>9999)   yr = '+' + p( y, 6);
 | 
			
		||||
    else if(y<0) yr = '-' + p(-y, 6);
 | 
			
		||||
    else         yr =       p( y, 4);
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
      yr, p(this.getUTCMonth()+1), p(this.getUTCDate())
 | 
			
		||||
    ].join('-') + 'T' + [
 | 
			
		||||
      p(this.getUTCHours()), p(this.getUTCMinutes()), p(this.getUTCSeconds())
 | 
			
		||||
    ].join(':') + '.' + p(this.getUTCMilliseconds(),3) + 'Z';
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
 | 
			
		||||
if (!Array.prototype.forEach)
 | 
			
		||||
{
 | 
			
		||||
  Array.prototype.forEach = function(fun /*, thisArg */)
 | 
			
		||||
  {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (this === void 0 || this === null)
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var t = Object(this);
 | 
			
		||||
    var len = t.length >>> 0;
 | 
			
		||||
    if (typeof fun !== "function")
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
 | 
			
		||||
    for (var i = 0; i < len; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (i in t)
 | 
			
		||||
        fun.call(thisArg, t[i], i, t);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Production steps of ECMA-262, Edition 5, 15.4.4.19
 | 
			
		||||
// Reference: http://es5.github.com/#x15.4.4.19
 | 
			
		||||
if (!Array.prototype.map) {
 | 
			
		||||
  Array.prototype.map = function(callback, thisArg) {
 | 
			
		||||
 | 
			
		||||
    var T, A, k;
 | 
			
		||||
 | 
			
		||||
    if (this == null) {
 | 
			
		||||
      throw new TypeError(" this is null or not defined");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
 | 
			
		||||
    var O = Object(this);
 | 
			
		||||
 | 
			
		||||
    // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
 | 
			
		||||
    // 3. Let len be ToUint32(lenValue).
 | 
			
		||||
    var len = O.length >>> 0;
 | 
			
		||||
 | 
			
		||||
    // 4. If IsCallable(callback) is false, throw a TypeError exception.
 | 
			
		||||
    // See: http://es5.github.com/#x9.11
 | 
			
		||||
    if (typeof callback !== "function") {
 | 
			
		||||
      throw new TypeError(callback + " is not a function");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
 | 
			
		||||
    if (thisArg) {
 | 
			
		||||
      T = thisArg;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 6. Let A be a new array created as if by the expression new Array(len) where Array is
 | 
			
		||||
    // the standard built-in constructor with that name and len is the value of len.
 | 
			
		||||
    A = new Array(len);
 | 
			
		||||
 | 
			
		||||
    // 7. Let k be 0
 | 
			
		||||
    k = 0;
 | 
			
		||||
 | 
			
		||||
    // 8. Repeat, while k < len
 | 
			
		||||
    while(k < len) {
 | 
			
		||||
 | 
			
		||||
      var kValue, mappedValue;
 | 
			
		||||
 | 
			
		||||
      // a. Let Pk be ToString(k).
 | 
			
		||||
      //   This is implicit for LHS operands of the in operator
 | 
			
		||||
      // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
 | 
			
		||||
      //   This step can be combined with c
 | 
			
		||||
      // c. If kPresent is true, then
 | 
			
		||||
      if (k in O) {
 | 
			
		||||
 | 
			
		||||
        // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
 | 
			
		||||
        kValue = O[ k ];
 | 
			
		||||
 | 
			
		||||
        // ii. Let mappedValue be the result of calling the Call internal method of callback
 | 
			
		||||
        // with T as the this value and argument list containing kValue, k, and O.
 | 
			
		||||
        mappedValue = callback.call(T, kValue, k, O);
 | 
			
		||||
 | 
			
		||||
        // iii. Call the DefineOwnProperty internal method of A with arguments
 | 
			
		||||
        // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
 | 
			
		||||
        // and false.
 | 
			
		||||
 | 
			
		||||
        // In browsers that support Object.defineProperty, use the following:
 | 
			
		||||
        // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });
 | 
			
		||||
 | 
			
		||||
        // For best browser support, use the following:
 | 
			
		||||
        A[ k ] = mappedValue;
 | 
			
		||||
      }
 | 
			
		||||
      // d. Increase k by 1.
 | 
			
		||||
      k++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 9. return A
 | 
			
		||||
    return A;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
 | 
			
		||||
if (!Array.prototype.indexOf) {
 | 
			
		||||
  Array.prototype.indexOf = function (searchElement, fromIndex) {
 | 
			
		||||
    if ( this === undefined || this === null ) {
 | 
			
		||||
      throw new TypeError( '"this" is null or not defined' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var length = this.length >>> 0; // Hack to convert object.length to a UInt32
 | 
			
		||||
 | 
			
		||||
    fromIndex = +fromIndex || 0;
 | 
			
		||||
 | 
			
		||||
    if (Math.abs(fromIndex) === Infinity) {
 | 
			
		||||
      fromIndex = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (fromIndex < 0) {
 | 
			
		||||
      fromIndex += length;
 | 
			
		||||
      if (fromIndex < 0) {
 | 
			
		||||
        fromIndex = 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (;fromIndex < length; fromIndex++) {
 | 
			
		||||
      if (this[fromIndex] === searchElement) {
 | 
			
		||||
        return fromIndex;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
 | 
			
		||||
 | 
			
		||||
if (! Array.isArray) {
 | 
			
		||||
    Array.isArray = function(obj) {
 | 
			
		||||
        return Object.prototype.toString.call(obj) === "[object Array]";
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://github.com/ttaubert/node-arraybuffer-slice
 | 
			
		||||
// (c) 2013 Tim Taubert <tim@timtaubert.de>
 | 
			
		||||
// arraybuffer-slice may be freely distributed under the MIT license.
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
 | 
			
		||||
  ArrayBuffer.prototype.slice = function (begin, end) {
 | 
			
		||||
    begin = (begin|0) || 0;
 | 
			
		||||
    var num = this.byteLength;
 | 
			
		||||
    end = end === (void 0) ? num : (end|0);
 | 
			
		||||
 | 
			
		||||
    // Handle negative values.
 | 
			
		||||
    if (begin < 0) begin += num;
 | 
			
		||||
    if (end < 0) end += num;
 | 
			
		||||
 | 
			
		||||
    if (num === 0 || begin >= num || begin >= end) {
 | 
			
		||||
      return new ArrayBuffer(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var length = Math.min(num - begin, end - begin);
 | 
			
		||||
    var target = new ArrayBuffer(length);
 | 
			
		||||
    var targetArray = new Uint8Array(target);
 | 
			
		||||
    targetArray.set(new Uint8Array(this, begin, length));
 | 
			
		||||
    return target;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://github.com/davidchambers/Base64.js
 | 
			
		||||
// (C) 2015 David Chambers
 | 
			
		||||
// Base64.js may be freely distributed under the Apache 2.0 License.
 | 
			
		||||
;(function () {
 | 
			
		||||
 | 
			
		||||
  var object =
 | 
			
		||||
    typeof exports != 'undefined' ? exports :
 | 
			
		||||
    typeof self != 'undefined' ? self : // #8: web workers
 | 
			
		||||
    $.global; // #31: ExtendScript
 | 
			
		||||
 | 
			
		||||
  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
 | 
			
		||||
 | 
			
		||||
  function InvalidCharacterError(message) {
 | 
			
		||||
    this.message = message;
 | 
			
		||||
  }
 | 
			
		||||
  InvalidCharacterError.prototype = new Error;
 | 
			
		||||
  InvalidCharacterError.prototype.name = 'InvalidCharacterError';
 | 
			
		||||
 | 
			
		||||
  // encoder
 | 
			
		||||
  // [https://gist.github.com/999166] by [https://github.com/nignag]
 | 
			
		||||
  object.btoa || (
 | 
			
		||||
  object.btoa = function (input) {
 | 
			
		||||
    var str = String(input);
 | 
			
		||||
    for (
 | 
			
		||||
      // initialize result and counter
 | 
			
		||||
      var block, charCode, idx = 0, map = chars, output = '';
 | 
			
		||||
      // if the next str index does not exist:
 | 
			
		||||
      //   change the mapping table to "="
 | 
			
		||||
      //   check if d has no fractional digits
 | 
			
		||||
      str.charAt(idx | 0) || (map = '=', idx % 1);
 | 
			
		||||
      // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
 | 
			
		||||
      output += map.charAt(63 & block >> 8 - idx % 1 * 8)
 | 
			
		||||
    ) {
 | 
			
		||||
      charCode = str.charCodeAt(idx += 3/4);
 | 
			
		||||
      if (charCode > 0xFF) {
 | 
			
		||||
        throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
 | 
			
		||||
      }
 | 
			
		||||
      block = block << 8 | charCode;
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // decoder
 | 
			
		||||
  // [https://gist.github.com/1020396] by [https://github.com/atk]
 | 
			
		||||
  object.atob || (
 | 
			
		||||
  object.atob = function (input) {
 | 
			
		||||
    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=
 | 
			
		||||
    if (str.length % 4 == 1) {
 | 
			
		||||
      throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.");
 | 
			
		||||
    }
 | 
			
		||||
    for (
 | 
			
		||||
      // initialize result and counters
 | 
			
		||||
      var bc = 0, bs, buffer, idx = 0, output = '';
 | 
			
		||||
      // get next character
 | 
			
		||||
      buffer = str.charAt(idx++);
 | 
			
		||||
      // character found in table? initialize bit storage and add its ascii value;
 | 
			
		||||
      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
 | 
			
		||||
        // and if not first of each 4 characters,
 | 
			
		||||
        // convert the first 8 bits to one ascii character
 | 
			
		||||
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
 | 
			
		||||
    ) {
 | 
			
		||||
      // try to find character in table (0-63, not found => -1)
 | 
			
		||||
      buffer = chars.indexOf(buffer);
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  });
 | 
			
		||||
}());
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
 | 
			
		||||
if (!Date.prototype.toISOString) {
 | 
			
		||||
  (function() {
 | 
			
		||||
 | 
			
		||||
    function pad(number) {
 | 
			
		||||
      if (number < 10) {
 | 
			
		||||
        return '0' + number;
 | 
			
		||||
      }
 | 
			
		||||
      return number;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Date.prototype.toISOString = function() {
 | 
			
		||||
      return this.getUTCFullYear() +
 | 
			
		||||
        '-' + pad(this.getUTCMonth() + 1) +
 | 
			
		||||
        '-' + pad(this.getUTCDate()) +
 | 
			
		||||
        'T' + pad(this.getUTCHours()) +
 | 
			
		||||
        ':' + pad(this.getUTCMinutes()) +
 | 
			
		||||
        ':' + pad(this.getUTCSeconds()) +
 | 
			
		||||
        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
 | 
			
		||||
        'Z';
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  }());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// note: MDN shim will not work in IE
 | 
			
		||||
if(typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) ArrayBuffer.prototype.slice = function(start, end) {
 | 
			
		||||
  if(start == null) start = 0;
 | 
			
		||||
  if(start < 0) { start += this.byteLength; if(start < 0) start = 0; }
 | 
			
		||||
  if(start >= this.byteLength) return new Uint8Array(0);
 | 
			
		||||
  if(end == null) end = this.byteLength;
 | 
			
		||||
  if(end < 0) { end += this.byteLength; if(end < 0) end = 0; }
 | 
			
		||||
  if(end > this.byteLength) end = this.byteLength;
 | 
			
		||||
  if(start > end) return new Uint8Array(0);
 | 
			
		||||
  var out = new ArrayBuffer(end - start);
 | 
			
		||||
  var view = new Uint8Array(out);
 | 
			
		||||
  var data = new Uint8Array(this, start, end - start)
 | 
			
		||||
  /* IE10 should have Uint8Array#set */
 | 
			
		||||
  if(view.set) view.set(data); else while(start <= --end) view[end - start] = data[end];
 | 
			
		||||
  return out;
 | 
			
		||||
};
 | 
			
		||||
if(typeof Uint8Array !== 'undefined' && !Uint8Array.prototype.slice) Uint8Array.prototype.slice = function(start, end) {
 | 
			
		||||
	if(start < 0) { start += this.length; if(start < 0) start = 0; }
 | 
			
		||||
	if(start >= this.length) return new Uint8Array(0);
 | 
			
		||||
	if(end == null) end = this.length;
 | 
			
		||||
	if(end < 0) { end += this.length; if(end < 0) end = 0; }
 | 
			
		||||
	if(end > this.length) end = this.length;
 | 
			
		||||
	var out = new Uint8Array(end - start);
 | 
			
		||||
	while(start <= --end) out[end - start] = this[end];
 | 
			
		||||
	return out;
 | 
			
		||||
  if(start == null) start = 0;
 | 
			
		||||
  if(start < 0) { start += this.length; if(start < 0) start = 0; }
 | 
			
		||||
  if(start >= this.length) return new Uint8Array(0);
 | 
			
		||||
  if(end == null) end = this.length;
 | 
			
		||||
  if(end < 0) { end += this.length; if(end < 0) end = 0; }
 | 
			
		||||
  if(end > this.length) end = this.length;
 | 
			
		||||
  if(start > end) return new Uint8Array(0);
 | 
			
		||||
  var out = new Uint8Array(end - start);
 | 
			
		||||
  while(start <= --end) out[end - start] = this[end];
 | 
			
		||||
  return out;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// VBScript + ActiveX fallback for IE5+
 | 
			
		||||
var IE_SaveFile = (function() { try {
 | 
			
		||||
	if(typeof IE_SaveFile_Impl == "undefined") document.write([
 | 
			
		||||
  if(typeof IE_SaveFile_Impl == "undefined") document.write([
 | 
			
		||||
'<script type="text/vbscript" language="vbscript">',
 | 
			
		||||
'IE_GetProfileAndPath_Key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders\\"',
 | 
			
		||||
'Function IE_GetProfileAndPath(key): Set wshell = CreateObject("WScript.Shell"): IE_GetProfileAndPath = wshell.RegRead(IE_GetProfileAndPath_Key & key): IE_GetProfileAndPath = wshell.ExpandEnvironmentStrings("%USERPROFILE%") & "!" & IE_GetProfileAndPath: End Function',
 | 
			
		||||
'Function IE_SaveFile_Impl(FileName, payload): Dim data, plen, i, bit: data = CStr(payload): plen = Len(data): Set fso = CreateObject("Scripting.FileSystemObject"): fso.CreateTextFile FileName, True: Set f = fso.GetFile(FileName): Set stream = f.OpenAsTextStream(2, 0): For i = 1 To plen Step 3: bit = Mid(data, i, 2): stream.write Chr(CLng("&h" & bit)): Next: stream.Close: IE_SaveFile_Impl = True: End Function',
 | 
			
		||||
'|/script>'.replace("|","<")
 | 
			
		||||
	].join("\r\n"));
 | 
			
		||||
	if(typeof IE_SaveFile_Impl == "undefined") return void 0;
 | 
			
		||||
	var IE_GetPath = (function() {
 | 
			
		||||
		var DDP1 = "";
 | 
			
		||||
		try { DDP1 = IE_GetProfileAndPath("{374DE290-123F-4565-9164-39C4925E467B}"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Personal"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Desktop"); } catch(e) { throw e; }}}
 | 
			
		||||
		var o = DDP1.split("!");
 | 
			
		||||
		DDP = o[1].replace("%USERPROFILE%", o[0]);
 | 
			
		||||
		return function(path) { return DDP + "\\" + path; };
 | 
			
		||||
	})();
 | 
			
		||||
	function fix_data(data) {
 | 
			
		||||
		var out = [];
 | 
			
		||||
		var T = typeof data == "string";
 | 
			
		||||
		for(var i = 0; i < data.length; ++i) out.push(("00"+(T ? data.charCodeAt(i) : data[i]).toString(16)).slice(-2));
 | 
			
		||||
		var o = out.join("|");
 | 
			
		||||
		return o;
 | 
			
		||||
	}
 | 
			
		||||
	return function(data, filename) { return IE_SaveFile_Impl(IE_GetPath(filename), fix_data(data)); };
 | 
			
		||||
  ].join("\r\n"));
 | 
			
		||||
  if(typeof IE_SaveFile_Impl == "undefined") return void 0;
 | 
			
		||||
  var IE_GetPath = (function() {
 | 
			
		||||
    var DDP1 = "";
 | 
			
		||||
    try { DDP1 = IE_GetProfileAndPath("{374DE290-123F-4565-9164-39C4925E467B}"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Personal"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Desktop"); } catch(e) { throw e; }}}
 | 
			
		||||
    var o = DDP1.split("!");
 | 
			
		||||
    DDP = o[1].replace("%USERPROFILE%", o[0]);
 | 
			
		||||
    return function(path) { return DDP + "\\" + path; };
 | 
			
		||||
  })();
 | 
			
		||||
  function fix_data(data) {
 | 
			
		||||
    var out = [];
 | 
			
		||||
    var T = typeof data == "string";
 | 
			
		||||
    for(var i = 0; i < data.length; ++i) out.push(("00"+(T ? data.charCodeAt(i) : data[i]).toString(16)).slice(-2));
 | 
			
		||||
    var o = out.join("|");
 | 
			
		||||
    return o;
 | 
			
		||||
  }
 | 
			
		||||
  return function(data, filename) { return IE_SaveFile_Impl(IE_GetPath(filename), fix_data(data)); };
 | 
			
		||||
} catch(e) { return void 0; }})();
 | 
			
		||||
var IE_LoadFile = (function() { try {
 | 
			
		||||
	if(typeof IE_LoadFile_Impl == "undefined") document.write([
 | 
			
		||||
  if(typeof IE_LoadFile_Impl == "undefined") document.write([
 | 
			
		||||
'<script type="text/vbscript" language="vbscript">',
 | 
			
		||||
'Function IE_LoadFile_Impl(FileName): Dim out(), plen, i, cc: Set fso = CreateObject("Scripting.FileSystemObject"): Set f = fso.GetFile(FileName): Set stream = f.OpenAsTextStream(1, 0): plen = f.Size: ReDim out(plen): For i = 1 To plen Step 1: cc = Hex(Asc(stream.read(1))): If Len(cc) < 2 Then: cc = "0" & cc: End If: out(i) = cc: Next: IE_LoadFile_Impl = Join(out,""): End Function',
 | 
			
		||||
'|/script>'.replace("|","<")
 | 
			
		||||
	].join("\r\n"));
 | 
			
		||||
	if(typeof IE_LoadFile_Impl == "undefined") return void 0;
 | 
			
		||||
	function fix_data(data) {
 | 
			
		||||
		var out = [];
 | 
			
		||||
		for(var i = 0; i < data.length; i+=2) out.push(String.fromCharCode(parseInt(data.slice(i, i+2), 16)));
 | 
			
		||||
		var o = out.join("");
 | 
			
		||||
		return o;
 | 
			
		||||
	}
 | 
			
		||||
	return function(filename) { return fix_data(IE_LoadFile_Impl(filename)); };
 | 
			
		||||
  ].join("\r\n"));
 | 
			
		||||
  if(typeof IE_LoadFile_Impl == "undefined") return void 0;
 | 
			
		||||
  function fix_data(data) {
 | 
			
		||||
    var out = [];
 | 
			
		||||
    for(var i = 0; i < data.length; i+=2) out.push(String.fromCharCode(parseInt(data.slice(i, i+2), 16)));
 | 
			
		||||
    var o = out.join("");
 | 
			
		||||
    return o;
 | 
			
		||||
  }
 | 
			
		||||
  return function(filename) { return fix_data(IE_LoadFile_Impl(filename)); };
 | 
			
		||||
} catch(e) { return void 0; }})();
 | 
			
		||||
var DO_NOT_EXPORT_CODEPAGE = true;
 | 
			
		||||
var DO_NOT_EXPORT_JSZIP = true;
 | 
			
		||||
@ -9380,7 +9138,7 @@ module.exports = ZStream;
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.12.2';
 | 
			
		||||
XLSX.version = '0.12.3';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -11255,7 +11013,11 @@ function read_binary(path) {
 | 
			
		||||
	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
 | 
			
		||||
	throw new Error("Cannot access file " + path);
 | 
			
		||||
}
 | 
			
		||||
function keys(o) { return Object.keys(o); }
 | 
			
		||||
function keys(o) {
 | 
			
		||||
	var ks = Object.keys(o), o2 = [];
 | 
			
		||||
	for(var i = 0; i < ks.length; ++i) if(o.hasOwnProperty(ks[i])) o2.push(ks[i]);
 | 
			
		||||
	return o2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function evert_key(obj, key) {
 | 
			
		||||
	var o = ([]), K = keys(obj);
 | 
			
		||||
@ -11446,6 +11208,12 @@ function getzipstr(zip, file, safe) {
 | 
			
		||||
	try { return getzipstr(zip, file); } catch(e) { return null; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function zipentries(zip) {
 | 
			
		||||
	var k = keys(zip.files), o = [];
 | 
			
		||||
	for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
 | 
			
		||||
	return o.sort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var jszip;
 | 
			
		||||
/*global JSZip:true */
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
@ -18750,7 +18518,7 @@ function parse_PtgArea3d(blob, length, opts) {
 | 
			
		||||
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
 | 
			
		||||
function parse_PtgAreaErr(blob, length, opts) {
 | 
			
		||||
	var type = (blob[blob.l++] & 0x60) >> 5;
 | 
			
		||||
	blob.l += opts && opts.biff > 8 ? 12 : 8;
 | 
			
		||||
	blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
 | 
			
		||||
	return [type];
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
 | 
			
		||||
@ -18882,8 +18650,8 @@ function parse_PtgFunc(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
 | 
			
		||||
function parse_PtgFuncVar(blob, length, opts) {
 | 
			
		||||
	blob.l++;
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [0, blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	var type = blob[blob.l++];
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19080,12 +18848,35 @@ var parse_PtgElfRw = parse_PtgElfLoc;
 | 
			
		||||
/* [MS-XLS] 2.5.198.55 */
 | 
			
		||||
var parse_PtgElfRwV = parse_PtgElfLoc;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 TODO */
 | 
			
		||||
var PtgListRT = [
 | 
			
		||||
	"Data",
 | 
			
		||||
	"All",
 | 
			
		||||
	"Headers",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Data2",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataHeaders",
 | 
			
		||||
	"??",
 | 
			
		||||
	"Totals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataTotals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Current"
 | 
			
		||||
];
 | 
			
		||||
function parse_PtgList(blob) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var ixti = blob.read_shift(2);
 | 
			
		||||
	blob.l += 10;
 | 
			
		||||
	return {ixti: ixti};
 | 
			
		||||
	var flags = blob.read_shift(2);
 | 
			
		||||
	var idx = blob.read_shift(4);
 | 
			
		||||
	var c = blob.read_shift(2);
 | 
			
		||||
	var C = blob.read_shift(2);
 | 
			
		||||
	var rt = PtgListRT[(flags >> 2) & 0x1F];
 | 
			
		||||
	return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
 | 
			
		||||
function parse_PtgSxName(blob) {
 | 
			
		||||
@ -19093,6 +18884,32 @@ function parse_PtgSxName(blob) {
 | 
			
		||||
	return [blob.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [XLS] old spec */
 | 
			
		||||
function parse_PtgSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += 5;
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 1 : 4);
 | 
			
		||||
	return ["PTGSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgEndSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 4 : 5);
 | 
			
		||||
	return ["PTGENDSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemAreaN(blob) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemNoMemN(blob) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgAttrNoop(blob) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	return [0, 0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
 | 
			
		||||
var PtgTypes = {
 | 
			
		||||
0x01: { n:'PtgExp', f:parse_PtgExp },
 | 
			
		||||
@ -19118,6 +18935,8 @@ var PtgTypes = {
 | 
			
		||||
0x15: { n:'PtgParen', f:parseread1 },
 | 
			
		||||
0x16: { n:'PtgMissArg', f:parseread1 },
 | 
			
		||||
0x17: { n:'PtgStr', f:parse_PtgStr },
 | 
			
		||||
0x1A: { n:'PtgSheet', f:parse_PtgSheet },
 | 
			
		||||
0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },
 | 
			
		||||
0x1C: { n:'PtgErr', f:parse_PtgErr },
 | 
			
		||||
0x1D: { n:'PtgBool', f:parse_PtgBool },
 | 
			
		||||
0x1E: { n:'PtgInt', f:parse_PtgInt },
 | 
			
		||||
@ -19136,6 +18955,8 @@ var PtgTypes = {
 | 
			
		||||
0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },
 | 
			
		||||
0x2C: { n:'PtgRefN', f:parse_PtgRefN },
 | 
			
		||||
0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },
 | 
			
		||||
0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
 | 
			
		||||
0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
 | 
			
		||||
0x39: { n:'PtgNameX', f:parse_PtgNameX },
 | 
			
		||||
0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },
 | 
			
		||||
0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },
 | 
			
		||||
@ -19159,6 +18980,9 @@ var PtgDupes = {
 | 
			
		||||
0x4B: 0x2B, 0x6B: 0x2B,
 | 
			
		||||
0x4C: 0x2C, 0x6C: 0x2C,
 | 
			
		||||
0x4D: 0x2D, 0x6D: 0x2D,
 | 
			
		||||
0x4E: 0x2E, 0x6E: 0x2E,
 | 
			
		||||
0x4F: 0x2F, 0x6F: 0x2F,
 | 
			
		||||
0x58: 0x22, 0x78: 0x22,
 | 
			
		||||
0x59: 0x39, 0x79: 0x39,
 | 
			
		||||
0x5A: 0x3A, 0x7A: 0x3A,
 | 
			
		||||
0x5B: 0x3B, 0x7B: 0x3B,
 | 
			
		||||
@ -19183,6 +19007,7 @@ var Ptg18 = {
 | 
			
		||||
0xFF: {}
 | 
			
		||||
};
 | 
			
		||||
var Ptg19 = {
 | 
			
		||||
0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
 | 
			
		||||
0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
 | 
			
		||||
0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },
 | 
			
		||||
0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
 | 
			
		||||
@ -19239,10 +19064,7 @@ function parse_Rgce(blob, length, opts) {
 | 
			
		||||
		length = target - blob.l;
 | 
			
		||||
		id = blob[blob.l];
 | 
			
		||||
		R = PtgTypes[id];
 | 
			
		||||
		if(id === 0x18 || id === 0x19) {
 | 
			
		||||
			id = blob[blob.l + 1];
 | 
			
		||||
			R = (id === 0x18 ? Ptg18 : Ptg19)[id];
 | 
			
		||||
		}
 | 
			
		||||
		if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
 | 
			
		||||
		if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
		else { ptgs.push([R.n, R.f(blob, length, opts)]); }
 | 
			
		||||
@ -19568,6 +19390,18 @@ ixti = f[1][1]; r = f[1][2];
 | 
			
		||||
			case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
 | 
			
		||||
				stack.push("#REF!"); break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
				// $FlowIgnore
 | 
			
		||||
				stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemAreaN':
 | 
			
		||||
			case 'PtgMemNoMemN':
 | 
			
		||||
			case 'PtgAttrNoop':
 | 
			
		||||
			case 'PtgSheet':
 | 
			
		||||
			case 'PtgEndSheet':
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
 | 
			
		||||
@ -19587,13 +19421,10 @@ ixti = f[1][1]; r = f[1][2];
 | 
			
		||||
 | 
			
		||||
			case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
 | 
			
		||||
			default: throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
		}
 | 
			
		||||
		var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
 | 
			
		||||
		if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
		if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
			f = formula[0][last_sp];
 | 
			
		||||
			var _left = true;
 | 
			
		||||
			switch(f[1][0]) {
 | 
			
		||||
@ -20596,6 +20427,7 @@ var Ftab = {
 | 
			
		||||
var FtabArgc = {
 | 
			
		||||
0x0002: 1, /* ISNA */
 | 
			
		||||
0x0003: 1, /* ISERROR */
 | 
			
		||||
0x000A: 0, /* NA */
 | 
			
		||||
0x000F: 1, /* SIN */
 | 
			
		||||
0x0010: 1, /* COS */
 | 
			
		||||
0x0011: 1, /* TAN */
 | 
			
		||||
@ -20613,6 +20445,8 @@ var FtabArgc = {
 | 
			
		||||
0x001F: 3, /* MID */
 | 
			
		||||
0x0020: 1, /* LEN */
 | 
			
		||||
0x0021: 1, /* VALUE */
 | 
			
		||||
0x0022: 0, /* TRUE */
 | 
			
		||||
0x0023: 0, /* FALSE */
 | 
			
		||||
0x0026: 1, /* NOT */
 | 
			
		||||
0x0027: 2, /* MOD */
 | 
			
		||||
0x0028: 3, /* DCOUNT */
 | 
			
		||||
@ -20625,6 +20459,7 @@ var FtabArgc = {
 | 
			
		||||
0x0030: 2, /* TEXT */
 | 
			
		||||
0x0035: 1, /* GOTO */
 | 
			
		||||
0x003D: 3, /* MIRR */
 | 
			
		||||
0x003F: 0, /* RAND */
 | 
			
		||||
0x0041: 3, /* DATE */
 | 
			
		||||
0x0042: 3, /* TIME */
 | 
			
		||||
0x0043: 1, /* DAY */
 | 
			
		||||
@ -20634,6 +20469,7 @@ var FtabArgc = {
 | 
			
		||||
0x0047: 1, /* HOUR */
 | 
			
		||||
0x0048: 1, /* MINUTE */
 | 
			
		||||
0x0049: 1, /* SECOND */
 | 
			
		||||
0x004A: 0, /* NOW */
 | 
			
		||||
0x004B: 1, /* AREAS */
 | 
			
		||||
0x004C: 1, /* ROWS */
 | 
			
		||||
0x004D: 1, /* COLUMNS */
 | 
			
		||||
@ -20642,13 +20478,18 @@ var FtabArgc = {
 | 
			
		||||
0x0053: 1, /* TRANSPOSE */
 | 
			
		||||
0x0055: 0, /* STEP */
 | 
			
		||||
0x0056: 1, /* TYPE */
 | 
			
		||||
0x0059: 0, /* CALLER */
 | 
			
		||||
0x005A: 1, /* DEREF */
 | 
			
		||||
0x005E: 0, /* ACTIVE.CELL */
 | 
			
		||||
0x005F: 0, /* SELECTION */
 | 
			
		||||
0x0061: 2, /* ATAN2 */
 | 
			
		||||
0x0062: 1, /* ASIN */
 | 
			
		||||
0x0063: 1, /* ACOS */
 | 
			
		||||
0x0065: 3, /* HLOOKUP */
 | 
			
		||||
0x0066: 3, /* VLOOKUP */
 | 
			
		||||
0x0069: 1, /* ISREF */
 | 
			
		||||
0x006A: 1, /* GET.FORMULA */
 | 
			
		||||
0x006C: 2, /* SET.VALUE */
 | 
			
		||||
0x006F: 1, /* CHAR */
 | 
			
		||||
0x0070: 1, /* LOWER */
 | 
			
		||||
0x0071: 1, /* UPPER */
 | 
			
		||||
@ -20674,6 +20515,7 @@ var FtabArgc = {
 | 
			
		||||
0x008E: 3, /* SLN */
 | 
			
		||||
0x008F: 4, /* SYD */
 | 
			
		||||
0x0090: 4, /* DDB */
 | 
			
		||||
0x00A1: 1, /* DIALOG.BOX */
 | 
			
		||||
0x00A2: 1, /* CLEAN */
 | 
			
		||||
0x00A3: 1, /* MDETERM */
 | 
			
		||||
0x00A4: 1, /* MINVERSE */
 | 
			
		||||
@ -20685,6 +20527,7 @@ var FtabArgc = {
 | 
			
		||||
0x00B2: 2, /* EXECUTE */
 | 
			
		||||
0x00B3: 1, /* TERMINATE */
 | 
			
		||||
0x00B8: 1, /* FACT */
 | 
			
		||||
0x00BA: 1, /* GET.WORKSPACE */
 | 
			
		||||
0x00BD: 3, /* DPRODUCT */
 | 
			
		||||
0x00BE: 1, /* ISNONTEXT */
 | 
			
		||||
0x00C3: 3, /* DSTDEVP */
 | 
			
		||||
@ -20700,6 +20543,7 @@ var FtabArgc = {
 | 
			
		||||
0x00D5: 2, /* ROUNDDOWN */
 | 
			
		||||
0x00D6: 1, /* ASC */
 | 
			
		||||
0x00D7: 1, /* DBCS */
 | 
			
		||||
0x00E1: 0, /* END.IF */
 | 
			
		||||
0x00E5: 1, /* SINH */
 | 
			
		||||
0x00E6: 1, /* COSH */
 | 
			
		||||
0x00E7: 1, /* TANH */
 | 
			
		||||
@ -27291,6 +27135,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
					if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
 | 
			
		||||
					SheetNames.push(sheetag.name);
 | 
			
		||||
					Sheets[sheetag.name] = ws;
 | 
			
		||||
					intable = false;
 | 
			
		||||
@ -28104,7 +27949,6 @@ function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, st
 | 
			
		||||
	} catch(e) { if(opts.WTF) throw e; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var nodirs = function nodirs(x){return x.slice(-1) != '/';};
 | 
			
		||||
function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
 | 
			
		||||
 | 
			
		||||
function parse_zip(zip, opts) {
 | 
			
		||||
@ -28119,7 +27963,7 @@ function parse_zip(zip, opts) {
 | 
			
		||||
	/* Numbers */
 | 
			
		||||
	if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
 | 
			
		||||
 | 
			
		||||
	var entries = keys(zip.files).filter(nodirs).sort();
 | 
			
		||||
	var entries = zipentries(zip);
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));
 | 
			
		||||
	var xlsb = false;
 | 
			
		||||
	var sheets, binname;
 | 
			
		||||
@ -28317,8 +28161,12 @@ var zip = new jszip();
 | 
			
		||||
f = "docProps/app.xml";
 | 
			
		||||
	if(wb.Props && wb.Props.SheetNames){/* empty */}
 | 
			
		||||
	else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
 | 
			
		||||
	// $FlowIgnore
 | 
			
		||||
	else wb.Props.SheetNames = wb.SheetNames.map(function(x,i) { return [(wb.Workbook.Sheets[i]||{}).Hidden != 2, x];}).filter(function(x) { return x[0]; }).map(function(x) { return x[1]; });
 | 
			
		||||
	else {
 | 
			
		||||
		var _sn = [];
 | 
			
		||||
		for(var _i = 0; _i < wb.SheetNames.length; ++_i)
 | 
			
		||||
			if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
 | 
			
		||||
		wb.Props.SheetNames = _sn;
 | 
			
		||||
	}
 | 
			
		||||
	wb.Props.Worksheets = wb.Props.SheetNames.length;
 | 
			
		||||
	zip.file(f, write_ext_props(wb.Props, opts));
 | 
			
		||||
	ct.extprops.push(f);
 | 
			
		||||
@ -28852,7 +28700,7 @@ function sheet_add_json(_ws, js, opts) {
 | 
			
		||||
	var hdr = o.header || [], C = 0;
 | 
			
		||||
 | 
			
		||||
	js.forEach(function (JS, R) {
 | 
			
		||||
		keys(JS).filter(function(x) { return JS.hasOwnProperty(x); }).forEach(function(k) {
 | 
			
		||||
		keys(JS).forEach(function(k) {
 | 
			
		||||
			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
 | 
			
		||||
			var v = JS[k];
 | 
			
		||||
			var t = 'z';
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										32
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										32
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										132
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										132
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -4,7 +4,7 @@
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.12.2';
 | 
			
		||||
XLSX.version = '0.12.3';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -1879,7 +1879,11 @@ function read_binary(path) {
 | 
			
		||||
	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
 | 
			
		||||
	throw new Error("Cannot access file " + path);
 | 
			
		||||
}
 | 
			
		||||
function keys(o) { return Object.keys(o); }
 | 
			
		||||
function keys(o) {
 | 
			
		||||
	var ks = Object.keys(o), o2 = [];
 | 
			
		||||
	for(var i = 0; i < ks.length; ++i) if(o.hasOwnProperty(ks[i])) o2.push(ks[i]);
 | 
			
		||||
	return o2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function evert_key(obj, key) {
 | 
			
		||||
	var o = ([]), K = keys(obj);
 | 
			
		||||
@ -2070,6 +2074,12 @@ function getzipstr(zip, file, safe) {
 | 
			
		||||
	try { return getzipstr(zip, file); } catch(e) { return null; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function zipentries(zip) {
 | 
			
		||||
	var k = keys(zip.files), o = [];
 | 
			
		||||
	for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
 | 
			
		||||
	return o.sort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var jszip;
 | 
			
		||||
/*global JSZip:true */
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
@ -9374,7 +9384,7 @@ function parse_PtgArea3d(blob, length, opts) {
 | 
			
		||||
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
 | 
			
		||||
function parse_PtgAreaErr(blob, length, opts) {
 | 
			
		||||
	var type = (blob[blob.l++] & 0x60) >> 5;
 | 
			
		||||
	blob.l += opts && opts.biff > 8 ? 12 : 8;
 | 
			
		||||
	blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
 | 
			
		||||
	return [type];
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
 | 
			
		||||
@ -9506,8 +9516,8 @@ function parse_PtgFunc(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
 | 
			
		||||
function parse_PtgFuncVar(blob, length, opts) {
 | 
			
		||||
	blob.l++;
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [0, blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	var type = blob[blob.l++];
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -9704,12 +9714,35 @@ var parse_PtgElfRw = parse_PtgElfLoc;
 | 
			
		||||
/* [MS-XLS] 2.5.198.55 */
 | 
			
		||||
var parse_PtgElfRwV = parse_PtgElfLoc;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 TODO */
 | 
			
		||||
var PtgListRT = [
 | 
			
		||||
	"Data",
 | 
			
		||||
	"All",
 | 
			
		||||
	"Headers",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Data2",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataHeaders",
 | 
			
		||||
	"??",
 | 
			
		||||
	"Totals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataTotals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Current"
 | 
			
		||||
];
 | 
			
		||||
function parse_PtgList(blob) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var ixti = blob.read_shift(2);
 | 
			
		||||
	blob.l += 10;
 | 
			
		||||
	return {ixti: ixti};
 | 
			
		||||
	var flags = blob.read_shift(2);
 | 
			
		||||
	var idx = blob.read_shift(4);
 | 
			
		||||
	var c = blob.read_shift(2);
 | 
			
		||||
	var C = blob.read_shift(2);
 | 
			
		||||
	var rt = PtgListRT[(flags >> 2) & 0x1F];
 | 
			
		||||
	return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
 | 
			
		||||
function parse_PtgSxName(blob) {
 | 
			
		||||
@ -9717,6 +9750,32 @@ function parse_PtgSxName(blob) {
 | 
			
		||||
	return [blob.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [XLS] old spec */
 | 
			
		||||
function parse_PtgSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += 5;
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 1 : 4);
 | 
			
		||||
	return ["PTGSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgEndSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 4 : 5);
 | 
			
		||||
	return ["PTGENDSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemAreaN(blob) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemNoMemN(blob) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgAttrNoop(blob) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	return [0, 0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
 | 
			
		||||
var PtgTypes = {
 | 
			
		||||
0x01: { n:'PtgExp', f:parse_PtgExp },
 | 
			
		||||
@ -9742,6 +9801,8 @@ var PtgTypes = {
 | 
			
		||||
0x15: { n:'PtgParen', f:parseread1 },
 | 
			
		||||
0x16: { n:'PtgMissArg', f:parseread1 },
 | 
			
		||||
0x17: { n:'PtgStr', f:parse_PtgStr },
 | 
			
		||||
0x1A: { n:'PtgSheet', f:parse_PtgSheet },
 | 
			
		||||
0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },
 | 
			
		||||
0x1C: { n:'PtgErr', f:parse_PtgErr },
 | 
			
		||||
0x1D: { n:'PtgBool', f:parse_PtgBool },
 | 
			
		||||
0x1E: { n:'PtgInt', f:parse_PtgInt },
 | 
			
		||||
@ -9760,6 +9821,8 @@ var PtgTypes = {
 | 
			
		||||
0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },
 | 
			
		||||
0x2C: { n:'PtgRefN', f:parse_PtgRefN },
 | 
			
		||||
0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },
 | 
			
		||||
0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
 | 
			
		||||
0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
 | 
			
		||||
0x39: { n:'PtgNameX', f:parse_PtgNameX },
 | 
			
		||||
0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },
 | 
			
		||||
0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },
 | 
			
		||||
@ -9783,6 +9846,9 @@ var PtgDupes = {
 | 
			
		||||
0x4B: 0x2B, 0x6B: 0x2B,
 | 
			
		||||
0x4C: 0x2C, 0x6C: 0x2C,
 | 
			
		||||
0x4D: 0x2D, 0x6D: 0x2D,
 | 
			
		||||
0x4E: 0x2E, 0x6E: 0x2E,
 | 
			
		||||
0x4F: 0x2F, 0x6F: 0x2F,
 | 
			
		||||
0x58: 0x22, 0x78: 0x22,
 | 
			
		||||
0x59: 0x39, 0x79: 0x39,
 | 
			
		||||
0x5A: 0x3A, 0x7A: 0x3A,
 | 
			
		||||
0x5B: 0x3B, 0x7B: 0x3B,
 | 
			
		||||
@ -9807,6 +9873,7 @@ var Ptg18 = {
 | 
			
		||||
0xFF: {}
 | 
			
		||||
};
 | 
			
		||||
var Ptg19 = {
 | 
			
		||||
0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
 | 
			
		||||
0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
 | 
			
		||||
0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },
 | 
			
		||||
0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
 | 
			
		||||
@ -9863,10 +9930,7 @@ function parse_Rgce(blob, length, opts) {
 | 
			
		||||
		length = target - blob.l;
 | 
			
		||||
		id = blob[blob.l];
 | 
			
		||||
		R = PtgTypes[id];
 | 
			
		||||
		if(id === 0x18 || id === 0x19) {
 | 
			
		||||
			id = blob[blob.l + 1];
 | 
			
		||||
			R = (id === 0x18 ? Ptg18 : Ptg19)[id];
 | 
			
		||||
		}
 | 
			
		||||
		if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
 | 
			
		||||
		if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
		else { ptgs.push([R.n, R.f(blob, length, opts)]); }
 | 
			
		||||
@ -10192,6 +10256,18 @@ ixti = f[1][1]; r = f[1][2];
 | 
			
		||||
			case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
 | 
			
		||||
				stack.push("#REF!"); break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
				// $FlowIgnore
 | 
			
		||||
				stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemAreaN':
 | 
			
		||||
			case 'PtgMemNoMemN':
 | 
			
		||||
			case 'PtgAttrNoop':
 | 
			
		||||
			case 'PtgSheet':
 | 
			
		||||
			case 'PtgEndSheet':
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
 | 
			
		||||
@ -10211,13 +10287,10 @@ ixti = f[1][1]; r = f[1][2];
 | 
			
		||||
 | 
			
		||||
			case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
 | 
			
		||||
			default: throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
		}
 | 
			
		||||
		var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
 | 
			
		||||
		if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
		if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
			f = formula[0][last_sp];
 | 
			
		||||
			var _left = true;
 | 
			
		||||
			switch(f[1][0]) {
 | 
			
		||||
@ -11220,6 +11293,7 @@ var Ftab = {
 | 
			
		||||
var FtabArgc = {
 | 
			
		||||
0x0002: 1, /* ISNA */
 | 
			
		||||
0x0003: 1, /* ISERROR */
 | 
			
		||||
0x000A: 0, /* NA */
 | 
			
		||||
0x000F: 1, /* SIN */
 | 
			
		||||
0x0010: 1, /* COS */
 | 
			
		||||
0x0011: 1, /* TAN */
 | 
			
		||||
@ -11237,6 +11311,8 @@ var FtabArgc = {
 | 
			
		||||
0x001F: 3, /* MID */
 | 
			
		||||
0x0020: 1, /* LEN */
 | 
			
		||||
0x0021: 1, /* VALUE */
 | 
			
		||||
0x0022: 0, /* TRUE */
 | 
			
		||||
0x0023: 0, /* FALSE */
 | 
			
		||||
0x0026: 1, /* NOT */
 | 
			
		||||
0x0027: 2, /* MOD */
 | 
			
		||||
0x0028: 3, /* DCOUNT */
 | 
			
		||||
@ -11249,6 +11325,7 @@ var FtabArgc = {
 | 
			
		||||
0x0030: 2, /* TEXT */
 | 
			
		||||
0x0035: 1, /* GOTO */
 | 
			
		||||
0x003D: 3, /* MIRR */
 | 
			
		||||
0x003F: 0, /* RAND */
 | 
			
		||||
0x0041: 3, /* DATE */
 | 
			
		||||
0x0042: 3, /* TIME */
 | 
			
		||||
0x0043: 1, /* DAY */
 | 
			
		||||
@ -11258,6 +11335,7 @@ var FtabArgc = {
 | 
			
		||||
0x0047: 1, /* HOUR */
 | 
			
		||||
0x0048: 1, /* MINUTE */
 | 
			
		||||
0x0049: 1, /* SECOND */
 | 
			
		||||
0x004A: 0, /* NOW */
 | 
			
		||||
0x004B: 1, /* AREAS */
 | 
			
		||||
0x004C: 1, /* ROWS */
 | 
			
		||||
0x004D: 1, /* COLUMNS */
 | 
			
		||||
@ -11266,13 +11344,18 @@ var FtabArgc = {
 | 
			
		||||
0x0053: 1, /* TRANSPOSE */
 | 
			
		||||
0x0055: 0, /* STEP */
 | 
			
		||||
0x0056: 1, /* TYPE */
 | 
			
		||||
0x0059: 0, /* CALLER */
 | 
			
		||||
0x005A: 1, /* DEREF */
 | 
			
		||||
0x005E: 0, /* ACTIVE.CELL */
 | 
			
		||||
0x005F: 0, /* SELECTION */
 | 
			
		||||
0x0061: 2, /* ATAN2 */
 | 
			
		||||
0x0062: 1, /* ASIN */
 | 
			
		||||
0x0063: 1, /* ACOS */
 | 
			
		||||
0x0065: 3, /* HLOOKUP */
 | 
			
		||||
0x0066: 3, /* VLOOKUP */
 | 
			
		||||
0x0069: 1, /* ISREF */
 | 
			
		||||
0x006A: 1, /* GET.FORMULA */
 | 
			
		||||
0x006C: 2, /* SET.VALUE */
 | 
			
		||||
0x006F: 1, /* CHAR */
 | 
			
		||||
0x0070: 1, /* LOWER */
 | 
			
		||||
0x0071: 1, /* UPPER */
 | 
			
		||||
@ -11298,6 +11381,7 @@ var FtabArgc = {
 | 
			
		||||
0x008E: 3, /* SLN */
 | 
			
		||||
0x008F: 4, /* SYD */
 | 
			
		||||
0x0090: 4, /* DDB */
 | 
			
		||||
0x00A1: 1, /* DIALOG.BOX */
 | 
			
		||||
0x00A2: 1, /* CLEAN */
 | 
			
		||||
0x00A3: 1, /* MDETERM */
 | 
			
		||||
0x00A4: 1, /* MINVERSE */
 | 
			
		||||
@ -11309,6 +11393,7 @@ var FtabArgc = {
 | 
			
		||||
0x00B2: 2, /* EXECUTE */
 | 
			
		||||
0x00B3: 1, /* TERMINATE */
 | 
			
		||||
0x00B8: 1, /* FACT */
 | 
			
		||||
0x00BA: 1, /* GET.WORKSPACE */
 | 
			
		||||
0x00BD: 3, /* DPRODUCT */
 | 
			
		||||
0x00BE: 1, /* ISNONTEXT */
 | 
			
		||||
0x00C3: 3, /* DSTDEVP */
 | 
			
		||||
@ -11324,6 +11409,7 @@ var FtabArgc = {
 | 
			
		||||
0x00D5: 2, /* ROUNDDOWN */
 | 
			
		||||
0x00D6: 1, /* ASC */
 | 
			
		||||
0x00D7: 1, /* DBCS */
 | 
			
		||||
0x00E1: 0, /* END.IF */
 | 
			
		||||
0x00E5: 1, /* SINH */
 | 
			
		||||
0x00E6: 1, /* COSH */
 | 
			
		||||
0x00E7: 1, /* TANH */
 | 
			
		||||
@ -17915,6 +18001,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
					if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
 | 
			
		||||
					SheetNames.push(sheetag.name);
 | 
			
		||||
					Sheets[sheetag.name] = ws;
 | 
			
		||||
					intable = false;
 | 
			
		||||
@ -18728,7 +18815,6 @@ function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, st
 | 
			
		||||
	} catch(e) { if(opts.WTF) throw e; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var nodirs = function nodirs(x){return x.slice(-1) != '/';};
 | 
			
		||||
function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
 | 
			
		||||
 | 
			
		||||
function parse_zip(zip, opts) {
 | 
			
		||||
@ -18743,7 +18829,7 @@ function parse_zip(zip, opts) {
 | 
			
		||||
	/* Numbers */
 | 
			
		||||
	if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
 | 
			
		||||
 | 
			
		||||
	var entries = keys(zip.files).filter(nodirs).sort();
 | 
			
		||||
	var entries = zipentries(zip);
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));
 | 
			
		||||
	var xlsb = false;
 | 
			
		||||
	var sheets, binname;
 | 
			
		||||
@ -18941,8 +19027,12 @@ var zip = new jszip();
 | 
			
		||||
f = "docProps/app.xml";
 | 
			
		||||
	if(wb.Props && wb.Props.SheetNames){/* empty */}
 | 
			
		||||
	else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
 | 
			
		||||
	// $FlowIgnore
 | 
			
		||||
	else wb.Props.SheetNames = wb.SheetNames.map(function(x,i) { return [(wb.Workbook.Sheets[i]||{}).Hidden != 2, x];}).filter(function(x) { return x[0]; }).map(function(x) { return x[1]; });
 | 
			
		||||
	else {
 | 
			
		||||
		var _sn = [];
 | 
			
		||||
		for(var _i = 0; _i < wb.SheetNames.length; ++_i)
 | 
			
		||||
			if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
 | 
			
		||||
		wb.Props.SheetNames = _sn;
 | 
			
		||||
	}
 | 
			
		||||
	wb.Props.Worksheets = wb.Props.SheetNames.length;
 | 
			
		||||
	zip.file(f, write_ext_props(wb.Props, opts));
 | 
			
		||||
	ct.extprops.push(f);
 | 
			
		||||
@ -19476,7 +19566,7 @@ function sheet_add_json(_ws, js, opts) {
 | 
			
		||||
	var hdr = o.header || [], C = 0;
 | 
			
		||||
 | 
			
		||||
	js.forEach(function (JS, R) {
 | 
			
		||||
		keys(JS).filter(function(x) { return JS.hasOwnProperty(x); }).forEach(function(k) {
 | 
			
		||||
		keys(JS).forEach(function(k) {
 | 
			
		||||
			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
 | 
			
		||||
			var v = JS[k];
 | 
			
		||||
			var t = 'z';
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										24
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -38,8 +38,12 @@ To use the shim, add the shim before the script tag that loads `xlsx.js`:
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<!-- add the shim first -->
 | 
			
		||||
<script type="text/javascript" src="shim.js"></script>
 | 
			
		||||
<script type="text/javascript" src="shim.min.js"></script>
 | 
			
		||||
<!-- after the shim is referenced, add the library -->
 | 
			
		||||
<script type="text/javascript" src="xlsx.full.min.js"></script>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The script also includes `IE_LoadFile` and `IE_SaveFile` for loading and saving
 | 
			
		||||
files in Internet Explorer versions 6-9.  The `xlsx.extendscript.js` script
 | 
			
		||||
bundles the shim in a format suitable for Photoshop and other Adobe products.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -254,7 +254,7 @@ For the example sheet:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
> var o = XLSX.utils.sheet_to_formulae(ws);
 | 
			
		||||
> o.filter(function(v, i) { return i % 5 === 0; });
 | 
			
		||||
> [o[0], o[5], o[10], o[15], o[20]];
 | 
			
		||||
[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]
 | 
			
		||||
```
 | 
			
		||||
</details>
 | 
			
		||||
 | 
			
		||||
@ -245,11 +245,15 @@ To use the shim, add the shim before the script tag that loads `xlsx.js`:
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<!-- add the shim first -->
 | 
			
		||||
<script type="text/javascript" src="shim.js"></script>
 | 
			
		||||
<script type="text/javascript" src="shim.min.js"></script>
 | 
			
		||||
<!-- after the shim is referenced, add the library -->
 | 
			
		||||
<script type="text/javascript" src="xlsx.full.min.js"></script>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The script also includes `IE_LoadFile` and `IE_SaveFile` for loading and saving
 | 
			
		||||
files in Internet Explorer versions 6-9.  The `xlsx.extendscript.js` script
 | 
			
		||||
bundles the shim in a format suitable for Photoshop and other Adobe products.
 | 
			
		||||
 | 
			
		||||
## Philosophy
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1889,7 +1893,7 @@ For the example sheet:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
> var o = XLSX.utils.sheet_to_formulae(ws);
 | 
			
		||||
> o.filter(function(v, i) { return i % 5 === 0; });
 | 
			
		||||
> [o[0], o[5], o[10], o[15], o[20]];
 | 
			
		||||
[ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "xlsx",
 | 
			
		||||
	"version": "0.12.2",
 | 
			
		||||
	"version": "0.12.3",
 | 
			
		||||
	"author": "sheetjs",
 | 
			
		||||
	"description": "SheetJS Spreadsheet data parser and writer",
 | 
			
		||||
	"keywords": [
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										476
									
								
								shim.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										476
									
								
								shim.js
									
									
									
									
									
								
							@ -1,385 +1,143 @@
 | 
			
		||||
/* shim.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* ES3/5 Compatibility shims and other utilities for older browsers. */
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 | 
			
		||||
if (!Object.keys) {
 | 
			
		||||
  Object.keys = (function () {
 | 
			
		||||
    var hasOwnProperty = Object.prototype.hasOwnProperty,
 | 
			
		||||
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
 | 
			
		||||
        dontEnums = [
 | 
			
		||||
          'toString',
 | 
			
		||||
          'toLocaleString',
 | 
			
		||||
          'valueOf',
 | 
			
		||||
          'hasOwnProperty',
 | 
			
		||||
          'isPrototypeOf',
 | 
			
		||||
          'propertyIsEnumerable',
 | 
			
		||||
          'constructor'
 | 
			
		||||
        ],
 | 
			
		||||
        dontEnumsLength = dontEnums.length;
 | 
			
		||||
if(!Object.keys) Object.keys = (function() {
 | 
			
		||||
  var hasOwnProperty = Object.prototype.hasOwnProperty,
 | 
			
		||||
      hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
 | 
			
		||||
      dontEnums = [
 | 
			
		||||
        'toString',
 | 
			
		||||
        'toLocaleString',
 | 
			
		||||
        'valueOf',
 | 
			
		||||
        'hasOwnProperty',
 | 
			
		||||
        'isPrototypeOf',
 | 
			
		||||
        'propertyIsEnumerable',
 | 
			
		||||
        'constructor'
 | 
			
		||||
      ],
 | 
			
		||||
      dontEnumsLength = dontEnums.length;
 | 
			
		||||
 | 
			
		||||
    return function (obj) {
 | 
			
		||||
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
 | 
			
		||||
  return function(obj) {
 | 
			
		||||
    if(typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
 | 
			
		||||
 | 
			
		||||
      var result = [];
 | 
			
		||||
    var result = [];
 | 
			
		||||
 | 
			
		||||
      for (var prop in obj) {
 | 
			
		||||
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
 | 
			
		||||
      }
 | 
			
		||||
    for(var prop in obj) if(hasOwnProperty.call(obj, prop)) result.push(prop);
 | 
			
		||||
 | 
			
		||||
      if (hasDontEnumBug) {
 | 
			
		||||
        for (var i=0; i < dontEnumsLength; i++) {
 | 
			
		||||
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return result;
 | 
			
		||||
    };
 | 
			
		||||
  })();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
 | 
			
		||||
if (!Array.prototype.filter)
 | 
			
		||||
{
 | 
			
		||||
  Array.prototype.filter = function(fun /*, thisp */)
 | 
			
		||||
  {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (this == null)
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var t = Object(this);
 | 
			
		||||
    var len = t.length >>> 0;
 | 
			
		||||
    if (typeof fun != "function")
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var res = [];
 | 
			
		||||
    var thisp = arguments[1];
 | 
			
		||||
    for (var i = 0; i < len; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (i in t)
 | 
			
		||||
      {
 | 
			
		||||
        var val = t[i]; // in case fun mutates this
 | 
			
		||||
        if (fun.call(thisp, val, i, t))
 | 
			
		||||
          res.push(val);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
    if(hasDontEnumBug)
 | 
			
		||||
      for(var i=0; i < dontEnumsLength; ++i)
 | 
			
		||||
        if(hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
 | 
			
		||||
    return result;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
 | 
			
		||||
if (!String.prototype.trim) {
 | 
			
		||||
  String.prototype.trim = function () {
 | 
			
		||||
    return this.replace(/^\s+|\s+$/g, '');
 | 
			
		||||
if(!String.prototype.trim) String.prototype.trim = function() {
 | 
			
		||||
  var s = this.replace(/^\s+/, '');
 | 
			
		||||
  for(var i = s.length - 1; i >=0 ; --i) if(!s.charAt(i).match(/^\s/)) return s.slice(0,i+1);
 | 
			
		||||
  return "";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.prototype.forEach) Array.prototype.forEach = function(cb) {
 | 
			
		||||
  var len = (this.length>>>0), self = (arguments[1]||void 0);
 | 
			
		||||
  for(var i=0; i<len; ++i) if(i in this) self ? cb.call(self, this[i], i, this) : cb(this[i], i, this);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.prototype.map) Array.prototype.map = function(cb) {
 | 
			
		||||
  var len = (this.length>>>0), self = (arguments[1]||void 0), A = new Array(len);
 | 
			
		||||
  for(var i=0; i<len; ++i) if(i in this) A[i] = self ? cb.call(self, this[i], i, this) : cb(this[i], i, this);
 | 
			
		||||
  return A;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.prototype.indexOf) Array.prototype.indexOf = function(needle) {
 | 
			
		||||
  var len = (this.length>>>0), i = ((arguments[1]|0)||0);
 | 
			
		||||
  for(i<0 && (i+=len)<0 && (i=0); i<len; ++i) if(this[i] === needle) return i;
 | 
			
		||||
  return -1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if(!Array.isArray) Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; };
 | 
			
		||||
 | 
			
		||||
if(!Date.prototype.toISOString) Date.prototype.toISOString = (function() {
 | 
			
		||||
  function p(n,i) { return ('0000000' + n).slice(-(i||2)); }
 | 
			
		||||
 | 
			
		||||
  return function _toISOString() {
 | 
			
		||||
    var y = this.getUTCFullYear(), yr = "";
 | 
			
		||||
    if(y>9999)   yr = '+' + p( y, 6);
 | 
			
		||||
    else if(y<0) yr = '-' + p(-y, 6);
 | 
			
		||||
    else         yr =       p( y, 4);
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
      yr, p(this.getUTCMonth()+1), p(this.getUTCDate())
 | 
			
		||||
    ].join('-') + 'T' + [
 | 
			
		||||
      p(this.getUTCHours()), p(this.getUTCMinutes()), p(this.getUTCSeconds())
 | 
			
		||||
    ].join(':') + '.' + p(this.getUTCMilliseconds(),3) + 'Z';
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
 | 
			
		||||
if (!Array.prototype.forEach)
 | 
			
		||||
{
 | 
			
		||||
  Array.prototype.forEach = function(fun /*, thisArg */)
 | 
			
		||||
  {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (this === void 0 || this === null)
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var t = Object(this);
 | 
			
		||||
    var len = t.length >>> 0;
 | 
			
		||||
    if (typeof fun !== "function")
 | 
			
		||||
      throw new TypeError();
 | 
			
		||||
 | 
			
		||||
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
 | 
			
		||||
    for (var i = 0; i < len; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (i in t)
 | 
			
		||||
        fun.call(thisArg, t[i], i, t);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Production steps of ECMA-262, Edition 5, 15.4.4.19
 | 
			
		||||
// Reference: http://es5.github.com/#x15.4.4.19
 | 
			
		||||
if (!Array.prototype.map) {
 | 
			
		||||
  Array.prototype.map = function(callback, thisArg) {
 | 
			
		||||
 | 
			
		||||
    var T, A, k;
 | 
			
		||||
 | 
			
		||||
    if (this == null) {
 | 
			
		||||
      throw new TypeError(" this is null or not defined");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
 | 
			
		||||
    var O = Object(this);
 | 
			
		||||
 | 
			
		||||
    // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
 | 
			
		||||
    // 3. Let len be ToUint32(lenValue).
 | 
			
		||||
    var len = O.length >>> 0;
 | 
			
		||||
 | 
			
		||||
    // 4. If IsCallable(callback) is false, throw a TypeError exception.
 | 
			
		||||
    // See: http://es5.github.com/#x9.11
 | 
			
		||||
    if (typeof callback !== "function") {
 | 
			
		||||
      throw new TypeError(callback + " is not a function");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
 | 
			
		||||
    if (thisArg) {
 | 
			
		||||
      T = thisArg;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 6. Let A be a new array created as if by the expression new Array(len) where Array is
 | 
			
		||||
    // the standard built-in constructor with that name and len is the value of len.
 | 
			
		||||
    A = new Array(len);
 | 
			
		||||
 | 
			
		||||
    // 7. Let k be 0
 | 
			
		||||
    k = 0;
 | 
			
		||||
 | 
			
		||||
    // 8. Repeat, while k < len
 | 
			
		||||
    while(k < len) {
 | 
			
		||||
 | 
			
		||||
      var kValue, mappedValue;
 | 
			
		||||
 | 
			
		||||
      // a. Let Pk be ToString(k).
 | 
			
		||||
      //   This is implicit for LHS operands of the in operator
 | 
			
		||||
      // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
 | 
			
		||||
      //   This step can be combined with c
 | 
			
		||||
      // c. If kPresent is true, then
 | 
			
		||||
      if (k in O) {
 | 
			
		||||
 | 
			
		||||
        // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
 | 
			
		||||
        kValue = O[ k ];
 | 
			
		||||
 | 
			
		||||
        // ii. Let mappedValue be the result of calling the Call internal method of callback
 | 
			
		||||
        // with T as the this value and argument list containing kValue, k, and O.
 | 
			
		||||
        mappedValue = callback.call(T, kValue, k, O);
 | 
			
		||||
 | 
			
		||||
        // iii. Call the DefineOwnProperty internal method of A with arguments
 | 
			
		||||
        // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
 | 
			
		||||
        // and false.
 | 
			
		||||
 | 
			
		||||
        // In browsers that support Object.defineProperty, use the following:
 | 
			
		||||
        // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });
 | 
			
		||||
 | 
			
		||||
        // For best browser support, use the following:
 | 
			
		||||
        A[ k ] = mappedValue;
 | 
			
		||||
      }
 | 
			
		||||
      // d. Increase k by 1.
 | 
			
		||||
      k++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 9. return A
 | 
			
		||||
    return A;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
 | 
			
		||||
if (!Array.prototype.indexOf) {
 | 
			
		||||
  Array.prototype.indexOf = function (searchElement, fromIndex) {
 | 
			
		||||
    if ( this === undefined || this === null ) {
 | 
			
		||||
      throw new TypeError( '"this" is null or not defined' );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var length = this.length >>> 0; // Hack to convert object.length to a UInt32
 | 
			
		||||
 | 
			
		||||
    fromIndex = +fromIndex || 0;
 | 
			
		||||
 | 
			
		||||
    if (Math.abs(fromIndex) === Infinity) {
 | 
			
		||||
      fromIndex = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (fromIndex < 0) {
 | 
			
		||||
      fromIndex += length;
 | 
			
		||||
      if (fromIndex < 0) {
 | 
			
		||||
        fromIndex = 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (;fromIndex < length; fromIndex++) {
 | 
			
		||||
      if (this[fromIndex] === searchElement) {
 | 
			
		||||
        return fromIndex;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
 | 
			
		||||
 | 
			
		||||
if (! Array.isArray) {
 | 
			
		||||
    Array.isArray = function(obj) {
 | 
			
		||||
        return Object.prototype.toString.call(obj) === "[object Array]";
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://github.com/ttaubert/node-arraybuffer-slice
 | 
			
		||||
// (c) 2013 Tim Taubert <tim@timtaubert.de>
 | 
			
		||||
// arraybuffer-slice may be freely distributed under the MIT license.
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
 | 
			
		||||
  ArrayBuffer.prototype.slice = function (begin, end) {
 | 
			
		||||
    begin = (begin|0) || 0;
 | 
			
		||||
    var num = this.byteLength;
 | 
			
		||||
    end = end === (void 0) ? num : (end|0);
 | 
			
		||||
 | 
			
		||||
    // Handle negative values.
 | 
			
		||||
    if (begin < 0) begin += num;
 | 
			
		||||
    if (end < 0) end += num;
 | 
			
		||||
 | 
			
		||||
    if (num === 0 || begin >= num || begin >= end) {
 | 
			
		||||
      return new ArrayBuffer(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var length = Math.min(num - begin, end - begin);
 | 
			
		||||
    var target = new ArrayBuffer(length);
 | 
			
		||||
    var targetArray = new Uint8Array(target);
 | 
			
		||||
    targetArray.set(new Uint8Array(this, begin, length));
 | 
			
		||||
    return target;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// https://github.com/davidchambers/Base64.js
 | 
			
		||||
// (C) 2015 David Chambers
 | 
			
		||||
// Base64.js may be freely distributed under the Apache 2.0 License.
 | 
			
		||||
;(function () {
 | 
			
		||||
 | 
			
		||||
  var object =
 | 
			
		||||
    typeof exports != 'undefined' ? exports :
 | 
			
		||||
    typeof self != 'undefined' ? self : // #8: web workers
 | 
			
		||||
    $.global; // #31: ExtendScript
 | 
			
		||||
 | 
			
		||||
  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
 | 
			
		||||
 | 
			
		||||
  function InvalidCharacterError(message) {
 | 
			
		||||
    this.message = message;
 | 
			
		||||
  }
 | 
			
		||||
  InvalidCharacterError.prototype = new Error;
 | 
			
		||||
  InvalidCharacterError.prototype.name = 'InvalidCharacterError';
 | 
			
		||||
 | 
			
		||||
  // encoder
 | 
			
		||||
  // [https://gist.github.com/999166] by [https://github.com/nignag]
 | 
			
		||||
  object.btoa || (
 | 
			
		||||
  object.btoa = function (input) {
 | 
			
		||||
    var str = String(input);
 | 
			
		||||
    for (
 | 
			
		||||
      // initialize result and counter
 | 
			
		||||
      var block, charCode, idx = 0, map = chars, output = '';
 | 
			
		||||
      // if the next str index does not exist:
 | 
			
		||||
      //   change the mapping table to "="
 | 
			
		||||
      //   check if d has no fractional digits
 | 
			
		||||
      str.charAt(idx | 0) || (map = '=', idx % 1);
 | 
			
		||||
      // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
 | 
			
		||||
      output += map.charAt(63 & block >> 8 - idx % 1 * 8)
 | 
			
		||||
    ) {
 | 
			
		||||
      charCode = str.charCodeAt(idx += 3/4);
 | 
			
		||||
      if (charCode > 0xFF) {
 | 
			
		||||
        throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
 | 
			
		||||
      }
 | 
			
		||||
      block = block << 8 | charCode;
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // decoder
 | 
			
		||||
  // [https://gist.github.com/1020396] by [https://github.com/atk]
 | 
			
		||||
  object.atob || (
 | 
			
		||||
  object.atob = function (input) {
 | 
			
		||||
    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=
 | 
			
		||||
    if (str.length % 4 == 1) {
 | 
			
		||||
      throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.");
 | 
			
		||||
    }
 | 
			
		||||
    for (
 | 
			
		||||
      // initialize result and counters
 | 
			
		||||
      var bc = 0, bs, buffer, idx = 0, output = '';
 | 
			
		||||
      // get next character
 | 
			
		||||
      buffer = str.charAt(idx++);
 | 
			
		||||
      // character found in table? initialize bit storage and add its ascii value;
 | 
			
		||||
      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
 | 
			
		||||
        // and if not first of each 4 characters,
 | 
			
		||||
        // convert the first 8 bits to one ascii character
 | 
			
		||||
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
 | 
			
		||||
    ) {
 | 
			
		||||
      // try to find character in table (0-63, not found => -1)
 | 
			
		||||
      buffer = chars.indexOf(buffer);
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  });
 | 
			
		||||
}());
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
 | 
			
		||||
if (!Date.prototype.toISOString) {
 | 
			
		||||
  (function() {
 | 
			
		||||
 | 
			
		||||
    function pad(number) {
 | 
			
		||||
      if (number < 10) {
 | 
			
		||||
        return '0' + number;
 | 
			
		||||
      }
 | 
			
		||||
      return number;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Date.prototype.toISOString = function() {
 | 
			
		||||
      return this.getUTCFullYear() +
 | 
			
		||||
        '-' + pad(this.getUTCMonth() + 1) +
 | 
			
		||||
        '-' + pad(this.getUTCDate()) +
 | 
			
		||||
        'T' + pad(this.getUTCHours()) +
 | 
			
		||||
        ':' + pad(this.getUTCMinutes()) +
 | 
			
		||||
        ':' + pad(this.getUTCSeconds()) +
 | 
			
		||||
        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
 | 
			
		||||
        'Z';
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  }());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// note: MDN shim will not work in IE
 | 
			
		||||
if(typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) ArrayBuffer.prototype.slice = function(start, end) {
 | 
			
		||||
  if(start == null) start = 0;
 | 
			
		||||
  if(start < 0) { start += this.byteLength; if(start < 0) start = 0; }
 | 
			
		||||
  if(start >= this.byteLength) return new Uint8Array(0);
 | 
			
		||||
  if(end == null) end = this.byteLength;
 | 
			
		||||
  if(end < 0) { end += this.byteLength; if(end < 0) end = 0; }
 | 
			
		||||
  if(end > this.byteLength) end = this.byteLength;
 | 
			
		||||
  if(start > end) return new Uint8Array(0);
 | 
			
		||||
  var out = new ArrayBuffer(end - start);
 | 
			
		||||
  var view = new Uint8Array(out);
 | 
			
		||||
  var data = new Uint8Array(this, start, end - start)
 | 
			
		||||
  /* IE10 should have Uint8Array#set */
 | 
			
		||||
  if(view.set) view.set(data); else while(start <= --end) view[end - start] = data[end];
 | 
			
		||||
  return out;
 | 
			
		||||
};
 | 
			
		||||
if(typeof Uint8Array !== 'undefined' && !Uint8Array.prototype.slice) Uint8Array.prototype.slice = function(start, end) {
 | 
			
		||||
	if(start < 0) { start += this.length; if(start < 0) start = 0; }
 | 
			
		||||
	if(start >= this.length) return new Uint8Array(0);
 | 
			
		||||
	if(end == null) end = this.length;
 | 
			
		||||
	if(end < 0) { end += this.length; if(end < 0) end = 0; }
 | 
			
		||||
	if(end > this.length) end = this.length;
 | 
			
		||||
	var out = new Uint8Array(end - start);
 | 
			
		||||
	while(start <= --end) out[end - start] = this[end];
 | 
			
		||||
	return out;
 | 
			
		||||
  if(start == null) start = 0;
 | 
			
		||||
  if(start < 0) { start += this.length; if(start < 0) start = 0; }
 | 
			
		||||
  if(start >= this.length) return new Uint8Array(0);
 | 
			
		||||
  if(end == null) end = this.length;
 | 
			
		||||
  if(end < 0) { end += this.length; if(end < 0) end = 0; }
 | 
			
		||||
  if(end > this.length) end = this.length;
 | 
			
		||||
  if(start > end) return new Uint8Array(0);
 | 
			
		||||
  var out = new Uint8Array(end - start);
 | 
			
		||||
  while(start <= --end) out[end - start] = this[end];
 | 
			
		||||
  return out;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// VBScript + ActiveX fallback for IE5+
 | 
			
		||||
var IE_SaveFile = (function() { try {
 | 
			
		||||
	if(typeof IE_SaveFile_Impl == "undefined") document.write([
 | 
			
		||||
  if(typeof IE_SaveFile_Impl == "undefined") document.write([
 | 
			
		||||
'<script type="text/vbscript" language="vbscript">',
 | 
			
		||||
'IE_GetProfileAndPath_Key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders\\"',
 | 
			
		||||
'Function IE_GetProfileAndPath(key): Set wshell = CreateObject("WScript.Shell"): IE_GetProfileAndPath = wshell.RegRead(IE_GetProfileAndPath_Key & key): IE_GetProfileAndPath = wshell.ExpandEnvironmentStrings("%USERPROFILE%") & "!" & IE_GetProfileAndPath: End Function',
 | 
			
		||||
'Function IE_SaveFile_Impl(FileName, payload): Dim data, plen, i, bit: data = CStr(payload): plen = Len(data): Set fso = CreateObject("Scripting.FileSystemObject"): fso.CreateTextFile FileName, True: Set f = fso.GetFile(FileName): Set stream = f.OpenAsTextStream(2, 0): For i = 1 To plen Step 3: bit = Mid(data, i, 2): stream.write Chr(CLng("&h" & bit)): Next: stream.Close: IE_SaveFile_Impl = True: End Function',
 | 
			
		||||
'|/script>'.replace("|","<")
 | 
			
		||||
	].join("\r\n"));
 | 
			
		||||
	if(typeof IE_SaveFile_Impl == "undefined") return void 0;
 | 
			
		||||
	var IE_GetPath = (function() {
 | 
			
		||||
		var DDP1 = "";
 | 
			
		||||
		try { DDP1 = IE_GetProfileAndPath("{374DE290-123F-4565-9164-39C4925E467B}"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Personal"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Desktop"); } catch(e) { throw e; }}}
 | 
			
		||||
		var o = DDP1.split("!");
 | 
			
		||||
		DDP = o[1].replace("%USERPROFILE%", o[0]);
 | 
			
		||||
		return function(path) { return DDP + "\\" + path; };
 | 
			
		||||
	})();
 | 
			
		||||
	function fix_data(data) {
 | 
			
		||||
		var out = [];
 | 
			
		||||
		var T = typeof data == "string";
 | 
			
		||||
		for(var i = 0; i < data.length; ++i) out.push(("00"+(T ? data.charCodeAt(i) : data[i]).toString(16)).slice(-2));
 | 
			
		||||
		var o = out.join("|");
 | 
			
		||||
		return o;
 | 
			
		||||
	}
 | 
			
		||||
	return function(data, filename) { return IE_SaveFile_Impl(IE_GetPath(filename), fix_data(data)); };
 | 
			
		||||
  ].join("\r\n"));
 | 
			
		||||
  if(typeof IE_SaveFile_Impl == "undefined") return void 0;
 | 
			
		||||
  var IE_GetPath = (function() {
 | 
			
		||||
    var DDP1 = "";
 | 
			
		||||
    try { DDP1 = IE_GetProfileAndPath("{374DE290-123F-4565-9164-39C4925E467B}"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Personal"); } catch(e) { try { DDP1 = IE_GetProfileAndPath("Desktop"); } catch(e) { throw e; }}}
 | 
			
		||||
    var o = DDP1.split("!");
 | 
			
		||||
    DDP = o[1].replace("%USERPROFILE%", o[0]);
 | 
			
		||||
    return function(path) { return DDP + "\\" + path; };
 | 
			
		||||
  })();
 | 
			
		||||
  function fix_data(data) {
 | 
			
		||||
    var out = [];
 | 
			
		||||
    var T = typeof data == "string";
 | 
			
		||||
    for(var i = 0; i < data.length; ++i) out.push(("00"+(T ? data.charCodeAt(i) : data[i]).toString(16)).slice(-2));
 | 
			
		||||
    var o = out.join("|");
 | 
			
		||||
    return o;
 | 
			
		||||
  }
 | 
			
		||||
  return function(data, filename) { return IE_SaveFile_Impl(IE_GetPath(filename), fix_data(data)); };
 | 
			
		||||
} catch(e) { return void 0; }})();
 | 
			
		||||
var IE_LoadFile = (function() { try {
 | 
			
		||||
	if(typeof IE_LoadFile_Impl == "undefined") document.write([
 | 
			
		||||
  if(typeof IE_LoadFile_Impl == "undefined") document.write([
 | 
			
		||||
'<script type="text/vbscript" language="vbscript">',
 | 
			
		||||
'Function IE_LoadFile_Impl(FileName): Dim out(), plen, i, cc: Set fso = CreateObject("Scripting.FileSystemObject"): Set f = fso.GetFile(FileName): Set stream = f.OpenAsTextStream(1, 0): plen = f.Size: ReDim out(plen): For i = 1 To plen Step 1: cc = Hex(Asc(stream.read(1))): If Len(cc) < 2 Then: cc = "0" & cc: End If: out(i) = cc: Next: IE_LoadFile_Impl = Join(out,""): End Function',
 | 
			
		||||
'|/script>'.replace("|","<")
 | 
			
		||||
	].join("\r\n"));
 | 
			
		||||
	if(typeof IE_LoadFile_Impl == "undefined") return void 0;
 | 
			
		||||
	function fix_data(data) {
 | 
			
		||||
		var out = [];
 | 
			
		||||
		for(var i = 0; i < data.length; i+=2) out.push(String.fromCharCode(parseInt(data.slice(i, i+2), 16)));
 | 
			
		||||
		var o = out.join("");
 | 
			
		||||
		return o;
 | 
			
		||||
	}
 | 
			
		||||
	return function(filename) { return fix_data(IE_LoadFile_Impl(filename)); };
 | 
			
		||||
  ].join("\r\n"));
 | 
			
		||||
  if(typeof IE_LoadFile_Impl == "undefined") return void 0;
 | 
			
		||||
  function fix_data(data) {
 | 
			
		||||
    var out = [];
 | 
			
		||||
    for(var i = 0; i < data.length; i+=2) out.push(String.fromCharCode(parseInt(data.slice(i, i+2), 16)));
 | 
			
		||||
    var o = out.join("");
 | 
			
		||||
    return o;
 | 
			
		||||
  }
 | 
			
		||||
  return function(filename) { return fix_data(IE_LoadFile_Impl(filename)); };
 | 
			
		||||
} catch(e) { return void 0; }})();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								test.js
									
									
									
									
									
								
							@ -37,8 +37,13 @@ if(typeof process != 'undefined' && ((process||{}).env)) {
 | 
			
		||||
var exp = ex.map(function(x){ return x + ".pending"; });
 | 
			
		||||
function test_file(x){ return ex.indexOf(x.slice(-5))>=0||exp.indexOf(x.slice(-13))>=0 || ex.indexOf(x.slice(-4))>=0||exp.indexOf(x.slice(-12))>=0; }
 | 
			
		||||
 | 
			
		||||
var files = browser ? [] : (fs.existsSync('tests.lst') ? fs.readFileSync('tests.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : fs.readdirSync('test_files')).filter(test_file);
 | 
			
		||||
var fileA = browser ? [] : (fs.existsSync('tests/testA.lst') ? fs.readFileSync('tests/testA.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : []).filter(test_file);
 | 
			
		||||
var files = [], fileA = [];
 | 
			
		||||
if(!browser) {
 | 
			
		||||
	var _files = fs.existsSync('tests.lst') ? fs.readFileSync('tests.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : fs.readdirSync('test_files');
 | 
			
		||||
	for(var _filesi = 0; _filesi < _files.length; ++_filesi) if(test_file(_files[_filesi])) files.push(_files[_filesi]);
 | 
			
		||||
	var _fileA = fs.existsSync('tests/testA.lst') ? fs.readFileSync('tests/testA.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : [];
 | 
			
		||||
	for(var _fileAi = 0; _fileAi < _fileA.length; ++_fileAi) if(test_file(_fileA[_fileAi])) fileA.push(_fileA[_fileAi]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Excel enforces 31 character sheet limit, although technical file limit is 255 */
 | 
			
		||||
function fixsheetname(x/*:string*/)/*:string*/ { return x.substr(0,31); }
 | 
			
		||||
@ -1522,7 +1527,6 @@ describe('roundtrip features', function() {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
//function password_file(x){return x.match(/^password.*\.xls$/); }
 | 
			
		||||
//var password_files = fs.readdirSync('test_files').filter(password_file);
 | 
			
		||||
var password_files = [
 | 
			
		||||
	//"password_2002_40_972000.xls",
 | 
			
		||||
	"password_2002_40_xor.xls"
 | 
			
		||||
 | 
			
		||||
@ -203,7 +203,7 @@ apachepoi_Booleans.xlsx
 | 
			
		||||
apachepoi_BrNotClosed.xlsx
 | 
			
		||||
apachepoi_ConditionalFormattingSamples.xlsx
 | 
			
		||||
apachepoi_CustomXMLMapping-singleattributenamespace.xlsx
 | 
			
		||||
apachepoi_CustomXMLMappings-complex-type.xlsx
 | 
			
		||||
#apachepoi_CustomXMLMappings-complex-type.xlsx # Upstream changed file
 | 
			
		||||
apachepoi_CustomXMLMappings.xlsx
 | 
			
		||||
apachepoi_CustomXmlMappings-inverse-order.xlsx
 | 
			
		||||
apachepoi_DataTableCities.xlsx
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										67
									
								
								tests/base64.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										67
									
								
								tests/base64.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,67 @@
 | 
			
		||||
// https://github.com/davidchambers/Base64.js
 | 
			
		||||
// (C) 2015 David Chambers and contributors
 | 
			
		||||
// Base64.js may be freely distributed under the Apache 2.0 License.
 | 
			
		||||
;(function () {
 | 
			
		||||
 | 
			
		||||
  var object =
 | 
			
		||||
    typeof exports != 'undefined' ? exports :
 | 
			
		||||
    typeof self != 'undefined' ? self : // #8: web workers
 | 
			
		||||
    $.global; // #31: ExtendScript
 | 
			
		||||
 | 
			
		||||
  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
 | 
			
		||||
 | 
			
		||||
  function InvalidCharacterError(message) {
 | 
			
		||||
    this.message = message;
 | 
			
		||||
  }
 | 
			
		||||
  InvalidCharacterError.prototype = new Error;
 | 
			
		||||
  InvalidCharacterError.prototype.name = 'InvalidCharacterError';
 | 
			
		||||
 | 
			
		||||
  // encoder
 | 
			
		||||
  // [https://gist.github.com/999166] by [https://github.com/nignag]
 | 
			
		||||
  object.btoa || (
 | 
			
		||||
  object.btoa = function (input) {
 | 
			
		||||
    var str = String(input);
 | 
			
		||||
    for (
 | 
			
		||||
      // initialize result and counter
 | 
			
		||||
      var block, charCode, idx = 0, map = chars, output = '';
 | 
			
		||||
      // if the next str index does not exist:
 | 
			
		||||
      //   change the mapping table to "="
 | 
			
		||||
      //   check if d has no fractional digits
 | 
			
		||||
      str.charAt(idx | 0) || (map = '=', idx % 1);
 | 
			
		||||
      // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
 | 
			
		||||
      output += map.charAt(63 & block >> 8 - idx % 1 * 8)
 | 
			
		||||
    ) {
 | 
			
		||||
      charCode = str.charCodeAt(idx += 3/4);
 | 
			
		||||
      if (charCode > 0xFF) {
 | 
			
		||||
        throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
 | 
			
		||||
      }
 | 
			
		||||
      block = block << 8 | charCode;
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // decoder
 | 
			
		||||
  // [https://gist.github.com/1020396] by [https://github.com/atk]
 | 
			
		||||
  object.atob || (
 | 
			
		||||
  object.atob = function (input) {
 | 
			
		||||
    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=
 | 
			
		||||
    if (str.length % 4 == 1) {
 | 
			
		||||
      throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.");
 | 
			
		||||
    }
 | 
			
		||||
    for (
 | 
			
		||||
      // initialize result and counters
 | 
			
		||||
      var bc = 0, bs, buffer, idx = 0, output = '';
 | 
			
		||||
      // get next character
 | 
			
		||||
      buffer = str.charAt(idx++);
 | 
			
		||||
      // character found in table? initialize bit storage and add its ascii value;
 | 
			
		||||
      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
 | 
			
		||||
        // and if not first of each 4 characters,
 | 
			
		||||
        // convert the first 8 bits to one ascii character
 | 
			
		||||
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
 | 
			
		||||
    ) {
 | 
			
		||||
      // try to find character in table (0-63, not found => -1)
 | 
			
		||||
      buffer = chars.indexOf(buffer);
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  });
 | 
			
		||||
}());
 | 
			
		||||
							
								
								
									
										10
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							@ -37,8 +37,13 @@ if(typeof process != 'undefined' && ((process||{}).env)) {
 | 
			
		||||
var exp = ex.map(function(x){ return x + ".pending"; });
 | 
			
		||||
function test_file(x){ return ex.indexOf(x.slice(-5))>=0||exp.indexOf(x.slice(-13))>=0 || ex.indexOf(x.slice(-4))>=0||exp.indexOf(x.slice(-12))>=0; }
 | 
			
		||||
 | 
			
		||||
var files = browser ? [] : (fs.existsSync('tests.lst') ? fs.readFileSync('tests.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : fs.readdirSync('test_files')).filter(test_file);
 | 
			
		||||
var fileA = browser ? [] : (fs.existsSync('tests/testA.lst') ? fs.readFileSync('tests/testA.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : []).filter(test_file);
 | 
			
		||||
var files = [], fileA = [];
 | 
			
		||||
if(!browser) {
 | 
			
		||||
	var _files = fs.existsSync('tests.lst') ? fs.readFileSync('tests.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : fs.readdirSync('test_files');
 | 
			
		||||
	for(var _filesi = 0; _filesi < _files.length; ++_filesi) if(test_file(_files[_filesi])) files.push(_files[_filesi]);
 | 
			
		||||
	var _fileA = fs.existsSync('tests/testA.lst') ? fs.readFileSync('tests/testA.lst', 'utf-8').split("\n").map(function(x) { return x.trim(); }) : [];
 | 
			
		||||
	for(var _fileAi = 0; _fileAi < _fileA.length; ++_fileAi) if(test_file(_fileA[_fileAi])) fileA.push(_fileA[_fileAi]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Excel enforces 31 character sheet limit, although technical file limit is 255 */
 | 
			
		||||
function fixsheetname(x/*:string*/)/*:string*/ { return x.substr(0,31); }
 | 
			
		||||
@ -1522,7 +1527,6 @@ describe('roundtrip features', function() {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
//function password_file(x){return x.match(/^password.*\.xls$/); }
 | 
			
		||||
//var password_files = fs.readdirSync('test_files').filter(password_file);
 | 
			
		||||
var password_files = [
 | 
			
		||||
	//"password_2002_40_972000.xls",
 | 
			
		||||
	"password_2002_40_xor.xls"
 | 
			
		||||
 | 
			
		||||
@ -26,8 +26,10 @@ function require(s) {
 | 
			
		||||
 | 
			
		||||
var fs = {};
 | 
			
		||||
fs.existsSync = function(p) { return !!fs[p]; };
 | 
			
		||||
fs.readdirSync = function(p) { return Object.keys(fs).filter(function(n) {
 | 
			
		||||
	return fs.hasOwnProperty(n) && n.slice(-4) != "Sync"; });
 | 
			
		||||
fs.readdirSync = function(p) {
 | 
			
		||||
	var k = Object.keys(fs), o = [];
 | 
			
		||||
	for(var i = 0; i < k.length; ++i) if(fs.hasOwnProperty(k[i]) && k[i].match(p)) o.push(k[i]);
 | 
			
		||||
	return o;
 | 
			
		||||
};
 | 
			
		||||
fs.readFileSync = function(f, enc) {
 | 
			
		||||
	if(!fs[f]) throw new Error("File not found: " + f);
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,7 @@
 | 
			
		||||
	})();
 | 
			
		||||
</script>
 | 
			
		||||
    <script src="shim.js"></script>
 | 
			
		||||
    <script src="base64.js"></script>
 | 
			
		||||
    <script src="fs_.js"></script>
 | 
			
		||||
    <script src="fixtures.js"></script>
 | 
			
		||||
    <script src="xlsx.full.min.js"></script>
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,7 @@
 | 
			
		||||
	})();
 | 
			
		||||
</script>
 | 
			
		||||
    <script src="shim.js"></script>
 | 
			
		||||
    <script src="base64.js"></script>
 | 
			
		||||
    <script src="fs_.js"></script>
 | 
			
		||||
    <script src="fixtures.js"></script>
 | 
			
		||||
    <script src="xlsx.full.min.js"></script>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										132
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										132
									
								
								xlsx.flow.js
									
									
									
									
									
								
							@ -4,7 +4,7 @@
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.12.2';
 | 
			
		||||
XLSX.version = '0.12.3';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*:: declare var cptable:any; */
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
@ -1954,7 +1954,11 @@ function read_binary(path/*:string*/) {
 | 
			
		||||
	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
 | 
			
		||||
	throw new Error("Cannot access file " + path);
 | 
			
		||||
}
 | 
			
		||||
function keys(o/*:any*/)/*:Array<any>*/ { return Object.keys(o); }
 | 
			
		||||
function keys(o/*:any*/)/*:Array<any>*/ {
 | 
			
		||||
	var ks = Object.keys(o), o2 = [];
 | 
			
		||||
	for(var i = 0; i < ks.length; ++i) if(o.hasOwnProperty(ks[i])) o2.push(ks[i]);
 | 
			
		||||
	return o2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function evert_key(obj/*:any*/, key/*:string*/)/*:EvertType*/ {
 | 
			
		||||
	var o = ([]/*:any*/), K = keys(obj);
 | 
			
		||||
@ -2146,6 +2150,12 @@ function getzipstr(zip, file/*:string*/, safe/*:?boolean*/)/*:?string*/ {
 | 
			
		||||
	try { return getzipstr(zip, file); } catch(e) { return null; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function zipentries(zip) {
 | 
			
		||||
	var k = keys(zip.files), o = [];
 | 
			
		||||
	for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
 | 
			
		||||
	return o.sort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var jszip;
 | 
			
		||||
/*:: declare var JSZip:any; */
 | 
			
		||||
/*global JSZip:true */
 | 
			
		||||
@ -9468,7 +9478,7 @@ function parse_PtgArea3d(blob, length, opts) {
 | 
			
		||||
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
 | 
			
		||||
function parse_PtgAreaErr(blob, length, opts) {
 | 
			
		||||
	var type = (blob[blob.l++] & 0x60) >> 5;
 | 
			
		||||
	blob.l += opts && opts.biff > 8 ? 12 : 8;
 | 
			
		||||
	blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
 | 
			
		||||
	return [type];
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
 | 
			
		||||
@ -9600,8 +9610,8 @@ function parse_PtgFunc(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
 | 
			
		||||
function parse_PtgFuncVar(blob, length, opts) {
 | 
			
		||||
	blob.l++;
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [0, blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	var type = blob[blob.l++];
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -9798,12 +9808,35 @@ var parse_PtgElfRw = parse_PtgElfLoc;
 | 
			
		||||
/* [MS-XLS] 2.5.198.55 */
 | 
			
		||||
var parse_PtgElfRwV = parse_PtgElfLoc;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 TODO */
 | 
			
		||||
var PtgListRT = [
 | 
			
		||||
	"Data",
 | 
			
		||||
	"All",
 | 
			
		||||
	"Headers",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Data2",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataHeaders",
 | 
			
		||||
	"??",
 | 
			
		||||
	"Totals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataTotals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Current"
 | 
			
		||||
];
 | 
			
		||||
function parse_PtgList(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var ixti = blob.read_shift(2);
 | 
			
		||||
	blob.l += 10;
 | 
			
		||||
	return {ixti: ixti};
 | 
			
		||||
	var flags = blob.read_shift(2);
 | 
			
		||||
	var idx = blob.read_shift(4);
 | 
			
		||||
	var c = blob.read_shift(2);
 | 
			
		||||
	var C = blob.read_shift(2);
 | 
			
		||||
	var rt = PtgListRT[(flags >> 2) & 0x1F];
 | 
			
		||||
	return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
 | 
			
		||||
function parse_PtgSxName(blob/*::, length, opts*/) {
 | 
			
		||||
@ -9811,6 +9844,32 @@ function parse_PtgSxName(blob/*::, length, opts*/) {
 | 
			
		||||
	return [blob.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [XLS] old spec */
 | 
			
		||||
function parse_PtgSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += 5;
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 1 : 4);
 | 
			
		||||
	return ["PTGSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgEndSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 4 : 5);
 | 
			
		||||
	return ["PTGENDSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemAreaN(blob/*::, length, opts*/) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemNoMemN(blob/*::, length, opts*/) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgAttrNoop(blob/*::, length, opts*/) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	return [0, 0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
 | 
			
		||||
var PtgTypes = {
 | 
			
		||||
	/*::[*/0x01/*::]*/: { n:'PtgExp', f:parse_PtgExp },
 | 
			
		||||
@ -9836,6 +9895,8 @@ var PtgTypes = {
 | 
			
		||||
	/*::[*/0x15/*::]*/: { n:'PtgParen', f:parseread1 },
 | 
			
		||||
	/*::[*/0x16/*::]*/: { n:'PtgMissArg', f:parseread1 },
 | 
			
		||||
	/*::[*/0x17/*::]*/: { n:'PtgStr', f:parse_PtgStr },
 | 
			
		||||
	/*::[*/0x1A/*::]*/: { n:'PtgSheet', f:parse_PtgSheet },
 | 
			
		||||
	/*::[*/0x1B/*::]*/: { n:'PtgEndSheet', f:parse_PtgEndSheet },
 | 
			
		||||
	/*::[*/0x1C/*::]*/: { n:'PtgErr', f:parse_PtgErr },
 | 
			
		||||
	/*::[*/0x1D/*::]*/: { n:'PtgBool', f:parse_PtgBool },
 | 
			
		||||
	/*::[*/0x1E/*::]*/: { n:'PtgInt', f:parse_PtgInt },
 | 
			
		||||
@ -9854,6 +9915,8 @@ var PtgTypes = {
 | 
			
		||||
	/*::[*/0x2B/*::]*/: { n:'PtgAreaErr', f:parse_PtgAreaErr },
 | 
			
		||||
	/*::[*/0x2C/*::]*/: { n:'PtgRefN', f:parse_PtgRefN },
 | 
			
		||||
	/*::[*/0x2D/*::]*/: { n:'PtgAreaN', f:parse_PtgAreaN },
 | 
			
		||||
	/*::[*/0x2E/*::]*/: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
 | 
			
		||||
	/*::[*/0x2F/*::]*/: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
 | 
			
		||||
	/*::[*/0x39/*::]*/: { n:'PtgNameX', f:parse_PtgNameX },
 | 
			
		||||
	/*::[*/0x3A/*::]*/: { n:'PtgRef3d', f:parse_PtgRef3d },
 | 
			
		||||
	/*::[*/0x3B/*::]*/: { n:'PtgArea3d', f:parse_PtgArea3d },
 | 
			
		||||
@ -9877,6 +9940,9 @@ var PtgDupes = {
 | 
			
		||||
	/*::[*/0x4B/*::]*/: 0x2B, /*::[*/0x6B/*::]*/: 0x2B,
 | 
			
		||||
	/*::[*/0x4C/*::]*/: 0x2C, /*::[*/0x6C/*::]*/: 0x2C,
 | 
			
		||||
	/*::[*/0x4D/*::]*/: 0x2D, /*::[*/0x6D/*::]*/: 0x2D,
 | 
			
		||||
	/*::[*/0x4E/*::]*/: 0x2E, /*::[*/0x6E/*::]*/: 0x2E,
 | 
			
		||||
	/*::[*/0x4F/*::]*/: 0x2F, /*::[*/0x6F/*::]*/: 0x2F,
 | 
			
		||||
	/*::[*/0x58/*::]*/: 0x22, /*::[*/0x78/*::]*/: 0x22,
 | 
			
		||||
	/*::[*/0x59/*::]*/: 0x39, /*::[*/0x79/*::]*/: 0x39,
 | 
			
		||||
	/*::[*/0x5A/*::]*/: 0x3A, /*::[*/0x7A/*::]*/: 0x3A,
 | 
			
		||||
	/*::[*/0x5B/*::]*/: 0x3B, /*::[*/0x7B/*::]*/: 0x3B,
 | 
			
		||||
@ -9901,6 +9967,7 @@ var Ptg18 = {
 | 
			
		||||
	/*::[*/0xFF/*::]*/: {}
 | 
			
		||||
};
 | 
			
		||||
var Ptg19 = {
 | 
			
		||||
	/*::[*/0x00/*::]*/: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
 | 
			
		||||
	/*::[*/0x01/*::]*/: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
 | 
			
		||||
	/*::[*/0x02/*::]*/: { n:'PtgAttrIf', f:parse_PtgAttrIf },
 | 
			
		||||
	/*::[*/0x04/*::]*/: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
 | 
			
		||||
@ -9957,10 +10024,7 @@ function parse_Rgce(blob, length, opts) {
 | 
			
		||||
		length = target - blob.l;
 | 
			
		||||
		id = blob[blob.l];
 | 
			
		||||
		R = PtgTypes[id];
 | 
			
		||||
		if(id === 0x18 || id === 0x19) {
 | 
			
		||||
			id = blob[blob.l + 1];
 | 
			
		||||
			R = (id === 0x18 ? Ptg18 : Ptg19)[id];
 | 
			
		||||
		}
 | 
			
		||||
		if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
 | 
			
		||||
		if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
		else { ptgs.push([R.n, R.f(blob, length, opts)]); }
 | 
			
		||||
@ -10287,6 +10351,18 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
 | 
			
		||||
			case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
 | 
			
		||||
				stack.push("#REF!"); break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
				// $FlowIgnore
 | 
			
		||||
				stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemAreaN':
 | 
			
		||||
			case 'PtgMemNoMemN':
 | 
			
		||||
			case 'PtgAttrNoop':
 | 
			
		||||
			case 'PtgSheet':
 | 
			
		||||
			case 'PtgEndSheet':
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
 | 
			
		||||
@ -10306,13 +10382,10 @@ function stringify_formula(formula/*Array<any>*/, range, cell/*:any*/, supbooks,
 | 
			
		||||
 | 
			
		||||
			case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
 | 
			
		||||
			default: throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
		}
 | 
			
		||||
		var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
 | 
			
		||||
		if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
		if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
			f = formula[0][last_sp];
 | 
			
		||||
			var _left = true;
 | 
			
		||||
			switch(f[1][0]) {
 | 
			
		||||
@ -11315,6 +11388,7 @@ var Ftab = {
 | 
			
		||||
var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0002/*::]*/: 1, /* ISNA */
 | 
			
		||||
	/*::[*/0x0003/*::]*/: 1, /* ISERROR */
 | 
			
		||||
	/*::[*/0x000A/*::]*/: 0, /* NA */
 | 
			
		||||
	/*::[*/0x000F/*::]*/: 1, /* SIN */
 | 
			
		||||
	/*::[*/0x0010/*::]*/: 1, /* COS */
 | 
			
		||||
	/*::[*/0x0011/*::]*/: 1, /* TAN */
 | 
			
		||||
@ -11332,6 +11406,8 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x001F/*::]*/: 3, /* MID */
 | 
			
		||||
	/*::[*/0x0020/*::]*/: 1, /* LEN */
 | 
			
		||||
	/*::[*/0x0021/*::]*/: 1, /* VALUE */
 | 
			
		||||
	/*::[*/0x0022/*::]*/: 0, /* TRUE */
 | 
			
		||||
	/*::[*/0x0023/*::]*/: 0, /* FALSE */
 | 
			
		||||
	/*::[*/0x0026/*::]*/: 1, /* NOT */
 | 
			
		||||
	/*::[*/0x0027/*::]*/: 2, /* MOD */
 | 
			
		||||
	/*::[*/0x0028/*::]*/: 3, /* DCOUNT */
 | 
			
		||||
@ -11344,6 +11420,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0030/*::]*/: 2, /* TEXT */
 | 
			
		||||
	/*::[*/0x0035/*::]*/: 1, /* GOTO */
 | 
			
		||||
	/*::[*/0x003D/*::]*/: 3, /* MIRR */
 | 
			
		||||
	/*::[*/0x003F/*::]*/: 0, /* RAND */
 | 
			
		||||
	/*::[*/0x0041/*::]*/: 3, /* DATE */
 | 
			
		||||
	/*::[*/0x0042/*::]*/: 3, /* TIME */
 | 
			
		||||
	/*::[*/0x0043/*::]*/: 1, /* DAY */
 | 
			
		||||
@ -11353,6 +11430,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0047/*::]*/: 1, /* HOUR */
 | 
			
		||||
	/*::[*/0x0048/*::]*/: 1, /* MINUTE */
 | 
			
		||||
	/*::[*/0x0049/*::]*/: 1, /* SECOND */
 | 
			
		||||
	/*::[*/0x004A/*::]*/: 0, /* NOW */
 | 
			
		||||
	/*::[*/0x004B/*::]*/: 1, /* AREAS */
 | 
			
		||||
	/*::[*/0x004C/*::]*/: 1, /* ROWS */
 | 
			
		||||
	/*::[*/0x004D/*::]*/: 1, /* COLUMNS */
 | 
			
		||||
@ -11361,13 +11439,18 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x0053/*::]*/: 1, /* TRANSPOSE */
 | 
			
		||||
	/*::[*/0x0055/*::]*/: 0, /* STEP */
 | 
			
		||||
	/*::[*/0x0056/*::]*/: 1, /* TYPE */
 | 
			
		||||
	/*::[*/0x0059/*::]*/: 0, /* CALLER */
 | 
			
		||||
	/*::[*/0x005A/*::]*/: 1, /* DEREF */
 | 
			
		||||
	/*::[*/0x005E/*::]*/: 0, /* ACTIVE.CELL */
 | 
			
		||||
	/*::[*/0x005F/*::]*/: 0, /* SELECTION */
 | 
			
		||||
	/*::[*/0x0061/*::]*/: 2, /* ATAN2 */
 | 
			
		||||
	/*::[*/0x0062/*::]*/: 1, /* ASIN */
 | 
			
		||||
	/*::[*/0x0063/*::]*/: 1, /* ACOS */
 | 
			
		||||
	/*::[*/0x0065/*::]*/: 3, /* HLOOKUP */
 | 
			
		||||
	/*::[*/0x0066/*::]*/: 3, /* VLOOKUP */
 | 
			
		||||
	/*::[*/0x0069/*::]*/: 1, /* ISREF */
 | 
			
		||||
	/*::[*/0x006A/*::]*/: 1, /* GET.FORMULA */
 | 
			
		||||
	/*::[*/0x006C/*::]*/: 2, /* SET.VALUE */
 | 
			
		||||
	/*::[*/0x006F/*::]*/: 1, /* CHAR */
 | 
			
		||||
	/*::[*/0x0070/*::]*/: 1, /* LOWER */
 | 
			
		||||
	/*::[*/0x0071/*::]*/: 1, /* UPPER */
 | 
			
		||||
@ -11393,6 +11476,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x008E/*::]*/: 3, /* SLN */
 | 
			
		||||
	/*::[*/0x008F/*::]*/: 4, /* SYD */
 | 
			
		||||
	/*::[*/0x0090/*::]*/: 4, /* DDB */
 | 
			
		||||
	/*::[*/0x00A1/*::]*/: 1, /* DIALOG.BOX */
 | 
			
		||||
	/*::[*/0x00A2/*::]*/: 1, /* CLEAN */
 | 
			
		||||
	/*::[*/0x00A3/*::]*/: 1, /* MDETERM */
 | 
			
		||||
	/*::[*/0x00A4/*::]*/: 1, /* MINVERSE */
 | 
			
		||||
@ -11404,6 +11488,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x00B2/*::]*/: 2, /* EXECUTE */
 | 
			
		||||
	/*::[*/0x00B3/*::]*/: 1, /* TERMINATE */
 | 
			
		||||
	/*::[*/0x00B8/*::]*/: 1, /* FACT */
 | 
			
		||||
	/*::[*/0x00BA/*::]*/: 1, /* GET.WORKSPACE */
 | 
			
		||||
	/*::[*/0x00BD/*::]*/: 3, /* DPRODUCT */
 | 
			
		||||
	/*::[*/0x00BE/*::]*/: 1, /* ISNONTEXT */
 | 
			
		||||
	/*::[*/0x00C3/*::]*/: 3, /* DSTDEVP */
 | 
			
		||||
@ -11419,6 +11504,7 @@ var FtabArgc = {
 | 
			
		||||
	/*::[*/0x00D5/*::]*/: 2, /* ROUNDDOWN */
 | 
			
		||||
	/*::[*/0x00D6/*::]*/: 1, /* ASC */
 | 
			
		||||
	/*::[*/0x00D7/*::]*/: 1, /* DBCS */
 | 
			
		||||
	/*::[*/0x00E1/*::]*/: 0, /* END.IF */
 | 
			
		||||
	/*::[*/0x00E5/*::]*/: 1, /* SINH */
 | 
			
		||||
	/*::[*/0x00E6/*::]*/: 1, /* COSH */
 | 
			
		||||
	/*::[*/0x00E7/*::]*/: 1, /* TANH */
 | 
			
		||||
@ -18025,6 +18111,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
					if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
 | 
			
		||||
					SheetNames.push(sheetag.name);
 | 
			
		||||
					Sheets[sheetag.name] = ws;
 | 
			
		||||
					intable = false;
 | 
			
		||||
@ -18839,7 +18926,6 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/
 | 
			
		||||
	} catch(e) { if(opts.WTF) throw e; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var nodirs = function nodirs(x/*:string*/)/*:boolean*/{return x.slice(-1) != '/';};
 | 
			
		||||
function strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; }
 | 
			
		||||
 | 
			
		||||
function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
@ -18854,7 +18940,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	/* Numbers */
 | 
			
		||||
	if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
 | 
			
		||||
 | 
			
		||||
	var entries = keys(zip.files).filter(nodirs).sort();
 | 
			
		||||
	var entries = zipentries(zip);
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')/*:?any*/));
 | 
			
		||||
	var xlsb = false;
 | 
			
		||||
	var sheets, binname;
 | 
			
		||||
@ -19056,8 +19142,12 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 | 
			
		||||
	f = "docProps/app.xml";
 | 
			
		||||
	if(wb.Props && wb.Props.SheetNames){/* empty */}
 | 
			
		||||
	else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
 | 
			
		||||
	// $FlowIgnore
 | 
			
		||||
	else wb.Props.SheetNames = wb.SheetNames.map(function(x,i) { return [(wb.Workbook.Sheets[i]||{}).Hidden != 2, x];}).filter(function(x) { return x[0]; }).map(function(x) { return x[1]; });
 | 
			
		||||
	else {
 | 
			
		||||
		var _sn = [];
 | 
			
		||||
		for(var _i = 0; _i < wb.SheetNames.length; ++_i)
 | 
			
		||||
			if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
 | 
			
		||||
		wb.Props.SheetNames = _sn;
 | 
			
		||||
	}
 | 
			
		||||
	wb.Props.Worksheets = wb.Props.SheetNames.length;
 | 
			
		||||
	zip.file(f, write_ext_props(wb.Props, opts));
 | 
			
		||||
	ct.extprops.push(f);
 | 
			
		||||
@ -19592,7 +19682,7 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet
 | 
			
		||||
	var hdr/*:Array<string>*/ = o.header || [], C = 0;
 | 
			
		||||
 | 
			
		||||
	js.forEach(function (JS, R/*:number*/) {
 | 
			
		||||
		keys(JS).filter(function(x) { return JS.hasOwnProperty(x); }).forEach(function(k) {
 | 
			
		||||
		keys(JS).forEach(function(k) {
 | 
			
		||||
			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
 | 
			
		||||
			var v = JS[k];
 | 
			
		||||
			var t = 'z';
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										132
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										132
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							@ -4,7 +4,7 @@
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.12.2';
 | 
			
		||||
XLSX.version = '0.12.3';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -1879,7 +1879,11 @@ function read_binary(path) {
 | 
			
		||||
	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }
 | 
			
		||||
	throw new Error("Cannot access file " + path);
 | 
			
		||||
}
 | 
			
		||||
function keys(o) { return Object.keys(o); }
 | 
			
		||||
function keys(o) {
 | 
			
		||||
	var ks = Object.keys(o), o2 = [];
 | 
			
		||||
	for(var i = 0; i < ks.length; ++i) if(o.hasOwnProperty(ks[i])) o2.push(ks[i]);
 | 
			
		||||
	return o2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function evert_key(obj, key) {
 | 
			
		||||
	var o = ([]), K = keys(obj);
 | 
			
		||||
@ -2070,6 +2074,12 @@ function getzipstr(zip, file, safe) {
 | 
			
		||||
	try { return getzipstr(zip, file); } catch(e) { return null; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function zipentries(zip) {
 | 
			
		||||
	var k = keys(zip.files), o = [];
 | 
			
		||||
	for(var i = 0; i < k.length; ++i) if(k[i].slice(-1) != '/') o.push(k[i]);
 | 
			
		||||
	return o.sort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var jszip;
 | 
			
		||||
/*global JSZip:true */
 | 
			
		||||
if(typeof JSZip !== 'undefined') jszip = JSZip;
 | 
			
		||||
@ -9374,7 +9384,7 @@ function parse_PtgArea3d(blob, length, opts) {
 | 
			
		||||
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
 | 
			
		||||
function parse_PtgAreaErr(blob, length, opts) {
 | 
			
		||||
	var type = (blob[blob.l++] & 0x60) >> 5;
 | 
			
		||||
	blob.l += opts && opts.biff > 8 ? 12 : 8;
 | 
			
		||||
	blob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);
 | 
			
		||||
	return [type];
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
 | 
			
		||||
@ -9506,8 +9516,8 @@ function parse_PtgFunc(blob, length, opts) {
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
 | 
			
		||||
function parse_PtgFuncVar(blob, length, opts) {
 | 
			
		||||
	blob.l++;
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [0, blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	var type = blob[blob.l++];
 | 
			
		||||
	var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);
 | 
			
		||||
	return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -9704,12 +9714,35 @@ var parse_PtgElfRw = parse_PtgElfLoc;
 | 
			
		||||
/* [MS-XLS] 2.5.198.55 */
 | 
			
		||||
var parse_PtgElfRwV = parse_PtgElfLoc;
 | 
			
		||||
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
/* [MS-XLSB] 2.5.97.52 TODO */
 | 
			
		||||
var PtgListRT = [
 | 
			
		||||
	"Data",
 | 
			
		||||
	"All",
 | 
			
		||||
	"Headers",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Data2",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataHeaders",
 | 
			
		||||
	"??",
 | 
			
		||||
	"Totals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?DataTotals",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"??",
 | 
			
		||||
	"?Current"
 | 
			
		||||
];
 | 
			
		||||
function parse_PtgList(blob) {
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	var ixti = blob.read_shift(2);
 | 
			
		||||
	blob.l += 10;
 | 
			
		||||
	return {ixti: ixti};
 | 
			
		||||
	var flags = blob.read_shift(2);
 | 
			
		||||
	var idx = blob.read_shift(4);
 | 
			
		||||
	var c = blob.read_shift(2);
 | 
			
		||||
	var C = blob.read_shift(2);
 | 
			
		||||
	var rt = PtgListRT[(flags >> 2) & 0x1F];
 | 
			
		||||
	return {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};
 | 
			
		||||
}
 | 
			
		||||
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
 | 
			
		||||
function parse_PtgSxName(blob) {
 | 
			
		||||
@ -9717,6 +9750,32 @@ function parse_PtgSxName(blob) {
 | 
			
		||||
	return [blob.read_shift(4)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [XLS] old spec */
 | 
			
		||||
function parse_PtgSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += 5;
 | 
			
		||||
	blob.l += 2;
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 1 : 4);
 | 
			
		||||
	return ["PTGSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgEndSheet(blob, length, opts) {
 | 
			
		||||
	blob.l += (opts.biff == 2 ? 4 : 5);
 | 
			
		||||
	return ["PTGENDSHEET"];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemAreaN(blob) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgMemNoMemN(blob) {
 | 
			
		||||
	var type = (blob.read_shift(1) >>> 5) & 0x03;
 | 
			
		||||
	var cce = blob.read_shift(2);
 | 
			
		||||
	return [type, cce];
 | 
			
		||||
}
 | 
			
		||||
function parse_PtgAttrNoop(blob) {
 | 
			
		||||
	blob.l += 4;
 | 
			
		||||
	return [0, 0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
 | 
			
		||||
var PtgTypes = {
 | 
			
		||||
0x01: { n:'PtgExp', f:parse_PtgExp },
 | 
			
		||||
@ -9742,6 +9801,8 @@ var PtgTypes = {
 | 
			
		||||
0x15: { n:'PtgParen', f:parseread1 },
 | 
			
		||||
0x16: { n:'PtgMissArg', f:parseread1 },
 | 
			
		||||
0x17: { n:'PtgStr', f:parse_PtgStr },
 | 
			
		||||
0x1A: { n:'PtgSheet', f:parse_PtgSheet },
 | 
			
		||||
0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },
 | 
			
		||||
0x1C: { n:'PtgErr', f:parse_PtgErr },
 | 
			
		||||
0x1D: { n:'PtgBool', f:parse_PtgBool },
 | 
			
		||||
0x1E: { n:'PtgInt', f:parse_PtgInt },
 | 
			
		||||
@ -9760,6 +9821,8 @@ var PtgTypes = {
 | 
			
		||||
0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },
 | 
			
		||||
0x2C: { n:'PtgRefN', f:parse_PtgRefN },
 | 
			
		||||
0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },
 | 
			
		||||
0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },
 | 
			
		||||
0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },
 | 
			
		||||
0x39: { n:'PtgNameX', f:parse_PtgNameX },
 | 
			
		||||
0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },
 | 
			
		||||
0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },
 | 
			
		||||
@ -9783,6 +9846,9 @@ var PtgDupes = {
 | 
			
		||||
0x4B: 0x2B, 0x6B: 0x2B,
 | 
			
		||||
0x4C: 0x2C, 0x6C: 0x2C,
 | 
			
		||||
0x4D: 0x2D, 0x6D: 0x2D,
 | 
			
		||||
0x4E: 0x2E, 0x6E: 0x2E,
 | 
			
		||||
0x4F: 0x2F, 0x6F: 0x2F,
 | 
			
		||||
0x58: 0x22, 0x78: 0x22,
 | 
			
		||||
0x59: 0x39, 0x79: 0x39,
 | 
			
		||||
0x5A: 0x3A, 0x7A: 0x3A,
 | 
			
		||||
0x5B: 0x3B, 0x7B: 0x3B,
 | 
			
		||||
@ -9807,6 +9873,7 @@ var Ptg18 = {
 | 
			
		||||
0xFF: {}
 | 
			
		||||
};
 | 
			
		||||
var Ptg19 = {
 | 
			
		||||
0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },
 | 
			
		||||
0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },
 | 
			
		||||
0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },
 | 
			
		||||
0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },
 | 
			
		||||
@ -9863,10 +9930,7 @@ function parse_Rgce(blob, length, opts) {
 | 
			
		||||
		length = target - blob.l;
 | 
			
		||||
		id = blob[blob.l];
 | 
			
		||||
		R = PtgTypes[id];
 | 
			
		||||
		if(id === 0x18 || id === 0x19) {
 | 
			
		||||
			id = blob[blob.l + 1];
 | 
			
		||||
			R = (id === 0x18 ? Ptg18 : Ptg19)[id];
 | 
			
		||||
		}
 | 
			
		||||
		if(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
 | 
			
		||||
		if(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }
 | 
			
		||||
		// $FlowIgnore
 | 
			
		||||
		else { ptgs.push([R.n, R.f(blob, length, opts)]); }
 | 
			
		||||
@ -10192,6 +10256,18 @@ ixti = f[1][1]; r = f[1][2];
 | 
			
		||||
			case 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */
 | 
			
		||||
				stack.push("#REF!"); break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 */
 | 
			
		||||
				// $FlowIgnore
 | 
			
		||||
				stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemAreaN':
 | 
			
		||||
			case 'PtgMemNoMemN':
 | 
			
		||||
			case 'PtgAttrNoop':
 | 
			
		||||
			case 'PtgSheet':
 | 
			
		||||
			case 'PtgEndSheet':
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */
 | 
			
		||||
				break;
 | 
			
		||||
			case 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */
 | 
			
		||||
@ -10211,13 +10287,10 @@ ixti = f[1][1]; r = f[1][2];
 | 
			
		||||
 | 
			
		||||
			case 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
			case 'PtgList': /* [MS-XLSB] 2.5.97.52 TODO -- find a test case */
 | 
			
		||||
				throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
 | 
			
		||||
			default: throw new Error('Unrecognized Formula Token: ' + String(f));
 | 
			
		||||
		}
 | 
			
		||||
		var PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];
 | 
			
		||||
		if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
		if(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
 | 
			
		||||
			f = formula[0][last_sp];
 | 
			
		||||
			var _left = true;
 | 
			
		||||
			switch(f[1][0]) {
 | 
			
		||||
@ -11220,6 +11293,7 @@ var Ftab = {
 | 
			
		||||
var FtabArgc = {
 | 
			
		||||
0x0002: 1, /* ISNA */
 | 
			
		||||
0x0003: 1, /* ISERROR */
 | 
			
		||||
0x000A: 0, /* NA */
 | 
			
		||||
0x000F: 1, /* SIN */
 | 
			
		||||
0x0010: 1, /* COS */
 | 
			
		||||
0x0011: 1, /* TAN */
 | 
			
		||||
@ -11237,6 +11311,8 @@ var FtabArgc = {
 | 
			
		||||
0x001F: 3, /* MID */
 | 
			
		||||
0x0020: 1, /* LEN */
 | 
			
		||||
0x0021: 1, /* VALUE */
 | 
			
		||||
0x0022: 0, /* TRUE */
 | 
			
		||||
0x0023: 0, /* FALSE */
 | 
			
		||||
0x0026: 1, /* NOT */
 | 
			
		||||
0x0027: 2, /* MOD */
 | 
			
		||||
0x0028: 3, /* DCOUNT */
 | 
			
		||||
@ -11249,6 +11325,7 @@ var FtabArgc = {
 | 
			
		||||
0x0030: 2, /* TEXT */
 | 
			
		||||
0x0035: 1, /* GOTO */
 | 
			
		||||
0x003D: 3, /* MIRR */
 | 
			
		||||
0x003F: 0, /* RAND */
 | 
			
		||||
0x0041: 3, /* DATE */
 | 
			
		||||
0x0042: 3, /* TIME */
 | 
			
		||||
0x0043: 1, /* DAY */
 | 
			
		||||
@ -11258,6 +11335,7 @@ var FtabArgc = {
 | 
			
		||||
0x0047: 1, /* HOUR */
 | 
			
		||||
0x0048: 1, /* MINUTE */
 | 
			
		||||
0x0049: 1, /* SECOND */
 | 
			
		||||
0x004A: 0, /* NOW */
 | 
			
		||||
0x004B: 1, /* AREAS */
 | 
			
		||||
0x004C: 1, /* ROWS */
 | 
			
		||||
0x004D: 1, /* COLUMNS */
 | 
			
		||||
@ -11266,13 +11344,18 @@ var FtabArgc = {
 | 
			
		||||
0x0053: 1, /* TRANSPOSE */
 | 
			
		||||
0x0055: 0, /* STEP */
 | 
			
		||||
0x0056: 1, /* TYPE */
 | 
			
		||||
0x0059: 0, /* CALLER */
 | 
			
		||||
0x005A: 1, /* DEREF */
 | 
			
		||||
0x005E: 0, /* ACTIVE.CELL */
 | 
			
		||||
0x005F: 0, /* SELECTION */
 | 
			
		||||
0x0061: 2, /* ATAN2 */
 | 
			
		||||
0x0062: 1, /* ASIN */
 | 
			
		||||
0x0063: 1, /* ACOS */
 | 
			
		||||
0x0065: 3, /* HLOOKUP */
 | 
			
		||||
0x0066: 3, /* VLOOKUP */
 | 
			
		||||
0x0069: 1, /* ISREF */
 | 
			
		||||
0x006A: 1, /* GET.FORMULA */
 | 
			
		||||
0x006C: 2, /* SET.VALUE */
 | 
			
		||||
0x006F: 1, /* CHAR */
 | 
			
		||||
0x0070: 1, /* LOWER */
 | 
			
		||||
0x0071: 1, /* UPPER */
 | 
			
		||||
@ -11298,6 +11381,7 @@ var FtabArgc = {
 | 
			
		||||
0x008E: 3, /* SLN */
 | 
			
		||||
0x008F: 4, /* SYD */
 | 
			
		||||
0x0090: 4, /* DDB */
 | 
			
		||||
0x00A1: 1, /* DIALOG.BOX */
 | 
			
		||||
0x00A2: 1, /* CLEAN */
 | 
			
		||||
0x00A3: 1, /* MDETERM */
 | 
			
		||||
0x00A4: 1, /* MINVERSE */
 | 
			
		||||
@ -11309,6 +11393,7 @@ var FtabArgc = {
 | 
			
		||||
0x00B2: 2, /* EXECUTE */
 | 
			
		||||
0x00B3: 1, /* TERMINATE */
 | 
			
		||||
0x00B8: 1, /* FACT */
 | 
			
		||||
0x00BA: 1, /* GET.WORKSPACE */
 | 
			
		||||
0x00BD: 3, /* DPRODUCT */
 | 
			
		||||
0x00BE: 1, /* ISNONTEXT */
 | 
			
		||||
0x00C3: 3, /* DSTDEVP */
 | 
			
		||||
@ -11324,6 +11409,7 @@ var FtabArgc = {
 | 
			
		||||
0x00D5: 2, /* ROUNDDOWN */
 | 
			
		||||
0x00D6: 1, /* ASC */
 | 
			
		||||
0x00D7: 1, /* DBCS */
 | 
			
		||||
0x00E1: 0, /* END.IF */
 | 
			
		||||
0x00E5: 1, /* SINH */
 | 
			
		||||
0x00E6: 1, /* COSH */
 | 
			
		||||
0x00E7: 1, /* TANH */
 | 
			
		||||
@ -17915,6 +18001,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
					if(typeof JSON !== 'undefined') JSON.stringify(sheetag);
 | 
			
		||||
					SheetNames.push(sheetag.name);
 | 
			
		||||
					Sheets[sheetag.name] = ws;
 | 
			
		||||
					intable = false;
 | 
			
		||||
@ -18728,7 +18815,6 @@ function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, st
 | 
			
		||||
	} catch(e) { if(opts.WTF) throw e; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var nodirs = function nodirs(x){return x.slice(-1) != '/';};
 | 
			
		||||
function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
 | 
			
		||||
 | 
			
		||||
function parse_zip(zip, opts) {
 | 
			
		||||
@ -18743,7 +18829,7 @@ function parse_zip(zip, opts) {
 | 
			
		||||
	/* Numbers */
 | 
			
		||||
	if(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');
 | 
			
		||||
 | 
			
		||||
	var entries = keys(zip.files).filter(nodirs).sort();
 | 
			
		||||
	var entries = zipentries(zip);
 | 
			
		||||
	var dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));
 | 
			
		||||
	var xlsb = false;
 | 
			
		||||
	var sheets, binname;
 | 
			
		||||
@ -18941,8 +19027,12 @@ var zip = new jszip();
 | 
			
		||||
f = "docProps/app.xml";
 | 
			
		||||
	if(wb.Props && wb.Props.SheetNames){/* empty */}
 | 
			
		||||
	else if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;
 | 
			
		||||
	// $FlowIgnore
 | 
			
		||||
	else wb.Props.SheetNames = wb.SheetNames.map(function(x,i) { return [(wb.Workbook.Sheets[i]||{}).Hidden != 2, x];}).filter(function(x) { return x[0]; }).map(function(x) { return x[1]; });
 | 
			
		||||
	else {
 | 
			
		||||
		var _sn = [];
 | 
			
		||||
		for(var _i = 0; _i < wb.SheetNames.length; ++_i)
 | 
			
		||||
			if((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);
 | 
			
		||||
		wb.Props.SheetNames = _sn;
 | 
			
		||||
	}
 | 
			
		||||
	wb.Props.Worksheets = wb.Props.SheetNames.length;
 | 
			
		||||
	zip.file(f, write_ext_props(wb.Props, opts));
 | 
			
		||||
	ct.extprops.push(f);
 | 
			
		||||
@ -19476,7 +19566,7 @@ function sheet_add_json(_ws, js, opts) {
 | 
			
		||||
	var hdr = o.header || [], C = 0;
 | 
			
		||||
 | 
			
		||||
	js.forEach(function (JS, R) {
 | 
			
		||||
		keys(JS).filter(function(x) { return JS.hasOwnProperty(x); }).forEach(function(k) {
 | 
			
		||||
		keys(JS).forEach(function(k) {
 | 
			
		||||
			if((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;
 | 
			
		||||
			var v = JS[k];
 | 
			
		||||
			var t = 'z';
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user