docs: function parse_ws_xml(data, opts, rels, wb, themes, styles) {
  	if(!data) return data;
  	if(DENSE != null && opts.dense == null) opts.dense = DENSE;
  
  	/* 18.3.1.99 worksheet CT_Worksheet */
  	var s = opts.dense ? ([]) : ({});
  	var refguess = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} });
  
  	var data1 = "", data2 = "";
  	var mtch = data.match(sheetdataregex);
  	if(mtch) {
  		data1 = data.substr(0, mtch.index);
  		data2 = data.substr(mtch.index + mtch[0].length);
  	} else data1 = data2 = data;
  
  	/* 18.3.1.35 dimension CT_SheetDimension ? */
  	// $FlowIgnore
  	var ridx = (data1.match(/<(?:\w*:)?dimension/)||{index:-1}).index;
  	if(ridx > 0) {
  		var ref = data1.substr(ridx,50).match(dimregex);
  		if(ref) parse_ws_xml_dim(s, ref[1]);
  	}
  
  	/* 18.3.1.17 cols CT_Cols */
  	var columns = [];
  	if(opts.cellStyles) {
  		/* 18.3.1.13 col CT_Col */
  		var cols = data1.match(colregex);
  		if(cols) parse_ws_xml_cols(columns, cols);
  	}
  
  	/* 18.3.1.80 sheetData CT_SheetData ? */
  	if(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);
  
  	/* 18.3.1.2  autoFilter CT_AutoFilter */
  	var afilter = data2.match(afregex);
  	if(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);
  
  	/* 18.3.1.55 mergeCells CT_MergeCells */
  	var mergecells = [];
  	var merges = data2.match(mergecregex);
  	if(merges) for(ridx = 0; ridx != merges.length; ++ridx)
  		mergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf("\"")+1));
  
  	/* 18.3.1.48 hyperlinks CT_Hyperlinks */
  	var hlink = data2.match(hlinkregex);
  	if(hlink) parse_ws_xml_hlinks(s, hlink, rels);
  
  	/* 18.3.1.62 pageMargins CT_PageMargins */
  	var margins = data2.match(marginregex);
  	if(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));
  
  	if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
  	if(opts.sheetRows > 0 && s["!ref"]) {
  		var tmpref = safe_decode_range(s["!ref"]);
  		if(opts.sheetRows < +tmpref.e.r) {
  			tmpref.e.r = opts.sheetRows - 1;
  			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
  			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
  			if(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;
  			if(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;
  			s["!fullref"] = s["!ref"];
  			s["!ref"] = encode_range(tmpref);
  		}
  	}
  	if(columns.length > 0) s["!cols"] = columns;
  	if(mergecells.length > 0) s["!merges"] = mergecells;
  	return s;
  }