text: /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
  /* 12.3 Part Summary <SpreadsheetML> */
  /* 14.2 Part Summary <DrawingML> */
  /* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
  var ct2type/*{[string]:string}*/ = ({
  	/* Workbook */
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
  
  	/* Worksheet */
  	"application/vnd.ms-excel.binIndexWs": "TODO", /* Binary Index */
  
  	/* Macrosheet */
  	"application/vnd.ms-excel.intlmacrosheet": "TODO",
  	"application/vnd.ms-excel.binIndexMs": "TODO", /* Binary Index */
  
  	/* File Properties */
  	"application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
  	"application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
  	"application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
  
  	/* Custom Data Properties */
  	"application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO",
  
  	/* PivotTable */
  	"application/vnd.ms-excel.pivotTable": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
  
  	/* Chart Objects */
  	"application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
  
  	/* Chart Colors */
  	"application/vnd.ms-office.chartcolorstyle+xml": "TODO",
  
  	/* Chart Style */
  	"application/vnd.ms-office.chartstyle+xml": "TODO",
  
  	/* Chart Advanced */
  	"application/vnd.ms-office.chartex+xml": "TODO",
  
  	/* Calculation Chain */
  	"application/vnd.ms-excel.calcChain": "calcchains",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
  
  	/* Printer Settings */
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
  
  	/* ActiveX */
  	"application/vnd.ms-office.activeX": "TODO",
  	"application/vnd.ms-office.activeX+xml": "TODO",
  
  	/* Custom Toolbars */
  	"application/vnd.ms-excel.attachedToolbars": "TODO",
  
  	/* External Data Connections */
  	"application/vnd.ms-excel.connections": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
  
  	/* External Links */
  	"application/vnd.ms-excel.externalLink": "links",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
  
  	/* Metadata */
  	"application/vnd.ms-excel.sheetMetadata": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO",
  
  	/* PivotCache */
  	"application/vnd.ms-excel.pivotCacheDefinition": "TODO",
  	"application/vnd.ms-excel.pivotCacheRecords": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
  
  	/* Query Table */
  	"application/vnd.ms-excel.queryTable": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
  
  	/* Shared Workbook */
  	"application/vnd.ms-excel.userNames": "TODO",
  	"application/vnd.ms-excel.revisionHeaders": "TODO",
  	"application/vnd.ms-excel.revisionLog": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
  
  	/* Single Cell Table */
  	"application/vnd.ms-excel.tableSingleCells": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
  
  	/* Slicer */
  	"application/vnd.ms-excel.slicer": "TODO",
  	"application/vnd.ms-excel.slicerCache": "TODO",
  	"application/vnd.ms-excel.slicer+xml": "TODO",
  	"application/vnd.ms-excel.slicerCache+xml": "TODO",
  
  	/* Sort Map */
  	"application/vnd.ms-excel.wsSortMap": "TODO",
  
  	/* Table */
  	"application/vnd.ms-excel.table": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
  
  	/* Themes */
  	"application/vnd.openxmlformats-officedocument.theme+xml": "themes",
  
  	/* Theme Override */
  	"application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO",
  
  	/* Timeline */
  	"application/vnd.ms-excel.Timeline+xml": "TODO", /* verify */
  	"application/vnd.ms-excel.TimelineCache+xml": "TODO", /* verify */
  
  	/* VBA */
  	"application/vnd.ms-office.vbaProject": "vba",
  	"application/vnd.ms-office.vbaProjectSignature": "vba",
  
  	/* Volatile Dependencies */
  	"application/vnd.ms-office.volatileDependencies": "TODO",
  	"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
  
  	/* Control Properties */
  	"application/vnd.ms-excel.controlproperties+xml": "TODO",
  
  	/* Data Model */
  	"application/vnd.openxmlformats-officedocument.model+data": "TODO",
  
  	/* Survey */
  	"application/vnd.ms-excel.Survey+xml": "TODO",
  
  	/* Drawing */
  	"application/vnd.openxmlformats-officedocument.drawing+xml": "drawings",
  	"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
  	"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
  
  	/* VML */
  	"application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
  
  	"application/vnd.openxmlformats-package.relationships+xml": "rels",
  	"application/vnd.openxmlformats-officedocument.oleObject": "TODO",
  
  	/* Image */
  	"image/png": "TODO",
  
  	"sheet": "js"
  }/*:any*/);
  
  var CT_LIST = (function(){
  	var o = {
  		workbooks: {
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
  			xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
  			xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
  			xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
  			xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
  		},
  		strs: { /* Shared Strings */
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
  			xlsb: "application/vnd.ms-excel.sharedStrings"
  		},
  		comments: { /* Comments */
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
  			xlsb: "application/vnd.ms-excel.comments"
  		},
  		sheets: { /* Worksheet */
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
  			xlsb: "application/vnd.ms-excel.worksheet"
  		},
  		charts: { /* Chartsheet */
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
  			xlsb: "application/vnd.ms-excel.chartsheet"
  		},
  		dialogs: { /* Dialogsheet */
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
  			xlsb: "application/vnd.ms-excel.dialogsheet"
  		},
  		macros: { /* Macrosheet (Excel 4.0 Macros) */
  			xlsx: "application/vnd.ms-excel.macrosheet+xml",
  			xlsb: "application/vnd.ms-excel.macrosheet"
  		},
  		styles: { /* Styles */
  			xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
  			xlsb: "application/vnd.ms-excel.styles"
  		}
  	};
  	keys(o).forEach(function(k) { ["xlsm", "xlam"].forEach(function(v) { if(!o[k][v]) o[k][v] = o[k].xlsx; }); });
  	keys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });
  	return o;
  })();
  
  var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
  
  XMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';
  
  function new_ct()/*:any*/ {
  	return ({
  		workbooks:[], sheets:[], charts:[], dialogs:[], macros:[],
  		rels:[], strs:[], comments:[], links:[],
  		coreprops:[], extprops:[], custprops:[], themes:[], styles:[],
  		calcchains:[], vba: [], drawings: [],
  		TODO:[], xmlns: "" }/*:any*/);
  }
  
  function parse_ct(data/*:?string*/) {
  	var ct = new_ct();
  	if(!data || !data.match) return ct;
  	var ctext = {};
  	(data.match(tagregex)||[]).forEach(function(x) {
  		var y = parsexmltag(x);
  		switch(y[0].replace(nsregex,"<")) {
  			case '<?xml': break;
  			case '<Types': ct.xmlns = y['xmlns' + (y[0].match(/<(\w+):/)||["",""])[1] ]; break;
  			case '<Default': ctext[y.Extension] = y.ContentType; break;
  			case '<Override':
  				if(ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName);
  				break;
  		}
  	});
  	if(ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns);
  	ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
  	ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
  	ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
  	ct.defaults = ctext;
  	delete ct.calcchains;
  	return ct;
  }
  
  var CTYPE_XML_ROOT = writextag('Types', null, {
  	'xmlns': XMLNS.CT,
  	'xmlns:xsd': XMLNS.xsd,
  	'xmlns:xsi': XMLNS.xsi
  });
  
  var CTYPE_DEFAULTS = [
  	['xml', 'application/xml'],
  	['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
  	['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],
  	['data', 'application/vnd.openxmlformats-officedocument.model+data'],
  	/* from test files */
  	['bmp', 'image/bmp'],
  	['png', 'image/png'],
  	['gif', 'image/gif'],
  	['emf', 'image/x-emf'],
  	['wmf', 'image/x-wmf'],
  	['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],
  	['tif', 'image/tiff'], ['tiff', 'image/tiff'],
  	['pdf', 'application/pdf'],
  	['rels', type2ct.rels[0]]
  ].map(function(x) {
  	return writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});
  });
  
  function write_ct(ct, opts)/*:string*/ {
  	var o/*:Array<string>*/ = [], v;
  	o[o.length] = (XML_HEADER);
  	o[o.length] = (CTYPE_XML_ROOT);
  	o = o.concat(CTYPE_DEFAULTS);
  
  	/* only write first instance */
  	var f1 = function(w) {
  		if(ct[w] && ct[w].length > 0) {
  			v = ct[w][0];
  			o[o.length] = (writextag('Override', null, {
  				'PartName': (v[0] == '/' ? "":"/") + v,
  				'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
  			}));
  		}
  	};
  
  	/* book type-specific */
  	var f2 = function(w) {
  		(ct[w]||[]).forEach(function(v) {
  			o[o.length] = (writextag('Override', null, {
  				'PartName': (v[0] == '/' ? "":"/") + v,
  				'ContentType': CT_LIST[w][opts.bookType || 'xlsx']
  			}));
  		});
  	};
  
  	/* standard type */
  	var f3 = function(t) {
  		(ct[t]||[]).forEach(function(v) {
  			o[o.length] = (writextag('Override', null, {
  				'PartName': (v[0] == '/' ? "":"/") + v,
  				'ContentType': type2ct[t][0]
  			}));
  		});
  	};
  
  	f1('workbooks');
  	f2('sheets');
  	f2('charts');
  	f3('themes');
  	['strs', 'styles'].forEach(f1);
  	['coreprops', 'extprops', 'custprops'].forEach(f3);
  	f3('vba');
  	f3('comments');
  	f3('drawings');
  	if(o.length>2){ o[o.length] = ('</Types>'); o[1]=o[1].replace("/>",">"); }
  	return o.join("");
  }
  