@extend-ai/react-xlsx 0.12.1 → 0.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/duke_sheets_wasm_bg.wasm +0 -0
- package/dist/index.cjs +169 -139
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +169 -139
- package/dist/index.js.map +1 -1
- package/dist/xlsx-worker.js +133 -133
- package/dist/xlsx-worker.js.map +1 -1
- package/package.json +2 -2
package/dist/xlsx-worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts.ts","../src/images.ts","../src/colors.ts","../src/safe-calculate.ts","../src/wasm.ts","../src/xlsx-worker.ts"],"sourcesContent":["import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8 } from \"fflate\";\nimport type { WorkbookImageAssets, WorkbookImageSheetOrigin } from \"./images\";\nimport type {\n XlsxChart,\n XlsxChartAxis,\n XlsxChartDataLabels,\n XlsxChartLegend,\n XlsxChartPointDataLabel,\n XlsxChartPointStyle,\n XlsxChartReference,\n XlsxChartSeries,\n XlsxChartTypeGroup,\n XlsxChartWall,\n XlsxChartsheet,\n XlsxImageAnchor,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst CHART_NS = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst DRAWINGML_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst DRAWING_SPREADSHEET_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst CHART_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nconst CHART_EX_REL_TYPE = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\nconst CHART_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartStyle\";\nconst CHART_COLOR_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartColorStyle\";\nconst SERIES_COLORS = [\n \"#4472c4\",\n \"#ed7d31\",\n \"#a5a5a5\",\n \"#ffc000\",\n \"#5b9bd5\",\n \"#70ad47\",\n \"#264478\",\n \"#9e480e\",\n \"#636363\",\n \"#997300\"\n];\nfunction normalizeWorksheetVisibility(value: unknown): \"hidden\" | \"veryHidden\" | \"visible\" {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\nconst EMU_PER_PIXEL = 9525;\nconst THEME_COLOR_INDEX_BY_NAME: Record<string, number> = {\n accent1: 4,\n accent2: 5,\n accent3: 6,\n accent4: 7,\n accent5: 8,\n accent6: 9,\n dk1: 1,\n dk2: 3,\n folHlink: 11,\n hlink: 10,\n lt1: 0,\n lt2: 2,\n tx1: 1,\n tx2: 3,\n bg1: 0,\n bg2: 2\n};\nconst PRIMARY_CHART_TYPE_LOCAL_NAMES = [\n \"barChart\",\n \"lineChart\",\n \"line3DChart\",\n \"stockChart\",\n \"radarChart\",\n \"scatterChart\",\n \"pieChart\",\n \"pie3DChart\",\n \"doughnutChart\",\n \"areaChart\",\n \"area3DChart\",\n \"bar3DChart\",\n \"ofPieChart\",\n \"bubbleChart\",\n \"surfaceChart\",\n \"surface3DChart\"\n] as const;\n\nexport type WorkbookChartOrigin = {\n anchorIndex: number;\n anchor: XlsxImageAnchor | null;\n chartPath: string | null;\n chartKind: \"classic\" | \"modern\";\n drawingPath: string;\n workbookSheetIndex: number;\n};\n\nexport type WorkbookChartAssets = {\n chartOriginsById: Map<string, WorkbookChartOrigin>;\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n};\n\ntype ChartStyleAppearance = {\n axisLabelColor?: string;\n axisLineColor?: string;\n chartAreaBorderColor?: string;\n chartAreaFillColor?: string;\n chartAreaNoFill?: boolean;\n paletteOffset?: number;\n textColor?: string;\n titleColor?: string;\n};\n\nfunction clampUnitInterval(value: number) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction isElementNode(node: Node | ChildNode | null | undefined): node is Element {\n return node != null && node.nodeType === 1;\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction resolveColorFromXmlFragment(fragment: string, themePalette?: XlsxThemePalette | null) {\n if (!fragment) {\n return undefined;\n }\n\n const srgbMatch = fragment.match(/<a:srgbClr\\b[^>]*\\bval=\"([0-9a-fA-F]{6,8})\"/i);\n if (srgbMatch?.[1]) {\n return normalizeHexColor(srgbMatch[1]) ?? undefined;\n }\n\n const schemeMatch = fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a:schemeClr>/i)\n ?? fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*/i);\n if (!schemeMatch?.[1]) {\n return undefined;\n }\n\n const baseColor = resolveThemeColor(schemeMatch[1], themePalette);\n if (!baseColor) {\n return undefined;\n }\n\n const transforms = schemeMatch[2] ?? \"\";\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const match of transforms.matchAll(/<a:(lumMod|lumOff|tint|shade)\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/gi)) {\n const transform = match[1]?.toLowerCase();\n const rawValue = Number(match[2] ?? Number.NaN);\n if (!transform || !Number.isFinite(rawValue)) {\n continue;\n }\n if (transform === \"lummod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transform === \"lumoff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transform === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transform === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset) ?? undefined;\n}\n\nfunction readHexColorFromXmlFragment(\n fragment: string,\n preferLine = false,\n themePalette?: XlsxThemePalette | null\n) {\n const source = preferLine\n ? fragment.match(/<a:ln\\b[\\s\\S]*?<\\/a:ln>/i)?.[0] ?? \"\"\n : fragment.match(/<a:solidFill\\b[\\s\\S]*?<\\/a:solidFill>/i)?.[0] ?? \"\";\n return resolveColorFromXmlFragment(source, themePalette);\n}\n\ntype FallbackSeriesStyle = {\n color?: string;\n lineColor?: string;\n};\n\nfunction parseFallbackSeriesStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): FallbackSeriesStyle[] {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const shapeBlock = seriesBlock.match(/<c:spPr\\b[\\s\\S]*?<\\/c:spPr>/i)?.[0] ?? \"\";\n return {\n color: readHexColorFromXmlFragment(shapeBlock, false, themePalette),\n lineColor: readHexColorFromXmlFragment(shapeBlock, true, themePalette)\n };\n });\n}\n\nfunction parseFallbackPointStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): XlsxChartPointStyle[][] {\n const chartDocument = parseXml(chartXml);\n if (chartDocument) {\n const parsedSeriesStyles = getLocalDescendants(chartDocument, \"ser\").map((seriesNode) => {\n const styles: XlsxChartPointStyle[] = [];\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n styles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n return styles;\n });\n if (parsedSeriesStyles.some((styles) => styles.length > 0)) {\n return parsedSeriesStyles;\n }\n }\n\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const pointBlocks = seriesBlock.match(/<c:dPt\\b[\\s\\S]*?<\\/c:dPt>/gi) ?? [];\n if (pointBlocks.length === 0) {\n return [];\n }\n\n const styles: XlsxChartPointStyle[] = [];\n for (const pointBlock of pointBlocks) {\n const indexMatch = pointBlock.match(/<c:idx\\b[^>]*\\bval=\"(-?\\d+)\"/i);\n const index = indexMatch?.[1] ? Number(indexMatch[1]) : Number.NaN;\n if (!Number.isFinite(index)) {\n continue;\n }\n const explosionMatch = pointBlock.match(/<c:explosion\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/i);\n const explosionValue = explosionMatch?.[1] ? Number(explosionMatch[1]) : Number.NaN;\n styles.push({\n color: readHexColorFromXmlFragment(pointBlock, false, themePalette),\n explosion: Number.isFinite(explosionValue) ? explosionValue : undefined,\n index,\n lineColor: readHexColorFromXmlFragment(pointBlock, true, themePalette)\n });\n }\n\n return styles;\n });\n}\n\nfunction parseNumericPointCacheFromXmlFragment(fragment: string) {\n const pointMatches = Array.from(fragment.matchAll(/<c:pt\\b[^>]*\\bidx=\"(-?\\d+)\"[^>]*>[\\s\\S]*?<c:v>([^<]*)<\\/c:v>[\\s\\S]*?<\\/c:pt>/gi));\n if (pointMatches.length === 0) {\n return [];\n }\n\n const explicitPointCountMatch = fragment.match(/<c:ptCount\\b[^>]*\\bval=\"(\\d+)\"/i);\n const explicitPointCount = explicitPointCountMatch?.[1] ? Number(explicitPointCountMatch[1]) : Number.NaN;\n const maxIndex = pointMatches.reduce((max, match) => {\n const current = Number(match[1] ?? Number.NaN);\n return Number.isFinite(current) ? Math.max(max, current) : max;\n }, -1);\n const pointCount = Math.max(\n pointMatches.length,\n Number.isFinite(explicitPointCount) ? explicitPointCount : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: pointCount }, () => null as number | null);\n\n for (const match of pointMatches) {\n const index = Number(match[1] ?? Number.NaN);\n const rawValue = (match[2] ?? \"\").trim();\n const numericValue = Number(rawValue);\n if (!Number.isFinite(index) || index < 0 || !Number.isFinite(numericValue)) {\n continue;\n }\n values[index] = numericValue;\n }\n\n return values;\n}\n\nfunction parseFallbackBubbleSizesFromChartXml(chartXml: string): Array<Array<number | null>> {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const bubbleSizeBlock = seriesBlock.match(/<c:bubbleSize\\b[\\s\\S]*?<\\/c:bubbleSize>/i)?.[0] ?? \"\";\n if (!bubbleSizeBlock) {\n return [];\n }\n\n return parseNumericPointCacheFromXmlFragment(bubbleSizeBlock);\n });\n}\n\nfunction decodeChartXmlText(value: string) {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\");\n}\n\nfunction normalizeChartTitleForMatch(value: string | null | undefined) {\n return (value ?? \"\").trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction extractChartTitleFromXml(chartXml: string): string | null {\n const match = chartXml.match(/<c:title\\b[\\s\\S]*?<a:t>([\\s\\S]*?)<\\/a:t>/i);\n if (!match?.[1]) {\n return null;\n }\n const decoded = decodeChartXmlText(match[1]).trim();\n return decoded.length > 0 ? decoded : null;\n}\n\nfunction resolveArchiveFallbackBubbleSizes(\n archive: Record<string, Uint8Array>,\n preferredTitle: string | undefined\n) {\n const preferred = normalizeChartTitleForMatch(preferredTitle);\n let bestScore = Number.NEGATIVE_INFINITY;\n let bestCandidate: Array<Array<number | null>> = [];\n\n for (const [path, bytes] of Object.entries(archive)) {\n if (!/\\/charts\\/chart\\d+\\.xml$/i.test(path)) {\n continue;\n }\n const chartXml = strFromU8(bytes);\n if (!/<c:bubbleChart\\b/i.test(chartXml)) {\n continue;\n }\n const candidateBubbleSizes = parseFallbackBubbleSizesFromChartXml(chartXml);\n const hasCandidateValues = candidateBubbleSizes.some((seriesValues) => seriesValues.some((value) => value != null));\n if (!hasCandidateValues) {\n continue;\n }\n\n let score = 0;\n const candidateTitle = normalizeChartTitleForMatch(extractChartTitleFromXml(chartXml));\n if (preferred.length > 0 && candidateTitle.length > 0 && preferred === candidateTitle) {\n score += 100;\n }\n if (bestCandidate.length === 0) {\n score += 1;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCandidate = candidateBubbleSizes;\n if (score >= 100) {\n break;\n }\n }\n }\n\n return bestCandidate;\n}\n\nfunction parseChartTypeFromXml(chartXml: string) {\n for (const chartType of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n if (new RegExp(`<c:${chartType}\\\\b`, \"i\").test(chartXml)) {\n return chartType;\n }\n }\n return \"\";\n}\n\nfunction findPrimaryChartTypeNode(plotAreaNode: Element | null) {\n if (!plotAreaNode) {\n return null;\n }\n\n for (const localName of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n const node = getLocalChildren(plotAreaNode, localName)[0];\n if (node) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction resolveScatterChartType(scatterStyle: string | null | undefined) {\n switch (scatterStyle) {\n case \"line\":\n case \"lineMarker\":\n return \"ScatterLines\";\n case \"smooth\":\n case \"smoothMarker\":\n return \"ScatterSmooth\";\n default:\n return \"Scatter\";\n }\n}\n\nfunction resolveArchiveFallbackPointStyles(\n archive: Record<string, Uint8Array>,\n preferredTitle: string | undefined,\n preferredChartXmlType: string | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const preferred = normalizeChartTitleForMatch(preferredTitle);\n const preferredType = (preferredChartXmlType ?? \"\").trim();\n let bestScore = Number.NEGATIVE_INFINITY;\n let bestCandidate: XlsxChartPointStyle[][] = [];\n\n for (const [path, bytes] of Object.entries(archive)) {\n if (!/\\/charts\\/chart\\d+\\.xml$/i.test(path)) {\n continue;\n }\n const chartXml = strFromU8(bytes);\n const candidateType = parseChartTypeFromXml(chartXml);\n if (!candidateType) {\n continue;\n }\n const candidatePointStyles = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const hasCandidateValues = candidatePointStyles.some((seriesStyles) => seriesStyles.some((style) => (\n (typeof style.color === \"string\" && style.color.length > 0)\n || typeof style.explosion === \"number\"\n )));\n if (!hasCandidateValues) {\n continue;\n }\n\n let score = 0;\n const candidateTitle = normalizeChartTitleForMatch(extractChartTitleFromXml(chartXml));\n if (preferred.length > 0 && candidateTitle.length > 0 && preferred === candidateTitle) {\n score += 100;\n }\n if (preferredType && candidateType === preferredType) {\n score += 20;\n }\n if (bestCandidate.length === 0) {\n score += 1;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCandidate = candidatePointStyles;\n if (score >= 120) {\n break;\n }\n }\n }\n\n return bestCandidate;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n if (!normalized) {\n return null;\n }\n const match = /^#([0-9a-f]{6})$/.exec(normalized);\n if (!match) {\n return null;\n }\n return [\n Number.parseInt(match[1].slice(0, 2), 16),\n Number.parseInt(match[1].slice(2, 4), 16),\n Number.parseInt(match[1].slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, Math.round(channel))).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyLightnessTransform(baseColor: string, modifier = 1, offset = 0) {\n const rgb = parseHexColor(baseColor);\n if (!rgb) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = clampUnitInterval(lightness * modifier + offset);\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, nextLightness);\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nfunction resolveThemeColor(name: string | null, themePalette?: XlsxThemePalette | null) {\n if (!name) {\n return null;\n }\n const index = THEME_COLOR_INDEX_BY_NAME[name];\n return index === undefined ? null : themePalette?.colorsByIndex[index] ?? null;\n}\n\nfunction resolveThemeTypeface(typeface: string | null, themePalette?: XlsxThemePalette | null) {\n if (!typeface) {\n return null;\n }\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return themePalette?.minorLatinFont ?? null;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return themePalette?.majorLatinFont ?? null;\n }\n return typeface;\n}\n\nfunction readChartTextTypeface(textPropertiesNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!textPropertiesNode) {\n return null;\n }\n const defaultRunProperties = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n if (!defaultRunProperties) {\n return null;\n }\n const typeface = getFirstLocalChild(defaultRunProperties, \"latin\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"ea\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"cs\")?.getAttribute(\"typeface\")\n ?? null;\n const resolved = resolveThemeTypeface(typeface, themePalette)?.trim() ?? \"\";\n return resolved.length > 0 ? resolved : null;\n}\n\nfunction resolveChartColorNode(node: Element | null, themePalette?: XlsxThemePalette | null): string | null {\n if (!node) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (node.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"val\") ?? \"\"}`);\n } else if (node.localName === \"schemeClr\") {\n baseColor = resolveThemeColor(node.getAttribute(\"val\"), themePalette);\n } else if (node.localName === \"sysClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"lastClr\") ?? \"\"}`);\n }\n\n if (!baseColor) {\n return null;\n }\n\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const transformNode of Array.from(node.childNodes).filter(isElementNode)) {\n const rawValue = Number(transformNode.getAttribute(\"val\") ?? Number.NaN);\n if (!Number.isFinite(rawValue)) {\n continue;\n }\n if (transformNode.localName === \"lumMod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transformNode.localName === \"lumOff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transformNode.localName === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transformNode.localName === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset);\n}\n\nfunction isChartColorElement(node: Element | null | undefined): node is Element {\n return Boolean(node && (node.localName === \"schemeClr\" || node.localName === \"srgbClr\" || node.localName === \"sysClr\"));\n}\n\nfunction findFirstChartColorElement(node: Element | null) {\n if (!node) {\n return null;\n }\n if (isChartColorElement(node)) {\n return node;\n }\n\n for (const localName of [\"srgbClr\", \"schemeClr\", \"sysClr\"]) {\n for (const candidate of getLocalDescendants(node, localName)) {\n if (isChartColorElement(candidate)) {\n return candidate;\n }\n }\n }\n\n return null;\n}\n\nfunction resolveChartFillColor(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!shapeNode || getFirstLocalChild(shapeNode, \"noFill\")) {\n return null;\n }\n const solidFill = getFirstLocalChild(shapeNode, \"solidFill\");\n if (solidFill) {\n const colorNode = findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null);\n return resolveChartColorNode(colorNode, themePalette);\n }\n\n const gradientFill = getFirstLocalChild(shapeNode, \"gradFill\");\n const gradientStops = gradientFill\n ? getLocalDescendants(gradientFill, \"gs\")\n .map((stopNode) => ({\n colorNode: Array.from(stopNode.childNodes).find(isElementNode) ?? null,\n position: Number(stopNode.getAttribute(\"pos\") ?? Number.NaN)\n }))\n .filter((stop) => Boolean(stop.colorNode))\n : [];\n if (gradientStops.length === 0) {\n return null;\n }\n\n gradientStops.sort((left, right) => {\n const leftPos = Number.isFinite(left.position) ? left.position : 0;\n const rightPos = Number.isFinite(right.position) ? right.position : 0;\n return leftPos - rightPos;\n });\n const midpointStop = gradientStops.find((stop) => Number.isFinite(stop.position) && stop.position >= 50000)\n ?? gradientStops[Math.floor(gradientStops.length / 2)]\n ?? gradientStops[0];\n return resolveChartColorNode(midpointStop.colorNode, themePalette);\n}\n\nfunction resolveChartLineStyle(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n const lineNode = shapeNode?.localName === \"ln\" ? shapeNode : (shapeNode ? getFirstLocalChild(shapeNode, \"ln\") : null);\n if (!lineNode) {\n return { color: null, hidden: false, widthPx: undefined };\n }\n if (getFirstLocalChild(lineNode, \"noFill\")) {\n return { color: null, hidden: true, widthPx: undefined };\n }\n\n const solidFill = getFirstLocalChild(lineNode, \"solidFill\");\n const colorNode = solidFill ? findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null) : null;\n const widthValue = Number(lineNode.getAttribute(\"w\") ?? Number.NaN);\n return {\n color: resolveChartColorNode(colorNode, themePalette),\n hidden: false,\n widthPx: Number.isFinite(widthValue) ? Math.max(1, widthValue / EMU_PER_PIXEL) : undefined\n };\n}\n\nfunction normalizeLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n const legend = raw as Record<string, unknown>;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position: typeof legend.position === \"string\" ? legend.position : undefined,\n raw: legend\n };\n}\n\nfunction normalizeLegendPosition(position: string | undefined) {\n if (!position) {\n return undefined;\n }\n switch (position) {\n case \"bottom\":\n return \"b\";\n case \"left\":\n return \"l\";\n case \"right\":\n return \"r\";\n case \"top\":\n return \"t\";\n default:\n return position;\n }\n}\n\nfunction readChartNumericAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n const value = Number(node?.getAttribute(\"val\") ?? Number.NaN);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readChartBooleanAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n if (!node) {\n return undefined;\n }\n const rawValue = node.getAttribute(\"val\");\n if (rawValue == null) {\n return true;\n }\n if (rawValue === \"1\" || rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"0\" || rawValue === \"false\") {\n return false;\n }\n return undefined;\n}\n\nfunction readChartLabelFontSizePt(textPropertiesNode: Element | null) {\n if (!textPropertiesNode) {\n return undefined;\n }\n const runPropertiesNode = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n const rawSize = Number(runPropertiesNode?.getAttribute(\"sz\") ?? Number.NaN);\n if (!Number.isFinite(rawSize) || rawSize <= 0) {\n return undefined;\n }\n return rawSize / 100;\n}\n\nfunction parseChartPointDataLabelsFromXml(labelsNode: Element): XlsxChartPointDataLabel[] {\n const fallbackFontSizePt = readChartLabelFontSizePt(getFirstLocalChild(labelsNode, \"txPr\"));\n const labels: XlsxChartPointDataLabel[] = [];\n for (const pointLabelNode of getLocalChildren(labelsNode, \"dLbl\")) {\n const index = readChartNumericAttribute(pointLabelNode, \"idx\");\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n const layoutNode = getFirstLocalChild(pointLabelNode, \"layout\");\n const manualLayoutNode = getFirstLocalChild(layoutNode, \"manualLayout\");\n labels.push({\n deleted: readChartBooleanAttribute(pointLabelNode, \"delete\"),\n fontSizePt: readChartLabelFontSizePt(getFirstLocalChild(pointLabelNode, \"txPr\")) ?? fallbackFontSizePt,\n index,\n showBubbleSize: readChartBooleanAttribute(pointLabelNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(pointLabelNode, \"showCatName\"),\n showPercent: readChartBooleanAttribute(pointLabelNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(pointLabelNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(pointLabelNode, \"showVal\"),\n x: readChartNumericAttribute(manualLayoutNode, \"x\"),\n y: readChartNumericAttribute(manualLayoutNode, \"y\")\n });\n }\n return labels;\n}\n\nfunction parseChartDataLabelsFromXml(labelsNode: Element | null): XlsxChartDataLabels | null {\n if (!labelsNode) {\n return null;\n }\n\n const pointLabels = parseChartPointDataLabelsFromXml(labelsNode);\n const labels: XlsxChartDataLabels = {\n pointLabels: pointLabels.length > 0 ? pointLabels : undefined,\n raw: {},\n showBubbleSize: readChartBooleanAttribute(labelsNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(labelsNode, \"showCatName\"),\n showLegendKey: readChartBooleanAttribute(labelsNode, \"showLegendKey\"),\n showPercent: readChartBooleanAttribute(labelsNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(labelsNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(labelsNode, \"showVal\")\n };\n const hasValue = (\n labels.showBubbleSize !== undefined\n || labels.showCategoryName !== undefined\n || labels.showLegendKey !== undefined\n || labels.showPercent !== undefined\n || (labels.pointLabels?.length ?? 0) > 0\n || labels.showSeriesName !== undefined\n || labels.showValue !== undefined\n );\n return hasValue ? labels : null;\n}\n\nfunction readChartRelationships(\n archive: Record<string, Uint8Array>,\n chartPath: string\n) {\n const relsPath = normalizeArchivePath(`${dirname(chartPath)}/_rels/${chartPath.split(\"/\").pop()}.rels`);\n const relsXml = readArchiveText(archive, relsPath);\n if (!relsXml) {\n return new Map<string, string>();\n }\n\n const relsDocument = parseXml(relsXml);\n if (!relsDocument) {\n return new Map<string, string>();\n }\n\n const relationships = new Map<string, string>();\n for (const relationshipNode of getLocalDescendants(relsDocument, \"Relationship\")) {\n const type = relationshipNode.getAttribute(\"Type\");\n const target = relationshipNode.getAttribute(\"Target\");\n if (!type || !target) {\n continue;\n }\n relationships.set(type, resolveRelationshipPath(relsPath, target));\n }\n\n return relationships;\n}\n\nfunction readChartColorPalette(\n archive: Record<string, Uint8Array>,\n colorStylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const colorStyleXml = readArchiveText(archive, colorStylePath);\n if (!colorStyleXml) {\n return [];\n }\n\n const colorStyleDocument = parseXml(colorStyleXml);\n if (!colorStyleDocument?.documentElement) {\n return [];\n }\n\n return Array.from(colorStyleDocument.documentElement.childNodes)\n .filter((child): child is Element => isElementNode(child) && child.localName !== \"variation\")\n .map((child) => (\n resolveChartColorNode(child, themePalette)\n ?? resolveChartColorNode(findFirstChartColorElement(child), themePalette)\n ))\n .filter((color): color is string => typeof color === \"string\");\n}\n\nfunction readChartStyleAppearance(\n archive: Record<string, Uint8Array>,\n stylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n): ChartStyleAppearance {\n const styleXml = readArchiveText(archive, stylePath);\n if (!styleXml) {\n return {};\n }\n\n const styleDocument = parseXml(styleXml);\n if (!styleDocument) {\n return {};\n }\n\n const dataPointNode = getFirstLocalDescendant(styleDocument, \"dataPoint\");\n const fillRefNode = dataPointNode ? getFirstLocalChild(dataPointNode, \"fillRef\") : null;\n const index = Number(fillRefNode?.getAttribute(\"idx\") ?? Number.NaN);\n const chartAreaNode = getFirstLocalDescendant(styleDocument, \"chartArea\");\n const chartAreaShapeProperties = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"spPr\") : null;\n const chartAreaFontRef = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"fontRef\") : null;\n const chartAreaFontColor = chartAreaFontRef\n ? resolveChartColorNode(Array.from(chartAreaFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const titleNode = getFirstLocalDescendant(styleDocument, \"title\");\n const titleFontRef = titleNode ? getFirstLocalChild(titleNode, \"fontRef\") : null;\n const titleColor = titleFontRef\n ? resolveChartColorNode(Array.from(titleFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const axisStyleNode = getFirstLocalDescendant(styleDocument, \"categoryAxis\")\n ?? getFirstLocalDescendant(styleDocument, \"valueAxis\");\n const axisShapeProperties = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"spPr\") : null;\n const axisFontRef = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"fontRef\") : null;\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n\n return {\n axisLabelColor: axisFontRef\n ? resolveChartColorNode(Array.from(axisFontRef.childNodes).find(isElementNode) ?? null, themePalette) ?? undefined\n : undefined,\n axisLineColor: resolveChartLineStyle(axisShapeProperties, themePalette).color ?? undefined,\n chartAreaBorderColor: resolveChartLineStyle(chartAreaShapeProperties, themePalette).color ?? undefined,\n chartAreaFillColor: resolveChartFillColor(chartAreaShapeProperties, themePalette) ?? undefined,\n chartAreaNoFill,\n paletteOffset: Number.isFinite(index) ? index : undefined,\n textColor: chartAreaFontColor ?? undefined,\n titleColor: titleColor ?? chartAreaFontColor ?? undefined\n };\n}\n\nfunction buildThemeSeriesPalette(themePalette?: XlsxThemePalette | null) {\n const themeColors = [4, 5, 6, 7, 8, 9]\n .map((index) => themePalette?.colorsByIndex[index] ?? null)\n .filter((color): color is string => Boolean(color));\n return themeColors.length > 0 ? themeColors : SERIES_COLORS;\n}\n\nfunction normalizeBuiltinSurfaceStyleId(styleId: number | undefined) {\n if (typeof styleId !== \"number\" || !Number.isFinite(styleId)) {\n return null;\n }\n return styleId >= 100 ? styleId - 100 : styleId;\n}\n\nfunction getBuiltinSurfacePalette(styleId: number | undefined, wireframe: boolean | undefined) {\n const normalized = normalizeBuiltinSurfaceStyleId(styleId);\n if (normalized === 34 || (wireframe === true && normalized == null)) {\n return [\"#5b9bd5\", \"#ed7d31\", \"#a5a5a5\"];\n }\n if (normalized === 35 || normalized === 36 || (wireframe !== true && normalized == null)) {\n return [\"#2f5597\", \"#4472c4\", \"#5b9bd5\", \"#8faadc\", \"#d9e2f3\"];\n }\n return null;\n}\n\nfunction applyBuiltinSurfaceDefaults(chart: XlsxChart) {\n if (chart.chartType !== \"Surface\") {\n return;\n }\n\n const builtinPalette = getBuiltinSurfacePalette(chart.chartStyleId, chart.wireframe);\n if ((!chart.chartColorPalette || chart.chartColorPalette.length === 0) && builtinPalette) {\n chart.chartColorPalette = builtinPalette;\n }\n\n const wallFill = chart.wireframe ? \"#d0d0d0\" : \"#d9d9df\";\n const wallLine = chart.wireframe ? \"#a6a6a6\" : \"#a8adb7\";\n chart.floor = {\n ...(chart.floor ?? {}),\n fillColor: chart.floor?.fillColor ?? wallFill,\n lineColor: chart.floor?.lineColor ?? wallLine\n };\n chart.sideWall = {\n ...(chart.sideWall ?? {}),\n fillColor: chart.sideWall?.fillColor ?? wallFill,\n lineColor: chart.sideWall?.lineColor ?? wallLine\n };\n chart.backWall = {\n ...(chart.backWall ?? {}),\n fillColor: chart.backWall?.fillColor ?? wallFill,\n lineColor: chart.backWall?.lineColor ?? wallLine\n };\n if (!chart.surfaceMaterial && chart.wireframe !== true) {\n chart.surfaceMaterial = \"flat\";\n }\n}\n\nfunction applyBuiltinChartDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n const darkBuiltInStyle = typeof chart.chartStyleId === \"number\" && chart.chartStyleId >= 140 && chart.chartStyleId < 150;\n const textColor = themePalette?.colorsByIndex[1] ?? themePalette?.colorsByIndex[3] ?? null;\n const minorTypeface = themePalette?.minorLatinFont?.trim() || undefined;\n const derivedAxisColor = textColor ? applyLightnessTransform(textColor, 0.35, 0.55) : null;\n const derivedBorderColor = textColor\n ? applyLightnessTransform(textColor, chart.is3d ? 0.28 : 0.22, chart.is3d ? 0.6 : 0.7)\n : null;\n if (darkBuiltInStyle) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? \"#1f1f1f\";\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? \"#1f1f1f\";\n chart.textColor = chart.textColor ?? \"#f5f5f5\";\n chart.titleColor = chart.titleColor ?? \"#f5f5f5\";\n chart.axisLabelColor = chart.axisLabelColor ?? \"#d9d9d9\";\n chart.axisLineColor = chart.axisLineColor ?? \"#8c8c8c\";\n }\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? derivedBorderColor ?? undefined;\n chart.textColor = chart.textColor ?? textColor ?? undefined;\n chart.titleColor = chart.titleColor ?? textColor ?? undefined;\n chart.axisLabelColor = chart.axisLabelColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.axisLineColor = chart.axisLineColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.fontFamily = chart.fontFamily ?? minorTypeface;\n chart.titleFontFamily = chart.titleFontFamily ?? chart.fontFamily ?? minorTypeface;\n\n const seriesPalette = chart.chartColorPalette && chart.chartColorPalette.length > 0\n ? chart.chartColorPalette\n : buildThemeSeriesPalette(themePalette);\n if (!chart.chartColorPalette || chart.chartColorPalette.length === 0) {\n chart.chartColorPalette = seriesPalette;\n }\n\n chart.series = chart.series.map((series, index) => {\n const fallbackColor = seriesPalette[index % seriesPalette.length];\n return {\n ...series,\n color: series.color ?? series.lineColor ?? fallbackColor,\n lineColor: series.lineColor ?? series.color ?? fallbackColor,\n markerColor: series.markerColor ?? series.color ?? series.lineColor ?? fallbackColor,\n markerLineColor: series.markerLineColor ?? series.lineColor ?? series.color ?? fallbackColor\n };\n });\n chart.typeGroups = chart.typeGroups?.map((group, groupIndex) => ({\n ...group,\n series: group.series.map((series, seriesIndex) => {\n const fallbackColor = seriesPalette[(groupIndex + seriesIndex) % seriesPalette.length];\n return {\n ...series,\n color: series.color ?? series.lineColor ?? fallbackColor,\n lineColor: series.lineColor ?? series.color ?? fallbackColor,\n markerColor: series.markerColor ?? series.color ?? series.lineColor ?? fallbackColor,\n markerLineColor: series.markerLineColor ?? series.lineColor ?? series.color ?? fallbackColor\n };\n })\n }));\n applyBuiltinSurfaceDefaults(chart);\n}\n\nfunction parseChartPointStyles(seriesNode: Element, themePalette?: XlsxThemePalette | null): XlsxChartPointStyle[] {\n const pointStyles: XlsxChartPointStyle[] = [];\n\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n pointStyles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n\n return pointStyles;\n}\n\nfunction parseInvertNegativeStyle(seriesNode: Element, themePalette?: XlsxThemePalette | null) {\n const invertNode = getFirstLocalDescendant(seriesNode, \"invertSolidFillFmt\");\n const shapeProperties = invertNode ? getFirstLocalChild(invertNode, \"spPr\") : null;\n if (!shapeProperties) {\n return {\n color: undefined,\n lineColor: undefined\n };\n }\n\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n lineColor: lineStyle.color ?? undefined\n };\n}\n\nfunction parseChartCacheValues(\n parentNode: Element | null,\n cacheName: \"numCache\" | \"strCache\",\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"numRef\")\n ?? getFirstLocalChild(parentNode, \"strRef\")\n ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, cacheName);\n if (!cacheNode) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const pointNodes = getLocalChildren(cacheNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n } else {\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n }\n return values;\n}\n\nfunction parseChartMultiLevelCacheValues(\n parentNode: Element | null,\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"multiLvlStrRef\") ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, \"multiLvlStrCache\");\n if (!cacheNode) {\n return null;\n }\n\n const levelNodes = getLocalChildren(cacheNode, \"lvl\");\n if (levelNodes.length === 0) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const primaryLevelNode = mode === \"category\"\n ? levelNodes[levelNodes.length - 1] ?? levelNodes[0]\n : levelNodes[0];\n const pointNodes = getLocalChildren(primaryLevelNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n continue;\n }\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n return values;\n}\n\nfunction applyChartSeriesStyleFromXml(chart: XlsxChart, chartTypeNode: Element, themePalette?: XlsxThemePalette | null) {\n const seriesNodes = getLocalChildren(chartTypeNode, \"ser\");\n chart.series = chart.series.map((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return series;\n }\n\n const shapeProperties = getFirstLocalChild(seriesNode, \"spPr\");\n const markerNode = getFirstLocalChild(seriesNode, \"marker\");\n const markerShapeProperties = getFirstLocalChild(markerNode ?? chartTypeNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const markerLineStyle = resolveChartLineStyle(markerShapeProperties, themePalette);\n const fillColor = resolveChartFillColor(shapeProperties, themePalette);\n const markerSize = readChartNumericAttribute(markerNode, \"size\");\n const markerSymbolNode = markerNode ? getFirstLocalChild(markerNode, \"symbol\") : null;\n const markerSymbol = markerSymbolNode?.getAttribute(\"val\") ?? undefined;\n const pointStyles = parseChartPointStyles(seriesNode, themePalette);\n const seriesExplosion = readChartNumericAttribute(seriesNode, \"explosion\");\n const invertNegativeStyle = parseInvertNegativeStyle(seriesNode, themePalette);\n const invertIfNegative = readChartBooleanAttribute(seriesNode, \"invertIfNegative\");\n const isScatterChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n const cachedCategories = isScatterChart\n ? (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"numCache\", \"value\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"category\")\n )\n : (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"strCache\", \"category\")\n ?? parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"numCache\", \"category\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"category\")\n );\n const cachedValues = isScatterChart\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"yVal\"), \"numCache\", \"value\")\n : parseChartCacheValues(getFirstLocalChild(seriesNode, \"val\"), \"numCache\", \"value\");\n const cachedBubbleSizes = chart.chartType === \"Bubble\"\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"bubbleSize\"), \"numCache\", \"value\")\n : null;\n const existingShapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : null;\n const rawFillColor = typeof existingShapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof existingShapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.lineColorHex)\n : null;\n const resolvedLineColor = lineStyle.hidden\n ? undefined\n : rawLineColor ?? lineStyle.color ?? rawFillColor ?? fillColor ?? series.lineColor ?? series.color;\n\n const hasCategoryReference = typeof series.categoriesRef?.formula === \"string\" && series.categoriesRef.formula.length > 0;\n const hasValueReference = typeof series.valuesRef?.formula === \"string\" && series.valuesRef.formula.length > 0;\n const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === \"string\" && series.bubbleSizeRef.formula.length > 0;\n\n return {\n ...series,\n bubbleSizes: !hasBubbleSizeReference && cachedBubbleSizes\n ? cachedBubbleSizes.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.bubbleSizes,\n categories: !hasCategoryReference && cachedCategories ? cachedCategories : series.categories,\n color: rawFillColor ?? rawLineColor ?? fillColor ?? lineStyle.color ?? series.color,\n dataPointStyles: pointStyles.length > 0 ? pointStyles : series.dataPointStyles,\n lineColor: resolvedLineColor,\n lineWidthPx: lineStyle.hidden ? undefined : lineStyle.widthPx ?? series.lineWidthPx,\n markerColor: rawFillColor\n ?? rawLineColor\n ?? resolveChartFillColor(markerShapeProperties, themePalette)\n ?? fillColor\n ?? lineStyle.color\n ?? undefined,\n markerLineColor: rawLineColor\n ?? rawFillColor\n ?? markerLineStyle.color\n ?? lineStyle.color\n ?? fillColor\n ?? undefined,\n markerSize: markerSize ?? series.markerSize,\n markerSymbol,\n smooth: readChartBooleanAttribute(seriesNode, \"smooth\") ?? series.smooth,\n invertIfNegative: invertIfNegative ?? series.invertIfNegative,\n shapeProperties: {\n ...series.shapeProperties,\n xmlExplosion: seriesExplosion ?? undefined,\n xmlFillColor: fillColor ?? undefined,\n xmlLineHidden: lineStyle.hidden ? true : undefined,\n xmlLineColor: lineStyle.color ?? undefined,\n xmlLineWidthPx: lineStyle.widthPx ?? undefined,\n xmlNegativeFillColor: invertNegativeStyle.color ?? undefined,\n xmlNegativeLineColor: invertNegativeStyle.lineColor ?? undefined\n },\n negativeColor: invertNegativeStyle.color ?? series.negativeColor,\n negativeLineColor: invertNegativeStyle.lineColor ?? series.negativeLineColor,\n values: !hasValueReference && cachedValues\n ? cachedValues.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.values\n };\n });\n}\n\nfunction applyChartStyleFromXml(\n chart: XlsxChart,\n chartPath: string | undefined,\n archive: Record<string, Uint8Array>,\n themePalette?: XlsxThemePalette | null\n) {\n const chartXml = readArchiveText(archive, chartPath);\n if (!chartXml) {\n return;\n }\n const relationships = chartPath ? readChartRelationships(archive, chartPath) : new Map<string, string>();\n const fallbackPointStylesBySeries = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const fallbackSeriesStyles = parseFallbackSeriesStylesFromChartXml(chartXml, themePalette);\n const fallbackBubbleSizesBySeries = parseFallbackBubbleSizesFromChartXml(chartXml);\n const applyFallbackSeriesStyles = () => {\n if (fallbackBubbleSizesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackBubbleSizes = fallbackBubbleSizesBySeries[seriesIndex] ?? [];\n if (fallbackBubbleSizes.length === 0) {\n return series;\n }\n\n const currentNumericPointCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n const fallbackNumericPointCount = fallbackBubbleSizes.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n\n if (currentNumericPointCount >= fallbackNumericPointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackBubbleSizes\n };\n });\n }\n\n if (fallbackPointStylesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackPointStyles = fallbackPointStylesBySeries[seriesIndex] ?? [];\n if (fallbackPointStyles.length === 0) {\n return series;\n }\n\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackPointStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n\n if (fallbackSeriesStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyle = fallbackSeriesStyles[seriesIndex];\n if (!fallbackStyle) {\n return series;\n }\n const fallbackColor = fallbackStyle.color ?? fallbackStyle.lineColor;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? fallbackStyle.lineColor ?? fallbackColor,\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? fallbackStyle.lineColor ?? fallbackColor ?? series.lineColor\n };\n });\n }\n };\n const applyRelationshipStyles = () => {\n chart.chartColorPalette = readChartColorPalette(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE), themePalette);\n const styleAppearance = readChartStyleAppearance(\n archive,\n relationships.get(CHART_STYLE_REL_TYPE),\n themePalette\n );\n chart.axisLabelColor = styleAppearance.axisLabelColor ?? chart.axisLabelColor;\n chart.axisLineColor = styleAppearance.axisLineColor ?? chart.axisLineColor;\n chart.chartAreaBorderColor = styleAppearance.chartAreaBorderColor ?? chart.chartAreaBorderColor;\n chart.chartAreaFillColor = styleAppearance.chartAreaFillColor ?? chart.chartAreaFillColor;\n chart.chartColorPaletteOffset = styleAppearance.paletteOffset ?? chart.chartColorPaletteOffset;\n chart.textColor = styleAppearance.textColor ?? chart.textColor;\n chart.titleColor = styleAppearance.titleColor ?? chart.titleColor;\n return styleAppearance;\n };\n const applyModernChartExStyles = () => {\n const modernPlotAreaNode = chartDocument?.documentElement\n ? getFirstLocalDescendant(chartDocument.documentElement, \"plotArea\")\n : null;\n if (!modernPlotAreaNode) {\n return;\n }\n\n const parseModernBinning = (seriesNode: Element) => {\n const layoutPrNode = getFirstLocalChild(seriesNode, \"layoutPr\");\n const binningNode = layoutPrNode ? getFirstLocalChild(layoutPrNode, \"binning\") : null;\n if (!binningNode) {\n return null;\n }\n const binning: Record<string, unknown> = {};\n for (const attribute of Array.from(binningNode.attributes)) {\n const rawValue = attribute.value;\n const numeric = Number(rawValue);\n binning[attribute.localName || attribute.name] = Number.isFinite(numeric) && rawValue.trim() !== \"\"\n ? numeric\n : rawValue;\n }\n return Object.keys(binning).length > 0 ? binning : {};\n };\n\n const plotAreaShapeProperties = getFirstLocalChild(modernPlotAreaNode, \"spPr\");\n if (plotAreaShapeProperties) {\n const plotAreaFillColor = resolveChartFillColor(plotAreaShapeProperties, themePalette);\n const plotAreaLineStyle = resolveChartLineStyle(plotAreaShapeProperties, themePalette);\n if (plotAreaFillColor) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? plotAreaFillColor;\n }\n if (plotAreaLineStyle.color) {\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? plotAreaLineStyle.color;\n }\n }\n\n const modernSeriesNodes = getLocalDescendants(modernPlotAreaNode, \"series\");\n if (modernSeriesNodes.length === 0) {\n return;\n }\n\n chart.series = chart.series.map((series, seriesIndex) => {\n const modernSeriesNode = modernSeriesNodes[seriesIndex] ?? null;\n if (!modernSeriesNode) {\n return series;\n }\n const valueColorsNode = getFirstLocalChild(modernSeriesNode, \"valueColors\");\n const valueColors = valueColorsNode\n ? Array.from(valueColorsNode.childNodes)\n .filter((node): node is Element => node.nodeType === Node.ELEMENT_NODE)\n .map((node) => resolveChartColorNode(findFirstChartColorElement(node) ?? node, themePalette))\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n : [];\n const nextRaw = valueColors.length > 0\n ? {\n ...(series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : {}),\n valueColors\n }\n : series.raw;\n const seriesShapeProperties = getFirstLocalChild(modernSeriesNode, \"spPr\");\n if (!seriesShapeProperties) {\n return nextRaw === series.raw\n ? series\n : {\n ...series,\n raw: nextRaw\n };\n }\n const fillColor = resolveChartFillColor(seriesShapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(seriesShapeProperties, themePalette);\n const fallbackColor = fillColor ?? lineStyle.color ?? undefined;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? lineStyle.color ?? fillColor ?? fallbackColor,\n lineWidthPx: series.lineWidthPx ?? (typeof lineStyle.widthPx === \"number\" ? lineStyle.widthPx : undefined),\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? lineStyle.color ?? fallbackColor ?? series.lineColor,\n raw: nextRaw\n };\n });\n\n const seriesLayouts = modernSeriesNodes.map((node) => node.getAttribute(\"layoutId\") ?? node.getAttribute(\"layout\"));\n const clusteredColumnIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n if (clusteredColumnIndex >= 0) {\n const clusteredNode = modernSeriesNodes[clusteredColumnIndex] ?? null;\n const parsedBinning = clusteredNode ? parseModernBinning(clusteredNode) : null;\n if (parsedBinning) {\n const syntheticRawSeries: Record<string, unknown> = {\n layoutId: \"clusteredColumn\",\n layoutPr: {\n binning: parsedBinning\n }\n };\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const replaceColumnSeries = (series: XlsxChartSeries | null | undefined) => (\n series ? buildChartExHistogramSeries(series, syntheticRawSeries, hasParetoLine) : null\n );\n\n if (chart.typeGroups && chart.typeGroups.length > 0) {\n const nextTypeGroups = chart.typeGroups.map((group) => ({ ...group, series: [...group.series] }));\n const columnGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"ColumnClustered\");\n if (columnGroupIndex >= 0) {\n const originalColumnSeries = nextTypeGroups[columnGroupIndex]?.series[0] ?? null;\n const binnedColumnSeries = replaceColumnSeries(originalColumnSeries);\n if (binnedColumnSeries) {\n nextTypeGroups[columnGroupIndex].series = [binnedColumnSeries];\n const lineGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"Line\");\n if (lineGroupIndex >= 0 && nextTypeGroups[lineGroupIndex]?.series[0]) {\n const originalLineSeries = nextTypeGroups[lineGroupIndex].series[0];\n const recomputedLine = buildChartExParetoLineSeries(\n binnedColumnSeries,\n {\n text: originalLineSeries.name,\n ...(originalLineSeries.raw && typeof originalLineSeries.raw === \"object\"\n ? originalLineSeries.raw as Record<string, unknown>\n : {})\n },\n 0\n );\n nextTypeGroups[lineGroupIndex].series = [\n {\n ...originalLineSeries,\n categories: recomputedLine.categories,\n categoriesRef: recomputedLine.categoriesRef,\n raw: recomputedLine.raw,\n values: recomputedLine.values\n }\n ];\n chart.series = [binnedColumnSeries, nextTypeGroups[lineGroupIndex].series[0]];\n } else {\n chart.series = [binnedColumnSeries];\n }\n chart.typeGroups = nextTypeGroups;\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n }\n }\n };\n\n const chartDocument = parseXml(chartXml);\n const chartNode = chartDocument ? getFirstLocalDescendant(chartDocument, \"chart\") : null;\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const styleIdNode = chartDocument?.documentElement ? getFirstLocalDescendant(chartDocument.documentElement, \"style\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n\n if (!chartNode || !chartTypeNode) {\n applyRelationshipStyles();\n const fallbackStyleId = readChartNumericAttribute(styleIdNode, \"style\");\n if (typeof fallbackStyleId === \"number\" && Number.isFinite(fallbackStyleId)) {\n chart.chartStyleId = fallbackStyleId;\n }\n applyModernChartExStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n const plotArea = plotAreaNode;\n if (!plotArea) {\n applyRelationshipStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n\n switch (chartTypeNode.localName) {\n case \"barChart\":\n case \"bar3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n const barDir = getFirstLocalChild(chartTypeNode, \"barDir\")?.getAttribute(\"val\");\n const isHorizontalBar = barDir === \"bar\";\n chart.is3d = chartTypeNode.localName === \"bar3DChart\" ? true : chart.is3d;\n if (grouping === \"percentStacked\") {\n chart.chartType = isHorizontalBar ? \"BarPercentStacked\" : \"ColumnPercentStacked\";\n } else if (grouping === \"stacked\") {\n chart.chartType = isHorizontalBar ? \"BarStacked\" : \"ColumnStacked\";\n } else {\n chart.chartType = isHorizontalBar ? \"BarClustered\" : \"ColumnClustered\";\n }\n break;\n }\n case \"areaChart\":\n case \"area3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"area3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"AreaStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"AreaPercentStacked\";\n } else {\n chart.chartType = \"Area\";\n }\n break;\n }\n case \"lineChart\":\n case \"line3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"line3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"LineStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"LinePercentStacked\";\n } else {\n chart.chartType = \"Line\";\n }\n break;\n }\n case \"pieChart\":\n chart.chartType = \"Pie\";\n break;\n case \"pie3DChart\":\n chart.chartType = \"Pie3D\";\n chart.is3d = true;\n break;\n case \"doughnutChart\":\n chart.chartType = \"Doughnut\";\n break;\n case \"ofPieChart\":\n chart.chartType = \"BarOfPie\";\n break;\n case \"scatterChart\":\n chart.chartType = resolveScatterChartType(getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\"));\n break;\n case \"radarChart\":\n chart.chartType = \"Radar\";\n break;\n case \"surfaceChart\":\n chart.chartType = \"Surface\";\n chart.is3d = false;\n break;\n case \"surface3DChart\":\n chart.chartType = \"Surface\";\n chart.is3d = true;\n break;\n case \"stockChart\":\n chart.chartType = \"Stock\";\n break;\n case \"bubbleChart\":\n chart.chartType = \"Bubble\";\n break;\n default:\n break;\n }\n\n const legendNode = getFirstLocalChild(chartNode, \"legend\");\n const legendPosition = legendNode ? getFirstLocalChild(legendNode, \"legendPos\")?.getAttribute(\"val\") ?? undefined : undefined;\n const legendOverlay = legendNode ? getFirstLocalChild(legendNode, \"overlay\")?.getAttribute(\"val\") : undefined;\n\n chart.legend = legendNode ? {\n overlay: legendOverlay === \"1\",\n position: normalizeLegendPosition(legendPosition),\n raw: chart.legend?.raw\n } : chart.legend;\n const plotVisibleOnly = readChartBooleanAttribute(chartNode, \"plotVisOnly\");\n if (plotVisibleOnly !== undefined) {\n chart.plotVisibleOnly = plotVisibleOnly;\n }\n chart.displayBlanksAs = getFirstLocalChild(chartNode, \"dispBlanksAs\")?.getAttribute(\"val\") ?? chart.displayBlanksAs;\n const styleId = Number(styleIdNode?.getAttribute(\"val\") ?? Number.NaN);\n chart.chartStyleId = Number.isFinite(styleId) ? styleId : chart.chartStyleId;\n chart.firstSliceAngle = readChartNumericAttribute(chartTypeNode, \"firstSliceAng\") ?? chart.firstSliceAngle;\n chart.gapWidth = readChartNumericAttribute(chartTypeNode, \"gapWidth\") ?? chart.gapWidth;\n chart.overlap = readChartNumericAttribute(chartTypeNode, \"overlap\") ?? chart.overlap;\n chart.bubbleScale = readChartNumericAttribute(chartTypeNode, \"bubbleScale\") ?? chart.bubbleScale;\n chart.varyColors = readChartBooleanAttribute(chartTypeNode, \"varyColors\") ?? chart.varyColors;\n const bubble3dNode = getFirstLocalChild(chartTypeNode, \"bubble3D\");\n chart.bubble3d = bubble3dNode\n ? bubble3dNode.getAttribute(\"val\") !== \"0\"\n : chart.bubble3d;\n chart.holeSize = readChartNumericAttribute(chartTypeNode, \"holeSize\") ?? chart.holeSize;\n chart.radarStyle = getFirstLocalChild(chartTypeNode, \"radarStyle\")?.getAttribute(\"val\") ?? chart.radarStyle;\n chart.scatterStyle = getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\") ?? chart.scatterStyle;\n chart.shape3d = getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? chart.shape3d;\n const wireframeNode = getFirstLocalChild(chartTypeNode, \"wireframe\");\n chart.wireframe = wireframeNode\n ? wireframeNode.getAttribute(\"val\") !== \"0\"\n : chart.wireframe;\n const chartTypeDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(chartTypeNode, \"dLbls\"));\n const firstSeriesNode = getLocalChildren(chartTypeNode, \"ser\")[0] ?? null;\n const seriesDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(firstSeriesNode, \"dLbls\"));\n chart.dataLabels = chartTypeDataLabels ?? seriesDataLabels ?? chart.dataLabels;\n const seriesSp3dNode = firstSeriesNode ? getFirstLocalDescendant(firstSeriesNode, \"sp3d\") : null;\n chart.surfaceMaterial = seriesSp3dNode?.getAttribute(\"prstMaterial\") ?? chart.surfaceMaterial;\n const bandFormatsNode = getLocalChildren(chartTypeNode, \"bandFmts\")[0] ?? null;\n const bandFormatNodes = bandFormatsNode ? getLocalChildren(bandFormatsNode, \"bandFmt\") : [];\n const bandFormatColors = bandFormatNodes\n .map((bandFormatNode) => {\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n return resolveChartFillColor(shapeProperties, themePalette) ?? undefined;\n })\n .filter((color): color is string => typeof color === \"string\" && color.length > 0);\n const bandFormatLineColors = bandFormatNodes\n .map((bandFormatNode) => {\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n return resolveChartLineStyle(shapeProperties, themePalette).color ?? undefined;\n })\n .filter((color): color is string => typeof color === \"string\" && color.length > 0);\n\n chart.raw = {\n ...(chart.raw ?? {}),\n bandFormatCount: bandFormatNodes.length > 0 ? bandFormatNodes.length : undefined,\n bandFormatColors: bandFormatColors.length > 0 ? bandFormatColors : undefined,\n bandFormatLineColors: bandFormatLineColors.length > 0 ? bandFormatLineColors : undefined,\n date1904: readChartBooleanAttribute(chartDocument?.documentElement ?? null, \"date1904\"),\n bubble3d: chart.bubble3d,\n grouping: getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\") ?? undefined,\n ofPieType: getFirstLocalChild(chartTypeNode, \"ofPieType\")?.getAttribute(\"val\") ?? undefined,\n shape: getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? undefined,\n secondPieSize: readChartNumericAttribute(chartTypeNode, \"secondPieSize\"),\n scatterStyle: chart.scatterStyle,\n splitPos: readChartNumericAttribute(chartTypeNode, \"splitPos\"),\n splitType: getFirstLocalChild(chartTypeNode, \"splitType\")?.getAttribute(\"val\") ?? undefined,\n xmlChartType: chartTypeNode.localName\n };\n const view3dNode = getFirstLocalDescendant(chartNode, \"view3D\");\n if (view3dNode) {\n chart.view3d = {\n depthPercent: readChartNumericAttribute(view3dNode, \"depthPercent\"),\n perspective: readChartNumericAttribute(view3dNode, \"perspective\"),\n rAngAx: getFirstLocalChild(view3dNode, \"rAngAx\")?.getAttribute(\"val\") === \"1\",\n rotX: readChartNumericAttribute(view3dNode, \"rotX\"),\n rotY: readChartNumericAttribute(view3dNode, \"rotY\")\n };\n }\n chart.floor = readChartWallFromXml(getFirstLocalChild(chartNode, \"floor\"), themePalette) ?? chart.floor;\n chart.sideWall = readChartWallFromXml(getFirstLocalChild(chartNode, \"sideWall\"), themePalette) ?? chart.sideWall;\n chart.backWall = readChartWallFromXml(getFirstLocalChild(chartNode, \"backWall\"), themePalette) ?? chart.backWall;\n\n const styleAppearance = applyRelationshipStyles();\n const chartTextTypeface = readChartTextTypeface(getFirstLocalChild(chartNode, \"txPr\"), themePalette);\n const titleTypeface = readChartTextTypeface(getFirstLocalDescendant(chartNode, \"title\"), themePalette);\n chart.fontFamily = chartTextTypeface ?? chart.fontFamily;\n chart.titleFontFamily = titleTypeface ?? chart.titleFontFamily ?? chart.fontFamily;\n\n const chartAreaShapeProperties = chartDocument?.documentElement\n ? getFirstLocalChild(chartDocument.documentElement, \"spPr\")\n : null;\n const plotAreaShapeProperties = getFirstLocalChild(plotArea, \"spPr\");\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n const plotAreaNoFill = plotAreaShapeProperties ? getFirstLocalChild(plotAreaShapeProperties, \"noFill\") != null : false;\n chart.raw = {\n ...(chart.raw ?? {}),\n chartAreaNoFill: styleAppearance.chartAreaNoFill === true || chartAreaNoFill,\n plotAreaNoFill\n };\n if (chartAreaShapeProperties) {\n const chartAreaFillColor = resolveChartFillColor(chartAreaShapeProperties, themePalette);\n if (chartAreaFillColor) {\n chart.chartAreaFillColor = chartAreaFillColor;\n } else if (getFirstLocalChild(chartAreaShapeProperties, \"noFill\")) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const chartAreaLineStyle = resolveChartLineStyle(chartAreaShapeProperties, themePalette);\n if (chartAreaLineStyle.hidden) {\n chart.chartAreaBorderColor = \"transparent\";\n } else if (chartAreaLineStyle.color) {\n chart.chartAreaBorderColor = chartAreaLineStyle.color;\n }\n }\n if (!chart.chartAreaFillColor && (styleAppearance.chartAreaNoFill === true || plotAreaNoFill)) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const categoryAxisNodes = [\n ...getLocalChildren(plotArea, \"catAx\"),\n ...getLocalChildren(plotArea, \"dateAx\")\n ];\n const valueAxisNodes = getLocalChildren(plotArea, \"valAx\");\n const seriesAxisNode = getLocalChildren(plotArea, \"serAx\")[0] ?? null;\n const isScatterLikeChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n let categoryAxisNode = categoryAxisNodes[0] ?? null;\n let valueAxisNode = valueAxisNodes[0] ?? null;\n if (!categoryAxisNode && isScatterLikeChart && valueAxisNodes.length >= 2) {\n categoryAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"b\" || position === \"t\";\n }) ?? valueAxisNodes[0];\n valueAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"l\" || position === \"r\";\n }) ?? valueAxisNodes[1] ?? valueAxisNodes[0];\n }\n chart.categoryAxis = mergeChartAxis(chart.categoryAxis, readChartAxisFromXml(categoryAxisNode));\n chart.valueAxis = mergeChartAxis(chart.valueAxis, readChartAxisFromXml(valueAxisNode));\n chart.seriesAxis = mergeChartAxis(chart.seriesAxis, readChartAxisFromXml(seriesAxisNode));\n chart.axes = chart.axes.length > 0\n ? chart.axes.map((axis, index) => (\n index === 0 && categoryAxisNode\n ? { ...axis, ...readChartAxisFromXml(categoryAxisNode) }\n : index === 1 && valueAxisNode\n ? { ...axis, ...readChartAxisFromXml(valueAxisNode) }\n : axis\n ))\n : chart.axes;\n if (seriesAxisNode) {\n const seriesAxis = readChartAxisFromXml(seriesAxisNode);\n if (seriesAxis && !chart.axes.some((axis) => axis.id != null && axis.id === seriesAxis.id)) {\n chart.axes = [...chart.axes, seriesAxis as XlsxChartAxis];\n }\n }\n\n applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);\n applyFallbackSeriesStyles();\n if (chart.chartType === \"Bubble\") {\n const archiveFallbackBubbleSizes = resolveArchiveFallbackBubbleSizes(archive, chart.title);\n if (archiveFallbackBubbleSizes.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 1) {\n return series;\n }\n\n const numericBubbleCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n if (numericBubbleCount >= pointCount) {\n return series;\n }\n\n const fallbackCandidate = archiveFallbackBubbleSizes[seriesIndex] ?? archiveFallbackBubbleSizes[0] ?? [];\n const fallbackNumericCount = fallbackCandidate.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n if (fallbackNumericCount < pointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackCandidate\n };\n });\n }\n }\n if (chart.chartType === \"Pie\" || chart.chartType === \"Pie3D\" || chart.chartType === \"PieExploded\" || chart.chartType === \"Doughnut\" || chart.chartType === \"BarOfPie\") {\n const needsPointColorFallback = chart.series.some((series) => {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 0) {\n return false;\n }\n const coloredPointCount = (series.dataPointStyles ?? []).filter(\n (style) => typeof style.color === \"string\" && style.color.length > 0\n ).length;\n return coloredPointCount === 0;\n });\n if (needsPointColorFallback) {\n const archiveFallbackPointStyles = resolveArchiveFallbackPointStyles(\n archive,\n chart.title,\n chartTypeNode.localName,\n themePalette\n );\n if (archiveFallbackPointStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyles = archiveFallbackPointStyles[seriesIndex] ?? archiveFallbackPointStyles[0] ?? [];\n if (fallbackStyles.length === 0) {\n return series;\n }\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n }\n }\n applyBuiltinChartDefaults(chart, themePalette);\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const index = normalized.lastIndexOf(\"/\");\n return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction resolveRelationshipPath(basePath: string, target: string) {\n if (!target) {\n return \"\";\n }\n\n const normalizedTarget = target.replace(/\\\\/g, \"/\");\n if (normalizedTarget.startsWith(\"/\")) {\n return normalizeArchivePath(normalizedTarget);\n }\n const normalizedBasePath = normalizeArchivePath(basePath);\n let baseDirectory = dirname(normalizedBasePath);\n if (normalizedBasePath.endsWith(\".rels\")) {\n const relsMarker = \"/_rels/\";\n const relsMarkerIndex = normalizedBasePath.lastIndexOf(relsMarker);\n if (relsMarkerIndex >= 0) {\n const ownerPrefix = normalizedBasePath.slice(0, relsMarkerIndex);\n const relFileName = normalizedBasePath.slice(relsMarkerIndex + relsMarker.length);\n const ownerFileName = relFileName.endsWith(\".rels\")\n ? relFileName.slice(0, -\".rels\".length)\n : relFileName;\n baseDirectory = dirname(`${ownerPrefix}/${ownerFileName}`);\n }\n }\n\n const segments = [...baseDirectory.split(\"/\").filter(Boolean), ...normalizedTarget.split(\"/\").filter(Boolean)];\n const resolved: string[] = [];\n for (const segment of segments) {\n if (segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n resolved.pop();\n continue;\n }\n resolved.push(segment);\n }\n\n return resolved.join(\"/\");\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string | null | undefined) {\n if (!path) {\n return null;\n }\n\n const entry = archive[normalizeArchivePath(path)];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseXml(xml: string) {\n if (typeof DOMParser === \"undefined\") {\n return null;\n }\n\n try {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n } catch {\n return null;\n }\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction getLocalChildren(parent: ParentNode, localName: string) {\n return Array.from(parent.childNodes).filter(\n (node): node is Element => node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === localName\n );\n}\n\nfunction getLocalDescendants(parent: ParentNode, localName: string) {\n return Array.from((parent as Element | Document).getElementsByTagName(\"*\")).filter(\n (node) => node.localName === localName\n );\n}\n\nfunction getFirstLocalChild(parent: ParentNode, localName: string) {\n return getLocalChildren(parent, localName)[0] ?? null;\n}\n\nfunction getFirstLocalDescendant(parent: ParentNode, localName: string) {\n return getLocalDescendants(parent, localName)[0] ?? null;\n}\n\nfunction ensureChild(parent: Element, localName: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const existing = getFirstLocalChild(parent, localName);\n if (existing) {\n return existing;\n }\n\n const document = parent.ownerDocument;\n const node = document.createElementNS(namespace, `${prefix}:${localName}`);\n parent.appendChild(node);\n return node;\n}\n\nfunction setLeafValue(parent: Element, localName: string, value: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const node = ensureChild(parent, localName, namespace, prefix);\n node.textContent = value;\n return node;\n}\n\nfunction setBooleanValue(parent: Element, localName: string, value: boolean) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", value ? \"1\" : \"0\");\n return node;\n}\n\nfunction setNumericValue(parent: Element, localName: string, value: number) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", String(Math.round(value)));\n return node;\n}\n\nfunction unquoteSheetName(value: string) {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction splitSheetReference(reference: string) {\n let bangIndex = -1;\n let quoted = false;\n for (let index = 0; index < reference.length; index += 1) {\n const char = reference[index];\n if (char === \"'\") {\n quoted = !quoted;\n } else if (char === \"!\" && !quoted) {\n bangIndex = index;\n break;\n }\n }\n\n if (bangIndex < 0) {\n return null;\n }\n\n return {\n range: reference.slice(bangIndex + 1),\n sheetName: unquoteSheetName(reference.slice(0, bangIndex))\n };\n}\n\nfunction parseA1Cell(reference: string) {\n const match = /^\\$?([A-Z]+)\\$?(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n let col = 0;\n for (const char of match[1].toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(match[2]) - 1\n };\n}\n\nfunction parseA1Range(reference: string) {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1Cell(startRef ?? \"\");\n const end = parseA1Cell(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return {\n end: {\n col: Math.max(start.col, end.col),\n row: Math.max(start.row, end.row)\n },\n start: {\n col: Math.min(start.col, end.col),\n row: Math.min(start.row, end.row)\n }\n };\n}\n\nfunction formatA1Column(col: number) {\n let current = col + 1;\n let label = \"\";\n while (current > 0) {\n const remainder = (current - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n current = Math.floor((current - 1) / 26);\n }\n return label;\n}\n\nfunction buildA1RangeFormula(sheetName: string, start: { col: number; row: number }, end: { col: number; row: number }) {\n const escapedSheetName = sheetName.replace(/'/g, \"''\");\n return `'${escapedSheetName}'!$${formatA1Column(start.col)}$${start.row + 1}:$${formatA1Column(end.col)}$${end.row + 1}`;\n}\n\nfunction resolveReferenceSheet(workbook: Workbook, fallbackSheetIndex: number, formula?: string | null) {\n if (!formula) {\n return {\n range: null,\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n const trimmedFormula = formula.trim();\n if (trimmedFormula.length > 0 && !trimmedFormula.includes(\"!\")) {\n try {\n const namedRange = workbook.getNamedRange(trimmedFormula);\n if (typeof namedRange === \"string\" && namedRange.length > 0 && namedRange !== trimmedFormula) {\n return resolveReferenceSheet(workbook, fallbackSheetIndex, namedRange);\n }\n } catch {\n // Fall back to direct A1 parsing when the workbook has no matching name.\n }\n }\n\n const split = splitSheetReference(trimmedFormula);\n if (!split) {\n return {\n range: parseA1Range(trimmedFormula),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n try {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheetByName(split.sheetName),\n sheetName: split.sheetName\n };\n } catch {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n}\n\nfunction resolveChartReferenceLabel(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n fallbackLabel: string\n) {\n if (!reference?.formula) {\n return fallbackLabel;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return fallbackLabel;\n }\n\n const { start } = resolved.range;\n if (start.row > 0) {\n const headerDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row - 1, start.col)\n : null\n );\n if (headerDisplay.length > 0) {\n return headerDisplay;\n }\n }\n\n const firstDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row, start.col)\n : null\n );\n return firstDisplay.length > 0 ? firstDisplay : fallbackLabel;\n}\n\nfunction resolveReferenceRowPaths(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined\n) {\n if (!reference?.formula) {\n return [] as string[][];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return [];\n }\n\n const rows: string[][] = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n const parts: string[] = [];\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n const label = display.length > 0 ? display : (numeric != null ? String(numeric) : \"\");\n if (label.length > 0) {\n parts.push(label);\n }\n }\n rows.push(parts);\n }\n return rows;\n}\n\nfunction normalizeChartExLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const legend = raw as Record<string, unknown>;\n const position = typeof legend.pos === \"string\"\n ? normalizeLegendPosition(String(legend.pos))\n : undefined;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position,\n raw: legend\n };\n}\n\nfunction humanizeChartExLayoutLabel(layout: string | undefined) {\n if (!layout) {\n return undefined;\n }\n return layout\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n\nfunction normalizeChartExAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const axis = raw as Record<string, unknown>;\n const scaling = axis.scaling && typeof axis.scaling === \"object\"\n ? axis.scaling as Record<string, unknown>\n : null;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n delete: typeof axis.hidden === \"boolean\" ? axis.hidden : undefined,\n id: typeof axis.id === \"number\" && Number.isFinite(axis.id) ? axis.id : undefined,\n crossId: typeof axis.crossId === \"number\" && Number.isFinite(axis.crossId) ? axis.crossId : undefined,\n majorGridlines: axis.majorGridlines != null ? true : undefined,\n majorUnit: typeof scaling?.majorUnit === \"number\" ? scaling.majorUnit : undefined,\n max: typeof scaling?.max === \"number\" ? scaling.max : undefined,\n min: typeof scaling?.min === \"number\" ? scaling.min : undefined,\n minorGridlines: axis.minorGridlines != null ? true : undefined,\n minorUnit: typeof scaling?.minorUnit === \"number\" ? scaling.minorUnit : undefined,\n numberFormat: numberFormat\n ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n }\n : undefined,\n raw: axis,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction resolveChartExLayoutChartType(layout: string | undefined) {\n switch (layout) {\n case \"boxWhisker\":\n return \"BoxWhisker\";\n case \"clusteredColumn\":\n return \"ColumnClustered\";\n case \"funnel\":\n return \"Funnel\";\n case \"paretoLine\":\n return \"Line\";\n case \"regionMap\":\n return \"RegionMap\";\n case \"sunburst\":\n return \"Sunburst\";\n case \"treemap\":\n return \"Treemap\";\n case \"waterfall\":\n return \"Waterfall\";\n default:\n return layout ? `Unsupported(cx:${layout})` : \"ColumnClustered\";\n }\n}\n\nfunction resolveChartExSeriesLayout(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n return typeof record.layout === \"string\"\n ? record.layout\n : typeof record.layoutId === \"string\"\n ? record.layoutId\n : undefined;\n}\n\nfunction resolveChartExSeriesAxisIds(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n const record = raw as Record<string, unknown>;\n if (Array.isArray(record.axisIds)) {\n return record.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n }\n if (Array.isArray(record.axisId)) {\n return record.axisId.flatMap((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return [value];\n }\n if (value && typeof value === \"object\" && typeof (value as { val?: unknown }).val === \"number\") {\n return [(value as { val: number }).val];\n }\n return [];\n });\n }\n if (typeof record.axisId === \"number\" && Number.isFinite(record.axisId)) {\n return [record.axisId];\n }\n return [];\n}\n\nfunction niceHistogramStep(value: number) {\n if (!Number.isFinite(value) || value <= 0) {\n return 1;\n }\n const exponent = Math.floor(Math.log10(value));\n const scale = 10 ** exponent;\n const normalized = value / scale;\n if (normalized <= 1) {\n return scale;\n }\n if (normalized <= 2) {\n return scale * 2;\n }\n if (normalized <= 5) {\n return scale * 5;\n }\n return scale * 10;\n}\n\nfunction formatHistogramBinLabel(lower: number, upper: number, index: number, closedRight: boolean) {\n const leftBracket = closedRight\n ? (index === 0 ? \"[\" : \"(\")\n : \"[\";\n const rightBracket = closedRight ? \"]\" : \")\";\n return `${leftBracket}${Number(lower.toFixed(6))},${Number(upper.toFixed(6))}${rightBracket}`;\n}\n\ntype ChartExHistogramBin = {\n count: number;\n label: string;\n lower: number;\n upper: number;\n};\n\nfunction buildChartExHistogramBins(values: number[], rawSeries: unknown, sortByFrequency: boolean) {\n if (values.length === 0) {\n return [] as ChartExHistogramBin[];\n }\n\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const layoutProperties = rawRecord?.layoutPr && typeof rawRecord.layoutPr === \"object\"\n ? rawRecord.layoutPr as Record<string, unknown>\n : null;\n const rawBinning = layoutProperties?.binning && typeof layoutProperties.binning === \"object\"\n ? layoutProperties.binning as Record<string, unknown>\n : null;\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const explicitWidth = typeof rawBinning?.binWidth === \"number\" && Number.isFinite(rawBinning.binWidth) && rawBinning.binWidth > 0\n ? rawBinning.binWidth\n : typeof rawBinning?.width === \"number\" && Number.isFinite(rawBinning.width) && rawBinning.width > 0\n ? rawBinning.width\n : undefined;\n const explicitCount = typeof rawBinning?.binCount === \"number\" && Number.isFinite(rawBinning.binCount) && rawBinning.binCount > 0\n ? rawBinning.binCount\n : typeof rawBinning?.count === \"number\" && Number.isFinite(rawBinning.count) && rawBinning.count > 0\n ? rawBinning.count\n : undefined;\n const closedRight = rawBinning?.intervalClosed === \"r\" || rawBinning?.intervalClosed === \"right\";\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const variance = values.reduce((sum, value) => sum + ((value - mean) ** 2), 0) / Math.max(1, values.length);\n const standardDeviation = Math.sqrt(Math.max(0, variance));\n const allIntegers = values.every((value) => Math.abs(value - Math.round(value)) < 1e-9);\n const scottWidth = standardDeviation > 0\n ? (3.49 * standardDeviation) / Math.cbrt(values.length)\n : undefined;\n const fallbackWidth = explicitCount != null\n ? (maxValue - minValue) / Math.max(1, explicitCount)\n : scottWidth ?? ((maxValue - minValue) / Math.max(1, Math.ceil(Math.log2(values.length) + 1)));\n const roughWidth = explicitWidth\n ?? (allIntegers\n ? Math.max(1, Math.ceil(Math.max(fallbackWidth, 1e-6)))\n : niceHistogramStep(Math.max(fallbackWidth, 1e-6)));\n const binWidth = Math.max(roughWidth, 1e-6);\n const start = explicitWidth != null || explicitCount != null\n ? Math.floor(minValue / binWidth) * binWidth\n : minValue;\n const end = Math.max(start + binWidth, start + Math.ceil((maxValue - start) / binWidth) * binWidth);\n const binCount = Math.max(1, Math.ceil((end - start) / binWidth));\n const bins = Array.from({ length: binCount }, (_, index) => {\n const lower = start + binWidth * index;\n const upper = lower + binWidth;\n return {\n count: 0,\n label: formatHistogramBinLabel(lower, upper, index, closedRight),\n lower,\n upper\n } satisfies ChartExHistogramBin;\n });\n\n values.forEach((value) => {\n if (!Number.isFinite(value)) {\n return;\n }\n const offset = (value - start) / binWidth;\n let binIndex = Math.floor(offset);\n if (closedRight && Math.abs(offset - Math.round(offset)) < 1e-9 && value > start) {\n binIndex -= 1;\n }\n if (value >= end) {\n binIndex = bins.length - 1;\n }\n if (value <= start) {\n binIndex = 0;\n }\n const target = bins[Math.max(0, Math.min(bins.length - 1, binIndex))];\n if (target) {\n target.count += 1;\n }\n });\n\n if (sortByFrequency) {\n bins.sort((left, right) => (\n right.count - left.count\n || left.lower - right.lower\n ));\n }\n return bins;\n}\n\nfunction buildChartExHistogramSeries(\n series: XlsxChartSeries,\n rawSeries: unknown,\n sortByFrequency: boolean\n) {\n const layout = resolveChartExSeriesLayout(rawSeries);\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const hasBinning = Boolean(\n layout === \"clusteredColumn\"\n && rawRecord?.layoutPr\n && typeof rawRecord.layoutPr === \"object\"\n && (rawRecord.layoutPr as Record<string, unknown>).binning != null\n );\n if (!hasBinning) {\n return series;\n }\n\n const numericValues = series.values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n if (numericValues.length === 0) {\n return series;\n }\n\n const bins = buildChartExHistogramBins(numericValues, rawSeries, sortByFrequency);\n if (bins.length === 0) {\n return series;\n }\n\n return {\n ...series,\n categories: bins.map((bin) => bin.label),\n categoriesRef: null,\n raw: {\n ...series.raw,\n chartExHistogramBins: bins,\n chartExSourceValues: numericValues\n },\n values: bins.map((bin) => bin.count)\n };\n}\n\nfunction buildChartExParetoLineSeries(series: XlsxChartSeries, sourceRaw: unknown, index: number) {\n const counts = series.values.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : 0\n ));\n const total = counts.reduce((sum, value) => sum + value, 0);\n let running = 0;\n const cumulative = counts.map((value) => {\n running += value;\n return total > 0 ? (running / total) * 100 : 0;\n });\n return {\n ...series,\n color: undefined,\n lineColor: undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: 7,\n markerSymbol: \"circle\",\n name: typeof (sourceRaw as { text?: unknown } | null)?.text === \"string\"\n ? (sourceRaw as { text: string }).text\n : \"Pareto\",\n raw: {\n ...(series.raw ?? {}),\n chartExLayout: \"paretoLine\",\n source: sourceRaw && typeof sourceRaw === \"object\" ? sourceRaw as Record<string, unknown> : undefined\n },\n values: cumulative\n };\n}\n\nfunction resolveChartExTextFormula(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.formula === \"string\" && record.formula.length > 0) {\n return record.formula;\n }\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n if (typeof record.value === \"string\" && record.value.length > 0) {\n return record.value;\n }\n return undefined;\n}\n\nfunction resolveChartExTitleText(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n const nestedText = record.text && typeof record.text === \"object\"\n ? resolveChartExTextFormula(record.text)\n : undefined;\n if (nestedText) {\n return nestedText;\n }\n return typeof record.value === \"string\" && record.value.length > 0 ? record.value : undefined;\n}\n\nfunction resolveChartExFallbackCategoryReference(\n workbook: Workbook,\n fallbackSheetIndex: number,\n valueFormula: string | undefined\n) {\n if (!valueFormula) {\n return null;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, valueFormula);\n if (!resolved.sheet || !resolved.range || resolved.range.start.col <= 0) {\n return null;\n }\n\n return normalizeChartReference({\n formula: buildA1RangeFormula(\n resolved.sheetName,\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.start.row\n },\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.end.row\n }\n )\n });\n}\n\nfunction normalizeChartExSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n dataById: Map<number, Record<string, unknown>>,\n index: number,\n chartType?: XlsxChart[\"chartType\"]\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const dataId = typeof series.dataId === \"number\" ? series.dataId : null;\n const dataEntry = dataId != null ? dataById.get(dataId) ?? null : null;\n const dimensions = Array.isArray(dataEntry?.dimensions)\n ? dataEntry.dimensions.filter((value): value is Record<string, unknown> => Boolean(value && typeof value === \"object\"))\n : [];\n const categoryDimension = dimensions.find((dimension) => dimension.dimType === \"cat\")\n ?? dimensions.find((dimension) => dimension.dimType === \"name\")\n ?? null;\n const valueDimension = dimensions.find((dimension) => (\n dimension.dimType === \"val\"\n || dimension.dimType === \"y\"\n || dimension.dimType === \"colorVal\"\n || dimension.dimType === \"size\"\n ))\n ?? dimensions.find((dimension) => dimension !== categoryDimension)\n ?? categoryDimension;\n const categoryDimensionFormula = typeof categoryDimension?.formula === \"string\" ? categoryDimension.formula : undefined;\n const valueDimensionFormula = typeof valueDimension?.formula === \"string\" ? valueDimension.formula : undefined;\n const fallbackCategoryRef = (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && !categoryDimension\n && typeof valueDimensionFormula === \"string\"\n )\n ? resolveChartExFallbackCategoryReference(workbook, workbookSheetIndex, valueDimensionFormula)\n : null;\n const categoriesRef = categoryDimension\n ? normalizeChartReference({\n formula: categoryDimensionFormula\n })\n : fallbackCategoryRef;\n const valuesRef = valueDimension\n ? normalizeChartReference({\n formula: valueDimensionFormula\n })\n : null;\n const resolvedValueCells = resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\");\n const values = resolvedValueCells.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ));\n const colorStrings = chartType === \"RegionMap\" && valueDimension?.dimType === \"colorStr\"\n ? resolvedValueCells.map((value) => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n })\n : [];\n const categories = resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\");\n const hierarchyCategories = (\n chartType === \"Sunburst\" || chartType === \"Treemap\"\n )\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const seriesTextFormula = resolveChartExTextFormula(series.text);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n\n return {\n bubbleSizeRef: null,\n bubbleSizes: [],\n categories,\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n formatIdx: typeof series.formatIdx === \"number\" ? series.formatIdx : undefined,\n hidden: typeof series.hidden === \"boolean\" ? series.hidden : undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: undefined,\n markerColor: rawFillColor ?? undefined,\n markerLineColor: rawLineColor ?? rawFillColor ?? undefined,\n markerSize: undefined,\n markerSymbol: undefined,\n name: typeof series.text === \"string\"\n ? series.text\n : seriesTextFormula\n ? resolveSeriesName(workbook, workbookSheetIndex, seriesTextFormula)\n : resolveChartReferenceLabel(workbook, workbookSheetIndex, valuesRef, `Series ${index + 1}`),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: {\n ...series,\n chartExColorStrings: colorStrings,\n chartExHierarchyCategories: hierarchyCategories,\n data: dataEntry,\n dimType: typeof valueDimension?.dimType === \"string\" ? valueDimension.dimType : undefined\n },\n shapeProperties,\n smooth: undefined,\n values,\n valuesRef\n };\n}\n\nfunction collapseChartExPointSeries(chartType: XlsxChart[\"chartType\"], series: XlsxChartSeries[]) {\n if (chartType !== \"Funnel\" && chartType !== \"Waterfall\") {\n if (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && series.length > 1\n && series.every((entry) => {\n const raw = entry.raw && typeof entry.raw === \"object\" ? entry.raw as Record<string, unknown> : null;\n return raw?.dimType === \"size\";\n })\n ) {\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n return [\n {\n ...primarySeries,\n dataPoints: [],\n hidden: false\n }\n ];\n }\n return series;\n }\n\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n\n return [\n {\n ...primarySeries,\n categories: [],\n categoriesRef: null,\n dataPoints: [],\n hidden: false\n }\n ];\n}\n\nfunction normalizeChartExChart(\n workbook: Workbook,\n workbookSheetIndex: number,\n visibleSheetIndex: number,\n raw: unknown,\n index: number,\n themePalette?: XlsxThemePalette | null\n): XlsxChart {\n const chart = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const plotArea = chart.plotArea && typeof chart.plotArea === \"object\"\n ? chart.plotArea as Record<string, unknown>\n : {};\n const rawSeries = Array.isArray(plotArea.series) ? plotArea.series : [];\n const seriesLayouts = rawSeries.map(resolveChartExSeriesLayout);\n const dataEntries = Array.isArray(chart.data) ? chart.data : [];\n const dataById = new Map<number, Record<string, unknown>>();\n dataEntries.forEach((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return;\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.id === \"number\") {\n dataById.set(record.id, record);\n }\n });\n const axes = Array.isArray(plotArea.axes)\n ? plotArea.axes.map(normalizeChartExAxis).filter((value): value is XlsxChartAxis => Boolean(value))\n : [];\n const primaryLayout = typeof chart.layout === \"string\"\n ? chart.layout\n : seriesLayouts.find((value): value is string => typeof value === \"string\" && value.length > 0);\n const fallbackTitle = humanizeChartExLayoutLabel(primaryLayout);\n const chartTitle = resolveChartExTitleText(chart.title) ?? (chart.title != null ? \"Chart Title\" : fallbackTitle);\n const chartType = resolveChartExLayoutChartType(primaryLayout);\n const normalizedSeries = rawSeries.map((entry, seriesIndex) => (\n normalizeChartExSeries(workbook, workbookSheetIndex, `chart-ex-${workbookSheetIndex}-${index}`, entry, dataById, seriesIndex, chartType)\n ));\n const clusteredColumnSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const clusteredColumnAxisIds = clusteredColumnSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[clusteredColumnSeriesIndex])\n : [];\n const paretoLineSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"paretoLine\");\n const paretoLineAxisIds = paretoLineSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[paretoLineSeriesIndex])\n : [];\n const primaryHistogramSeries = clusteredColumnSeriesIndex >= 0\n ? buildChartExHistogramSeries(normalizedSeries[clusteredColumnSeriesIndex] ?? normalizedSeries[0], rawSeries[clusteredColumnSeriesIndex], hasParetoLine)\n : null;\n const synthesizedParetoSeries = (\n hasParetoLine\n && primaryHistogramSeries\n && primaryHistogramSeries.values.length > 0\n )\n ? buildChartExParetoLineSeries(primaryHistogramSeries, rawSeries[paretoLineSeriesIndex], paretoLineSeriesIndex)\n : null;\n const resolvedSeries = synthesizedParetoSeries\n ? [primaryHistogramSeries!, synthesizedParetoSeries]\n : primaryHistogramSeries\n ? [\n primaryHistogramSeries,\n ...normalizedSeries.filter((_, seriesIndex) => seriesIndex !== clusteredColumnSeriesIndex)\n ]\n : collapseChartExPointSeries(chartType, normalizedSeries);\n const resolvedChartType = primaryHistogramSeries ? \"ColumnClustered\" : chartType;\n const resolvedGapWidth = primaryHistogramSeries ? 0 : undefined;\n const typeGroups = synthesizedParetoSeries\n ? [\n {\n axisIds: clusteredColumnAxisIds,\n chartType: \"ColumnClustered\",\n gapWidth: 0,\n raw: {\n gapWidth: 0,\n layout: \"clusteredColumn\"\n },\n series: [primaryHistogramSeries!]\n },\n {\n axisIds: paretoLineAxisIds,\n chartType: \"Line\",\n raw: {\n layout: \"paretoLine\"\n },\n series: [synthesizedParetoSeries]\n }\n ]\n : [];\n const normalizedChart: XlsxChart = {\n anchor: normalizeChartAnchor(chart.anchor),\n autoTitleDeleted: undefined,\n axes,\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: axes[0] ?? null,\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartExLayout: primaryLayout,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: resolvedChartType,\n dataLabels: rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null,\n displayBlanksAs: undefined,\n editable: true,\n firstSliceAngle: undefined,\n fontFamily: undefined,\n gapWidth: resolvedGapWidth,\n holeSize: undefined,\n id: `chart-ex-${workbookSheetIndex}-${index}`,\n is3d: undefined,\n legend: normalizeChartExLegend(chart.legend),\n name: chartTitle,\n overlap: undefined,\n plotVisibleOnly: undefined,\n raw: chart,\n radarStyle: undefined,\n scatterStyle: undefined,\n roundedCorners: undefined,\n shape3d: undefined,\n seriesAxis: null,\n series: resolvedSeries,\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: undefined,\n bubble3d: undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: chartTitle,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups,\n valueAxis: axes.find((axis) => axis.numberFormat || axis.majorGridlines) ?? axes[1] ?? null,\n varyColors: typeof chart.valueColors === \"boolean\" ? chart.valueColors : undefined,\n view3d: undefined,\n wireframe: undefined,\n workbookSheetIndex,\n zIndex: index\n };\n\n applyBuiltinChartDefaults(normalizedChart, themePalette);\n return normalizedChart;\n}\n\nfunction cellValueToNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return null;\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asNumber?: () => unknown }).asNumber === \"function\") {\n candidates.push((value as { asNumber: () => unknown }).asNumber());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const parsed = Number(candidate.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n }\n if (typeof value === \"string\") {\n const parsed = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction cellValueToDisplay(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return \"\";\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) {\n continue;\n }\n if (typeof candidate === \"string\") {\n return candidate;\n }\n return String(candidate);\n }\n }\n return String(value);\n}\n\nfunction resolveReferenceValues(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n mode: \"category\" | \"value\"\n): Array<number | string | null> {\n if (!reference?.formula) {\n return reference?.values ?? [];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return reference.values ?? [];\n }\n\n const values: Array<number | string | null> = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n if (mode === \"value\") {\n values.push(cellValueToNumber(calculated ?? formatted));\n } else {\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n values.push(display.length > 0 ? display : (numeric !== null ? numeric : null));\n }\n }\n }\n\n return values;\n}\n\nfunction resolveSeriesName(workbook: Workbook, fallbackSheetIndex: number, rawName: unknown) {\n if (typeof rawName !== \"string\" || !rawName) {\n return undefined;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, rawName);\n if (!resolved.sheet || !resolved.range) {\n return rawName;\n }\n\n const value = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(resolved.range.start.row, resolved.range.start.col)\n : null;\n const display = cellValueToDisplay(value);\n return display || rawName;\n}\n\nfunction normalizeChartReference(raw: unknown): XlsxChartReference | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n return {\n formula: typeof record.formula === \"string\" ? record.formula : undefined,\n refType: typeof record.refType === \"string\" ? record.refType : undefined,\n values: Array.isArray(record.values) ? record.values as Array<number | string | null> : undefined\n };\n}\n\nfunction normalizeChartAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const rawAxis = raw as Record<string, unknown>;\n const axis = rawAxis.axis && typeof rawAxis.axis === \"object\"\n ? rawAxis.axis as Record<string, unknown>\n : rawAxis;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n crossId: typeof rawAxis.crossId === \"number\" && Number.isFinite(rawAxis.crossId) ? rawAxis.crossId : undefined,\n crosses: typeof axis.crosses === \"string\" ? axis.crosses : undefined,\n crossBetween: typeof axis.crossBetween === \"string\" ? axis.crossBetween : undefined,\n delete: typeof axis.delete === \"boolean\" ? axis.delete : undefined,\n id: typeof rawAxis.id === \"number\" && Number.isFinite(rawAxis.id) ? rawAxis.id : undefined,\n labelPosition: typeof axis.labelPosition === \"string\" ? axis.labelPosition : undefined,\n logBase: typeof axis.logBase === \"number\" ? axis.logBase : undefined,\n orientation: typeof axis.orientation === \"string\" ? axis.orientation : undefined,\n majorUnit: typeof axis.majorUnit === \"number\" ? axis.majorUnit : undefined,\n max: typeof axis.max === \"number\" ? axis.max : undefined,\n min: typeof axis.min === \"number\" ? axis.min : undefined,\n majorGridlines: typeof axis.majorGridlines === \"boolean\" ? axis.majorGridlines : undefined,\n majorTickMark: typeof axis.majorTickMark === \"string\" ? axis.majorTickMark : undefined,\n minorUnit: typeof axis.minorUnit === \"number\" ? axis.minorUnit : undefined,\n minorGridlines: typeof axis.minorGridlines === \"boolean\" ? axis.minorGridlines : undefined,\n minorTickMark: typeof axis.minorTickMark === \"string\" ? axis.minorTickMark : undefined,\n numberFormat: numberFormat ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n } : undefined,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n raw: axis,\n shapeProperties: axis.shapeProperties && typeof axis.shapeProperties === \"object\"\n ? axis.shapeProperties as Record<string, unknown>\n : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" && Number.isFinite(axis.tickLabelSkip) ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" && Number.isFinite(axis.tickMarkSkip) ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction mergeChartAxis(target: XlsxChartAxis | null | undefined, patch: Partial<XlsxChartAxis> | null | undefined) {\n if (!patch) {\n return target ?? null;\n }\n return {\n ...(target ?? {}),\n ...patch\n };\n}\n\nfunction readChartAxisFromXml(axisNode: Element | null): Partial<XlsxChartAxis> | null {\n if (!axisNode) {\n return null;\n }\n\n const numFmt = getFirstLocalChild(axisNode, \"numFmt\");\n const scalingNode = getFirstLocalChild(axisNode, \"scaling\");\n return {\n crossId: readChartNumericAttribute(axisNode, \"crossAx\"),\n crosses: getFirstLocalChild(axisNode, \"crosses\")?.getAttribute(\"val\") ?? undefined,\n crossBetween: getFirstLocalChild(axisNode, \"crossBetween\")?.getAttribute(\"val\") ?? undefined,\n delete: getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"1\"\n ? true\n : getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"0\"\n ? false\n : undefined,\n id: readChartNumericAttribute(axisNode, \"axId\"),\n labelPosition: getFirstLocalChild(axisNode, \"tickLblPos\")?.getAttribute(\"val\") ?? undefined,\n logBase: readChartNumericAttribute(getFirstLocalChild(axisNode, \"scaling\"), \"logBase\"),\n orientation: getFirstLocalChild(scalingNode ?? axisNode, \"orientation\")?.getAttribute(\"val\") ?? undefined,\n majorGridlines: Boolean(getFirstLocalChild(axisNode, \"majorGridlines\")),\n majorTickMark: getFirstLocalChild(axisNode, \"majorTickMark\")?.getAttribute(\"val\") ?? undefined,\n majorUnit: readChartNumericAttribute(axisNode, \"majorUnit\"),\n max: readChartNumericAttribute(scalingNode, \"max\"),\n min: readChartNumericAttribute(scalingNode, \"min\"),\n minorGridlines: Boolean(getFirstLocalChild(axisNode, \"minorGridlines\")),\n minorTickMark: getFirstLocalChild(axisNode, \"minorTickMark\")?.getAttribute(\"val\") ?? undefined,\n minorUnit: readChartNumericAttribute(axisNode, \"minorUnit\"),\n numberFormat: numFmt\n ? {\n formatCode: numFmt.getAttribute(\"formatCode\") ?? undefined,\n sourceLinked: numFmt.getAttribute(\"sourceLinked\") === \"1\"\n ? true\n : numFmt.getAttribute(\"sourceLinked\") === \"0\"\n ? false\n : undefined\n }\n : undefined,\n position: getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\") ?? undefined,\n tickLabelSkip: readChartNumericAttribute(axisNode, \"tickLblSkip\"),\n tickMarkSkip: readChartNumericAttribute(axisNode, \"tickMarkSkip\")\n };\n}\n\nfunction readChartWallFromXml(wallNode: Element | null, themePalette?: XlsxThemePalette | null): XlsxChartWall | null {\n if (!wallNode) {\n return null;\n }\n const shapeProperties = getFirstLocalChild(wallNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n fillColor: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n hidden: shapeProperties ? getFirstLocalChild(shapeProperties, \"noFill\") != null : undefined,\n lineColor: lineStyle.color ?? undefined,\n thickness: readChartNumericAttribute(wallNode, \"thickness\")\n };\n}\n\nfunction normalizeChartDataLabels(raw: unknown): XlsxChartDataLabels | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const labels = raw as Record<string, unknown>;\n const pointLabels = Array.isArray(labels.pointLabels)\n ? (() => {\n const normalized: XlsxChartPointDataLabel[] = [];\n for (const entry of labels.pointLabels) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const point = entry as Record<string, unknown>;\n const index = typeof point.index === \"number\" && Number.isFinite(point.index)\n ? point.index\n : null;\n if (index == null) {\n continue;\n }\n\n const nextPoint: XlsxChartPointDataLabel = { index };\n if (typeof point.deleted === \"boolean\") {\n nextPoint.deleted = point.deleted;\n }\n if (typeof point.fontSizePt === \"number\" && Number.isFinite(point.fontSizePt)) {\n nextPoint.fontSizePt = point.fontSizePt;\n }\n if (typeof point.showBubbleSize === \"boolean\") {\n nextPoint.showBubbleSize = point.showBubbleSize;\n }\n if (typeof point.showCategoryName === \"boolean\") {\n nextPoint.showCategoryName = point.showCategoryName;\n }\n if (typeof point.showPercent === \"boolean\") {\n nextPoint.showPercent = point.showPercent;\n }\n if (typeof point.showSeriesName === \"boolean\") {\n nextPoint.showSeriesName = point.showSeriesName;\n }\n if (typeof point.showValue === \"boolean\") {\n nextPoint.showValue = point.showValue;\n }\n if (typeof point.x === \"number\" && Number.isFinite(point.x)) {\n nextPoint.x = point.x;\n }\n if (typeof point.y === \"number\" && Number.isFinite(point.y)) {\n nextPoint.y = point.y;\n }\n normalized.push(nextPoint);\n }\n return normalized;\n })()\n : undefined;\n return {\n pointLabels: pointLabels && pointLabels.length > 0 ? pointLabels : undefined,\n raw: labels,\n showBubbleSize: typeof labels.showBubbleSize === \"boolean\" ? labels.showBubbleSize : undefined,\n showCategoryName: typeof labels.showCategoryName === \"boolean\" ? labels.showCategoryName : undefined,\n showLegendKey: typeof labels.showLegendKey === \"boolean\" ? labels.showLegendKey : undefined,\n showPercent: typeof labels.showPercent === \"boolean\" ? labels.showPercent : undefined,\n showSeriesName: typeof labels.showSeriesName === \"boolean\" ? labels.showSeriesName : undefined,\n showValue: typeof labels.showValue === \"boolean\" ? labels.showValue : undefined\n };\n}\n\nfunction normalizeChartAnchor(raw: unknown): XlsxImageAnchor {\n if (!raw || typeof raw !== \"object\") {\n return {\n kind: \"two-cell\",\n from: { col: 0, colOffsetEmu: 0, row: 0, rowOffsetEmu: 0 },\n to: { col: 8, colOffsetEmu: 0, row: 15, rowOffsetEmu: 0 }\n };\n }\n\n const anchor = raw as Record<string, unknown>;\n const fromCol = typeof anchor.fromCol === \"number\" ? anchor.fromCol : 0;\n const fromColOffsetEmu = typeof anchor.fromColOffset === \"number\" ? anchor.fromColOffset : 0;\n const fromRow = typeof anchor.fromRow === \"number\" ? anchor.fromRow : 0;\n const fromRowOffsetEmu = typeof anchor.fromRowOffset === \"number\" ? anchor.fromRowOffset : 0;\n const rawToCol = typeof anchor.toCol === \"number\" ? anchor.toCol : null;\n const rawToColOffsetEmu = typeof anchor.toColOffset === \"number\" ? anchor.toColOffset : 0;\n const rawToRow = typeof anchor.toRow === \"number\" ? anchor.toRow : null;\n const rawToRowOffsetEmu = typeof anchor.toRowOffset === \"number\" ? anchor.toRowOffset : 0;\n const hasExplicitTo = rawToCol !== null && rawToRow !== null;\n const collapsedWidth = hasExplicitTo && (\n rawToCol < fromCol ||\n (rawToCol === fromCol && rawToColOffsetEmu <= fromColOffsetEmu)\n );\n const collapsedHeight = hasExplicitTo && (\n rawToRow < fromRow ||\n (rawToRow === fromRow && rawToRowOffsetEmu <= fromRowOffsetEmu)\n );\n const fallbackToCol = Math.max(fromCol + 8, 8);\n const fallbackToRow = Math.max(fromRow + 15, 15);\n\n return {\n kind: \"two-cell\",\n from: {\n col: fromCol,\n colOffsetEmu: fromColOffsetEmu,\n row: fromRow,\n rowOffsetEmu: fromRowOffsetEmu\n },\n to: {\n col: !hasExplicitTo || collapsedWidth ? fallbackToCol : rawToCol,\n colOffsetEmu: !hasExplicitTo || collapsedWidth ? 0 : rawToColOffsetEmu,\n row: !hasExplicitTo || collapsedHeight ? fallbackToRow : rawToRow,\n rowOffsetEmu: !hasExplicitTo || collapsedHeight ? 0 : rawToRowOffsetEmu\n }\n };\n}\n\nfunction parseMarkerNode(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstLocalChild(node, \"col\")?.textContent ?? Number.NaN);\n const row = Number(getFirstLocalChild(node, \"row\")?.textContent ?? Number.NaN);\n const colOffsetEmu = Number(getFirstLocalChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstLocalChild(node, \"rowOff\")?.textContent ?? 0);\n\n if (!Number.isFinite(col) || !Number.isFinite(row)) {\n return null;\n }\n\n return {\n col: Math.max(0, Math.round(col)),\n colOffsetEmu: Number.isFinite(colOffsetEmu) ? Math.max(0, Math.round(colOffsetEmu)) : 0,\n row: Math.max(0, Math.round(row)),\n rowOffsetEmu: Number.isFinite(rowOffsetEmu) ? Math.max(0, Math.round(rowOffsetEmu)) : 0\n };\n}\n\nfunction parseChartAnchorNode(anchorNode: Element): XlsxImageAnchor | null {\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const to = parseMarkerNode(getFirstLocalChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\", to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return from && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n from,\n kind: \"one-cell\",\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const x = Number(pos?.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pos?.getAttribute(\"y\") ?? Number.NaN);\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n kind: \"absolute\",\n positionEmu: {\n x: Math.round(x),\n y: Math.round(y)\n },\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n}\n\nfunction isCollapsedChartAnchor(anchor: XlsxImageAnchor) {\n if (anchor.kind !== \"two-cell\") {\n return false;\n }\n\n const collapsedWidth = anchor.to.col < anchor.from.col\n || (anchor.to.col === anchor.from.col && anchor.to.colOffsetEmu <= anchor.from.colOffsetEmu);\n const collapsedHeight = anchor.to.row < anchor.from.row\n || (anchor.to.row === anchor.from.row && anchor.to.rowOffsetEmu <= anchor.from.rowOffsetEmu);\n return collapsedWidth || collapsedHeight;\n}\n\nfunction normalizeChartSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const categoriesRef = normalizeChartReference(series.categories);\n const valuesRef = normalizeChartReference(series.values);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n const bubbleSizeRef = normalizeChartReference(series.bubbleSize ?? series.bubbleSizes ?? series.bubbles);\n\n return {\n bubbleSizeRef,\n bubbleSizes: resolveReferenceValues(workbook, workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n categories: resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\"),\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: typeof series.invertIfNegative === \"boolean\" ? series.invertIfNegative : undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: series.marker && typeof series.marker === \"object\" ? series.marker as Record<string, unknown> : undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).size === \"number\"\n ? Number((series.marker as Record<string, unknown>).size)\n : undefined,\n markerSymbol: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).symbol === \"string\"\n ? String((series.marker as Record<string, unknown>).symbol)\n : undefined,\n name: resolveSeriesName(workbook, workbookSheetIndex, series.name),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: series,\n shapeProperties,\n smooth: typeof series.smooth === \"boolean\" ? series.smooth : undefined,\n values: resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n valuesRef\n };\n}\n\nfunction normalizeChartTypeGroup(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartTypeGroup | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const group = raw as Record<string, unknown>;\n const rawSeries = Array.isArray(group.series) ? group.series : [];\n return {\n axisIds: Array.isArray(group.axisIds)\n ? group.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value))\n : undefined,\n chartType: typeof group.chartType === \"string\" ? group.chartType : \"ColumnClustered\",\n dataLabels: normalizeChartDataLabels(group.dataLabels),\n gapWidth: typeof group.gapWidth === \"number\" && Number.isFinite(group.gapWidth) ? group.gapWidth : undefined,\n is3d: typeof group.is3d === \"boolean\" ? group.is3d : undefined,\n overlap: typeof group.overlap === \"number\" && Number.isFinite(group.overlap) ? group.overlap : undefined,\n raw: group,\n series: rawSeries.map((entry, seriesIndex) => (\n normalizeChartSeries(workbook, workbookSheetIndex, `${chartId}-group-${index}`, entry, seriesIndex)\n )),\n varyColors: typeof group.varyColors === \"boolean\" ? group.varyColors : undefined\n };\n}\n\nfunction normalizeChartsheet(raw: unknown, index: number): XlsxChartsheet {\n const chartsheet = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n return {\n chartIds: Array.isArray(chartsheet.chartIds) ? chartsheet.chartIds.filter((value): value is string => typeof value === \"string\") : [],\n chartPath: typeof chartsheet.chartPath === \"string\" ? chartsheet.chartPath : undefined,\n id: `chartsheet-${index}`,\n index,\n name: typeof chartsheet.name === \"string\" ? chartsheet.name : `Chart ${index + 1}`,\n raw: chartsheet,\n workbookSheetIndex: typeof chartsheet.workbookSheetIndex === \"number\" ? chartsheet.workbookSheetIndex : undefined\n };\n}\n\nfunction buildTabs(\n workbook: Workbook,\n chartsheets: XlsxChartsheet[],\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): XlsxWorkbookTab[] {\n const rawOrder = Array.isArray(workbook.sheetOrder) ? workbook.sheetOrder as Array<Record<string, unknown>> : [];\n if (rawOrder.length === 0) {\n return workbook.sheetNames.flatMap((name, index) => {\n const worksheet = workbook.getSheet(index);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${index}`,\n index,\n kind: \"sheet\" as const,\n name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(index) ?? index,\n visibility,\n workbookSheetIndex: index\n }];\n });\n }\n\n return rawOrder.flatMap<XlsxWorkbookTab>((entry, index) => {\n const slotType = typeof entry.slotType === \"string\" ? entry.slotType : \"worksheet\";\n const slotIndex = typeof entry.index === \"number\" ? entry.index : index;\n if (slotType === \"chartsheet\") {\n const chartsheet = chartsheets[slotIndex];\n return chartsheet ? [{\n chartsheetIndex: slotIndex,\n id: `chartsheet-${slotIndex}`,\n index,\n kind: \"chartsheet\" as const,\n name: chartsheet.name\n }] : [];\n }\n\n const worksheet = workbook.getSheet(slotIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${slotIndex}`,\n index,\n kind: \"sheet\" as const,\n name: worksheet.name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(slotIndex) ?? slotIndex,\n visibility,\n workbookSheetIndex: slotIndex\n }];\n });\n}\n\nfunction collectChartOriginsForSheet(\n archive: Record<string, Uint8Array>,\n origin: WorkbookImageSheetOrigin | null\n) {\n if (!origin) {\n return [] as WorkbookChartOrigin[];\n }\n\n const chartOrigins: WorkbookChartOrigin[] = [];\n\n for (const attachment of origin.attachments) {\n const drawingXml = readArchiveText(archive, attachment.drawingPath);\n const relsXml = readArchiveText(archive, attachment.drawingRelsPath);\n if (!drawingXml || !relsXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n const relsDocument = parseXml(relsXml);\n if (!drawingDocument || !relsDocument) {\n continue;\n }\n\n const relationships = new Map<string, { target: string; type: string | null }>();\n for (const node of getLocalDescendants(relsDocument, \"Relationship\")) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (id && target) {\n relationships.set(id, {\n target: resolveRelationshipPath(attachment.drawingRelsPath ?? attachment.drawingPath, target),\n type\n });\n }\n }\n\n const anchorNodes = Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n );\n\n let chartAnchorIndex = 0;\n for (const anchorNode of anchorNodes) {\n const graphicFrame = getFirstLocalDescendant(anchorNode, \"graphicFrame\");\n const chartNode = graphicFrame ? getFirstLocalDescendant(graphicFrame, \"chart\") : null;\n const relationshipId = chartNode?.getAttributeNS(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\", \"id\")\n ?? chartNode?.getAttribute(\"r:id\")\n ?? chartNode?.getAttribute(\"id\");\n if (!relationshipId) {\n continue;\n }\n const relationship = relationships.get(relationshipId);\n if (!relationship || (relationship.type !== CHART_REL_TYPE && relationship.type !== CHART_EX_REL_TYPE)) {\n continue;\n }\n\n chartOrigins.push({\n anchorIndex: chartAnchorIndex,\n anchor: parseChartAnchorNode(anchorNode),\n chartKind: relationship.type === CHART_EX_REL_TYPE ? \"modern\" : \"classic\",\n chartPath: relationship.target,\n drawingPath: attachment.drawingPath,\n workbookSheetIndex: origin.workbookSheetIndex\n });\n chartAnchorIndex += 1;\n }\n }\n\n return chartOrigins;\n}\n\nfunction applyChartOrigins(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n chartOriginsById: Map<string, WorkbookChartOrigin>,\n archive: Record<string, Uint8Array>,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n for (let workbookSheetIndex = 0; workbookSheetIndex < chartsByWorkbookSheetIndex.length; workbookSheetIndex += 1) {\n const charts = chartsByWorkbookSheetIndex[workbookSheetIndex] ?? [];\n const origins = collectChartOriginsForSheet(archive, sheetOrigins[workbookSheetIndex] ?? null);\n const originsByKind = {\n classic: origins.filter((origin) => origin.chartKind === \"classic\"),\n modern: origins.filter((origin) => origin.chartKind === \"modern\")\n };\n const chartIndexByKind = {\n classic: 0,\n modern: 0\n };\n\n charts.forEach((chart) => {\n const chartKind = chart.id.startsWith(\"chart-ex-\") ? \"modern\" : \"classic\";\n const origin = originsByKind[chartKind][chartIndexByKind[chartKind]];\n chartIndexByKind[chartKind] += 1;\n if (!origin) {\n return;\n }\n if (origin.anchor && isCollapsedChartAnchor(chart.anchor)) {\n chart.anchor = origin.anchor;\n } else if (origin.anchor && chart.anchor.kind === \"two-cell\" && chart.anchor.from.col === 0 && chart.anchor.from.row === 0) {\n chart.anchor = origin.anchor;\n }\n chart.chartPath = origin.chartPath ?? undefined;\n chartOriginsById.set(chart.id, origin);\n });\n }\n}\n\nexport function loadWorkbookChartAssets(\n workbook: Workbook,\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\"> | null,\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): WorkbookChartAssets {\n const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = workbook.getSheet(workbookSheetIndex);\n const rawCharts = Array.isArray(worksheet.charts) ? worksheet.charts : [];\n const rawChartsEx = Array.isArray(worksheet.chartsEx) ? worksheet.chartsEx : [];\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(workbookSheetIndex) ?? workbookSheetIndex;\n\n const classicCharts = rawCharts.map((rawChart, chartIndex) => {\n const chartId = `chart-${workbookSheetIndex}-${chartIndex}`;\n const chart = rawChart && typeof rawChart === \"object\" ? rawChart as Record<string, unknown> : {};\n const rawView3d = chart.view3d && typeof chart.view3d === \"object\"\n ? chart.view3d as Record<string, unknown>\n : null;\n const rawSeries = Array.isArray(chart.series) ? chart.series : [];\n const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);\n const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null;\n return {\n anchor: normalizeChartAnchor(chart.anchor),\n autoTitleDeleted: typeof chart.autoTitleDeleted === \"boolean\" ? chart.autoTitleDeleted : undefined,\n axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value): value is XlsxChartAxis => Boolean(value)) : [],\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: normalizeChartAxis(chart.categoryAxis),\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: typeof chart.chartType === \"string\" ? chart.chartType : \"ColumnClustered\",\n dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,\n displayBlanksAs: typeof chart.displayBlanksAs === \"string\" ? chart.displayBlanksAs : undefined,\n editable: true,\n firstSliceAngle: typeof chart.firstSliceAngle === \"number\" ? chart.firstSliceAngle : undefined,\n fontFamily: undefined,\n gapWidth: typeof chart.gapWidth === \"number\" ? chart.gapWidth : undefined,\n holeSize: typeof chart.holeSize === \"number\" ? chart.holeSize : undefined,\n id: chartId,\n is3d: typeof chart.is3d === \"boolean\" ? chart.is3d : undefined,\n legend: normalizeLegend(chart.legend)\n ? {\n ...normalizeLegend(chart.legend),\n position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)\n }\n : null,\n name: typeof chart.name === \"string\" ? chart.name : undefined,\n overlap: typeof chart.overlap === \"number\" ? chart.overlap : undefined,\n plotVisibleOnly: typeof chart.plotVisibleOnly === \"boolean\" ? chart.plotVisibleOnly : undefined,\n raw: chart,\n radarStyle: typeof chart.radarStyle === \"string\" ? chart.radarStyle : undefined,\n scatterStyle: typeof chart.scatterStyle === \"string\" ? chart.scatterStyle : undefined,\n roundedCorners: typeof chart.roundedCorners === \"boolean\" ? chart.roundedCorners : undefined,\n shape3d: typeof chart.shape === \"string\"\n ? chart.shape\n : typeof chart.shape3d === \"string\"\n ? chart.shape3d\n : undefined,\n seriesAxis: null,\n series: rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex)),\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: typeof chart.showDlblsOverMax === \"boolean\" ? chart.showDlblsOverMax : undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: typeof chart.bubbleScale === \"number\" ? chart.bubbleScale : undefined,\n bubble3d: typeof chart.bubble3d === \"boolean\" ? chart.bubble3d : undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: typeof chart.title === \"string\" ? chart.title : undefined,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups: Array.isArray(chart.typeGroups)\n ? chart.typeGroups\n .map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex))\n .filter((value): value is XlsxChartTypeGroup => value != null)\n : [],\n valueAxis: normalizeChartAxis(chart.valueAxis),\n varyColors: typeof chart.varyColors === \"boolean\" ? chart.varyColors : undefined,\n view3d: rawView3d\n ? {\n depthPercent: typeof rawView3d.depthPercent === \"number\" ? rawView3d.depthPercent : undefined,\n perspective: typeof rawView3d.perspective === \"number\" ? rawView3d.perspective : undefined,\n rAngAx: typeof rawView3d.rAngAx === \"boolean\"\n ? rawView3d.rAngAx\n : typeof rawView3d.rightAngleAxes === \"boolean\"\n ? rawView3d.rightAngleAxes\n : undefined,\n rotX: typeof rawView3d.rotX === \"number\"\n ? rawView3d.rotX\n : typeof rawView3d.rotateX === \"number\"\n ? rawView3d.rotateX\n : undefined,\n rotY: typeof rawView3d.rotY === \"number\"\n ? rawView3d.rotY\n : typeof rawView3d.rotateY === \"number\"\n ? rawView3d.rotateY\n : undefined\n }\n : undefined,\n wireframe: typeof chart.wireframe === \"boolean\" ? chart.wireframe : undefined,\n workbookSheetIndex,\n zIndex: 200 + chartIndex\n } satisfies XlsxChart;\n });\n\n const modernCharts = rawChartsEx.map((rawChartEx, chartExIndex) => (\n normalizeChartExChart(\n workbook,\n workbookSheetIndex,\n visibleSheetIndex,\n rawChartEx,\n chartExIndex,\n imageAssets?.themePalette ?? null\n )\n ));\n\n return [...classicCharts, ...modernCharts];\n });\n\n const chartsheets = Array.isArray(workbook.chartsheets)\n ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index))\n : [];\n const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets);\n const chartOriginsById = new Map<string, WorkbookChartOrigin>();\n\n if (imageAssets) {\n applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);\n applyBuiltinChartDefaults(chart, imageAssets.themePalette);\n }\n }\n } else {\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyBuiltinChartDefaults(chart, null);\n }\n }\n }\n\n return {\n chartOriginsById,\n chartsByWorkbookSheetIndex,\n chartsheets,\n tabs\n };\n}\n\nfunction getChartAnchorNodes(drawingDocument: XMLDocument) {\n return Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n )\n .filter((anchorNode) => {\n const graphicFrame = getFirstLocalChild(anchorNode, \"graphicFrame\");\n return Boolean(graphicFrame && getFirstLocalDescendant(graphicFrame, \"chart\"));\n });\n}\n\nfunction updateMarkerNode(markerNode: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!markerNode) {\n return;\n }\n\n setLeafValue(markerNode, \"col\", String(Math.max(0, Math.round(marker.col))));\n setLeafValue(markerNode, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setLeafValue(markerNode, \"row\", String(Math.max(0, Math.round(marker.row))));\n setLeafValue(markerNode, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImageAnchor) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n updateMarkerNode(getFirstLocalChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n if (pos) {\n pos.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n pos.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nfunction setChartTitle(chartNode: Element, value: string | undefined) {\n const existing = getFirstLocalChild(chartNode, \"title\");\n if (!value) {\n existing?.remove();\n return;\n }\n\n const titleNode = existing ?? chartNode.insertBefore(\n chartNode.ownerDocument.createElementNS(CHART_NS, \"c:title\"),\n chartNode.firstChild\n );\n while (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n const tx = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:tx\");\n const rich = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:rich\");\n const bodyPr = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:bodyPr\");\n const lstStyle = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:lstStyle\");\n const p = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:p\");\n const r = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:r\");\n const t = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:t\");\n t.textContent = value;\n r.appendChild(t);\n p.appendChild(r);\n rich.append(bodyPr, lstStyle, p);\n tx.appendChild(rich);\n titleNode.appendChild(tx);\n}\n\nfunction setRefFormula(parent: Element, refNodeName: string, formula: string | undefined) {\n if (!formula) {\n return;\n }\n\n const refNode = ensureChild(parent, refNodeName);\n setLeafValue(refNode, \"f\", formula);\n}\n\nfunction updateSeriesNodes(chartTypeNode: Element, chart: Partial<XlsxChart>) {\n if (!chart.series) {\n return;\n }\n\n const seriesNodes = getLocalDescendants(chartTypeNode, \"ser\");\n chart.series.forEach((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return;\n }\n\n if (series.name !== undefined) {\n const tx = ensureChild(seriesNode, \"tx\");\n const strRef = ensureChild(tx, \"strRef\");\n setLeafValue(strRef, \"f\", series.name);\n }\n if (series.categoriesRef?.formula) {\n const target = (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\"\n )\n ? ensureChild(seriesNode, \"xVal\")\n : ensureChild(seriesNode, \"cat\");\n setRefFormula(target, \"strRef\", series.categoriesRef.formula);\n }\n if (series.valuesRef?.formula) {\n const target = (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\"\n )\n ? ensureChild(seriesNode, \"yVal\")\n : ensureChild(seriesNode, \"val\");\n setRefFormula(target, \"numRef\", series.valuesRef.formula);\n }\n if (series.invertIfNegative !== undefined) {\n setBooleanValue(seriesNode, \"invertIfNegative\", series.invertIfNegative);\n }\n if (series.smooth !== undefined) {\n setBooleanValue(seriesNode, \"smooth\", series.smooth);\n }\n });\n}\n\nfunction updateAxisNode(axisNode: Element | null, axis: XlsxChartAxis | null | undefined) {\n if (!axisNode || !axis) {\n return;\n }\n\n if (axis.position) {\n setLeafValue(ensureChild(axisNode, \"axPos\"), \"val\", axis.position);\n getFirstLocalChild(axisNode, \"axPos\")?.setAttribute(\"val\", axis.position);\n }\n if (axis.majorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"majorGridlines\");\n if (axis.majorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:majorGridlines\"));\n } else if (!axis.majorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.minorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"minorGridlines\");\n if (axis.minorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:minorGridlines\"));\n } else if (!axis.minorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.majorTickMark) {\n getFirstLocalChild(axisNode, \"majorTickMark\")?.setAttribute(\"val\", axis.majorTickMark)\n ?? setBooleanValue(axisNode, \"majorTickMark\", false).setAttribute(\"val\", axis.majorTickMark);\n }\n if (axis.minorTickMark) {\n getFirstLocalChild(axisNode, \"minorTickMark\")?.setAttribute(\"val\", axis.minorTickMark)\n ?? setBooleanValue(axisNode, \"minorTickMark\", false).setAttribute(\"val\", axis.minorTickMark);\n }\n if (axis.labelPosition) {\n getFirstLocalChild(axisNode, \"tickLblPos\")?.setAttribute(\"val\", axis.labelPosition)\n ?? setBooleanValue(axisNode, \"tickLblPos\", false).setAttribute(\"val\", axis.labelPosition);\n }\n if (axis.crosses) {\n getFirstLocalChild(axisNode, \"crosses\")?.setAttribute(\"val\", axis.crosses)\n ?? setBooleanValue(axisNode, \"crosses\", false).setAttribute(\"val\", axis.crosses);\n }\n if (axis.crossBetween) {\n getFirstLocalChild(axisNode, \"crossBetween\")?.setAttribute(\"val\", axis.crossBetween)\n ?? setBooleanValue(axisNode, \"crossBetween\", false).setAttribute(\"val\", axis.crossBetween);\n }\n if (axis.delete !== undefined) {\n setBooleanValue(axisNode, \"delete\", axis.delete);\n }\n if (axis.numberFormat?.formatCode) {\n const numFmt = ensureChild(axisNode, \"numFmt\");\n numFmt.setAttribute(\"formatCode\", axis.numberFormat.formatCode);\n if (axis.numberFormat.sourceLinked !== undefined) {\n numFmt.setAttribute(\"sourceLinked\", axis.numberFormat.sourceLinked ? \"1\" : \"0\");\n }\n }\n}\n\nfunction updateDataLabels(chartTypeNode: Element, labels: XlsxChartDataLabels | null | undefined) {\n if (!labels) {\n return;\n }\n\n const labelsNode = ensureChild(chartTypeNode, \"dLbls\");\n if (labels.showLegendKey !== undefined) {\n setBooleanValue(labelsNode, \"showLegendKey\", labels.showLegendKey);\n }\n if (labels.showValue !== undefined) {\n setBooleanValue(labelsNode, \"showVal\", labels.showValue);\n }\n if (labels.showCategoryName !== undefined) {\n setBooleanValue(labelsNode, \"showCatName\", labels.showCategoryName);\n }\n if (labels.showSeriesName !== undefined) {\n setBooleanValue(labelsNode, \"showSerName\", labels.showSeriesName);\n }\n if (labels.showPercent !== undefined) {\n setBooleanValue(labelsNode, \"showPercent\", labels.showPercent);\n }\n if (labels.showBubbleSize !== undefined) {\n setBooleanValue(labelsNode, \"showBubbleSize\", labels.showBubbleSize);\n }\n}\n\nexport function updateWorkbookChartAnchor(\n imageAssets: Pick<WorkbookImageAssets, \"archive\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n anchor: XlsxImageAnchor\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin) {\n return false;\n }\n\n const drawingXml = readArchiveText(imageAssets.archive, origin.drawingPath);\n if (!drawingXml) {\n return false;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return false;\n }\n\n const anchorNode = getChartAnchorNodes(drawingDocument)[origin.anchorIndex];\n if (!anchorNode) {\n return false;\n }\n\n updateAnchorNode(anchorNode, anchor);\n imageAssets.archive[normalizeArchivePath(origin.drawingPath)] = strToU8(serializeXml(drawingDocument));\n return true;\n}\n\nexport function updateWorkbookChartDefinition(\n imageAssets: Pick<WorkbookImageAssets, \"archive\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n patch: Partial<XlsxChart>\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin?.chartPath) {\n return false;\n }\n\n const chartXml = readArchiveText(imageAssets.archive, origin.chartPath);\n if (!chartXml) {\n return false;\n }\n\n const chartDocument = parseXml(chartXml);\n if (!chartDocument) {\n return false;\n }\n\n const chartNode = getFirstLocalDescendant(chartDocument, \"chart\");\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n if (!chartNode || !plotAreaNode || !chartTypeNode) {\n return false;\n }\n\n if (patch.title !== undefined) {\n setChartTitle(chartNode, patch.title);\n }\n if (patch.displayBlanksAs) {\n const node = ensureChild(chartNode, \"dispBlanksAs\");\n node.setAttribute(\"val\", patch.displayBlanksAs);\n }\n if (patch.roundedCorners !== undefined) {\n setBooleanValue(chartNode, \"roundedCorners\", patch.roundedCorners);\n }\n if (patch.showDlblsOverMax !== undefined) {\n setBooleanValue(chartNode, \"showDLblsOverMax\", patch.showDlblsOverMax);\n }\n if (patch.varyColors !== undefined) {\n setBooleanValue(chartTypeNode, \"varyColors\", patch.varyColors);\n }\n if (patch.gapWidth !== undefined) {\n setNumericValue(chartTypeNode, \"gapWidth\", patch.gapWidth);\n }\n if (patch.overlap !== undefined) {\n const overlapNode = ensureChild(chartTypeNode, \"overlap\");\n overlapNode.setAttribute(\"val\", String(Math.round(patch.overlap)));\n }\n if (patch.dataLabels) {\n updateDataLabels(chartTypeNode, patch.dataLabels);\n }\n updateSeriesNodes(chartTypeNode, patch);\n updateAxisNode(\n getLocalChildren(plotAreaNode, \"catAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"dateAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"serAx\")[0]\n ?? null,\n patch.categoryAxis\n );\n updateAxisNode(getLocalChildren(plotAreaNode, \"valAx\")[0] ?? null, patch.valueAxis);\n\n imageAssets.archive[normalizeArchivePath(origin.chartPath)] = strToU8(serializeXml(chartDocument));\n return true;\n}\n","import { strFromU8, strToU8, unzipSync, zipSync } from \"fflate\";\nimport { resolveWorkbookColor } from \"./colors\";\nimport type {\n XlsxCellAddress,\n XlsxConditionalDataBarRule,\n XlsxConditionalFormatIcon,\n XlsxConditionalFormatRule,\n XlsxConditionalFormatValueObject,\n XlsxConditionalIconSetRule,\n XlsxCellRange,\n XlsxFormControl,\n XlsxImage,\n XlsxImageRect,\n XlsxImageResizeHandlePosition,\n XlsxResolvedCellStyle,\n XlsxShape,\n XlsxSparkline,\n XlsxTableStyleDefinition,\n XlsxThemePalette\n} from \"./types\";\n\nconst REL_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst SPREADSHEET_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst CONTENT_TYPES_NS = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nconst DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\nconst VML_DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\";\nconst CTRL_PROP_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp\";\nconst IMAGE_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nconst HYPERLINK_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\nconst DRAWING_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.drawing+xml\";\nconst EMU_PER_PIXEL = 9525;\nconst MIN_COL_WIDTH_PX = 30;\nconst MIN_ROW_HEIGHT_PX = 16;\nconst DEFAULT_COL_WIDTH_EMU = 64 * EMU_PER_PIXEL;\nconst DEFAULT_ROW_HEIGHT_EMU = 20 * EMU_PER_PIXEL;\nconst DEFAULT_COLUMN_CHARACTER_WIDTH_PX = 7;\nconst columnCharacterWidthCache = new Map<string, number>();\n\nfunction resolveDeviceGridlineThicknessPx() {\n if (typeof window === \"undefined\") {\n return 1;\n }\n\n const devicePixelRatio = window.devicePixelRatio;\n if (!Number.isFinite(devicePixelRatio) || devicePixelRatio <= 0) {\n return 1;\n }\n\n return 1 / devicePixelRatio;\n}\n\nfunction measureColumnCharacterWidthPx(fontFamily?: string | null, fontSizePt?: number | null) {\n const normalizedFamily = typeof fontFamily === \"string\" && fontFamily.trim().length > 0\n ? fontFamily.trim()\n : \"Calibri\";\n const normalizedSizePt = typeof fontSizePt === \"number\" && Number.isFinite(fontSizePt) && fontSizePt > 0\n ? fontSizePt\n : 11;\n const cacheKey = `${normalizedFamily}|${normalizedSizePt}`;\n const cached = columnCharacterWidthCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const fontSizePx = normalizedSizePt * (96 / 72);\n const font = `${fontSizePx}px \"${normalizedFamily}\"`;\n let width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n\n try {\n const context = typeof document !== \"undefined\"\n ? document.createElement(\"canvas\").getContext(\"2d\")\n : typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(32, 32).getContext(\"2d\")\n : null;\n if (context) {\n context.font = font;\n width = Math.max(1, context.measureText(\"0\").width);\n }\n } catch {\n width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n }\n\n columnCharacterWidthCache.set(cacheKey, width);\n return width;\n}\n\nfunction sheetColumnWidthToPixels(width: number, columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX) {\n if (!Number.isFinite(width) || width <= 0) {\n return MIN_COL_WIDTH_PX;\n }\n\n const digitWidth = Math.max(1, columnCharacterWidthPx);\n const pixels = width < 1\n ? Math.floor(width * (digitWidth + 5) + 0.5)\n : Math.floor(((256 * width + Math.floor(128 / digitWidth)) / 256) * digitWidth);\n return Math.max(MIN_COL_WIDTH_PX, pixels);\n}\n\ntype ArchiveEntries = Record<string, Uint8Array>;\n\ntype ContentTypesState = {\n defaultEntries: Map<string, string>;\n overrideEntries: Map<string, string>;\n};\n\ntype RelationshipRecord = {\n id: string;\n target: string;\n targetMode: string | null;\n type: string;\n};\n\ntype WorkbookSheetInfo = {\n name: string;\n path: string;\n};\n\ntype WorkbookSheetState = {\n cachedFormulaValues: Record<string, string>;\n columnWidthCharacterWidthPx?: number;\n colWidthOverridesPx: Record<number, number>;\n colStyleIds: Record<number, number>;\n conditionalFormatRules: XlsxConditionalFormatRule[];\n defaultColWidthPx: number;\n defaultRowHeightPx: number;\n hasHorizontalMerges: boolean;\n hasVerticalMerges: boolean;\n maxHorizontalMergeEndCol: number;\n maxVerticalMergeEndRow: number;\n maxContentCol: number;\n maxContentRow: number;\n minContentCol: number;\n minContentRow: number;\n hiddenCols: number[];\n hiddenRows: number[];\n rowHeightOverridesPx: Record<number, number>;\n rowStyleIds: Record<number, number>;\n showGridLines: boolean;\n sparklines: XlsxSparkline[];\n zoomScale: number;\n};\n\ntype ParseWorkbookStructureOptions = {\n includeCachedFormulaValues?: boolean;\n themePalette?: XlsxThemePalette | null;\n};\n\ntype ThemeState = {\n colors: Map<string, string>;\n majorLatinFont: string | null;\n minorLatinFont: string | null;\n};\n\ntype DrawingColor = {\n color: string;\n opacity: number;\n};\n\ntype DrawingRectEmu = {\n cx: number;\n cy: number;\n x: number;\n y: number;\n};\n\ntype ShapeVectorPath = {\n path: string;\n viewBox: {\n height: number;\n width: number;\n };\n};\n\ntype GroupTransform = {\n chCx: number;\n chCy: number;\n chX: number;\n chY: number;\n cx: number;\n cy: number;\n scaleX: number;\n scaleY: number;\n x: number;\n y: number;\n};\n\ntype XlsxImageAttachment = {\n drawingPath: string;\n drawingRelsPath: string | null;\n mediaPaths: string[];\n};\n\ntype WorkbookImageOrigin = {\n anchorIndex: number;\n workbookSheetIndex: number;\n};\n\ntype ParsedSheetFormControl = {\n anchor: XlsxFormControl[\"anchor\"] | null;\n controlRelationshipId: string | null;\n name?: string;\n shapeId: number | null;\n};\n\ntype ParsedCtrlProp = {\n checked?: boolean;\n linkedCell?: string;\n objectType?: string;\n};\n\ntype ParsedVmlFormControl = {\n checked?: boolean;\n fontFamily?: string;\n fontSizePt?: number;\n hidden: boolean;\n label?: string;\n linkedCell?: string;\n objectType?: string;\n shapeId: number | null;\n textAlign?: \"center\" | \"left\" | \"right\";\n textColor?: string;\n zIndex: number;\n};\n\nexport type WorkbookImageSheetOrigin = {\n attachments: XlsxImageAttachment[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookTableMetadata = {\n displayName?: string;\n headerRowCount?: number;\n headerRowCellStyle?: string;\n name?: string;\n reference?: string;\n totalsRowCount?: number;\n totalsRowShown?: boolean;\n};\n\nexport type WorkbookImageAssets = {\n archive: ArchiveEntries;\n formControlsByWorkbookSheetIndex: XlsxFormControl[][];\n imageOriginsById: Map<string, WorkbookImageOrigin>;\n imagesByWorkbookSheetIndex: XlsxImage[][];\n namedCellStyleByName: Record<string, XlsxResolvedCellStyle>;\n objectUrls: string[];\n shapesByWorkbookSheetIndex: XlsxShape[][];\n sheetStatesByWorkbookSheetIndex: Array<WorkbookSheetState | null>;\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>;\n styleById: Record<number, XlsxResolvedCellStyle>;\n tableMetadataByWorkbookSheetIndex: WorkbookTableMetadata[][];\n tableStyleByName: Record<string, XlsxTableStyleDefinition>;\n themePalette: XlsxThemePalette;\n};\n\nexport type WorkbookStructureAssets = Pick<\n WorkbookImageAssets,\n | \"namedCellStyleByName\"\n | \"sheetStatesByWorkbookSheetIndex\"\n | \"styleById\"\n | \"tableMetadataByWorkbookSheetIndex\"\n | \"tableStyleByName\"\n | \"themePalette\"\n>;\n\nexport type WorkbookChartStyleAssets = Pick<\n WorkbookImageAssets,\n | \"archive\"\n | \"sheetOrigins\"\n | \"themePalette\"\n>;\n\nfunction buildThemePalette(theme: ThemeState): XlsxThemePalette {\n const themeOrder = [\"lt1\", \"dk1\", \"lt2\", \"dk2\", \"accent1\", \"accent2\", \"accent3\", \"accent4\", \"accent5\", \"accent6\", \"hlink\", \"folHlink\"];\n const colorsByIndex: Record<number, string> = {};\n\n themeOrder.forEach((key, index) => {\n const color = theme.colors.get(key);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n\n return {\n colorsByIndex,\n majorLatinFont: theme.majorLatinFont ?? undefined,\n minorLatinFont: theme.minorLatinFont ?? undefined\n };\n}\n\nfunction cloneBytes(bytes: Uint8Array) {\n const nextBytes = new Uint8Array(bytes.byteLength);\n nextBytes.set(bytes);\n return nextBytes;\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction joinArchivePath(...parts: string[]) {\n return normalizeArchivePath(parts.join(\"/\"));\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash >= 0 ? normalized.slice(0, lastSlash) : \"\";\n}\n\nfunction resolveArchiveTarget(baseDocumentPath: string, target: string) {\n if (!target) {\n return normalizeArchivePath(baseDocumentPath);\n }\n\n if (target.startsWith(\"#\")) {\n return target;\n }\n\n if (target.startsWith(\"/\")) {\n return normalizeArchivePath(target);\n }\n\n const baseParts = dirname(baseDocumentPath).split(\"/\").filter(Boolean);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n baseParts.pop();\n continue;\n }\n baseParts.push(segment);\n }\n\n return normalizeArchivePath(baseParts.join(\"/\"));\n}\n\nfunction relativeArchivePath(fromDocumentPath: string, toPath: string) {\n const fromParts = dirname(fromDocumentPath).split(\"/\").filter(Boolean);\n const toParts = normalizeArchivePath(toPath).split(\"/\").filter(Boolean);\n let shared = 0;\n while (shared < fromParts.length && shared < toParts.length && fromParts[shared] === toParts[shared]) {\n shared += 1;\n }\n\n const upSegments = fromParts.slice(shared).map(() => \"..\");\n const downSegments = toParts.slice(shared);\n return [...upSegments, ...downSegments].join(\"/\") || \".\";\n}\n\nfunction relsPathForDocument(documentPath: string) {\n const baseName = documentPath.split(\"/\").pop();\n const parentDir = dirname(documentPath);\n return joinArchivePath(parentDir, \"_rels\", `${baseName}.rels`);\n}\n\nfunction parseXml(xml: string) {\n const parser = new DOMParser();\n const document = parser.parseFromString(xml, \"application/xml\");\n if (document.querySelector(\"parsererror\")) {\n return null;\n }\n return document;\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction readArchiveText(archive: ArchiveEntries, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseColumnReference(reference: string) {\n let value = 0;\n for (const character of reference.toUpperCase()) {\n if (character < \"A\" || character > \"Z\") {\n return null;\n }\n value = value * 26 + (character.charCodeAt(0) - 64);\n }\n return value > 0 ? value - 1 : null;\n}\n\nfunction parseA1CellReference(reference: string) {\n const match = /^\\$?([A-Za-z]+)\\$?(\\d+)$/.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const col = parseColumnReference(match[1] ?? \"\");\n const row = Number(match[2] ?? Number.NaN) - 1;\n if (col === null || !Number.isFinite(row) || row < 0) {\n return null;\n }\n\n return { col, row };\n}\n\nfunction parseA1RangeReference(reference: string) {\n const [startRef, endRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? startRef ?? \"\");\n return start && end ? { end, start } : null;\n}\n\nfunction stripSheetNameFromFormulaReference(reference: string) {\n const trimmed = reference.trim();\n const bangIndex = trimmed.lastIndexOf(\"!\");\n return bangIndex >= 0 ? trimmed.slice(bangIndex + 1) : trimmed;\n}\n\nfunction parseFormulaCellReference(reference: string) {\n const normalized = stripSheetNameFromFormulaReference(reference).split(/\\s+/)[0] ?? \"\";\n return parseA1CellReference(normalized);\n}\n\nfunction parseFormulaRangeReference(reference: string) {\n return parseA1RangeReference(stripSheetNameFromFormulaReference(reference));\n}\n\nfunction isElementNode(node: Node | null | undefined): node is Element {\n return Boolean(node && node.nodeType === 1);\n}\n\nfunction getLocalElements(parent: Document | Element, localName: string) {\n return Array.from(parent.getElementsByTagName(\"*\")).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getChildElements(parent: Element, localName: string) {\n return Array.from(parent.childNodes).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getFirstChild(parent: Element, localName: string) {\n return getChildElements(parent, localName)[0] ?? null;\n}\n\nfunction getFirstDescendant(parent: Document | Element, localName: string) {\n return getLocalElements(parent, localName)[0] ?? null;\n}\n\nfunction readFeaturePropertyBagCheckboxComplements(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/featurePropertyBag/featurePropertyBag.xml\");\n if (!xml) {\n return new Set<number>();\n }\n\n const document = parseXml(xml);\n if (!document?.documentElement) {\n return new Set<number>();\n }\n\n const bagNodes = getChildElements(document.documentElement, \"bag\");\n const bagTypeById = bagNodes.map((node) => node.getAttribute(\"type\") ?? \"\");\n const checkboxComplementIndices = new Set<number>();\n\n const xfComplementsBag = bagNodes.find((node) => node.getAttribute(\"type\") === \"XFComplements\") ?? null;\n const mappedBagIds = xfComplementsBag\n ? getLocalElements(xfComplementsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .filter((value) => Number.isFinite(value))\n : [];\n\n mappedBagIds.forEach((bagId, complementIndex) => {\n const xfComplementBag = bagNodes[bagId];\n if (!xfComplementBag || bagTypeById[bagId] !== \"XFComplement\") {\n return;\n }\n\n const xfControlsBagId = getLocalElements(xfComplementBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (xfControlsBagId === undefined) {\n return;\n }\n\n const xfControlsBag = bagNodes[xfControlsBagId];\n if (!xfControlsBag || bagTypeById[xfControlsBagId] !== \"XFControls\") {\n return;\n }\n\n const cellControlBagId = getLocalElements(xfControlsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (cellControlBagId === undefined) {\n return;\n }\n\n if (bagTypeById[cellControlBagId] === \"Checkbox\") {\n checkboxComplementIndices.add(complementIndex);\n }\n });\n\n return checkboxComplementIndices;\n}\n\nfunction getRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"id\") ?? element.getAttribute(\"r:id\") ?? element.getAttribute(\"id\");\n}\n\nfunction getEmbeddedRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"embed\") ?? element.getAttribute(\"r:embed\") ?? element.getAttribute(\"embed\");\n}\n\nfunction setChildText(parent: Element, localName: string, value: string) {\n const child = getFirstChild(parent, localName);\n if (child) {\n child.textContent = value;\n }\n}\n\nfunction updateMarkerElement(element: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!element) {\n return;\n }\n\n setChildText(element, \"col\", String(Math.max(0, marker.col)));\n setChildText(element, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setChildText(element, \"row\", String(Math.max(0, marker.row)));\n setChildText(element, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction parseContentTypes(archive: ArchiveEntries): ContentTypesState {\n const xml = readArchiveText(archive, \"[Content_Types].xml\");\n const defaultEntries = new Map<string, string>();\n const overrideEntries = new Map<string, string>();\n if (!xml) {\n return { defaultEntries, overrideEntries };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return { defaultEntries, overrideEntries };\n }\n\n for (const defaultNode of getLocalElements(document, \"Default\")) {\n const extension = defaultNode.getAttribute(\"Extension\");\n const contentType = defaultNode.getAttribute(\"ContentType\");\n if (extension && contentType) {\n defaultEntries.set(extension.toLowerCase(), contentType);\n }\n }\n\n for (const overrideNode of getLocalElements(document, \"Override\")) {\n const partName = overrideNode.getAttribute(\"PartName\");\n const contentType = overrideNode.getAttribute(\"ContentType\");\n if (partName && contentType) {\n overrideEntries.set(normalizeArchivePath(partName), contentType);\n }\n }\n\n return { defaultEntries, overrideEntries };\n}\n\nfunction resolveContentType(contentTypes: ContentTypesState, path: string) {\n const normalized = normalizeArchivePath(path);\n const override = contentTypes.overrideEntries.get(normalized);\n if (override) {\n return override;\n }\n\n const extension = normalized.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return \"application/octet-stream\";\n }\n\n return contentTypes.defaultEntries.get(extension) ?? \"application/octet-stream\";\n}\n\nfunction parseRelationships(archive: ArchiveEntries, relsPath: string, baseDocumentPath: string) {\n const xml = readArchiveText(archive, relsPath);\n const relationships = new Map<string, RelationshipRecord>();\n if (!xml) {\n return relationships;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return relationships;\n }\n\n for (const relationshipNode of getLocalElements(document, \"Relationship\")) {\n const id = relationshipNode.getAttribute(\"Id\");\n const target = relationshipNode.getAttribute(\"Target\");\n const type = relationshipNode.getAttribute(\"Type\");\n if (!id || !target || !type) {\n continue;\n }\n\n relationships.set(id, {\n id,\n target: resolveArchiveTarget(baseDocumentPath, target),\n targetMode: relationshipNode.getAttribute(\"TargetMode\"),\n type\n });\n }\n\n return relationships;\n}\n\nfunction parseWorkbookSheets(archive: ArchiveEntries) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n if (!workbookXml) {\n return [];\n }\n\n const workbookDocument = parseXml(workbookXml);\n if (!workbookDocument) {\n return [];\n }\n\n const workbookRelationships = parseRelationships(archive, \"xl/_rels/workbook.xml.rels\", \"xl/workbook.xml\");\n const sheets: WorkbookSheetInfo[] = [];\n\n for (const sheetNode of getLocalElements(workbookDocument, \"sheet\")) {\n const relationshipId = getRelationshipId(sheetNode);\n if (!relationshipId) {\n continue;\n }\n\n const relationship = workbookRelationships.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n sheets.push({\n name: sheetNode.getAttribute(\"name\") ?? `Sheet ${sheets.length + 1}`,\n path: relationship.target\n });\n }\n\n return sheets;\n}\n\nfunction parseWorkbookTheme(archive: ArchiveEntries): ThemeState {\n const defaultTheme: ThemeState = {\n colors: new Map([\n [\"accent1\", \"#5b9bd5\"],\n [\"accent2\", \"#ed7d31\"],\n [\"accent3\", \"#a5a5a5\"],\n [\"accent4\", \"#ffc000\"],\n [\"accent5\", \"#4472c4\"],\n [\"accent6\", \"#70ad47\"],\n [\"bg1\", \"#ffffff\"],\n [\"bg2\", \"#e7e6e6\"],\n [\"dk1\", \"#000000\"],\n [\"dk2\", \"#6e747a\"],\n [\"folHlink\", \"#993366\"],\n [\"hlink\", \"#085296\"],\n [\"lt1\", \"#ffffff\"],\n [\"lt2\", \"#e7e6e6\"],\n [\"tx1\", \"#000000\"],\n [\"tx2\", \"#6e747a\"]\n ]),\n majorLatinFont: null,\n minorLatinFont: null\n };\n\n const themeXml = readArchiveText(archive, \"xl/theme/theme1.xml\");\n if (!themeXml) {\n return defaultTheme;\n }\n\n const themeDocument = parseXml(themeXml);\n if (!themeDocument) {\n return defaultTheme;\n }\n\n const colors = new Map(defaultTheme.colors);\n const colorSchemeNode = getLocalElements(themeDocument, \"clrScheme\")[0] ?? null;\n if (colorSchemeNode) {\n for (const colorNode of Array.from(colorSchemeNode.childNodes).filter(isElementNode)) {\n const key = colorNode.localName;\n const srgbNode = getFirstChild(colorNode, \"srgbClr\");\n const sysNode = getFirstChild(colorNode, \"sysClr\");\n const hex = srgbNode?.getAttribute(\"val\") ?? sysNode?.getAttribute(\"lastClr\");\n if (hex) {\n colors.set(key, normalizeHexColor(hex));\n }\n }\n }\n\n const fontSchemeNode = getLocalElements(themeDocument, \"fontScheme\")[0] ?? null;\n const majorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"majorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n const minorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"minorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n\n colors.set(\"bg1\", colors.get(\"lt1\") ?? defaultTheme.colors.get(\"bg1\") ?? \"#ffffff\");\n colors.set(\"tx1\", colors.get(\"dk1\") ?? defaultTheme.colors.get(\"tx1\") ?? \"#000000\");\n colors.set(\"bg2\", colors.get(\"lt2\") ?? defaultTheme.colors.get(\"bg2\") ?? \"#e7e6e6\");\n colors.set(\"tx2\", colors.get(\"dk2\") ?? defaultTheme.colors.get(\"tx2\") ?? \"#6e747a\");\n\n return {\n colors,\n majorLatinFont,\n minorLatinFont\n };\n}\n\nfunction parseSpreadsheetColor(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const color: Record<string, unknown> = {};\n const rgb = node.getAttribute(\"rgb\");\n const theme = node.getAttribute(\"theme\");\n const tint = node.getAttribute(\"tint\");\n const indexed = node.getAttribute(\"indexed\");\n if (rgb) {\n color.rgb = normalizeHexColor(rgb);\n }\n if (theme !== null) {\n color.theme = Number(theme);\n }\n if (tint !== null) {\n color.tint = Number(tint);\n }\n if (indexed !== null) {\n color.indexed = Number(indexed);\n }\n\n return Object.keys(color).length > 0 ? color : undefined;\n}\n\nfunction hasEnabledSpreadsheetFlag(node: Element | null) {\n if (!node) {\n return false;\n }\n\n const value = node.getAttribute(\"val\");\n return value === null || (value !== \"0\" && value !== \"false\");\n}\n\nfunction parseSheetSparklines(\n document: XMLDocument,\n themePalette?: XlsxThemePalette | null\n) {\n const sparklines: XlsxSparkline[] = [];\n\n for (const groupNode of getLocalElements(document, \"sparklineGroup\")) {\n const rawType = groupNode.getAttribute(\"type\");\n const sparklineType: XlsxSparkline[\"type\"] = rawType === \"column\"\n ? \"column\"\n : rawType === \"stacked\"\n ? \"winLoss\"\n : \"line\";\n\n const markersNode = getFirstChild(groupNode, \"markers\");\n const negativeNode = getFirstChild(groupNode, \"negative\");\n const colorSeries = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorSeries\")), themePalette);\n const colorNegative = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorNegative\")), themePalette);\n const colorMarkers = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorMarkers\")), themePalette);\n const colorFirst = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorFirst\")), themePalette);\n const colorLast = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLast\")), themePalette);\n const colorHigh = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorHigh\")), themePalette);\n const colorLow = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLow\")), themePalette);\n const sparklineCollectionNode = getFirstChild(groupNode, \"sparklines\");\n if (!sparklineCollectionNode) {\n continue;\n }\n\n for (const sparklineNode of getChildElements(sparklineCollectionNode, \"sparkline\")) {\n const formula = getFirstChild(sparklineNode, \"f\")?.textContent ?? \"\";\n const targetReference = getFirstChild(sparklineNode, \"sqref\")?.textContent ?? \"\";\n const range = parseFormulaRangeReference(formula);\n const target = parseFormulaCellReference(targetReference);\n if (!range || !target) {\n continue;\n }\n\n sparklines.push({\n color: colorSeries ?? undefined,\n firstColor: colorFirst ?? undefined,\n highColor: colorHigh ?? undefined,\n lastColor: colorLast ?? undefined,\n lowColor: colorLow ?? undefined,\n markerColor: colorMarkers ?? undefined,\n markers: hasEnabledSpreadsheetFlag(markersNode),\n negative: hasEnabledSpreadsheetFlag(negativeNode),\n negativeColor: colorNegative ?? undefined,\n range,\n target,\n type: sparklineType\n });\n }\n }\n\n return sparklines;\n}\n\nfunction parseSpreadsheetFont(node: Element | null): XlsxResolvedCellStyle[\"font\"] {\n if (!node) {\n return undefined;\n }\n\n const font: Record<string, unknown> = {};\n const size = getFirstChild(node, \"sz\")?.getAttribute(\"val\");\n const name = getFirstChild(node, \"name\")?.getAttribute(\"val\");\n const family = getFirstChild(node, \"family\")?.getAttribute(\"val\");\n const scheme = getFirstChild(node, \"scheme\")?.getAttribute(\"val\");\n const charset = getFirstChild(node, \"charset\")?.getAttribute(\"val\");\n const verticalAlign = getFirstChild(node, \"vertAlign\")?.getAttribute(\"val\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"b\"))) {\n font.bold = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"i\"))) {\n font.italic = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"strike\"))) {\n font.strikethrough = true;\n }\n if (getFirstChild(node, \"u\")) {\n font.underline = getFirstChild(node, \"u\")?.getAttribute(\"val\") ?? \"single\";\n }\n if (size !== null && size !== undefined) {\n font.size = Number(size);\n }\n if (name) {\n font.name = name;\n }\n if (family !== null && family !== undefined) {\n font.family = Number(family);\n }\n if (scheme) {\n font.scheme = scheme;\n }\n if (charset !== null && charset !== undefined) {\n font.charset = Number(charset);\n }\n if (verticalAlign) {\n font.verticalAlign = verticalAlign;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"shadow\"))) {\n font.shadow = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"outline\"))) {\n font.outline = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"condense\"))) {\n font.condense = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"extend\"))) {\n font.extend = true;\n }\n if (color) {\n font.color = color;\n }\n\n return Object.keys(font).length > 0 ? font : undefined;\n}\n\nfunction parseSpreadsheetFill(node: Element | null): XlsxResolvedCellStyle[\"fill\"] {\n if (!node) {\n return undefined;\n }\n\n const gradientFill = getFirstChild(node, \"gradientFill\");\n if (gradientFill) {\n const stops = Array.from(gradientFill.childNodes)\n .filter(isElementNode)\n .filter((child) => child.localName === \"stop\")\n .map((stopNode) => ({\n color: parseSpreadsheetColor(Array.from(stopNode.childNodes).find(isElementNode) ?? null),\n position: Number(stopNode.getAttribute(\"position\") ?? Number.NaN)\n }))\n .filter((stop) => stop.color && Number.isFinite(stop.position));\n if (stops.length > 0) {\n return {\n degree: Number(gradientFill.getAttribute(\"degree\") ?? 0),\n fillType: \"gradient\",\n gradientType: gradientFill.getAttribute(\"type\") ?? \"linear\",\n stops\n };\n }\n }\n\n const patternFill = getFirstChild(node, \"patternFill\");\n if (!patternFill) {\n return undefined;\n }\n\n const patternType = patternFill.getAttribute(\"patternType\") ?? \"none\";\n const foreground = parseSpreadsheetColor(getFirstChild(patternFill, \"fgColor\"));\n const background = parseSpreadsheetColor(getFirstChild(patternFill, \"bgColor\"));\n const solidColor = foreground ?? background;\n if (patternType === \"solid\" && solidColor) {\n return {\n color: solidColor,\n fillType: \"solid\"\n };\n }\n // Differential table styles sometimes omit patternType and only set bgColor.\n // Preserve those fills so header/table overrides are not dropped during import.\n if ((patternType === \"none\" || patternType === \"gray125\") && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n if (patternType !== \"none\" && patternType !== \"gray125\" && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n\n return undefined;\n}\n\nfunction parseSpreadsheetBorderEdge(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const style = node.getAttribute(\"style\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (!style || style === \"none\") {\n return undefined;\n }\n\n return {\n color,\n style\n };\n}\n\nfunction parseSpreadsheetBorder(node: Element | null): XlsxResolvedCellStyle[\"border\"] {\n if (!node) {\n return undefined;\n }\n\n const border: Record<string, Record<string, unknown>> = {};\n ([\"top\", \"right\", \"bottom\", \"left\", \"horizontal\", \"vertical\"] as const).forEach((edge) => {\n const parsedEdge = parseSpreadsheetBorderEdge(getFirstChild(node, edge));\n if (parsedEdge) {\n border[edge] = parsedEdge;\n }\n });\n\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parseSpreadsheetAlignment(node: Element | null): XlsxResolvedCellStyle[\"alignment\"] {\n if (!node) {\n return undefined;\n }\n\n const alignment: Record<string, unknown> = {};\n const horizontal = node.getAttribute(\"horizontal\");\n const vertical = node.getAttribute(\"vertical\");\n const wrapText = node.getAttribute(\"wrapText\");\n const indent = node.getAttribute(\"indent\");\n const shrinkToFit = node.getAttribute(\"shrinkToFit\");\n const textRotation = node.getAttribute(\"textRotation\");\n if (horizontal) {\n alignment.horizontal = horizontal;\n }\n if (vertical) {\n alignment.vertical = vertical;\n }\n if (wrapText !== null) {\n alignment.wrapText = wrapText === \"1\";\n }\n if (shrinkToFit !== null) {\n alignment.shrinkToFit = shrinkToFit === \"1\";\n }\n if (indent !== null) {\n alignment.indent = Number(indent);\n }\n if (textRotation !== null) {\n const parsedRotation = Number(textRotation);\n if (Number.isFinite(parsedRotation)) {\n alignment.textRotation = parsedRotation;\n }\n }\n\n return Object.keys(alignment).length > 0 ? alignment : undefined;\n}\n\nfunction parseDifferentialStyle(node: Element | null): XlsxResolvedCellStyle {\n if (!node) {\n return {};\n }\n\n const style: XlsxResolvedCellStyle = {};\n const font = parseSpreadsheetFont(getFirstChild(node, \"font\"));\n const fill = parseSpreadsheetFill(getFirstChild(node, \"fill\"));\n const border = parseSpreadsheetBorder(getFirstChild(node, \"border\"));\n const alignment = parseSpreadsheetAlignment(getFirstChild(node, \"alignment\"));\n\n if (font) {\n style.font = font;\n }\n if (fill) {\n style.fill = fill;\n }\n if (border) {\n style.border = border;\n }\n if (alignment) {\n style.alignment = alignment;\n }\n\n return style;\n}\n\nfunction parseResolvedXfStyle(\n xfNode: Element,\n fonts: Array<XlsxResolvedCellStyle[\"font\"]>,\n fills: Array<XlsxResolvedCellStyle[\"fill\"]>,\n borders: Array<XlsxResolvedCellStyle[\"border\"]>,\n checkboxComplementIndices?: Set<number>\n) {\n const style: XlsxResolvedCellStyle = {};\n const fontId = Number(xfNode.getAttribute(\"fontId\") ?? Number.NaN);\n const fillId = Number(xfNode.getAttribute(\"fillId\") ?? Number.NaN);\n const borderId = Number(xfNode.getAttribute(\"borderId\") ?? Number.NaN);\n const alignment = parseSpreadsheetAlignment(getFirstChild(xfNode, \"alignment\"));\n\n if (Number.isFinite(fontId) && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n if (Number.isFinite(fillId) && fills[fillId]) {\n style.fill = fills[fillId];\n }\n if (Number.isFinite(borderId) && borders[borderId]) {\n style.border = borders[borderId];\n }\n if (alignment) {\n style.alignment = alignment;\n }\n const xfComplementNode = getFirstDescendant(xfNode, \"xfComplement\");\n const xfComplementIndex = Number(xfComplementNode?.getAttribute(\"i\") ?? Number.NaN);\n if (Number.isFinite(xfComplementIndex) && checkboxComplementIndices?.has(xfComplementIndex)) {\n style.cellControl = { kind: \"checkbox\" };\n }\n\n return style;\n}\n\nfunction parseWorkbookStyles(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/styles.xml\");\n if (!xml) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const fontsNode = getFirstDescendant(document, \"fonts\");\n const fillsNode = getFirstDescendant(document, \"fills\");\n const bordersNode = getFirstDescendant(document, \"borders\");\n const cellStyleXfsNode = getFirstDescendant(document, \"cellStyleXfs\");\n const cellStylesNode = getFirstDescendant(document, \"cellStyles\");\n const cellXfsNode = getFirstDescendant(document, \"cellXfs\");\n const dxfsNode = getFirstDescendant(document, \"dxfs\");\n const tableStylesNode = getFirstDescendant(document, \"tableStyles\");\n if (!cellXfsNode) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const checkboxComplementIndices = readFeaturePropertyBagCheckboxComplements(archive);\n const fonts = getChildElements(fontsNode ?? document.documentElement, \"font\").map((node) => parseSpreadsheetFont(node));\n const fills = getChildElements(fillsNode ?? document.documentElement, \"fill\").map((node) => parseSpreadsheetFill(node));\n const borders = getChildElements(bordersNode ?? document.documentElement, \"border\").map((node) => parseSpreadsheetBorder(node));\n const differentialStyles = getChildElements(dxfsNode ?? document.documentElement, \"dxf\").map((node) => parseDifferentialStyle(node));\n const cellStyleXfs = getChildElements(cellStyleXfsNode ?? document.documentElement, \"xf\").map(\n (node) => parseResolvedXfStyle(node, fonts, fills, borders, checkboxComplementIndices)\n );\n const namedCellStyleByName: Record<string, XlsxResolvedCellStyle> = {};\n const styleById: Record<number, XlsxResolvedCellStyle> = {};\n const tableStyleByName: Record<string, XlsxTableStyleDefinition> = {};\n\n getChildElements(cellXfsNode, \"xf\").forEach((xfNode, index) => {\n styleById[index] = parseResolvedXfStyle(xfNode, fonts, fills, borders, checkboxComplementIndices);\n });\n\n getChildElements(cellStylesNode ?? document.documentElement, \"cellStyle\").forEach((cellStyleNode) => {\n const name = cellStyleNode.getAttribute(\"name\");\n const xfId = Number(cellStyleNode.getAttribute(\"xfId\") ?? Number.NaN);\n if (!name || !Number.isFinite(xfId)) {\n return;\n }\n\n const resolvedStyle = cellStyleXfs[xfId];\n if (resolvedStyle) {\n namedCellStyleByName[name] = resolvedStyle;\n }\n });\n\n getChildElements(tableStylesNode ?? document.documentElement, \"tableStyle\").forEach((tableStyleNode) => {\n const name = tableStyleNode.getAttribute(\"name\");\n if (!name) {\n return;\n }\n\n const elements: XlsxTableStyleDefinition = {};\n getChildElements(tableStyleNode, \"tableStyleElement\").forEach((elementNode) => {\n const type = elementNode.getAttribute(\"type\");\n const dxfId = Number(elementNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(dxfId)) {\n return;\n }\n\n const differentialStyle = differentialStyles[dxfId];\n if (differentialStyle) {\n elements[type] = differentialStyle;\n }\n });\n tableStyleByName[name] = elements;\n });\n\n const normalFont = (namedCellStyleByName.Normal?.font ?? styleById[0]?.font ?? fonts[0]) as Record<string, unknown> | undefined;\n const defaultFont = normalFont ? {\n family: typeof normalFont.name === \"string\" ? normalFont.name : undefined,\n sizePt: typeof normalFont.size === \"number\" ? normalFont.size : undefined\n } : null;\n\n return {\n defaultFont,\n namedCellStyleByName,\n styleById,\n tableStyleByName\n };\n}\n\nfunction parseWorkbookTableMetadata(\n archive: ArchiveEntries,\n workbookSheets: WorkbookSheetInfo[]\n) {\n return workbookSheets.map((sheet) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const sheetXml = readArchiveText(archive, sheet.path);\n if (!sheetXml) {\n return [];\n }\n\n const sheetDocument = parseXml(sheetXml);\n if (!sheetDocument) {\n return [];\n }\n\n return getLocalElements(sheetDocument, \"tablePart\").flatMap((tablePartNode) => {\n const relationshipId = getRelationshipId(tablePartNode);\n if (!relationshipId) {\n return [];\n }\n\n const relationship = sheetRelationships.get(relationshipId);\n if (!relationship) {\n return [];\n }\n\n const tableXml = readArchiveText(archive, relationship.target);\n if (!tableXml) {\n return [];\n }\n\n const tableDocument = parseXml(tableXml);\n const tableNode = tableDocument?.documentElement;\n if (!tableNode || tableNode.localName !== \"table\") {\n return [];\n }\n\n return [{\n displayName: tableNode.getAttribute(\"displayName\") ?? undefined,\n headerRowCount: parseWorkbookTableCount(tableNode.getAttribute(\"headerRowCount\"), 1),\n headerRowCellStyle: tableNode.getAttribute(\"headerRowCellStyle\") ?? undefined,\n name: tableNode.getAttribute(\"name\") ?? undefined,\n reference: tableNode.getAttribute(\"ref\") ?? undefined,\n totalsRowCount: parseWorkbookTableCount(tableNode.getAttribute(\"totalsRowCount\"), 0),\n totalsRowShown: parseWorkbookTableBoolean(tableNode.getAttribute(\"totalsRowShown\"), false)\n } satisfies WorkbookTableMetadata];\n });\n });\n}\n\nfunction parseWorkbookTableCount(value: string | null, fallback: number) {\n if (value === null) {\n return fallback;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;\n}\n\nfunction parseWorkbookTableBoolean(value: string | null, fallback: boolean) {\n if (value === null) {\n return fallback;\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"\") {\n return false;\n }\n if (normalized === \"1\" || normalized === \"true\") {\n return true;\n }\n\n return fallback;\n}\n\nfunction parseSqrefRanges(sqref: string | null | undefined): XlsxCellRange[] {\n if (!sqref) {\n return [];\n }\n\n return sqref\n .trim()\n .split(/\\s+/)\n .flatMap((reference) => {\n const range = parseA1RangeReference(reference);\n return range ? [range] : [];\n });\n}\n\nfunction parseConditionalFormatValueObject(node: Element | null): XlsxConditionalFormatValueObject | null {\n if (!node) {\n return null;\n }\n\n const type = node.getAttribute(\"type\");\n if (!type) {\n return null;\n }\n\n const rawValue = node.getAttribute(\"val\") ?? getFirstChild(node, \"f\")?.textContent ?? undefined;\n const numericValue = rawValue !== undefined ? Number(rawValue) : Number.NaN;\n return {\n type,\n value: Number.isFinite(numericValue) ? numericValue : undefined\n };\n}\n\nfunction parseSpreadsheetBooleanAttribute(node: Element | null, name: string) {\n if (!node) {\n return undefined;\n }\n\n const value = node.getAttribute(name);\n if (value === null) {\n return undefined;\n }\n\n return value !== \"0\" && value !== \"false\";\n}\n\nfunction parseStandardConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"colorScale\") {\n const colorScaleNode = getFirstChild(cfRuleNode, \"colorScale\");\n if (!colorScaleNode) {\n return null;\n }\n\n const cfvos = getChildElements(colorScaleNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const colors = getChildElements(colorScaleNode, \"color\")\n .map((node) => parseSpreadsheetColor(node))\n .filter((value): value is Record<string, unknown> => Boolean(value));\n if (cfvos.length === 0 || colors.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n colors,\n kind: \"colorScale\",\n priority,\n ranges\n };\n }\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n const extId = getFirstDescendant(cfRuleNode, \"id\")?.textContent?.trim() || undefined;\n return {\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"color\")),\n kind: \"dataBar\",\n priority,\n ranges,\n id: extId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const iconSetName = iconSetNode.getAttribute(\"iconSet\");\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (!iconSetName || cfvos.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons: cfvos.map((_, index) => ({\n iconId: index,\n iconSet: iconSetName\n })),\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\")\n };\n }\n\n return null;\n}\n\nfunction parseExtendedConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const ruleId = cfRuleNode.getAttribute(\"id\") ?? undefined;\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n return {\n axisColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"axisColor\")),\n border: parseSpreadsheetBooleanAttribute(dataBarNode, \"border\"),\n borderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"borderColor\")),\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"fillColor\")),\n gradient: parseSpreadsheetBooleanAttribute(dataBarNode, \"gradient\"),\n kind: \"dataBar\",\n maxLength: Number(dataBarNode.getAttribute(\"maxLength\") ?? Number.NaN),\n minLength: Number(dataBarNode.getAttribute(\"minLength\") ?? Number.NaN),\n negativeBarBorderColorSameAsPositive: parseSpreadsheetBooleanAttribute(dataBarNode, \"negativeBarBorderColorSameAsPositive\"),\n negativeBorderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeBorderColor\")),\n negativeFillColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeFillColor\")),\n priority,\n ranges,\n showValue: parseSpreadsheetBooleanAttribute(dataBarNode, \"showValue\"),\n id: ruleId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const icons = getChildElements(iconSetNode, \"cfIcon\")\n .map((iconNode) => {\n const iconSet = iconNode.getAttribute(\"iconSet\");\n const rawIconId = Number(iconNode.getAttribute(\"iconId\") ?? Number.NaN);\n if (!iconSet || !Number.isFinite(rawIconId)) {\n return null;\n }\n\n return {\n iconId: rawIconId,\n iconSet\n } satisfies XlsxConditionalFormatIcon;\n })\n .filter((icon): icon is XlsxConditionalFormatIcon => Boolean(icon));\n\n if (cfvos.length === 0 || icons.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons,\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\"),\n id: ruleId\n };\n }\n\n return null;\n}\n\nfunction mergeConditionalFormatRule(\n baseRule: XlsxConditionalFormatRule & { id?: string },\n extendedRule: XlsxConditionalFormatRule & { id?: string }\n) {\n if (baseRule.kind !== extendedRule.kind) {\n return baseRule;\n }\n\n if (baseRule.kind === \"colorScale\" && extendedRule.kind === \"colorScale\") {\n return {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n colors: extendedRule.colors.length > 0 ? extendedRule.colors : baseRule.colors,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n }\n\n if (baseRule.kind === \"dataBar\" && extendedRule.kind === \"dataBar\") {\n const merged: XlsxConditionalDataBarRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n axisColor: extendedRule.axisColor ?? baseRule.axisColor,\n border: extendedRule.border ?? baseRule.border,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n color: extendedRule.color ?? baseRule.color,\n negativeBarBorderColorSameAsPositive: extendedRule.negativeBarBorderColorSameAsPositive ?? baseRule.negativeBarBorderColorSameAsPositive,\n negativeBorderColor: extendedRule.negativeBorderColor ?? baseRule.negativeBorderColor,\n negativeFillColor: extendedRule.negativeFillColor ?? baseRule.negativeFillColor,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n if (baseRule.kind === \"iconSet\" && extendedRule.kind === \"iconSet\") {\n const merged: XlsxConditionalIconSetRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n icons: extendedRule.icons.length > 0 ? extendedRule.icons : baseRule.icons,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n return baseRule;\n}\n\nfunction parseConditionalFormatRules(document: Document) {\n const standardRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n const extendedRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n\n getLocalElements(document, \"conditionalFormatting\").forEach((conditionalFormattingNode) => {\n const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;\n const ranges = isExtended\n ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, \"sqref\")?.textContent ?? \"\")\n : parseSqrefRanges(conditionalFormattingNode.getAttribute(\"sqref\"));\n\n getChildElements(conditionalFormattingNode, \"cfRule\").forEach((cfRuleNode) => {\n const parsedRule = isExtended\n ? parseExtendedConditionalFormatRule(cfRuleNode, ranges)\n : parseStandardConditionalFormatRule(cfRuleNode, ranges);\n if (parsedRule) {\n if (isExtended) {\n extendedRules.push(parsedRule);\n } else {\n standardRules.push(parsedRule);\n }\n }\n });\n });\n\n const mergedRules: XlsxConditionalFormatRule[] = [];\n const usedExtendedRuleIds = new Set<string>();\n const extendedRulesById = new Map(\n extendedRules\n .filter((rule) => typeof rule.id === \"string\" && rule.id.length > 0)\n .map((rule) => [rule.id as string, rule])\n );\n\n standardRules.forEach((rule) => {\n const matchingExtendedRule = rule.id ? extendedRulesById.get(rule.id) : undefined;\n if (matchingExtendedRule) {\n usedExtendedRuleIds.add(rule.id as string);\n mergedRules.push(mergeConditionalFormatRule(rule, matchingExtendedRule));\n return;\n }\n\n mergedRules.push(rule);\n });\n\n extendedRules.forEach((rule) => {\n if (rule.id && usedExtendedRuleIds.has(rule.id)) {\n return;\n }\n\n mergedRules.push(rule);\n });\n\n return mergedRules\n .map((rule) => {\n const nextRule = { ...rule } as XlsxConditionalFormatRule & { id?: string };\n delete nextRule.id;\n return nextRule;\n })\n .filter((rule) => rule.ranges.length > 0)\n .sort((left, right) => left.priority - right.priority);\n}\n\nfunction parseSheetState(\n archive: ArchiveEntries,\n path: string,\n options?: ParseWorkbookStructureOptions & {\n defaultFont?: {\n family?: string;\n sizePt?: number;\n } | null;\n }\n): WorkbookSheetState | null {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return null;\n }\n\n const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;\n const cachedFormulaValues: Record<string, string> = {};\n const conditionalFormatRules = parseConditionalFormatRules(document);\n const sparklines = parseSheetSparklines(document, options?.themePalette);\n const sheetFormatNode = getLocalElements(document, \"sheetFormatPr\")[0] ?? null;\n const sheetViewNode = getLocalElements(document, \"sheetView\")[0] ?? null;\n const rowHeightOverridesPx: Record<number, number> = {};\n const colWidthOverridesPx: Record<number, number> = {};\n const rowStyleIds: Record<number, number> = {};\n const colStyleIds: Record<number, number> = {};\n const hiddenRows = new Set<number>();\n const hiddenCols = new Set<number>();\n let hasHorizontalMerges = false;\n let hasVerticalMerges = false;\n let maxHorizontalMergeEndCol = -1;\n let maxVerticalMergeEndRow = -1;\n let minContentCol = Number.POSITIVE_INFINITY;\n let minContentRow = Number.POSITIVE_INFINITY;\n let maxContentCol = -1;\n let maxContentRow = -1;\n const columnWidthCharacterWidthPx = measureColumnCharacterWidthPx(\n options?.defaultFont?.family,\n options?.defaultFont?.sizePt\n );\n\n const defaultRowHeight = Number(sheetFormatNode?.getAttribute(\"defaultRowHeight\") ?? 15);\n const defaultColWidth = Number(\n sheetFormatNode?.getAttribute(\"defaultColWidth\")\n ?? sheetFormatNode?.getAttribute(\"baseColWidth\")\n ?? 8.43\n );\n const rawZoomScale = Number(\n sheetViewNode?.getAttribute(\"zoomScale\")\n ?? sheetViewNode?.getAttribute(\"zoomScaleNormal\")\n ?? Number.NaN\n );\n const zoomScale = Number.isFinite(rawZoomScale) && rawZoomScale > 0\n ? rawZoomScale\n : 100;\n const trackContentCell = (cellRef: string | null) => {\n if (!cellRef) {\n return;\n }\n\n const cell = parseA1CellReference(cellRef);\n if (!cell) {\n return;\n }\n\n minContentCol = Math.min(minContentCol, cell.col);\n minContentRow = Math.min(minContentRow, cell.row);\n maxContentCol = Math.max(maxContentCol, cell.col);\n maxContentRow = Math.max(maxContentRow, cell.row);\n };\n const isMeaningfulCellNode = (cellNode: Element) => {\n if (getFirstChild(cellNode, \"f\") || getFirstChild(cellNode, \"is\")) {\n return true;\n }\n\n const valueNode = getFirstChild(cellNode, \"v\");\n return Boolean(valueNode && (valueNode.textContent ?? \"\").length > 0);\n };\n\n getLocalElements(document, \"row\").forEach((rowNode) => {\n const rowIndex = Number(rowNode.getAttribute(\"r\") ?? 0) - 1;\n const height = Number(rowNode.getAttribute(\"ht\") ?? Number.NaN);\n const styleId = Number(rowNode.getAttribute(\"s\") ?? Number.NaN);\n const isHidden = (rowNode.getAttribute(\"hidden\") ?? \"0\") === \"1\";\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n if (rowIndex >= 0 && Number.isFinite(styleId)) {\n rowStyleIds[rowIndex] = styleId;\n }\n if (rowIndex >= 0 && isHidden) {\n hiddenRows.add(rowIndex);\n }\n\n getChildElements(rowNode, \"c\").forEach((cellNode) => {\n const cellRef = cellNode.getAttribute(\"r\");\n if (isMeaningfulCellNode(cellNode)) {\n trackContentCell(cellRef);\n }\n\n if (includeCachedFormulaValues) {\n const formulaNode = getFirstChild(cellNode, \"f\");\n const valueNode = getFirstChild(cellNode, \"v\");\n if (formulaNode && valueNode && cellRef) {\n cachedFormulaValues[cellRef] = valueNode.textContent ?? \"\";\n }\n }\n });\n });\n\n getLocalElements(document, \"mergeCell\").forEach((mergeNode) => {\n const reference = mergeNode.getAttribute(\"ref\");\n const range = reference ? parseA1RangeReference(reference) : null;\n if (!range) {\n return;\n }\n\n if (range.end.col > range.start.col) {\n hasHorizontalMerges = true;\n maxHorizontalMergeEndCol = Math.max(maxHorizontalMergeEndCol, range.end.col);\n }\n if (range.end.row > range.start.row) {\n hasVerticalMerges = true;\n maxVerticalMergeEndRow = Math.max(maxVerticalMergeEndRow, range.end.row);\n }\n });\n\n const maxMetadataCol = Math.max(maxContentCol, maxHorizontalMergeEndCol, 0) + 256;\n getLocalElements(document, \"col\").forEach((colNode) => {\n const min = Number(colNode.getAttribute(\"min\") ?? 0) - 1;\n const max = Number(colNode.getAttribute(\"max\") ?? 0) - 1;\n const width = Number(colNode.getAttribute(\"width\") ?? Number.NaN);\n const styleId = Number(colNode.getAttribute(\"style\") ?? Number.NaN);\n const isHidden = (colNode.getAttribute(\"hidden\") ?? \"0\") === \"1\";\n if (!Number.isFinite(width)) {\n if (!Number.isFinite(styleId)) {\n return;\n }\n }\n\n for (let col = min; col <= Math.min(max, maxMetadataCol); col += 1) {\n if (col >= 0) {\n if (Number.isFinite(width)) {\n const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n colWidthOverridesPx[col] = widthPx;\n }\n if (Number.isFinite(styleId)) {\n colStyleIds[col] = styleId;\n }\n if (isHidden) {\n hiddenCols.add(col);\n }\n }\n }\n });\n\n return {\n cachedFormulaValues,\n columnWidthCharacterWidthPx,\n colWidthOverridesPx,\n colStyleIds,\n conditionalFormatRules,\n defaultColWidthPx: sheetColumnWidthToPixels(defaultColWidth, columnWidthCharacterWidthPx),\n defaultRowHeightPx: Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33)),\n hasHorizontalMerges,\n hasVerticalMerges,\n maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow,\n maxContentCol,\n maxContentRow,\n minContentCol: Number.isFinite(minContentCol) ? minContentCol : -1,\n minContentRow: Number.isFinite(minContentRow) ? minContentRow : -1,\n hiddenCols: [...hiddenCols].sort((left, right) => left - right),\n hiddenRows: [...hiddenRows].sort((left, right) => left - right),\n rowHeightOverridesPx,\n rowStyleIds,\n showGridLines: (sheetViewNode?.getAttribute(\"showGridLines\") ?? \"1\") !== \"0\",\n sparklines,\n zoomScale\n };\n}\n\nfunction clampChannel(value: number) {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return \"#000000\";\n}\n\nfunction hexToRgb(hex: string) {\n const normalized = normalizeHexColor(hex);\n return {\n b: Number.parseInt(normalized.slice(5, 7), 16),\n g: Number.parseInt(normalized.slice(3, 5), 16),\n r: Number.parseInt(normalized.slice(1, 3), 16)\n };\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((value) => clampChannel(value).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyDrawingColorTransforms(\n baseColor: string,\n transformNodes: Element[]\n): DrawingColor {\n let { r, g, b } = hexToRgb(baseColor);\n let opacity = 1;\n let lumMod = 1;\n let lumOff = 0;\n\n transformNodes.forEach((node) => {\n const rawValue = Number(node.getAttribute(\"val\") ?? 0);\n const value = Number.isFinite(rawValue) ? rawValue / 100000 : 0;\n switch (node.localName) {\n case \"alpha\":\n opacity *= value;\n break;\n case \"lumMod\":\n lumMod *= value;\n break;\n case \"lumOff\":\n lumOff += value;\n break;\n case \"shade\":\n r *= value;\n g *= value;\n b *= value;\n break;\n case \"tint\":\n r = r + (255 - r) * value;\n g = g + (255 - g) * value;\n b = b + (255 - b) * value;\n break;\n default:\n break;\n }\n });\n\n if (lumMod !== 1 || lumOff !== 0) {\n r = r * lumMod + 255 * lumOff;\n g = g * lumMod + 255 * lumOff;\n b = b * lumMod + 255 * lumOff;\n }\n\n return {\n color: rgbToHex(r, g, b),\n opacity: Math.max(0, Math.min(1, opacity))\n };\n}\n\nfunction resolveThemeColorName(theme: ThemeState, name: string | null) {\n if (!name) {\n return null;\n }\n\n const aliases: Record<string, string> = {\n bg1: \"bg1\",\n bg2: \"bg2\",\n tx1: \"tx1\",\n tx2: \"tx2\"\n };\n const key = aliases[name] ?? name;\n return theme.colors.get(key) ?? null;\n}\n\nfunction resolveColorValue(colorNode: Element | null, theme: ThemeState): DrawingColor | null {\n if (!colorNode) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (colorNode.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"val\") ?? \"\");\n } else if (colorNode.localName === \"schemeClr\") {\n baseColor = resolveThemeColorName(theme, colorNode.getAttribute(\"val\"));\n } else if (colorNode.localName === \"scrgbClr\") {\n const r = Number(colorNode.getAttribute(\"r\") ?? 0) * 255 / 100000;\n const g = Number(colorNode.getAttribute(\"g\") ?? 0) * 255 / 100000;\n const b = Number(colorNode.getAttribute(\"b\") ?? 0) * 255 / 100000;\n baseColor = rgbToHex(r, g, b);\n } else if (colorNode.localName === \"sysClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"lastClr\") ?? \"\");\n }\n\n if (!baseColor) {\n return null;\n }\n\n return applyDrawingColorTransforms(baseColor, Array.from(colorNode.childNodes).filter(isElementNode));\n}\n\nfunction resolveFillColor(fillParent: Element | null, theme: ThemeState): DrawingColor | null {\n if (!fillParent) {\n return null;\n }\n\n const solidFillNode = getFirstChild(fillParent, \"solidFill\");\n if (!solidFillNode) {\n return null;\n }\n\n return resolveColorValue(Array.from(solidFillNode.childNodes).filter(isElementNode)[0] ?? null, theme);\n}\n\nfunction resolveTextTypeface(typeface: string | null, theme: ThemeState) {\n if (!typeface) {\n return undefined;\n }\n\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return theme.minorLatinFont ?? undefined;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return theme.majorLatinFont ?? undefined;\n }\n\n return typeface;\n}\n\nfunction isThemeTypeface(typeface: string | null | undefined) {\n return Boolean(typeface && typeface.startsWith(\"+\"));\n}\n\nfunction resolvePreferredTextTypeface(node: Element | null, theme: ThemeState) {\n if (!node) {\n return undefined;\n }\n\n const latin = getFirstChild(node, \"latin\")?.getAttribute(\"typeface\") ?? null;\n const eastAsian = getFirstChild(node, \"ea\")?.getAttribute(\"typeface\") ?? null;\n const complexScript = getFirstChild(node, \"cs\")?.getAttribute(\"typeface\") ?? null;\n const candidates = [latin, eastAsian, complexScript];\n const explicit = candidates.find((candidate) => candidate && !isThemeTypeface(candidate));\n if (explicit) {\n return explicit;\n }\n\n return resolveTextTypeface(candidates.find(Boolean) ?? null, theme);\n}\n\ntype ShapeTextStyle = {\n bold?: boolean;\n color?: string;\n fontFamily?: string;\n fontSizePt?: number;\n italic?: boolean;\n underline?: boolean;\n};\n\nfunction parseShapeTextStyle(node: Element | null, theme: ThemeState, fallbackColor?: DrawingColor | null): ShapeTextStyle {\n if (!node) {\n return {\n color: fallbackColor?.color\n };\n }\n\n const fillColor = resolveFillColor(node, theme) ?? fallbackColor ?? null;\n const underlineValue = node.getAttribute(\"u\");\n return {\n bold: node.getAttribute(\"b\") === \"1\" || undefined,\n color: fillColor?.color,\n fontFamily: resolvePreferredTextTypeface(node, theme),\n fontSizePt: node.getAttribute(\"sz\") ? Number(node.getAttribute(\"sz\")) / 100 : undefined,\n italic: node.getAttribute(\"i\") === \"1\" || undefined,\n underline: underlineValue && underlineValue !== \"none\" ? true : undefined\n };\n}\n\nfunction mergeShapeTextStyles(...styles: Array<ShapeTextStyle | undefined>): ShapeTextStyle {\n return styles.reduce<ShapeTextStyle>((acc, style) => {\n if (!style) {\n return acc;\n }\n return {\n bold: style.bold ?? acc.bold,\n color: style.color ?? acc.color,\n fontFamily: style.fontFamily ?? acc.fontFamily,\n fontSizePt: style.fontSizePt ?? acc.fontSizePt,\n italic: style.italic ?? acc.italic,\n underline: style.underline ?? acc.underline\n };\n }, {});\n}\n\nfunction parseMarker(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstChild(node, \"col\")?.textContent ?? 0);\n const row = Number(getFirstChild(node, \"row\")?.textContent ?? 0);\n const colOffsetEmu = Number(getFirstChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstChild(node, \"rowOff\")?.textContent ?? 0);\n\n return {\n col,\n colOffsetEmu,\n row,\n rowOffsetEmu\n };\n}\n\nfunction parseSpreadsheetBooleanValue(value: string | null | undefined) {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return true;\n }\n\n return ![\"0\", \"false\", \"none\", \"off\", \"unchecked\"].includes(normalized);\n}\n\nfunction parseSpreadsheetBooleanNode(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n return parseSpreadsheetBooleanValue(node.getAttribute(\"val\") ?? node.textContent);\n}\n\nfunction parseFormControlKind(rawType: string | null | undefined): XlsxFormControl[\"kind\"] {\n const normalized = (rawType ?? \"\").trim().toLowerCase();\n switch (normalized) {\n case \"button\":\n return \"button\";\n case \"checkbox\":\n return \"checkbox\";\n case \"drop\":\n return \"dropdown\";\n case \"editbox\":\n return \"editbox\";\n case \"gbox\":\n return \"group-box\";\n case \"label\":\n return \"label\";\n case \"list\":\n return \"listbox\";\n case \"radio\":\n return \"radio\";\n case \"scroll\":\n return \"scrollbar\";\n case \"spin\":\n return \"spinner\";\n default:\n return \"unknown\";\n }\n}\n\nfunction parseFormControlShapeId(value: string | null | undefined) {\n const match = (value ?? \"\").match(/(\\d+)(?!.*\\d)/);\n if (!match) {\n return null;\n }\n\n const parsed = Number(match[1]);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction parseCssDeclarationValue(styleText: string | null | undefined, property: string) {\n if (!styleText) {\n return null;\n }\n\n const pattern = new RegExp(`${property}\\\\s*:\\\\s*([^;]+)`, \"i\");\n const match = pattern.exec(styleText);\n return match?.[1]?.trim() ?? null;\n}\n\nfunction parseControlTextAlign(styleText: string | null | undefined): XlsxFormControl[\"textAlign\"] {\n const value = parseCssDeclarationValue(styleText, \"text-align\")?.toLowerCase();\n if (value === \"center\" || value === \"right\") {\n return value;\n }\n return value === \"left\" ? \"left\" : undefined;\n}\n\nfunction parseVmlFontSizePt(value: string | null | undefined) {\n const parsed = Number(value ?? Number.NaN);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return undefined;\n }\n\n return parsed > 40 ? parsed / 20 : parsed;\n}\n\nfunction normalizeControlLabel(label: string | null | undefined) {\n if (!label) {\n return undefined;\n }\n\n const normalized = label\n .replace(/\\u00a0/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction isPlaceholderFormControlName(name: string | null | undefined) {\n const normalized = normalizeControlLabel(name)?.toLowerCase();\n if (!normalized) {\n return false;\n }\n\n return /^(option button|group box|check box|drop down|dropdown|list box|edit box|scroll bar|spinner|spin button|button)\\s+\\d+$/.test(normalized);\n}\n\nfunction resolveNamedFormControlLabel(name: string | null | undefined) {\n return isPlaceholderFormControlName(name) ? undefined : normalizeControlLabel(name);\n}\n\nfunction parseAnchor(anchorNode: Element) {\n if (anchorNode.localName === \"anchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const extNode = getFirstChild(anchorNode, \"ext\");\n return from && extNode\n ? {\n from,\n kind: \"one-cell\" as const,\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n const extNode = getFirstChild(anchorNode, \"ext\");\n return positionNode && extNode\n ? {\n kind: \"absolute\" as const,\n positionEmu: {\n x: Number(positionNode.getAttribute(\"x\") ?? 0),\n y: Number(positionNode.getAttribute(\"y\") ?? 0)\n },\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n}\n\nfunction anchorToRect(anchor: XlsxImage[\"anchor\"]): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.positionEmu.x,\n y: anchor.positionEmu.y\n };\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n }\n\n return {\n cx: Math.max(0, (anchor.to.col - anchor.from.col) * DEFAULT_COL_WIDTH_EMU + anchor.to.colOffsetEmu - anchor.from.colOffsetEmu),\n cy: Math.max(0, (anchor.to.row - anchor.from.row) * DEFAULT_ROW_HEIGHT_EMU + anchor.to.rowOffsetEmu - anchor.from.rowOffsetEmu),\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n}\n\nfunction resolveSheetColumnWidthPx(sheetState: WorkbookSheetState | null, col: number) {\n if (col < 0) {\n return 0;\n }\n return sheetState?.colWidthOverridesPx[col] ?? sheetState?.defaultColWidthPx ?? emuToPixels(DEFAULT_COL_WIDTH_EMU);\n}\n\nfunction resolveSheetRowHeightPx(sheetState: WorkbookSheetState | null, row: number) {\n if (row < 0) {\n return 0;\n }\n return sheetState?.rowHeightOverridesPx[row] ?? sheetState?.defaultRowHeightPx ?? emuToPixels(DEFAULT_ROW_HEIGHT_EMU);\n}\n\nfunction sumSheetColumnWidthsEmu(sheetState: WorkbookSheetState | null, beforeCol: number) {\n let total = 0;\n for (let col = 0; col < beforeCol; col += 1) {\n total += pixelsToEmu(resolveSheetColumnWidthPx(sheetState, col));\n }\n return total;\n}\n\nfunction sumSheetRowHeightsEmu(sheetState: WorkbookSheetState | null, beforeRow: number) {\n let total = 0;\n for (let row = 0; row < beforeRow; row += 1) {\n total += pixelsToEmu(resolveSheetRowHeightPx(sheetState, row));\n }\n return total;\n}\n\nfunction anchorToAbsoluteRect(anchor: XlsxImage[\"anchor\"], sheetState: WorkbookSheetState | null): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return anchorToRect(anchor);\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu,\n y: sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu\n };\n }\n\n const left = sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu;\n const top = sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu;\n const right = sumSheetColumnWidthsEmu(sheetState, anchor.to.col) + anchor.to.colOffsetEmu;\n const bottom = sumSheetRowHeightsEmu(sheetState, anchor.to.row) + anchor.to.rowOffsetEmu;\n\n return {\n cx: Math.max(0, right - left),\n cy: Math.max(0, bottom - top),\n x: left,\n y: top\n };\n}\n\nfunction rectToAbsoluteAnchor(rect: DrawingRectEmu): XlsxImage[\"anchor\"] {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: rect.x,\n y: rect.y\n },\n sizeEmu: {\n cx: rect.cx,\n cy: rect.cy\n }\n };\n}\n\nfunction parseTransformRect(xfrmNode: Element | null) {\n if (!xfrmNode) {\n return null;\n }\n\n const offNode = getFirstChild(xfrmNode, \"off\");\n const extNode = getFirstChild(xfrmNode, \"ext\");\n if (!offNode || !extNode) {\n return null;\n }\n\n return {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0),\n flipH: xfrmNode.getAttribute(\"flipH\") === \"1\",\n flipV: xfrmNode.getAttribute(\"flipV\") === \"1\",\n rot: Number(xfrmNode.getAttribute(\"rot\") ?? 0) / 60000,\n x: Number(offNode.getAttribute(\"x\") ?? 0),\n y: Number(offNode.getAttribute(\"y\") ?? 0)\n };\n}\n\nfunction applyGroupTransform(rect: DrawingRectEmu, group: GroupTransform): DrawingRectEmu {\n return {\n cx: rect.cx * group.scaleX,\n cy: rect.cy * group.scaleY,\n x: group.x + (rect.x - group.chX) * group.scaleX,\n y: group.y + (rect.y - group.chY) * group.scaleY\n };\n}\n\nfunction parseGroupTransform(\n groupNode: Element,\n parentGroup: GroupTransform | null,\n fallbackAnchor: XlsxImage[\"anchor\"],\n sheetState: WorkbookSheetState | null\n) {\n const xfrmNode = getFirstDescendant(getFirstChild(groupNode, \"grpSpPr\") ?? groupNode, \"xfrm\");\n const anchorRect = anchorToAbsoluteRect(fallbackAnchor, sheetState);\n const rect = parseTransformRect(xfrmNode) ?? anchorRect;\n const rootRectMatchesAnchorOrigin = Math.abs(rect.x - anchorRect.x) <= EMU_PER_PIXEL\n && Math.abs(rect.y - anchorRect.y) <= EMU_PER_PIXEL;\n const chOffNode = getFirstChild(xfrmNode ?? groupNode, \"chOff\");\n const chExtNode = getFirstChild(xfrmNode ?? groupNode, \"chExt\");\n const rootScaleX = rect.cx !== 0 ? anchorRect.cx / rect.cx : 1;\n const rootScaleY = rect.cy !== 0 ? anchorRect.cy / rect.cy : 1;\n const useRectFrameForRoot = !parentGroup && (\n rootScaleX < 0.85\n || rootScaleX > 1.15\n || rootScaleY < 0.85\n || rootScaleY > 1.15\n );\n const absoluteRect = parentGroup\n ? applyGroupTransform(rect, parentGroup)\n : rootRectMatchesAnchorOrigin\n ? rect\n : anchorRect;\n const childRectX = parentGroup\n ? Number(chOffNode?.getAttribute(\"x\") ?? 0)\n : useRectFrameForRoot\n ? rect.x\n : Number(chOffNode?.getAttribute(\"x\") ?? 0);\n const childRectY = parentGroup\n ? Number(chOffNode?.getAttribute(\"y\") ?? 0)\n : useRectFrameForRoot\n ? rect.y\n : Number(chOffNode?.getAttribute(\"y\") ?? 0);\n const childRectCx = parentGroup\n ? Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx)\n : useRectFrameForRoot\n ? rect.cx\n : Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx);\n const childRectCy = parentGroup\n ? Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy)\n : useRectFrameForRoot\n ? rect.cy\n : Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy);\n return {\n chCx: childRectCx,\n chCy: childRectCy,\n chX: childRectX,\n chY: childRectY,\n cx: absoluteRect.cx,\n cy: absoluteRect.cy,\n scaleX: childRectCx !== 0 ? absoluteRect.cx / childRectCx : (parentGroup?.scaleX ?? 1),\n scaleY: childRectCy !== 0 ? absoluteRect.cy / childRectCy : (parentGroup?.scaleY ?? 1),\n x: absoluteRect.x,\n y: absoluteRect.y\n };\n}\n\nfunction anchorFromNodeOrFallback(\n node: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n parentGroup: GroupTransform | null\n) {\n const xfrmNode = getFirstDescendant(node, \"xfrm\");\n const rect = parseTransformRect(xfrmNode);\n if (rect) {\n const scaleX = parentGroup?.scaleX ?? 1;\n const scaleY = parentGroup?.scaleY ?? 1;\n return {\n anchor: parentGroup ? rectToAbsoluteAnchor(applyGroupTransform(rect, parentGroup)) : fallbackAnchor,\n flipH: rect.flipH,\n flipV: rect.flipV,\n rotationDeg: rect.rot,\n scaleX,\n scaleY\n };\n }\n\n return {\n anchor: fallbackAnchor,\n flipH: false,\n flipV: false,\n rotationDeg: 0,\n scaleX: parentGroup?.scaleX ?? 1,\n scaleY: parentGroup?.scaleY ?? 1\n };\n}\n\nfunction mapParagraphAlign(value: string | null | undefined): XlsxShape[\"paragraphs\"][number][\"align\"] | undefined {\n switch (value) {\n case \"ctr\":\n return \"center\";\n case \"just\":\n return \"justify\";\n case \"r\":\n return \"right\";\n case \"l\":\n return \"left\";\n default:\n return undefined;\n }\n}\n\nfunction mapVerticalAnchor(value: string | null | undefined): \"bottom\" | \"middle\" | \"top\" {\n switch (value) {\n case \"b\":\n return \"bottom\";\n case \"ctr\":\n return \"middle\";\n default:\n return \"top\";\n }\n}\n\nfunction createImageAnchorNodes(document: XMLDocument) {\n return document.documentElement\n ? Array.from(document.documentElement.childNodes).filter(\n (node): node is Element =>\n isElementNode(node) &&\n (node.localName === \"twoCellAnchor\" || node.localName === \"oneCellAnchor\" || node.localName === \"absoluteAnchor\")\n )\n : [];\n}\n\nfunction createImageSource(bytes: Uint8Array, mimeType: string, objectUrls: string[]) {\n if (typeof URL !== \"undefined\" && typeof Blob !== \"undefined\") {\n const objectUrl = URL.createObjectURL(new Blob([cloneBytes(bytes)], { type: mimeType }));\n objectUrls.push(objectUrl);\n return objectUrl;\n }\n\n let binary = \"\";\n for (const value of bytes) {\n binary += String.fromCharCode(value);\n }\n const base64 = typeof btoa === \"function\" ? btoa(binary) : \"\";\n return `data:${mimeType};base64,${base64}`;\n}\n\nfunction isStrokeOnlyGeometry(geometry: string) {\n return geometry === \"line\" || geometry === \"arc\" || geometry === \"leftBrace\";\n}\n\nfunction parseShapeStroke(node: Element, styleNode: Element | null, theme: ThemeState): XlsxShape[\"stroke\"] | undefined {\n const lineNode = getFirstDescendant(node, \"ln\");\n const lineRefNode = styleNode ? getFirstChild(styleNode, \"lnRef\") : null;\n if (!lineNode && !lineRefNode) {\n return undefined;\n }\n\n if (lineNode && getFirstChild(lineNode, \"noFill\")) {\n return { none: true };\n }\n\n const color = resolveFillColor(lineNode, theme)\n ?? resolveColorValue(Array.from(lineRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const widthEmu = Number(lineNode?.getAttribute(\"w\") ?? 0);\n return {\n color: color?.color,\n dash: getFirstChild(lineNode ?? node, \"prstDash\")?.getAttribute(\"val\") ?? undefined,\n headEndType: getFirstChild(lineNode ?? node, \"headEnd\")?.getAttribute(\"type\") ?? undefined,\n none: false,\n opacity: color?.opacity,\n tailEndType: getFirstChild(lineNode ?? node, \"tailEnd\")?.getAttribute(\"type\") ?? undefined,\n widthPx: widthEmu > 0 ? emuToPixels(widthEmu) : undefined\n };\n}\n\nfunction parseShapeFill(\n node: Element,\n styleNode: Element | null,\n theme: ThemeState,\n geometry: string\n): XlsxShape[\"fill\"] | undefined {\n const shapePropsNode = getFirstChild(node, \"spPr\") ?? node;\n const noFillNode = getFirstChild(shapePropsNode, \"noFill\");\n if (noFillNode) {\n return { none: true };\n }\n\n if (isStrokeOnlyGeometry(geometry)) {\n return { none: true };\n }\n\n const fillRefNode = styleNode ? getFirstChild(styleNode, \"fillRef\") : null;\n const fillColor = resolveFillColor(shapePropsNode, theme)\n ?? resolveColorValue(Array.from(fillRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n if (!fillColor) {\n return undefined;\n }\n\n return {\n color: fillColor.color,\n none: false,\n opacity: fillColor.opacity\n };\n}\n\nfunction parsePointNode(pointNode: Element | null) {\n if (!pointNode) {\n return null;\n }\n\n const x = Number(pointNode.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pointNode.getAttribute(\"y\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;\n}\n\nfunction parseCustomGeometryPath(shapeNode: Element): ShapeVectorPath | undefined {\n const pathNode = getFirstDescendant(shapeNode, \"path\");\n if (!pathNode) {\n return undefined;\n }\n\n const width = Number(pathNode.getAttribute(\"w\") ?? Number.NaN);\n const height = Number(pathNode.getAttribute(\"h\") ?? Number.NaN);\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n return undefined;\n }\n\n const commands: string[] = [];\n let lastPoint: { x: number; y: number } | null = null;\n for (const child of Array.from(pathNode.childNodes).filter(isElementNode)) {\n if (child.localName === \"moveTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point) {\n commands.push(`M ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"lnTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point && (!lastPoint || point.x !== lastPoint.x || point.y !== lastPoint.y)) {\n commands.push(`L ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"cubicBezTo\") {\n const points = getChildElements(child, \"pt\").map(parsePointNode).filter((point): point is { x: number; y: number } => point !== null);\n if (points.length === 3) {\n commands.push(`C ${points[0].x} ${points[0].y} ${points[1].x} ${points[1].y} ${points[2].x} ${points[2].y}`);\n lastPoint = points[2];\n }\n continue;\n }\n\n if (child.localName === \"close\") {\n commands.push(\"Z\");\n lastPoint = null;\n }\n }\n\n if (commands.length === 0) {\n return undefined;\n }\n\n return {\n path: commands.join(\" \"),\n viewBox: {\n height,\n width\n }\n };\n}\n\nfunction parseShapeGeometryAdjustments(shapeNode: Element) {\n const presetGeometry = getFirstDescendant(shapeNode, \"prstGeom\");\n if (!presetGeometry) {\n return undefined;\n }\n\n const adjustments: Record<string, number> = {};\n getChildElements(getFirstChild(presetGeometry, \"avLst\"), \"gd\").forEach((adjustmentNode) => {\n const name = adjustmentNode.getAttribute(\"name\");\n const formula = adjustmentNode.getAttribute(\"fmla\") ?? \"\";\n const match = formula.match(/^val\\s+(-?\\d+(?:\\.\\d+)?)$/);\n if (!name || !match) {\n return;\n }\n\n const value = Number.parseFloat(match[1] ?? \"\");\n if (Number.isFinite(value)) {\n adjustments[name] = value;\n }\n });\n\n return Object.keys(adjustments).length > 0 ? adjustments : undefined;\n}\n\nfunction parseShapeParagraphs(\n shapeNode: Element,\n styleNode: Element | null,\n theme: ThemeState\n): XlsxShape[\"paragraphs\"] {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return [];\n }\n\n const defaultFontRef = styleNode ? getFirstChild(styleNode, \"fontRef\") : null;\n const defaultFontColor = resolveColorValue(Array.from(defaultFontRef?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const listStyleNode = getFirstChild(txBodyNode, \"lstStyle\");\n const paragraphs: XlsxShape[\"paragraphs\"] = [];\n\n getChildElements(txBodyNode, \"p\").forEach((paragraphNode) => {\n const paragraphProps = getFirstChild(paragraphNode, \"pPr\");\n const paragraphLevel = Number(paragraphProps?.getAttribute(\"lvl\") ?? 0);\n const listLevelProps = getFirstChild(listStyleNode ?? txBodyNode, `lvl${paragraphLevel + 1}pPr`);\n const inheritedStyle = mergeShapeTextStyles(\n parseShapeTextStyle(getFirstChild(listLevelProps ?? txBodyNode, \"defRPr\"), theme, defaultFontColor),\n parseShapeTextStyle(getFirstChild(paragraphProps ?? paragraphNode, \"defRPr\"), theme, defaultFontColor)\n );\n const runs: XlsxShape[\"paragraphs\"][number][\"runs\"] = [];\n let sawRenderableChild = false;\n\n Array.from(paragraphNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"br\") {\n sawRenderableChild = true;\n runs.push({ text: \"\\n\" });\n return;\n }\n if (child.localName !== \"r\") {\n return;\n }\n\n sawRenderableChild = true;\n const text = getFirstChild(child, \"t\")?.textContent ?? \"\";\n const runProps = getFirstChild(child, \"rPr\");\n const runStyle = mergeShapeTextStyles(\n inheritedStyle,\n parseShapeTextStyle(runProps, theme, defaultFontColor)\n );\n\n runs.push({\n bold: runStyle.bold,\n color: runStyle.color,\n fontFamily: runStyle.fontFamily,\n fontSizePt: runStyle.fontSizePt,\n italic: runStyle.italic,\n text,\n underline: runStyle.underline\n });\n });\n\n if (runs.length === 0) {\n if (!sawRenderableChild && !getFirstChild(paragraphNode, \"endParaRPr\")) {\n return;\n }\n\n runs.push({\n bold: inheritedStyle.bold,\n color: inheritedStyle.color,\n fontFamily: inheritedStyle.fontFamily,\n fontSizePt: inheritedStyle.fontSizePt,\n italic: inheritedStyle.italic,\n text: \" \",\n underline: inheritedStyle.underline\n });\n }\n\n paragraphs.push({\n align: mapParagraphAlign(paragraphProps?.getAttribute(\"algn\")),\n runs\n });\n });\n\n return paragraphs;\n}\n\nfunction parseTextBox(shapeNode: Element): XlsxShape[\"textBox\"] | undefined {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return undefined;\n }\n\n const bodyProps = getFirstChild(txBodyNode, \"bodyPr\");\n const leftInset = emuToPixels(Number(bodyProps?.getAttribute(\"lIns\") ?? 91440));\n const rightInset = emuToPixels(Number(bodyProps?.getAttribute(\"rIns\") ?? 91440));\n const topInset = emuToPixels(Number(bodyProps?.getAttribute(\"tIns\") ?? 45720));\n const bottomInset = emuToPixels(Number(bodyProps?.getAttribute(\"bIns\") ?? 45720));\n\n return {\n horizontalAlign: bodyProps?.getAttribute(\"anchorCtr\") === \"1\" ? \"center\" : \"left\",\n insetPx: {\n bottom: bottomInset,\n left: leftInset,\n right: rightInset,\n top: topInset\n },\n verticalAlign: mapVerticalAnchor(bodyProps?.getAttribute(\"anchor\"))\n };\n}\n\nfunction getHyperlinkTarget(\n node: Element | null,\n drawingRelationships: Map<string, RelationshipRecord>\n) {\n const hyperlinkNode = node ? getFirstDescendant(node, \"hlinkClick\") : null;\n const hyperlinkTargetNode = hyperlinkNode ?? node;\n const hyperlinkId = hyperlinkTargetNode ? getRelationshipId(hyperlinkTargetNode) : null;\n return hyperlinkId ? drawingRelationships.get(hyperlinkId)?.target ?? undefined : undefined;\n}\n\nfunction parsePictureNode(\n pictureNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n imageId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const blipNode = getFirstDescendant(pictureNode, \"blip\");\n const svgBlipNode = blipNode ? getFirstDescendant(blipNode, \"svgBlip\") : null;\n const embedId = (svgBlipNode ? getEmbeddedRelationshipId(svgBlipNode) : null) ?? (blipNode ? getEmbeddedRelationshipId(blipNode) : null);\n if (!embedId) {\n return null;\n }\n\n const mediaRelationship = drawingRelationships.get(embedId);\n if (!mediaRelationship || mediaRelationship.type !== IMAGE_REL_TYPE) {\n return null;\n }\n\n const mediaBytes = archive[mediaRelationship.target];\n if (!mediaBytes) {\n return null;\n }\n\n const nonVisualProps = getFirstDescendant(pictureNode, \"cNvPr\");\n const transform = anchorFromNodeOrFallback(pictureNode, fallbackAnchor, parentGroup);\n return {\n image: {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? pictureNode, drawingRelationships),\n id: imageId,\n mediaPath: mediaRelationship.target,\n mimeType: resolveContentType(contentTypes, mediaRelationship.target),\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n sheetIndex: workbookSheetIndex,\n src: createImageSource(mediaBytes, resolveContentType(contentTypes, mediaRelationship.target), objectUrls),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxImage,\n mediaPath: mediaRelationship.target\n };\n}\n\nfunction parseShapeNode(\n shapeNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n theme: ThemeState,\n workbookSheetIndex: number,\n shapeId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const nonVisualProps = getFirstDescendant(shapeNode, \"cNvPr\");\n const styleNode = getFirstChild(shapeNode, \"style\");\n const transform = anchorFromNodeOrFallback(shapeNode, fallbackAnchor, parentGroup);\n const geometry = getFirstDescendant(shapeNode, \"prstGeom\")?.getAttribute(\"prst\")\n ?? (getFirstDescendant(shapeNode, \"custGeom\") ? \"custom\" : \"rect\");\n const customPath = geometry === \"custom\" ? parseCustomGeometryPath(shapeNode) : undefined;\n const geometryAdjustments = parseShapeGeometryAdjustments(shapeNode);\n return {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n fill: parseShapeFill(shapeNode, styleNode, theme, geometry),\n flipH: transform.flipH,\n flipV: transform.flipV,\n geometry,\n geometryAdjustments,\n hidden: nonVisualProps?.getAttribute(\"hidden\") === \"1\" || undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? shapeNode, drawingRelationships),\n id: shapeId,\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n paragraphs: parseShapeParagraphs(shapeNode, styleNode, theme),\n rotationDeg: transform.rotationDeg,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n sheetIndex: workbookSheetIndex,\n svgPath: customPath?.path,\n svgViewBox: customPath?.viewBox,\n stroke: parseShapeStroke(shapeNode, styleNode, theme),\n textBox: parseTextBox(shapeNode),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxShape;\n}\n\nfunction parseAnchorContents(\n anchorNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n theme: ThemeState,\n ids: { image: number; shape: number; z: number },\n imageOriginsById: Map<string, WorkbookImageOrigin>,\n anchorIndex: number,\n sheetState: WorkbookSheetState | null,\n parentGroup: GroupTransform | null = null\n) {\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n\n Array.from(anchorNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"pic\") {\n const imageId = `sheet-${workbookSheetIndex}-${ids.image}`;\n const parsed = parsePictureNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n imageId,\n ids.z++,\n parentGroup\n );\n ids.image += 1;\n if (parsed) {\n images.push(parsed.image);\n mediaPaths.add(parsed.mediaPath);\n imageOriginsById.set(imageId, {\n anchorIndex,\n workbookSheetIndex\n });\n }\n return;\n }\n\n if (child.localName === \"sp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName === \"cxnSp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName !== \"grpSp\") {\n return;\n }\n\n const nextGroup = parseGroupTransform(\n child,\n parentGroup,\n fallbackAnchor,\n sheetState\n );\n const groupFallbackAnchor = rectToAbsoluteAnchor({\n cx: nextGroup.cx,\n cy: nextGroup.cy,\n x: nextGroup.x,\n y: nextGroup.y\n });\n const parsedGroup = parseAnchorContents(\n child,\n groupFallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n nextGroup\n );\n parsedGroup.images.forEach((image) => images.push(image));\n parsedGroup.shapes.forEach((shape) => shapes.push(shape));\n parsedGroup.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths,\n shapes\n };\n}\n\nfunction parseDrawingObjects(\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n drawingPath: string,\n objectUrls: string[],\n workbookSheetIndex: number,\n zIndexBase: number,\n theme: ThemeState,\n sheetState: WorkbookSheetState | null,\n imageOriginsById: Map<string, WorkbookImageOrigin>\n) {\n const drawingXml = readArchiveText(archive, drawingPath);\n if (!drawingXml) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingRelationships = parseRelationships(archive, relsPathForDocument(drawingPath), drawingPath);\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const ids = {\n image: zIndexBase,\n shape: zIndexBase,\n z: zIndexBase\n };\n\n anchorNodes.forEach((anchorNode, anchorIndex) => {\n const anchor = parseAnchor(anchorNode);\n if (!anchor) {\n return;\n }\n\n const parsed = parseAnchorContents(\n anchorNode,\n anchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState\n );\n parsed.images.forEach((image) => images.push(image));\n parsed.shapes.forEach((shape) => shapes.push(shape));\n parsed.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths: [...mediaPaths],\n shapes\n };\n}\n\nfunction parseSheetFormControlNodes(\n archive: ArchiveEntries,\n sheetPath: string\n) {\n const sheetXml = readArchiveText(archive, sheetPath);\n if (!sheetXml) {\n return [] as ParsedSheetFormControl[];\n }\n\n const sheetDocument = parseXml(sheetXml);\n if (!sheetDocument) {\n return [] as ParsedSheetFormControl[];\n }\n\n return getLocalElements(sheetDocument, \"control\").map((controlNode) => ({\n anchor: parseAnchor(getFirstDescendant(controlNode, \"anchor\") ?? controlNode),\n controlRelationshipId: getRelationshipId(controlNode),\n name: controlNode.getAttribute(\"name\") ?? undefined,\n shapeId: parseFormControlShapeId(controlNode.getAttribute(\"shapeId\"))\n }));\n}\n\nfunction parseCtrlPropDocument(\n archive: ArchiveEntries,\n ctrlPropPath: string\n) {\n const xml = readArchiveText(archive, ctrlPropPath);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n const root = document?.documentElement;\n if (!root) {\n return null;\n }\n\n return {\n checked: parseSpreadsheetBooleanValue(root.getAttribute(\"checked\")),\n linkedCell: root.getAttribute(\"fmlaLink\") ?? undefined,\n objectType: root.getAttribute(\"objectType\") ?? undefined\n } satisfies ParsedCtrlProp;\n}\n\nfunction parseVmlFormControls(\n archive: ArchiveEntries,\n vmlDrawingPath: string\n) {\n const xml = readArchiveText(archive, vmlDrawingPath);\n if (!xml) {\n return new Map<number, ParsedVmlFormControl>();\n }\n\n const document = parseXml(xml);\n if (!document) {\n return new Map<number, ParsedVmlFormControl>();\n }\n\n const controls = new Map<number, ParsedVmlFormControl>();\n for (const shapeNode of getLocalElements(document, \"shape\")) {\n const clientDataNode = getFirstChild(shapeNode, \"ClientData\");\n if (!clientDataNode) {\n continue;\n }\n\n const shapeId = parseFormControlShapeId(\n shapeNode.getAttributeNS(\"urn:schemas-microsoft-com:office:office\", \"spid\")\n ?? shapeNode.getAttribute(\"o:spid\")\n ?? shapeNode.getAttribute(\"spid\")\n ?? shapeNode.getAttribute(\"id\")\n );\n if (shapeId === null) {\n continue;\n }\n\n const styleText = shapeNode.getAttribute(\"style\");\n const textboxNode = getFirstChild(shapeNode, \"textbox\");\n const fontNode = textboxNode ? getFirstDescendant(textboxNode, \"font\") : null;\n const textContainerNode = textboxNode ? getFirstDescendant(textboxNode, \"div\") : null;\n const label = normalizeControlLabel(textboxNode?.textContent);\n const zIndex = Number(parseCssDeclarationValue(styleText, \"z-index\") ?? Number.NaN);\n\n controls.set(shapeId, {\n checked: parseSpreadsheetBooleanNode(getFirstChild(clientDataNode, \"Checked\")),\n fontFamily: fontNode?.getAttribute(\"face\") ?? undefined,\n fontSizePt: parseVmlFontSizePt(fontNode?.getAttribute(\"size\")),\n hidden: (parseCssDeclarationValue(styleText, \"visibility\") ?? \"\").toLowerCase() === \"hidden\",\n label,\n linkedCell: normalizeControlLabel(getFirstChild(clientDataNode, \"FmlaLink\")?.textContent),\n objectType: clientDataNode.getAttribute(\"ObjectType\") ?? undefined,\n shapeId,\n textAlign: parseControlTextAlign(textContainerNode?.getAttribute(\"style\")),\n textColor: fontNode?.getAttribute(\"color\") ?? undefined,\n zIndex: Number.isFinite(zIndex) ? zIndex : controls.size + 1\n });\n }\n\n return controls;\n}\n\nfunction parseSheetFormControls(\n archive: ArchiveEntries,\n sheetPath: string,\n sheetRelationships: Map<string, RelationshipRecord>,\n workbookSheetIndex: number,\n zIndexBase: number\n) {\n const controlNodes = parseSheetFormControlNodes(archive, sheetPath);\n if (controlNodes.length === 0) {\n return [] as XlsxFormControl[];\n }\n\n const legacyDrawingRelationship = [...sheetRelationships.values()].find(\n (relationship) => relationship.type === VML_DRAWING_REL_TYPE\n );\n const vmlControlsByShapeId = legacyDrawingRelationship\n ? parseVmlFormControls(archive, legacyDrawingRelationship.target)\n : new Map<number, ParsedVmlFormControl>();\n const parsedControls: XlsxFormControl[] = [];\n\n controlNodes.forEach((controlNode, index) => {\n if (!controlNode.anchor) {\n return;\n }\n\n const ctrlPropRelationship = controlNode.controlRelationshipId\n ? sheetRelationships.get(controlNode.controlRelationshipId) ?? null\n : null;\n const ctrlPropPath = ctrlPropRelationship?.type === CTRL_PROP_REL_TYPE\n ? ctrlPropRelationship.target\n : null;\n const ctrlProp = ctrlPropPath\n ? parseCtrlPropDocument(archive, ctrlPropPath)\n : null;\n const vmlControl = controlNode.shapeId !== null\n ? vmlControlsByShapeId.get(controlNode.shapeId) ?? null\n : null;\n const kind = parseFormControlKind(ctrlProp?.objectType ?? vmlControl?.objectType);\n\n parsedControls.push({\n anchor: controlNode.anchor,\n checked: ctrlProp?.checked ?? vmlControl?.checked,\n fontFamily: vmlControl?.fontFamily,\n fontSizePt: vmlControl?.fontSizePt,\n hidden: vmlControl?.hidden ?? false,\n id: `form-control-${workbookSheetIndex}-${index}`,\n kind,\n label: vmlControl?.label,\n linkedCell: ctrlProp?.linkedCell ?? vmlControl?.linkedCell,\n name: controlNode.name,\n sheetIndex: workbookSheetIndex,\n textAlign: vmlControl?.textAlign,\n textColor: vmlControl?.textColor,\n workbookSheetIndex,\n zIndex: zIndexBase + (vmlControl?.zIndex ?? index + 1)\n });\n });\n\n return parsedControls.sort((left, right) => left.zIndex - right.zIndex);\n}\n\nfunction flattenShapeText(shape: XlsxShape) {\n const text = shape.paragraphs\n .flatMap((paragraph) => paragraph.runs.map((run) => run.text))\n .join(\" \");\n return normalizeControlLabel(text);\n}\n\nfunction rectArea(rect: DrawingRectEmu) {\n return Math.max(0, rect.cx) * Math.max(0, rect.cy);\n}\n\nfunction rectIntersectionArea(left: DrawingRectEmu, right: DrawingRectEmu) {\n const overlapX = Math.max(0, Math.min(left.x + left.cx, right.x + right.cx) - Math.max(left.x, right.x));\n const overlapY = Math.max(0, Math.min(left.y + left.cy, right.y + right.cy) - Math.max(left.y, right.y));\n return overlapX * overlapY;\n}\n\nfunction rectCenterDistance(left: DrawingRectEmu, right: DrawingRectEmu) {\n const leftCenterX = left.x + left.cx / 2;\n const leftCenterY = left.y + left.cy / 2;\n const rightCenterX = right.x + right.cx / 2;\n const rightCenterY = right.y + right.cy / 2;\n return Math.hypot(leftCenterX - rightCenterX, leftCenterY - rightCenterY);\n}\n\nfunction findHiddenShapeControlMatch(\n control: XlsxFormControl,\n shapes: XlsxShape[],\n sheetState: WorkbookSheetState | null\n): XlsxShape | null {\n const controlRect = anchorToAbsoluteRect(control.anchor, sheetState);\n const controlArea = Math.max(1, rectArea(controlRect));\n const placeholderName = isPlaceholderFormControlName(control.name);\n let bestMatch: XlsxShape | null = null;\n let bestScore = Number.NEGATIVE_INFINITY;\n\n shapes.forEach((shape) => {\n if (!shape.hidden) {\n return;\n }\n\n const shapeRect = anchorToAbsoluteRect(shape.anchor, sheetState);\n const shapeArea = Math.max(1, rectArea(shapeRect));\n const intersectionArea = rectIntersectionArea(controlRect, shapeRect);\n const overlapScore = intersectionArea / Math.min(controlArea, shapeArea);\n const distance = rectCenterDistance(controlRect, shapeRect);\n const maxDimension = Math.max(controlRect.cx, controlRect.cy, shapeRect.cx, shapeRect.cy, 1);\n const distanceScore = distance / maxDimension;\n const textLabel = flattenShapeText(shape);\n const sameName = normalizeControlLabel(shape.name)?.toLowerCase() === normalizeControlLabel(control.name)?.toLowerCase();\n let score = overlapScore * 4 - distanceScore;\n\n if (sameName) {\n score += 1;\n }\n\n if (control.kind === \"group-box\") {\n score += textLabel ? -3 : 0.5;\n score += shape.stroke?.none ? -1.5 : 0.75;\n } else {\n score += textLabel ? 2 : -1;\n score += shape.stroke?.none ? 0.2 : -0.5;\n }\n\n if (!placeholderName && textLabel && textLabel === resolveNamedFormControlLabel(control.name)) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestMatch = shape;\n bestScore = score;\n }\n });\n\n return bestScore >= 0.25 ? bestMatch : null;\n}\n\nfunction enrichFormControlsWithHiddenShapes(\n formControls: XlsxFormControl[],\n shapes: XlsxShape[],\n sheetState: WorkbookSheetState | null\n) {\n return formControls.map((control) => {\n const matchedShape = findHiddenShapeControlMatch(control, shapes, sheetState);\n const matchedLabel = matchedShape ? flattenShapeText(matchedShape) : undefined;\n const fallbackLabel = resolveNamedFormControlLabel(control.name);\n let resolvedAnchor = control.anchor;\n if (matchedShape && (control.kind === \"group-box\" || matchedLabel || isPlaceholderFormControlName(control.name))) {\n resolvedAnchor = matchedShape.anchor;\n }\n\n return {\n ...control,\n anchor: resolvedAnchor,\n label: control.label ?? matchedLabel ?? fallbackLabel\n };\n });\n}\n\nexport function revokeWorkbookImageAssets(assets: WorkbookImageAssets | null) {\n if (!assets) {\n return;\n }\n\n for (const objectUrl of assets.objectUrls) {\n if (objectUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nfunction parseWorkbookStructureAssetsFromArchive(\n archive: ArchiveEntries,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets & {\n contentTypes: ContentTypesState;\n theme: ThemeState;\n workbookSheets: WorkbookSheetInfo[];\n} {\n const contentTypes = parseContentTypes(archive);\n const workbookSheets = parseWorkbookSheets(archive);\n const theme = parseWorkbookTheme(archive);\n const themePalette = buildThemePalette(theme);\n const { defaultFont, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);\n const tableMetadataByWorkbookSheetIndex = parseWorkbookTableMetadata(archive, workbookSheets);\n return {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {\n ...options,\n defaultFont,\n themePalette\n })),\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n };\n}\n\nexport function parseWorkbookStructureAssets(\n bytes: Uint8Array,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets {\n const archive = unzipSync(bytes);\n const {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n } = parseWorkbookStructureAssetsFromArchive(archive, options);\n\n return {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nexport function parseWorkbookChartStyleAssets(bytes: Uint8Array): WorkbookChartStyleAssets {\n const archive = unzipSync(bytes);\n const {\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: []\n });\n }\n\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n sheetOrigins,\n themePalette\n };\n}\n\nexport function parseWorkbookImageAssets(bytes: Uint8Array): WorkbookImageAssets {\n const archive = unzipSync(bytes);\n const {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const objectUrls: string[] = [];\n const formControlsByWorkbookSheetIndex: XlsxFormControl[][] = [];\n const imagesByWorkbookSheetIndex: XlsxImage[][] = [];\n const shapesByWorkbookSheetIndex: XlsxShape[][] = [];\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n const imageOriginsById = new Map<string, WorkbookImageOrigin>();\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n const imageList: XlsxImage[] = [];\n const shapeList: XlsxShape[] = [];\n let zIndexBase = 1;\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n const drawingImages = parseDrawingObjects(\n archive,\n contentTypes,\n drawingPath,\n objectUrls,\n workbookSheetIndex,\n zIndexBase,\n theme,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null,\n imageOriginsById\n );\n imageList.push(...drawingImages.images);\n shapeList.push(...drawingImages.shapes);\n zIndexBase += drawingImages.images.length + drawingImages.shapes.length + 10;\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: drawingImages.mediaPaths\n });\n }\n\n const formControlList = parseSheetFormControls(\n archive,\n sheet.path,\n sheetRelationships,\n workbookSheetIndex,\n zIndexBase\n );\n const visibleShapeList = shapeList.filter((shape) => !shape.hidden);\n const enrichedFormControlList = enrichFormControlsWithHiddenShapes(\n formControlList,\n shapeList,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null\n );\n\n formControlsByWorkbookSheetIndex[workbookSheetIndex] = enrichedFormControlList;\n imagesByWorkbookSheetIndex[workbookSheetIndex] = imageList;\n shapesByWorkbookSheetIndex[workbookSheetIndex] = visibleShapeList;\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n formControlsByWorkbookSheetIndex,\n imageOriginsById,\n imagesByWorkbookSheetIndex,\n namedCellStyleByName,\n objectUrls,\n shapesByWorkbookSheetIndex,\n sheetOrigins,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImage[\"anchor\"]) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n updateMarkerElement(getFirstChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n if (positionNode) {\n positionNode.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n positionNode.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nexport function updateWorkbookImageAnchor(\n assets: WorkbookImageAssets,\n imageId: string,\n anchor: XlsxImage[\"anchor\"]\n) {\n const origin = assets.imageOriginsById.get(imageId);\n if (!origin) {\n return false;\n }\n\n const attachments = assets.sheetOrigins[origin.workbookSheetIndex]?.attachments ?? [];\n for (const attachment of attachments) {\n const drawingXml = readArchiveText(assets.archive, attachment.drawingPath);\n if (!drawingXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n continue;\n }\n\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const anchorNode = anchorNodes[origin.anchorIndex];\n if (!anchorNode || !getFirstChild(anchorNode, \"pic\")) {\n continue;\n }\n\n updateAnchorNode(anchorNode, anchor);\n assets.archive[attachment.drawingPath] = strToU8(serializeXml(drawingDocument));\n const imageList = assets.imagesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? [];\n const imageIndex = imageList.findIndex((image) => image.id === imageId);\n if (imageIndex >= 0) {\n imageList[imageIndex] = {\n ...imageList[imageIndex],\n anchor\n };\n }\n return true;\n }\n\n return false;\n}\n\nfunction ensureRelationshipsDocument(archive: ArchiveEntries, relsPath: string) {\n const existing = readArchiveText(archive, relsPath);\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"${PKG_REL_NS}\"></Relationships>`\n );\n}\n\nfunction ensureContentTypesDocument(archive: ArchiveEntries) {\n const existing = readArchiveText(archive, \"[Content_Types].xml\");\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"${CONTENT_TYPES_NS}\"></Types>`\n );\n}\n\nfunction mergeContentTypeForPath(\n targetDocument: XMLDocument,\n originalDocument: XMLDocument | null,\n partPath: string\n) {\n const normalizedPartName = `/${normalizeArchivePath(partPath)}`;\n const targetRoot = targetDocument.documentElement;\n if (!targetRoot) {\n return;\n }\n\n const existingOverride = getLocalElements(targetDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (!existingOverride && originalDocument) {\n const sourceOverride = getLocalElements(originalDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (sourceOverride) {\n targetRoot.appendChild(sourceOverride.cloneNode(true));\n return;\n }\n }\n\n const extension = normalizedPartName.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return;\n }\n\n const existingDefault = getLocalElements(targetDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (existingDefault) {\n return;\n }\n\n if (originalDocument) {\n const sourceDefault = getLocalElements(originalDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (sourceDefault) {\n targetRoot.appendChild(sourceDefault.cloneNode(true));\n return;\n }\n }\n\n if (extension === \"xml\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/xml\");\n targetRoot.appendChild(defaultNode);\n return;\n }\n\n if (extension === \"rels\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/vnd.openxmlformats-package.relationships+xml\");\n targetRoot.appendChild(defaultNode);\n }\n}\n\nfunction removeDrawingReferences(sheetDocument: XMLDocument, relDocument: XMLDocument) {\n getLocalElements(sheetDocument, \"drawing\").forEach((node) => node.remove());\n getLocalElements(relDocument, \"Relationship\")\n .filter((node) => node.getAttribute(\"Type\") === DRAWING_REL_TYPE)\n .forEach((node) => node.remove());\n}\n\nfunction nextRelationshipId(relDocument: XMLDocument) {\n const existingIds = new Set(\n getLocalElements(relDocument, \"Relationship\")\n .map((node) => node.getAttribute(\"Id\"))\n .filter((value): value is string => Boolean(value))\n );\n\n let index = 1;\n while (existingIds.has(`rIdReactXlsxImage${index}`)) {\n index += 1;\n }\n\n return `rIdReactXlsxImage${index}`;\n}\n\nfunction appendSheetDrawingReference(\n sheetDocument: XMLDocument,\n relationshipId: string\n) {\n const worksheet = sheetDocument.documentElement;\n if (!worksheet) {\n return;\n }\n\n const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, \"drawing\");\n drawingNode.setAttributeNS(REL_NS, \"r:id\", relationshipId);\n\n const extLst = getFirstChild(worksheet, \"extLst\");\n if (extLst) {\n worksheet.insertBefore(drawingNode, extLst);\n return;\n }\n\n worksheet.appendChild(drawingNode);\n}\n\nexport function mergeWorkbookImageAssets(\n savedBytes: Uint8Array,\n sourceAssets: WorkbookImageAssets | null,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n if (!sourceAssets || sheetOrigins.every((origin) => !origin?.attachments.length)) {\n return cloneBytes(savedBytes);\n }\n\n try {\n const archive = unzipSync(savedBytes);\n const workbookSheets = parseWorkbookSheets(archive);\n const originalContentTypesDocument = parseXml(readArchiveText(sourceAssets.archive, \"[Content_Types].xml\") ?? \"\");\n const targetContentTypesDocument = ensureContentTypesDocument(archive);\n if (!targetContentTypesDocument) {\n return cloneBytes(savedBytes);\n }\n\n sheetOrigins.forEach((origin, workbookSheetIndex) => {\n if (!origin?.attachments.length) {\n return;\n }\n\n const currentSheet = workbookSheets[workbookSheetIndex];\n if (!currentSheet) {\n return;\n }\n\n const sheetXml = readArchiveText(archive, currentSheet.path);\n if (!sheetXml) {\n return;\n }\n\n const sheetDocument = parseXml(sheetXml);\n const relsPath = relsPathForDocument(currentSheet.path);\n const relDocument = ensureRelationshipsDocument(archive, relsPath);\n if (!sheetDocument || !relDocument) {\n return;\n }\n\n removeDrawingReferences(sheetDocument, relDocument);\n\n origin.attachments.forEach((attachment) => {\n const drawingBytes = sourceAssets.archive[attachment.drawingPath];\n if (!drawingBytes) {\n return;\n }\n\n archive[attachment.drawingPath] = cloneBytes(drawingBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingPath);\n\n if (attachment.drawingRelsPath) {\n const drawingRelsBytes = sourceAssets.archive[attachment.drawingRelsPath];\n if (drawingRelsBytes) {\n archive[attachment.drawingRelsPath] = cloneBytes(drawingRelsBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingRelsPath);\n }\n }\n\n attachment.mediaPaths.forEach((mediaPath) => {\n const mediaBytes = sourceAssets.archive[mediaPath];\n if (!mediaBytes) {\n return;\n }\n\n archive[mediaPath] = cloneBytes(mediaBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, mediaPath);\n });\n\n const relationshipId = nextRelationshipId(relDocument);\n const relationshipNode = relDocument.createElementNS(PKG_REL_NS, \"Relationship\");\n relationshipNode.setAttribute(\"Id\", relationshipId);\n relationshipNode.setAttribute(\"Type\", DRAWING_REL_TYPE);\n relationshipNode.setAttribute(\"Target\", relativeArchivePath(currentSheet.path, attachment.drawingPath));\n relDocument.documentElement?.appendChild(relationshipNode);\n appendSheetDrawingReference(sheetDocument, relationshipId);\n });\n\n archive[currentSheet.path] = strToU8(serializeXml(sheetDocument));\n archive[relsPath] = strToU8(serializeXml(relDocument));\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n });\n\n const hasDrawingOverride = getLocalElements(targetContentTypesDocument, \"Override\").some(\n (node) => node.getAttribute(\"ContentType\") === DRAWING_CONTENT_TYPE\n );\n if (!hasDrawingOverride) {\n for (const path of Object.keys(archive)) {\n if (path.startsWith(\"xl/drawings/\") && path.endsWith(\".xml\")) {\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, path);\n }\n }\n }\n\n archive[\"[Content_Types].xml\"] = strToU8(serializeXml(targetContentTypesDocument));\n return zipSync(archive, { level: 6 });\n } catch {\n return cloneBytes(savedBytes);\n }\n}\n\nexport function emuToPixels(value: number) {\n return value / EMU_PER_PIXEL;\n}\n\nexport function pixelsToEmu(value: number) {\n return value * EMU_PER_PIXEL;\n}\n\nexport function pxToSheetColumnWidth(widthPx: number) {\n return (Math.max(widthPx, MIN_COL_WIDTH_PX) - 5) / 7;\n}\n\nexport function resolveSheetColumnWidthPixels(width: number, columnWidthCharacterWidthPx?: number) {\n return sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n}\n\nexport function resolveSheetRowHeightPixels(height: number) {\n return Math.max(Math.round(height * 1.33), MIN_ROW_HEIGHT_PX);\n}\n\nexport function resolveRenderedSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx) + (showGridLines ? resolveDeviceGridlineThicknessPx() : 0);\n}\n\nexport function resolveContentSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx - (showGridLines ? resolveDeviceGridlineThicknessPx() : 0));\n}\n\nfunction markerFromOffset(offsetPx: number, getSizePx: (index: number) => number) {\n let remaining = Math.max(0, offsetPx);\n let index = 0;\n while (remaining > 0) {\n const size = Math.max(1, getSizePx(index));\n if (remaining < size) {\n break;\n }\n remaining -= size;\n index += 1;\n }\n\n return {\n index,\n offsetPx: remaining\n };\n}\n\nexport function rectToImageAnchor(\n rect: XlsxImageRect,\n currentAnchor: XlsxImage[\"anchor\"],\n options: {\n contentOffsetLeft: number;\n contentOffsetTop: number;\n getColumnWidthPx: (col: number) => number;\n getRowHeightPx: (row: number) => number;\n }\n): XlsxImage[\"anchor\"] {\n const contentLeft = Math.max(0, rect.left - options.contentOffsetLeft);\n const contentTop = Math.max(0, rect.top - options.contentOffsetTop);\n const contentRight = Math.max(contentLeft + 1, rect.left + rect.width - options.contentOffsetLeft);\n const contentBottom = Math.max(contentTop + 1, rect.top + rect.height - options.contentOffsetTop);\n\n if (currentAnchor.kind === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: pixelsToEmu(contentLeft),\n y: pixelsToEmu(contentTop)\n },\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const fromCol = markerFromOffset(contentLeft, options.getColumnWidthPx);\n const fromRow = markerFromOffset(contentTop, options.getRowHeightPx);\n if (currentAnchor.kind === \"one-cell\") {\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const toCol = markerFromOffset(contentRight, options.getColumnWidthPx);\n const toRow = markerFromOffset(contentBottom, options.getRowHeightPx);\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"two-cell\",\n to: {\n col: toCol.index,\n colOffsetEmu: pixelsToEmu(toCol.offsetPx),\n row: toRow.index,\n rowOffsetEmu: pixelsToEmu(toRow.offsetPx)\n }\n };\n}\n\nexport function resizeImageRect(\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number,\n minimumSize = 16\n) {\n let left = rect.left;\n let top = rect.top;\n let width = rect.width;\n let height = rect.height;\n\n if (handle.includes(\"w\")) {\n left += deltaX;\n width -= deltaX;\n }\n if (handle.includes(\"e\")) {\n width += deltaX;\n }\n if (handle.includes(\"n\")) {\n top += deltaY;\n height -= deltaY;\n }\n if (handle.includes(\"s\")) {\n height += deltaY;\n }\n\n if (width < minimumSize) {\n if (handle.includes(\"w\")) {\n left -= minimumSize - width;\n }\n width = minimumSize;\n }\n if (height < minimumSize) {\n if (handle.includes(\"n\")) {\n top -= minimumSize - height;\n }\n height = minimumSize;\n }\n\n return { height, left, top, width };\n}\n","import type { XlsxThemePalette } from \"./types\";\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n const match = normalized ? /^#([0-9a-f]{6})$/.exec(normalized) : null;\n if (!match) {\n return null;\n }\n\n const hex = match[1];\n return [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, channel)).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyExcelTint(baseColor: string, tint: number) {\n const rgb = parseHexColor(baseColor);\n if (!rgb || !Number.isFinite(tint) || tint === 0) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = tint < 0\n ? lightness * (1 + tint)\n : lightness * (1 - tint) + tint;\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, Math.max(0, Math.min(1, nextLightness)));\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nexport function resolveWorkbookColor(\n color: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!color) {\n return null;\n }\n\n const directHex = [\"hex\", \"rgb\", \"argb\"]\n .map((key) => color[key])\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n if (directHex) {\n return normalizeHexColor(directHex);\n }\n\n const themeValue = color.theme;\n const numericTheme = typeof themeValue === \"number\"\n ? themeValue\n : typeof themeValue === \"string\" && themeValue.trim().length > 0\n ? Number(themeValue)\n : Number.NaN;\n const themeColor = Number.isFinite(numericTheme) ? themePalette?.colorsByIndex[numericTheme] ?? null : null;\n if (!themeColor) {\n return null;\n }\n\n const tintValue = color.tint;\n const tint = typeof tintValue === \"number\"\n ? tintValue\n : typeof tintValue === \"string\" && tintValue.trim().length > 0\n ? Number(tintValue)\n : Number.NaN;\n\n return Number.isFinite(tint) ? applyExcelTint(themeColor, tint) : themeColor;\n}\n\nexport function resolveWorkbookFillColor(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!fill) {\n return null;\n }\n\n if (fill.fillType === \"solid\") {\n return resolveWorkbookColor(\n (fill.color as Record<string, unknown> | undefined)\n ?? (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n if (fill.fillType === \"pattern\") {\n return resolveWorkbookColor(\n (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.color as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n return null;\n}\n\nexport function resolveWorkbookFillStyle(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n if (!fill) {\n return {\n backgroundColor: null,\n backgroundImage: null\n };\n }\n\n if (fill.fillType === \"gradient\") {\n const rawStops = Array.isArray(fill.stops) ? fill.stops as Array<Record<string, unknown>> : [];\n const stops = rawStops\n .map((stop) => ({\n color: resolveWorkbookColor(stop.color as Record<string, unknown> | undefined, themePalette),\n position: typeof stop.position === \"number\" ? stop.position : Number(stop.position)\n }))\n .filter((stop): stop is { color: string; position: number } => Boolean(stop.color) && Number.isFinite(stop.position))\n .sort((left, right) => left.position - right.position);\n if (stops.length > 0) {\n const gradientType = typeof fill.gradientType === \"string\" ? fill.gradientType : \"linear\";\n if (gradientType === \"path\") {\n const backgroundColor = stops[stops.length - 1]?.color ?? null;\n return {\n backgroundColor,\n backgroundImage: `radial-gradient(circle at center, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n\n const degree = typeof fill.degree === \"number\" ? fill.degree : Number(fill.degree ?? 0);\n const cssAngle = Number.isFinite(degree) ? 90 - degree : 90;\n return {\n backgroundColor: stops[stops.length - 1]?.color ?? null,\n backgroundImage: `linear-gradient(${cssAngle}deg, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n }\n\n return {\n backgroundColor: resolveWorkbookFillColor(fill, themePalette),\n backgroundImage: null\n };\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\n\nconst SHEET_REF_REGEX = /'((?:[^']|'')+)'!|([A-Za-z_\\u0080-\\uFFFF][\\w.\\u0080-\\uFFFF]*)!/g;\n\ntype FormulaCell = { formula?: string | null };\n\nfunction collectReferencedSheetNames(workbook: Workbook): Set<string> {\n const referenced = new Set<string>();\n for (let sheetIdx = 0; sheetIdx < workbook.sheetCount; sheetIdx += 1) {\n let sheet;\n try {\n sheet = workbook.getSheet(sheetIdx);\n } catch {\n continue;\n }\n const cells = sheet.formulaCells as FormulaCell[] | null | undefined;\n if (!Array.isArray(cells)) {\n continue;\n }\n for (const cell of cells) {\n const formula = cell?.formula;\n if (!formula) {\n continue;\n }\n SHEET_REF_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SHEET_REF_REGEX.exec(formula)) !== null) {\n const raw = match[1] ?? match[2];\n if (!raw) {\n continue;\n }\n referenced.add(raw.replace(/''/g, \"'\"));\n }\n }\n }\n return referenced;\n}\n\nfunction hasUnresolvedSheetReferences(workbook: Workbook): boolean {\n let names: string[];\n try {\n names = workbook.sheetNames;\n } catch {\n return false;\n }\n const known = new Set(names);\n const referenced = collectReferencedSheetNames(workbook);\n for (const name of referenced) {\n if (!known.has(name)) {\n return true;\n }\n }\n return false;\n}\n\nexport type SafeCalculateSkipReason = \"unresolved-sheet-refs\" | \"calculate-trapped\";\n\nexport type SafeCalculateResult = {\n workbook: Workbook;\n calculated: boolean;\n skipReason: SafeCalculateSkipReason | null;\n};\n\nexport type SafeCalculateOptions = {\n reparse?: () => Workbook;\n};\n\n// Pre-scans for formulas referencing missing sheets (which cause the Rust\n// engine to panic into a wasm `unreachable` trap that poisons the Workbook\n// instance). On trap, `reparse` is used to return a fresh usable instance.\nexport function safeCalculate(workbook: Workbook, options: SafeCalculateOptions = {}): SafeCalculateResult {\n if (hasUnresolvedSheetReferences(workbook)) {\n return { workbook, calculated: false, skipReason: \"unresolved-sheet-refs\" };\n }\n try {\n workbook.calculate();\n return { workbook, calculated: true, skipReason: null };\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped; falling back to cached formula values\", err);\n if (options.reparse) {\n try {\n return { workbook: options.reparse(), calculated: false, skipReason: \"calculate-trapped\" };\n } catch (reparseErr) {\n console.warn(\"[react-xlsx] workbook reparse after calculate trap failed\", reparseErr);\n }\n }\n return { workbook, calculated: false, skipReason: \"calculate-trapped\" };\n }\n}\n\nexport function tryRecalculate(workbook: Workbook): { calculated: boolean; error: unknown } {\n try {\n workbook.calculate();\n return { calculated: true, error: null };\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped during recalculation\", err);\n return { calculated: false, error: err };\n }\n}\n","let wasmModulePromise: Promise<typeof import(\"@dukelib/sheets-wasm\")> | null = null;\n\nexport type XlsxWasmSource =\n | string\n | URL\n | Request\n | Response\n | BufferSource\n | WebAssembly.Module;\n\nexport type WorkerWasmSource = string | ArrayBuffer | WebAssembly.Module;\n\nlet hasConfiguredWasmSource = false;\nlet configuredWasmSource: XlsxWasmSource | undefined;\nlet configuredWorkerWasmSource: WorkerWasmSource | undefined;\n\nfunction bufferSourceToArrayBuffer(source: ArrayBuffer | ArrayBufferView<ArrayBufferLike>): ArrayBuffer {\n if (source instanceof ArrayBuffer) {\n return source.slice(0);\n }\n\n const bytes = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n const copy = new Uint8Array(bytes);\n return copy.buffer;\n}\n\nfunction sourceToWorkerSource(source: XlsxWasmSource): WorkerWasmSource | undefined {\n if (typeof source === \"string\") {\n return source;\n }\n if (typeof URL !== \"undefined\" && source instanceof URL) {\n return source.href;\n }\n if (typeof Request !== \"undefined\" && source instanceof Request) {\n return source.url;\n }\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return bufferSourceToArrayBuffer(source);\n }\n if (typeof WebAssembly !== \"undefined\" && source instanceof WebAssembly.Module) {\n return source;\n }\n\n return undefined;\n}\n\nexport function setWasmSource(source: XlsxWasmSource): void {\n hasConfiguredWasmSource = true;\n configuredWasmSource = source;\n configuredWorkerWasmSource = sourceToWorkerSource(source);\n}\n\nexport function initWasm(source?: XlsxWasmSource) {\n if (source !== undefined) {\n setWasmSource(source);\n }\n\n return getSheetsWasmModule();\n}\n\nexport function canUseConfiguredWasmSourceInWorker(): boolean {\n return !hasConfiguredWasmSource || configuredWorkerWasmSource !== undefined;\n}\n\nexport function getConfiguredWorkerWasmSource(): WorkerWasmSource | undefined {\n return configuredWorkerWasmSource;\n}\n\nexport function getSheetsWasmModule() {\n if (!wasmModulePromise) {\n wasmModulePromise = import(\"@dukelib/sheets-wasm\").then(async (mod) => {\n if (configuredWasmSource !== undefined) {\n await mod.default({ module_or_path: configuredWasmSource });\n } else {\n await mod.default();\n }\n return mod;\n });\n }\n\n return wasmModulePromise;\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { loadWorkbookChartAssets } from \"./charts\";\nimport { parseWorkbookChartStyleAssets, parseWorkbookStructureAssets, resolveSheetColumnWidthPixels } from \"./images\";\nimport type { WorkbookStructureAssets } from \"./images\";\nimport { safeCalculate } from \"./safe-calculate\";\nimport { getSheetsWasmModule, setWasmSource, type WorkerWasmSource } from \"./wasm\";\nimport type {\n XlsxChart,\n XlsxChartsheet,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxDataValidation,\n XlsxFreezePanes,\n XlsxResolvedCellStyle,\n XlsxSheetData,\n XlsxSheetVisibility,\n XlsxTable,\n XlsxTableStyleDefinition,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst DEFAULT_ROW_HEIGHT = 24;\nconst DEFAULT_COL_WIDTH = 80;\nconst DEFAULT_ZOOM_SCALE = 100;\nconst FORMULA_COUNT_THRESHOLD = 1000;\nconst FAST_STRUCTURE_PARSE_THRESHOLD_BYTES = 5 * 1024 * 1024;\n\nfunction isLegacyXlsWorkbook(bytes: Uint8Array) {\n return bytes.byteLength >= 8\n && bytes[0] === 0xd0\n && bytes[1] === 0xcf\n && bytes[2] === 0x11\n && bytes[3] === 0xe0\n && bytes[4] === 0xa1\n && bytes[5] === 0xb1\n && bytes[6] === 0x1a\n && bytes[7] === 0xe1;\n}\n\nfunction shouldSkipXmlParsingForWorkbook(bytes: Uint8Array, skipXmlParsing = false) {\n return skipXmlParsing || isLegacyXlsWorkbook(bytes);\n}\n\nfunction normalizeWorksheetVisibility(value: unknown): XlsxSheetVisibility {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\n\ntype WorkerRequest =\n | {\n id: number;\n type: \"load\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"parseCharts\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"getCellSnapshot\";\n payload: {\n workbookSheetIndex: number;\n row: number;\n col: number;\n };\n }\n | {\n id: number;\n type: \"getRowsBatch\";\n payload: {\n workbookSheetIndex: number;\n startRow: number;\n rowCount: number;\n };\n };\n\ntype WorkerSuccessResponse = {\n id: number;\n success: true;\n result:\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n }\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n sheets: XlsxSheetData[];\n tablesByWorkbookSheetIndex: XlsxTable[][];\n tabs: XlsxWorkbookTab[];\n }\n | {\n displayValue: string;\n formula: string;\n }\n | unknown[]\n | null;\n};\n\ntype WorkerErrorResponse = {\n id: number;\n success: false;\n error: string;\n};\n\ntype WorkerResponse = WorkerSuccessResponse | WorkerErrorResponse;\n\nlet workbook: Workbook | null = null;\nlet chartsByWorkbookSheetIndex: XlsxChart[][] = [];\nlet chartsheets: XlsxChartsheet[] = [];\nlet sheets: XlsxSheetData[] = [];\nlet tablesByWorkbookSheetIndex: XlsxTable[][] = [];\nlet tabs: XlsxWorkbookTab[] = [];\n\nfunction buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook: Workbook, showHiddenSheets = false) {\n const mapping = new Map<number, number>();\n let visibleIndex = 0;\n for (let workbookSheetIndex = 0; workbookSheetIndex < nextWorkbook.sheetCount; workbookSheetIndex += 1) {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n mapping.set(workbookSheetIndex, visibleIndex);\n visibleIndex += 1;\n }\n return mapping;\n}\n\nfunction normalizeRange(range: XlsxCellRange): XlsxCellRange {\n return {\n start: {\n col: Math.min(range.start.col, range.end.col),\n row: Math.min(range.start.row, range.end.row)\n },\n end: {\n col: Math.max(range.start.col, range.end.col),\n row: Math.max(range.start.row, range.end.row)\n }\n };\n}\n\nfunction parseA1CellReference(reference: string): XlsxCellAddress | null {\n const match = /^([A-Z]+)(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const [, columnPart, rowPart] = match;\n let col = 0;\n for (const char of columnPart.toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(rowPart) - 1\n };\n}\n\nfunction parseA1RangeReference(reference: string): XlsxCellRange | null {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return normalizeRange({ end, start });\n}\n\nfunction parseWorksheetFreezePanes(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxFreezePanes | null {\n const rawFreezePanes = worksheet.freezePanes as Record<string, unknown> | null | undefined;\n const row = typeof rawFreezePanes?.row === \"number\" && rawFreezePanes.row >= 0 ? rawFreezePanes.row : null;\n const col = typeof rawFreezePanes?.col === \"number\" && rawFreezePanes.col >= 0 ? rawFreezePanes.col : null;\n if (row === null && col === null) {\n return null;\n }\n\n return {\n col: col ?? 0,\n row: row ?? 0\n };\n}\n\nfunction parseWorksheetDataValidations(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxDataValidation[] {\n const rawDataValidations = Array.isArray(worksheet.dataValidations) ? worksheet.dataValidations : [];\n\n return rawDataValidations.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return [];\n }\n\n const validation = entry as Record<string, unknown>;\n const ranges = Array.isArray(validation.ranges)\n ? validation.ranges.flatMap((range) => {\n if (typeof range !== \"string\") {\n return [];\n }\n\n const parsedRange = parseA1RangeReference(range);\n return parsedRange ? [parsedRange] : [];\n })\n : [];\n const validationType = typeof validation.validationType === \"string\" ? validation.validationType : null;\n if (!validationType || ranges.length === 0) {\n return [];\n }\n\n return [{\n allowBlank: typeof validation.allowBlank === \"boolean\" ? validation.allowBlank : undefined,\n errorMessage: typeof validation.errorMessage === \"string\" ? validation.errorMessage : undefined,\n errorStyle: typeof validation.errorStyle === \"string\" ? validation.errorStyle : undefined,\n inputMessage: typeof validation.inputMessage === \"string\" ? validation.inputMessage : undefined,\n listSource: typeof validation.listSource === \"string\" ? validation.listSource : undefined,\n ranges,\n showDropdown: typeof validation.showDropdown === \"boolean\" ? validation.showDropdown : undefined,\n showErrorAlert: typeof validation.showErrorAlert === \"boolean\" ? validation.showErrorAlert : undefined,\n showInputMessage: typeof validation.showInputMessage === \"boolean\" ? validation.showInputMessage : undefined,\n validationType\n } satisfies XlsxDataValidation];\n });\n}\n\nfunction resolveWorksheetZoomScale(\n worksheet: ReturnType<Workbook[\"getSheet\"]>,\n sheetState?: WorkbookStructureAssets[\"sheetStatesByWorkbookSheetIndex\"][number] | null\n) {\n const candidates = [\n sheetState?.zoomScale,\n typeof worksheet.zoomScale === \"number\" ? worksheet.zoomScale : undefined\n ];\n const value = candidates.find((entry): entry is number => typeof entry === \"number\" && Number.isFinite(entry) && entry > 0);\n return value ?? DEFAULT_ZOOM_SCALE;\n}\n\nfunction resolveSheetDisplayUsedRange(\n usedRange: [number, number, number, number],\n sheetState?: WorkbookStructureAssets[\"sheetStatesByWorkbookSheetIndex\"][number] | null\n): [number, number, number, number] {\n const [minRow, minCol, maxRow, maxCol] = usedRange;\n const maxMeaningfulRow = Math.max(sheetState?.maxContentRow ?? -1, sheetState?.maxVerticalMergeEndRow ?? -1);\n const maxMeaningfulCol = Math.max(sheetState?.maxContentCol ?? -1, sheetState?.maxHorizontalMergeEndCol ?? -1);\n\n if (maxMeaningfulRow < 0 && maxMeaningfulCol < 0) {\n return usedRange;\n }\n\n return [\n sheetState?.minContentRow !== undefined && sheetState.minContentRow >= 0 ? Math.min(minRow, sheetState.minContentRow) : minRow,\n sheetState?.minContentCol !== undefined && sheetState.minContentCol >= 0 ? Math.min(minCol, sheetState.minContentCol) : minCol,\n maxMeaningfulRow >= 0 ? Math.min(maxRow, maxMeaningfulRow) : maxRow,\n maxMeaningfulCol >= 0 ? Math.min(maxCol, maxMeaningfulCol) : maxCol\n ];\n}\n\nfunction buildSheetList(\n nextWorkbook: Workbook,\n structureAssets?: WorkbookStructureAssets | null,\n showHiddenSheets = false\n) {\n const sheetsByWorkbookSheetIndex: XlsxSheetData[] = [];\n\n for (let index = 0; index < nextWorkbook.sheetCount; index += 1) {\n const worksheet = nextWorkbook.getSheet(index);\n const sheetState = structureAssets?.sheetStatesByWorkbookSheetIndex[index] ?? null;\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n\n const resolveColumnWidthPx = (col: number) => {\n const width = worksheet.getColumnWidth(col);\n if (width !== undefined && width !== null) {\n return resolveSheetColumnWidthPixels(width, sheetState?.columnWidthCharacterWidthPx);\n }\n\n return sheetState?.colWidthOverridesPx?.[col] ?? sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH;\n };\n\n const resolveRowHeightPx = (row: number) => {\n const height = worksheet.getRowHeight(row);\n if (height !== undefined && height !== null) {\n return Math.max(Math.round(height * 1.33), 16);\n }\n\n return sheetState?.rowHeightOverridesPx?.[row] ?? sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT;\n };\n\n const usedRange = worksheet.usedRange() as [number, number, number, number] | null;\n if (!usedRange) {\n sheetsByWorkbookSheetIndex.push({\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: 0,\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: [],\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx: sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH,\n defaultRowHeightPx: sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: sheetState?.hasHorizontalMerges ?? false,\n hasVerticalMerges: sheetState?.hasVerticalMerges ?? false,\n maxHorizontalMergeEndCol: sheetState?.maxHorizontalMergeEndCol ?? -1,\n maxVerticalMergeEndRow: sheetState?.maxVerticalMergeEndRow ?? -1,\n hiddenCols: sheetState?.hiddenCols ?? [],\n hiddenRows: sheetState?.hiddenRows ?? [],\n minUsedCol: -1,\n minUsedRow: -1,\n maxUsedCol: -1,\n maxUsedRow: -1,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: 0,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: [],\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette: structureAssets?.themePalette ?? { colorsByIndex: {} },\n visibleCols: [],\n visibleRows: [],\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n continue;\n }\n\n const [minRow, minCol, maxRow, maxCol] = resolveSheetDisplayUsedRange(usedRange, sheetState);\n const hiddenRows = (sheetState?.hiddenRows ?? []).filter((row) => row >= 0 && row <= maxRow);\n const hiddenCols = (sheetState?.hiddenCols ?? []).filter((col) => col >= 0 && col <= maxCol);\n\n sheetsByWorkbookSheetIndex.push({\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: Math.max(0, maxCol + 1 - hiddenCols.length),\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: [],\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx: sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH,\n defaultRowHeightPx: sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: sheetState?.hasHorizontalMerges ?? false,\n hasVerticalMerges: sheetState?.hasVerticalMerges ?? false,\n maxHorizontalMergeEndCol: sheetState?.maxHorizontalMergeEndCol ?? -1,\n maxVerticalMergeEndRow: sheetState?.maxVerticalMergeEndRow ?? -1,\n hiddenCols,\n hiddenRows,\n minUsedCol: minCol,\n minUsedRow: minRow,\n maxUsedCol: maxCol,\n maxUsedRow: maxRow,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: Math.max(0, maxRow + 1 - hiddenRows.length),\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: [],\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette: structureAssets?.themePalette ?? { colorsByIndex: {} },\n visibleCols: [],\n visibleRows: [],\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n }\n\n return sheetsByWorkbookSheetIndex;\n}\n\nfunction mapWorksheetTables(\n worksheet: ReturnType<Workbook[\"getSheet\"]> | null,\n metadataForSheet?: ReturnType<typeof parseWorkbookStructureAssets>[\"tableMetadataByWorkbookSheetIndex\"][number] | null\n): XlsxTable[] {\n const rawTables = (worksheet?.tables ?? []) as Array<Record<string, unknown>>;\n return rawTables.flatMap((table, index) => {\n const rawColumns = Array.isArray(table.columns) ? table.columns : [];\n const rawName = typeof table.name === \"string\" ? table.name : `Table${index + 1}`;\n const rawDisplayName =\n typeof table.displayName === \"string\"\n ? table.displayName\n : typeof table.name === \"string\"\n ? table.name\n : `Table ${index + 1}`;\n const metadata = metadataForSheet?.find((entry) =>\n (entry.name && entry.name === rawName)\n || (entry.displayName && entry.displayName === rawDisplayName)\n || (entry.reference && entry.reference === table.reference)\n );\n const rawReference = typeof table.reference === \"string\" ? table.reference : \"\";\n const reference = metadata?.reference ?? rawReference;\n const parsedRange = parseA1RangeReference(reference);\n if (!parsedRange) {\n return [];\n }\n\n return [{\n columns: rawColumns.map((column, columnIndex) => ({\n id: typeof (column as { id?: unknown }).id === \"number\" ? ((column as { id?: number }).id ?? columnIndex + 1) : columnIndex + 1,\n index: columnIndex,\n name: typeof (column as { name?: unknown }).name === \"string\" ? ((column as { name?: string }).name ?? `Column ${columnIndex + 1}`) : `Column ${columnIndex + 1}`\n })),\n displayName: rawDisplayName,\n end: parsedRange.end,\n headerRowCount: metadata?.headerRowCount ?? resolveWorkbookTableCount(table.headerRowCount, 1),\n headerRowCellStyle: metadata?.headerRowCellStyle,\n name: rawName,\n reference,\n start: parsedRange.start,\n styleInfo: table.styleInfo as XlsxTable[\"styleInfo\"] | undefined,\n totalsRowCount: metadata?.totalsRowCount ?? resolveWorkbookTableCount(table.totalsRowCount, 0),\n totalsRowShown: metadata?.totalsRowShown ?? resolveWorkbookTableBoolean(table.totalsRowShown)\n }];\n });\n}\n\nfunction resolveWorkbookTableCount(value: unknown, fallback: number) {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n\n return fallback;\n}\n\nfunction resolveWorkbookTableBoolean(value: unknown) {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"\") {\n return false;\n }\n if (normalized === \"1\" || normalized === \"true\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/"/g, \"\\\"\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction getCellDisplayValue(worksheet: ReturnType<Workbook[\"getSheet\"]>, row: number, col: number, activeSheet?: XlsxSheetData | null) {\n const formula = worksheet.getFormulaAt(row, col);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1({ row, col })] : undefined;\n const formatted = worksheet.getFormattedValueAt(row, col);\n if (formatted && !(formula && cachedFormulaValue !== undefined && formatted.startsWith(\"#\"))) {\n return decodeHtmlEntities(formatted);\n }\n\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (formula && cachedFormulaValue !== undefined && cellValue.is_error) {\n return cachedFormulaValue;\n }\n if (cellValue.is_error) {\n return cellValue.asError() ?? \"\";\n }\n if (cellValue.is_empty) {\n return \"\";\n }\n\n return cellValue.toString();\n}\n\nfunction cellAddressToA1(cell: XlsxCellAddress) {\n let col = cell.col + 1;\n let label = \"\";\n while (col > 0) {\n const remainder = (col - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n col = Math.floor((col - 1) / 26);\n }\n return `${label}${cell.row + 1}`;\n}\n\nasync function loadWorkbook(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const shouldUseFastStructureParse =\n bytes.byteLength >= FAST_STRUCTURE_PARSE_THRESHOLD_BYTES && totalFormulas <= FORMULA_COUNT_THRESHOLD;\n const structureAssets = effectiveSkipXmlParsing || shouldUseFastStructureParse\n ? null\n : parseWorkbookStructureAssets(bytes, {\n includeCachedFormulaValues: true\n });\n workbook = nextWorkbook;\n sheets = buildSheetList(nextWorkbook, structureAssets, showHiddenSheets);\n tablesByWorkbookSheetIndex = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) =>\n mapWorksheetTables(\n nextWorkbook.getSheet(workbookSheetIndex),\n structureAssets?.tableMetadataByWorkbookSheetIndex[workbookSheetIndex] ?? null\n )\n );\n const visibleSheetIndexByWorkbookSheetIndex = new Map(sheets.map((sheet, index) => [sheet.workbookSheetIndex, index]));\n const hasCharts = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const hasClassicCharts = Array.isArray(worksheet.charts) && worksheet.charts.length > 0;\n const hasModernCharts = Array.isArray(worksheet.chartsEx) && worksheet.chartsEx.length > 0;\n return hasClassicCharts || hasModernCharts;\n }).some(Boolean);\n const chartStyleAssets = effectiveSkipXmlParsing || !hasCharts ? null : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n chartsByWorkbookSheetIndex = chartAssets.chartsByWorkbookSheetIndex;\n chartsheets = chartAssets.chartsheets;\n tabs = chartAssets.tabs;\n return {\n chartsByWorkbookSheetIndex,\n chartsheets,\n sheets,\n tablesByWorkbookSheetIndex,\n tabs\n };\n}\n\nasync function parseCharts(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const visibleSheetIndexByWorkbookSheetIndex = buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook, showHiddenSheets);\n const chartStyleAssets = effectiveSkipXmlParsing ? null : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n return {\n chartsByWorkbookSheetIndex: chartAssets.chartsByWorkbookSheetIndex,\n chartsheets: chartAssets.chartsheets,\n tabs: chartAssets.tabs\n };\n}\n\nfunction respond(message: WorkerResponse) {\n self.postMessage(message);\n}\n\nasync function handleMessage(message: WorkerRequest) {\n switch (message.type) {\n case \"load\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return loadWorkbook(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"parseCharts\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return parseCharts(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"getCellSnapshot\": {\n if (!workbook) {\n return {\n displayValue: \"\",\n formula: \"\"\n };\n }\n\n const targetSheet = sheets.find((sheet) => sheet.workbookSheetIndex === message.payload.workbookSheetIndex) ?? null;\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex);\n return {\n displayValue: getCellDisplayValue(worksheet, message.payload.row, message.payload.col, targetSheet),\n formula: worksheet.getFormulaAt(message.payload.row, message.payload.col) ?? \"\"\n };\n }\n case \"getRowsBatch\": {\n if (!workbook) {\n return null;\n }\n\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex) as ReturnType<Workbook[\"getSheet\"]> & {\n getRowsBatch?: (startRow: number, maxRows: number, options?: unknown) => unknown;\n };\n if (typeof worksheet.getRowsBatch !== \"function\") {\n return null;\n }\n\n return worksheet.getRowsBatch(message.payload.startRow, message.payload.rowCount, {\n includeFormulas: true,\n includeHyperlinks: true,\n includeMergeInfo: true,\n includeStyles: true,\n useFormattedValues: true\n }) as unknown[] | null;\n }\n default:\n return null;\n }\n}\n\nself.addEventListener(\"message\", (event: MessageEvent<WorkerRequest>) => {\n const message = event.data;\n void handleMessage(message)\n .then((result) => {\n respond({\n id: message.id,\n result,\n success: true\n });\n })\n .catch((error: unknown) => {\n respond({\n error: error instanceof Error ? error.message : \"Worker request failed.\",\n id: message.id,\n success: false\n } satisfies WorkerErrorResponse);\n });\n});\n"],"mappings":"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","names":["styleAppearance","plotAreaShapeProperties","workbook","primarySeries","ext","cx","cy","chartsheets","chartsByWorkbookSheetIndex","tabs","strFromU8","strToU8","normalizeHexColor","parseHexColor","rgbToHsl","hueToRgb","hslToRgb","rgbToHex","EMU_PER_PIXEL","normalizeArchivePath","dirname","dirname","parseXml","document","readArchiveText","strFromU8","isElementNode","document","parseXml","readArchiveText","document","parseXml","normalizeArchivePath","readArchiveText","document","parseXml","sheets","isElementNode","normalizeHexColor","normalizeHexColor","workbook","normalizeWorksheetVisibility","parseA1CellReference","parseA1RangeReference"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts.ts","../src/images.ts","../src/colors.ts","../src/safe-calculate.ts","../src/wasm.ts","../src/xlsx-worker.ts"],"sourcesContent":["import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8 } from \"fflate\";\nimport type { WorkbookImageAssets, WorkbookImageSheetOrigin } from \"./images\";\nimport type {\n XlsxChart,\n XlsxChartAxis,\n XlsxChartDataLabels,\n XlsxChartLegend,\n XlsxChartPointDataLabel,\n XlsxChartPointStyle,\n XlsxChartReference,\n XlsxChartSeries,\n XlsxChartTypeGroup,\n XlsxChartWall,\n XlsxChartsheet,\n XlsxImageAnchor,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst CHART_NS = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst DRAWINGML_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst DRAWING_SPREADSHEET_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst CHART_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nconst CHART_EX_REL_TYPE = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\nconst CHART_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartStyle\";\nconst CHART_COLOR_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartColorStyle\";\nconst SERIES_COLORS = [\n \"#4472c4\",\n \"#ed7d31\",\n \"#a5a5a5\",\n \"#ffc000\",\n \"#5b9bd5\",\n \"#70ad47\",\n \"#264478\",\n \"#9e480e\",\n \"#636363\",\n \"#997300\"\n];\nfunction normalizeWorksheetVisibility(value: unknown): \"hidden\" | \"veryHidden\" | \"visible\" {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\nconst EMU_PER_PIXEL = 9525;\nconst THEME_COLOR_INDEX_BY_NAME: Record<string, number> = {\n accent1: 4,\n accent2: 5,\n accent3: 6,\n accent4: 7,\n accent5: 8,\n accent6: 9,\n dk1: 1,\n dk2: 3,\n folHlink: 11,\n hlink: 10,\n lt1: 0,\n lt2: 2,\n tx1: 1,\n tx2: 3,\n bg1: 0,\n bg2: 2\n};\nconst PRIMARY_CHART_TYPE_LOCAL_NAMES = [\n \"barChart\",\n \"lineChart\",\n \"line3DChart\",\n \"stockChart\",\n \"radarChart\",\n \"scatterChart\",\n \"pieChart\",\n \"pie3DChart\",\n \"doughnutChart\",\n \"areaChart\",\n \"area3DChart\",\n \"bar3DChart\",\n \"ofPieChart\",\n \"bubbleChart\",\n \"surfaceChart\",\n \"surface3DChart\"\n] as const;\n\nexport type WorkbookChartOrigin = {\n anchorIndex: number;\n anchor: XlsxImageAnchor | null;\n chartPath: string | null;\n chartKind: \"classic\" | \"modern\";\n drawingPath: string;\n workbookSheetIndex: number;\n};\n\nexport type WorkbookChartAssets = {\n chartOriginsById: Map<string, WorkbookChartOrigin>;\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n};\n\ntype ChartStyleAppearance = {\n axisLabelColor?: string;\n axisLineColor?: string;\n chartAreaBorderColor?: string;\n chartAreaFillColor?: string;\n chartAreaNoFill?: boolean;\n paletteOffset?: number;\n textColor?: string;\n titleColor?: string;\n};\n\nfunction clampUnitInterval(value: number) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction isElementNode(node: Node | ChildNode | null | undefined): node is Element {\n return node != null && node.nodeType === 1;\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction resolveColorFromXmlFragment(fragment: string, themePalette?: XlsxThemePalette | null) {\n if (!fragment) {\n return undefined;\n }\n\n const srgbMatch = fragment.match(/<a:srgbClr\\b[^>]*\\bval=\"([0-9a-fA-F]{6,8})\"/i);\n if (srgbMatch?.[1]) {\n return normalizeHexColor(srgbMatch[1]) ?? undefined;\n }\n\n const schemeMatch = fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a:schemeClr>/i)\n ?? fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*/i);\n if (!schemeMatch?.[1]) {\n return undefined;\n }\n\n const baseColor = resolveThemeColor(schemeMatch[1], themePalette);\n if (!baseColor) {\n return undefined;\n }\n\n const transforms = schemeMatch[2] ?? \"\";\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const match of transforms.matchAll(/<a:(lumMod|lumOff|tint|shade)\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/gi)) {\n const transform = match[1]?.toLowerCase();\n const rawValue = Number(match[2] ?? Number.NaN);\n if (!transform || !Number.isFinite(rawValue)) {\n continue;\n }\n if (transform === \"lummod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transform === \"lumoff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transform === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transform === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset) ?? undefined;\n}\n\nfunction readHexColorFromXmlFragment(\n fragment: string,\n preferLine = false,\n themePalette?: XlsxThemePalette | null\n) {\n const source = preferLine\n ? fragment.match(/<a:ln\\b[\\s\\S]*?<\\/a:ln>/i)?.[0] ?? \"\"\n : fragment.match(/<a:solidFill\\b[\\s\\S]*?<\\/a:solidFill>/i)?.[0] ?? \"\";\n return resolveColorFromXmlFragment(source, themePalette);\n}\n\ntype FallbackSeriesStyle = {\n color?: string;\n lineColor?: string;\n};\n\nfunction parseFallbackSeriesStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): FallbackSeriesStyle[] {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const shapeBlock = seriesBlock.match(/<c:spPr\\b[\\s\\S]*?<\\/c:spPr>/i)?.[0] ?? \"\";\n return {\n color: readHexColorFromXmlFragment(shapeBlock, false, themePalette),\n lineColor: readHexColorFromXmlFragment(shapeBlock, true, themePalette)\n };\n });\n}\n\nfunction parseFallbackPointStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): XlsxChartPointStyle[][] {\n const chartDocument = parseXml(chartXml);\n if (chartDocument) {\n const parsedSeriesStyles = getLocalDescendants(chartDocument, \"ser\").map((seriesNode) => {\n const styles: XlsxChartPointStyle[] = [];\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n styles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n return styles;\n });\n if (parsedSeriesStyles.some((styles) => styles.length > 0)) {\n return parsedSeriesStyles;\n }\n }\n\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const pointBlocks = seriesBlock.match(/<c:dPt\\b[\\s\\S]*?<\\/c:dPt>/gi) ?? [];\n if (pointBlocks.length === 0) {\n return [];\n }\n\n const styles: XlsxChartPointStyle[] = [];\n for (const pointBlock of pointBlocks) {\n const indexMatch = pointBlock.match(/<c:idx\\b[^>]*\\bval=\"(-?\\d+)\"/i);\n const index = indexMatch?.[1] ? Number(indexMatch[1]) : Number.NaN;\n if (!Number.isFinite(index)) {\n continue;\n }\n const explosionMatch = pointBlock.match(/<c:explosion\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/i);\n const explosionValue = explosionMatch?.[1] ? Number(explosionMatch[1]) : Number.NaN;\n styles.push({\n color: readHexColorFromXmlFragment(pointBlock, false, themePalette),\n explosion: Number.isFinite(explosionValue) ? explosionValue : undefined,\n index,\n lineColor: readHexColorFromXmlFragment(pointBlock, true, themePalette)\n });\n }\n\n return styles;\n });\n}\n\nfunction parseNumericPointCacheFromXmlFragment(fragment: string) {\n const pointMatches = Array.from(fragment.matchAll(/<c:pt\\b[^>]*\\bidx=\"(-?\\d+)\"[^>]*>[\\s\\S]*?<c:v>([^<]*)<\\/c:v>[\\s\\S]*?<\\/c:pt>/gi));\n if (pointMatches.length === 0) {\n return [];\n }\n\n const explicitPointCountMatch = fragment.match(/<c:ptCount\\b[^>]*\\bval=\"(\\d+)\"/i);\n const explicitPointCount = explicitPointCountMatch?.[1] ? Number(explicitPointCountMatch[1]) : Number.NaN;\n const maxIndex = pointMatches.reduce((max, match) => {\n const current = Number(match[1] ?? Number.NaN);\n return Number.isFinite(current) ? Math.max(max, current) : max;\n }, -1);\n const pointCount = Math.max(\n pointMatches.length,\n Number.isFinite(explicitPointCount) ? explicitPointCount : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: pointCount }, () => null as number | null);\n\n for (const match of pointMatches) {\n const index = Number(match[1] ?? Number.NaN);\n const rawValue = (match[2] ?? \"\").trim();\n const numericValue = Number(rawValue);\n if (!Number.isFinite(index) || index < 0 || !Number.isFinite(numericValue)) {\n continue;\n }\n values[index] = numericValue;\n }\n\n return values;\n}\n\nfunction parseFallbackBubbleSizesFromChartXml(chartXml: string): Array<Array<number | null>> {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const bubbleSizeBlock = seriesBlock.match(/<c:bubbleSize\\b[\\s\\S]*?<\\/c:bubbleSize>/i)?.[0] ?? \"\";\n if (!bubbleSizeBlock) {\n return [];\n }\n\n return parseNumericPointCacheFromXmlFragment(bubbleSizeBlock);\n });\n}\n\nfunction decodeChartXmlText(value: string) {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\");\n}\n\nfunction normalizeChartTitleForMatch(value: string | null | undefined) {\n return (value ?? \"\").trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction extractChartTitleFromXml(chartXml: string): string | null {\n const match = chartXml.match(/<c:title\\b[\\s\\S]*?<a:t>([\\s\\S]*?)<\\/a:t>/i);\n if (!match?.[1]) {\n return null;\n }\n const decoded = decodeChartXmlText(match[1]).trim();\n return decoded.length > 0 ? decoded : null;\n}\n\nfunction resolveArchiveFallbackBubbleSizes(\n archive: Record<string, Uint8Array>,\n preferredTitle: string | undefined\n) {\n const preferred = normalizeChartTitleForMatch(preferredTitle);\n let bestScore = Number.NEGATIVE_INFINITY;\n let bestCandidate: Array<Array<number | null>> = [];\n\n for (const [path, bytes] of Object.entries(archive)) {\n if (!/\\/charts\\/chart\\d+\\.xml$/i.test(path)) {\n continue;\n }\n const chartXml = strFromU8(bytes);\n if (!/<c:bubbleChart\\b/i.test(chartXml)) {\n continue;\n }\n const candidateBubbleSizes = parseFallbackBubbleSizesFromChartXml(chartXml);\n const hasCandidateValues = candidateBubbleSizes.some((seriesValues) => seriesValues.some((value) => value != null));\n if (!hasCandidateValues) {\n continue;\n }\n\n let score = 0;\n const candidateTitle = normalizeChartTitleForMatch(extractChartTitleFromXml(chartXml));\n if (preferred.length > 0 && candidateTitle.length > 0 && preferred === candidateTitle) {\n score += 100;\n }\n if (bestCandidate.length === 0) {\n score += 1;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCandidate = candidateBubbleSizes;\n if (score >= 100) {\n break;\n }\n }\n }\n\n return bestCandidate;\n}\n\nfunction parseChartTypeFromXml(chartXml: string) {\n for (const chartType of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n if (new RegExp(`<c:${chartType}\\\\b`, \"i\").test(chartXml)) {\n return chartType;\n }\n }\n return \"\";\n}\n\nfunction findPrimaryChartTypeNode(plotAreaNode: Element | null) {\n if (!plotAreaNode) {\n return null;\n }\n\n for (const localName of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n const node = getLocalChildren(plotAreaNode, localName)[0];\n if (node) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction resolveScatterChartType(scatterStyle: string | null | undefined) {\n switch (scatterStyle) {\n case \"line\":\n case \"lineMarker\":\n return \"ScatterLines\";\n case \"smooth\":\n case \"smoothMarker\":\n return \"ScatterSmooth\";\n default:\n return \"Scatter\";\n }\n}\n\nfunction resolveArchiveFallbackPointStyles(\n archive: Record<string, Uint8Array>,\n preferredTitle: string | undefined,\n preferredChartXmlType: string | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const preferred = normalizeChartTitleForMatch(preferredTitle);\n const preferredType = (preferredChartXmlType ?? \"\").trim();\n let bestScore = Number.NEGATIVE_INFINITY;\n let bestCandidate: XlsxChartPointStyle[][] = [];\n\n for (const [path, bytes] of Object.entries(archive)) {\n if (!/\\/charts\\/chart\\d+\\.xml$/i.test(path)) {\n continue;\n }\n const chartXml = strFromU8(bytes);\n const candidateType = parseChartTypeFromXml(chartXml);\n if (!candidateType) {\n continue;\n }\n const candidatePointStyles = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const hasCandidateValues = candidatePointStyles.some((seriesStyles) => seriesStyles.some((style) => (\n (typeof style.color === \"string\" && style.color.length > 0)\n || typeof style.explosion === \"number\"\n )));\n if (!hasCandidateValues) {\n continue;\n }\n\n let score = 0;\n const candidateTitle = normalizeChartTitleForMatch(extractChartTitleFromXml(chartXml));\n if (preferred.length > 0 && candidateTitle.length > 0 && preferred === candidateTitle) {\n score += 100;\n }\n if (preferredType && candidateType === preferredType) {\n score += 20;\n }\n if (bestCandidate.length === 0) {\n score += 1;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCandidate = candidatePointStyles;\n if (score >= 120) {\n break;\n }\n }\n }\n\n return bestCandidate;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n if (!normalized) {\n return null;\n }\n const match = /^#([0-9a-f]{6})$/.exec(normalized);\n if (!match) {\n return null;\n }\n return [\n Number.parseInt(match[1].slice(0, 2), 16),\n Number.parseInt(match[1].slice(2, 4), 16),\n Number.parseInt(match[1].slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, Math.round(channel))).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyLightnessTransform(baseColor: string, modifier = 1, offset = 0) {\n const rgb = parseHexColor(baseColor);\n if (!rgb) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = clampUnitInterval(lightness * modifier + offset);\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, nextLightness);\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nfunction resolveThemeColor(name: string | null, themePalette?: XlsxThemePalette | null) {\n if (!name) {\n return null;\n }\n const index = THEME_COLOR_INDEX_BY_NAME[name];\n return index === undefined ? null : themePalette?.colorsByIndex[index] ?? null;\n}\n\nfunction resolveThemeTypeface(typeface: string | null, themePalette?: XlsxThemePalette | null) {\n if (!typeface) {\n return null;\n }\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return themePalette?.minorLatinFont ?? null;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return themePalette?.majorLatinFont ?? null;\n }\n return typeface;\n}\n\nfunction readChartTextTypeface(textPropertiesNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!textPropertiesNode) {\n return null;\n }\n const defaultRunProperties = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n if (!defaultRunProperties) {\n return null;\n }\n const typeface = getFirstLocalChild(defaultRunProperties, \"latin\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"ea\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"cs\")?.getAttribute(\"typeface\")\n ?? null;\n const resolved = resolveThemeTypeface(typeface, themePalette)?.trim() ?? \"\";\n return resolved.length > 0 ? resolved : null;\n}\n\nfunction resolveChartColorNode(node: Element | null, themePalette?: XlsxThemePalette | null): string | null {\n if (!node) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (node.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"val\") ?? \"\"}`);\n } else if (node.localName === \"schemeClr\") {\n baseColor = resolveThemeColor(node.getAttribute(\"val\"), themePalette);\n } else if (node.localName === \"sysClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"lastClr\") ?? \"\"}`);\n }\n\n if (!baseColor) {\n return null;\n }\n\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const transformNode of Array.from(node.childNodes).filter(isElementNode)) {\n const rawValue = Number(transformNode.getAttribute(\"val\") ?? Number.NaN);\n if (!Number.isFinite(rawValue)) {\n continue;\n }\n if (transformNode.localName === \"lumMod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transformNode.localName === \"lumOff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transformNode.localName === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transformNode.localName === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset);\n}\n\nfunction isChartColorElement(node: Element | null | undefined): node is Element {\n return Boolean(node && (node.localName === \"schemeClr\" || node.localName === \"srgbClr\" || node.localName === \"sysClr\"));\n}\n\nfunction findFirstChartColorElement(node: Element | null) {\n if (!node) {\n return null;\n }\n if (isChartColorElement(node)) {\n return node;\n }\n\n for (const localName of [\"srgbClr\", \"schemeClr\", \"sysClr\"]) {\n for (const candidate of getLocalDescendants(node, localName)) {\n if (isChartColorElement(candidate)) {\n return candidate;\n }\n }\n }\n\n return null;\n}\n\nfunction resolveChartFillColor(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!shapeNode || getFirstLocalChild(shapeNode, \"noFill\")) {\n return null;\n }\n const solidFill = getFirstLocalChild(shapeNode, \"solidFill\");\n if (solidFill) {\n const colorNode = findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null);\n return resolveChartColorNode(colorNode, themePalette);\n }\n\n const gradientFill = getFirstLocalChild(shapeNode, \"gradFill\");\n const gradientStops = gradientFill\n ? getLocalDescendants(gradientFill, \"gs\")\n .map((stopNode) => ({\n colorNode: Array.from(stopNode.childNodes).find(isElementNode) ?? null,\n position: Number(stopNode.getAttribute(\"pos\") ?? Number.NaN)\n }))\n .filter((stop) => Boolean(stop.colorNode))\n : [];\n if (gradientStops.length === 0) {\n return null;\n }\n\n gradientStops.sort((left, right) => {\n const leftPos = Number.isFinite(left.position) ? left.position : 0;\n const rightPos = Number.isFinite(right.position) ? right.position : 0;\n return leftPos - rightPos;\n });\n const midpointStop = gradientStops.find((stop) => Number.isFinite(stop.position) && stop.position >= 50000)\n ?? gradientStops[Math.floor(gradientStops.length / 2)]\n ?? gradientStops[0];\n return resolveChartColorNode(midpointStop.colorNode, themePalette);\n}\n\nfunction resolveChartLineStyle(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n const lineNode = shapeNode?.localName === \"ln\" ? shapeNode : (shapeNode ? getFirstLocalChild(shapeNode, \"ln\") : null);\n if (!lineNode) {\n return { color: null, hidden: false, widthPx: undefined };\n }\n if (getFirstLocalChild(lineNode, \"noFill\")) {\n return { color: null, hidden: true, widthPx: undefined };\n }\n\n const solidFill = getFirstLocalChild(lineNode, \"solidFill\");\n const colorNode = solidFill ? findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null) : null;\n const widthValue = Number(lineNode.getAttribute(\"w\") ?? Number.NaN);\n return {\n color: resolveChartColorNode(colorNode, themePalette),\n hidden: false,\n widthPx: Number.isFinite(widthValue) ? Math.max(1, widthValue / EMU_PER_PIXEL) : undefined\n };\n}\n\nfunction normalizeLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n const legend = raw as Record<string, unknown>;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position: typeof legend.position === \"string\" ? legend.position : undefined,\n raw: legend\n };\n}\n\nfunction normalizeLegendPosition(position: string | undefined) {\n if (!position) {\n return undefined;\n }\n switch (position) {\n case \"bottom\":\n return \"b\";\n case \"left\":\n return \"l\";\n case \"right\":\n return \"r\";\n case \"top\":\n return \"t\";\n default:\n return position;\n }\n}\n\nfunction readChartNumericAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n const value = Number(node?.getAttribute(\"val\") ?? Number.NaN);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readChartBooleanAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n if (!node) {\n return undefined;\n }\n const rawValue = node.getAttribute(\"val\");\n if (rawValue == null) {\n return true;\n }\n if (rawValue === \"1\" || rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"0\" || rawValue === \"false\") {\n return false;\n }\n return undefined;\n}\n\nfunction readChartLabelFontSizePt(textPropertiesNode: Element | null) {\n if (!textPropertiesNode) {\n return undefined;\n }\n const runPropertiesNode = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n const rawSize = Number(runPropertiesNode?.getAttribute(\"sz\") ?? Number.NaN);\n if (!Number.isFinite(rawSize) || rawSize <= 0) {\n return undefined;\n }\n return rawSize / 100;\n}\n\nfunction parseChartPointDataLabelsFromXml(labelsNode: Element): XlsxChartPointDataLabel[] {\n const fallbackFontSizePt = readChartLabelFontSizePt(getFirstLocalChild(labelsNode, \"txPr\"));\n const labels: XlsxChartPointDataLabel[] = [];\n for (const pointLabelNode of getLocalChildren(labelsNode, \"dLbl\")) {\n const index = readChartNumericAttribute(pointLabelNode, \"idx\");\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n const layoutNode = getFirstLocalChild(pointLabelNode, \"layout\");\n const manualLayoutNode = getFirstLocalChild(layoutNode, \"manualLayout\");\n labels.push({\n deleted: readChartBooleanAttribute(pointLabelNode, \"delete\"),\n fontSizePt: readChartLabelFontSizePt(getFirstLocalChild(pointLabelNode, \"txPr\")) ?? fallbackFontSizePt,\n index,\n showBubbleSize: readChartBooleanAttribute(pointLabelNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(pointLabelNode, \"showCatName\"),\n showPercent: readChartBooleanAttribute(pointLabelNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(pointLabelNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(pointLabelNode, \"showVal\"),\n x: readChartNumericAttribute(manualLayoutNode, \"x\"),\n y: readChartNumericAttribute(manualLayoutNode, \"y\")\n });\n }\n return labels;\n}\n\nfunction parseChartDataLabelsFromXml(labelsNode: Element | null): XlsxChartDataLabels | null {\n if (!labelsNode) {\n return null;\n }\n\n const pointLabels = parseChartPointDataLabelsFromXml(labelsNode);\n const labels: XlsxChartDataLabels = {\n pointLabels: pointLabels.length > 0 ? pointLabels : undefined,\n raw: {},\n showBubbleSize: readChartBooleanAttribute(labelsNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(labelsNode, \"showCatName\"),\n showLegendKey: readChartBooleanAttribute(labelsNode, \"showLegendKey\"),\n showPercent: readChartBooleanAttribute(labelsNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(labelsNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(labelsNode, \"showVal\")\n };\n const hasValue = (\n labels.showBubbleSize !== undefined\n || labels.showCategoryName !== undefined\n || labels.showLegendKey !== undefined\n || labels.showPercent !== undefined\n || (labels.pointLabels?.length ?? 0) > 0\n || labels.showSeriesName !== undefined\n || labels.showValue !== undefined\n );\n return hasValue ? labels : null;\n}\n\nfunction readChartRelationships(\n archive: Record<string, Uint8Array>,\n chartPath: string\n) {\n const relsPath = normalizeArchivePath(`${dirname(chartPath)}/_rels/${chartPath.split(\"/\").pop()}.rels`);\n const relsXml = readArchiveText(archive, relsPath);\n if (!relsXml) {\n return new Map<string, string>();\n }\n\n const relsDocument = parseXml(relsXml);\n if (!relsDocument) {\n return new Map<string, string>();\n }\n\n const relationships = new Map<string, string>();\n for (const relationshipNode of getLocalDescendants(relsDocument, \"Relationship\")) {\n const type = relationshipNode.getAttribute(\"Type\");\n const target = relationshipNode.getAttribute(\"Target\");\n if (!type || !target) {\n continue;\n }\n relationships.set(type, resolveRelationshipPath(relsPath, target));\n }\n\n return relationships;\n}\n\nfunction readChartColorPalette(\n archive: Record<string, Uint8Array>,\n colorStylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const colorStyleXml = readArchiveText(archive, colorStylePath);\n if (!colorStyleXml) {\n return [];\n }\n\n const colorStyleDocument = parseXml(colorStyleXml);\n if (!colorStyleDocument?.documentElement) {\n return [];\n }\n\n return Array.from(colorStyleDocument.documentElement.childNodes)\n .filter((child): child is Element => isElementNode(child) && child.localName !== \"variation\")\n .map((child) => (\n resolveChartColorNode(child, themePalette)\n ?? resolveChartColorNode(findFirstChartColorElement(child), themePalette)\n ))\n .filter((color): color is string => typeof color === \"string\");\n}\n\nfunction readChartStyleAppearance(\n archive: Record<string, Uint8Array>,\n stylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n): ChartStyleAppearance {\n const styleXml = readArchiveText(archive, stylePath);\n if (!styleXml) {\n return {};\n }\n\n const styleDocument = parseXml(styleXml);\n if (!styleDocument) {\n return {};\n }\n\n const dataPointNode = getFirstLocalDescendant(styleDocument, \"dataPoint\");\n const fillRefNode = dataPointNode ? getFirstLocalChild(dataPointNode, \"fillRef\") : null;\n const index = Number(fillRefNode?.getAttribute(\"idx\") ?? Number.NaN);\n const chartAreaNode = getFirstLocalDescendant(styleDocument, \"chartArea\");\n const chartAreaShapeProperties = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"spPr\") : null;\n const chartAreaFontRef = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"fontRef\") : null;\n const chartAreaFontColor = chartAreaFontRef\n ? resolveChartColorNode(Array.from(chartAreaFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const titleNode = getFirstLocalDescendant(styleDocument, \"title\");\n const titleFontRef = titleNode ? getFirstLocalChild(titleNode, \"fontRef\") : null;\n const titleColor = titleFontRef\n ? resolveChartColorNode(Array.from(titleFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const axisStyleNode = getFirstLocalDescendant(styleDocument, \"categoryAxis\")\n ?? getFirstLocalDescendant(styleDocument, \"valueAxis\");\n const axisShapeProperties = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"spPr\") : null;\n const axisFontRef = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"fontRef\") : null;\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n\n return {\n axisLabelColor: axisFontRef\n ? resolveChartColorNode(Array.from(axisFontRef.childNodes).find(isElementNode) ?? null, themePalette) ?? undefined\n : undefined,\n axisLineColor: resolveChartLineStyle(axisShapeProperties, themePalette).color ?? undefined,\n chartAreaBorderColor: resolveChartLineStyle(chartAreaShapeProperties, themePalette).color ?? undefined,\n chartAreaFillColor: resolveChartFillColor(chartAreaShapeProperties, themePalette) ?? undefined,\n chartAreaNoFill,\n paletteOffset: Number.isFinite(index) ? index : undefined,\n textColor: chartAreaFontColor ?? undefined,\n titleColor: titleColor ?? chartAreaFontColor ?? undefined\n };\n}\n\nfunction buildThemeSeriesPalette(themePalette?: XlsxThemePalette | null) {\n const themeColors = [4, 5, 6, 7, 8, 9]\n .map((index) => themePalette?.colorsByIndex[index] ?? null)\n .filter((color): color is string => Boolean(color));\n return themeColors.length > 0 ? themeColors : SERIES_COLORS;\n}\n\nfunction normalizeBuiltinSurfaceStyleId(styleId: number | undefined) {\n if (typeof styleId !== \"number\" || !Number.isFinite(styleId)) {\n return null;\n }\n return styleId >= 100 ? styleId - 100 : styleId;\n}\n\nfunction getBuiltinSurfacePalette(styleId: number | undefined, wireframe: boolean | undefined) {\n const normalized = normalizeBuiltinSurfaceStyleId(styleId);\n if (normalized === 34 || (wireframe === true && normalized == null)) {\n return [\"#5b9bd5\", \"#ed7d31\", \"#a5a5a5\"];\n }\n if (normalized === 35 || normalized === 36 || (wireframe !== true && normalized == null)) {\n return [\"#2f5597\", \"#4472c4\", \"#5b9bd5\", \"#8faadc\", \"#d9e2f3\"];\n }\n return null;\n}\n\nfunction applyBuiltinSurfaceDefaults(chart: XlsxChart) {\n if (chart.chartType !== \"Surface\") {\n return;\n }\n\n const builtinPalette = getBuiltinSurfacePalette(chart.chartStyleId, chart.wireframe);\n if ((!chart.chartColorPalette || chart.chartColorPalette.length === 0) && builtinPalette) {\n chart.chartColorPalette = builtinPalette;\n }\n\n const wallFill = chart.wireframe ? \"#d0d0d0\" : \"#d9d9df\";\n const wallLine = chart.wireframe ? \"#a6a6a6\" : \"#a8adb7\";\n chart.floor = {\n ...(chart.floor ?? {}),\n fillColor: chart.floor?.fillColor ?? wallFill,\n lineColor: chart.floor?.lineColor ?? wallLine\n };\n chart.sideWall = {\n ...(chart.sideWall ?? {}),\n fillColor: chart.sideWall?.fillColor ?? wallFill,\n lineColor: chart.sideWall?.lineColor ?? wallLine\n };\n chart.backWall = {\n ...(chart.backWall ?? {}),\n fillColor: chart.backWall?.fillColor ?? wallFill,\n lineColor: chart.backWall?.lineColor ?? wallLine\n };\n if (!chart.surfaceMaterial && chart.wireframe !== true) {\n chart.surfaceMaterial = \"flat\";\n }\n}\n\nfunction applyBuiltinChartDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n const darkBuiltInStyle = typeof chart.chartStyleId === \"number\" && chart.chartStyleId >= 140 && chart.chartStyleId < 150;\n const textColor = themePalette?.colorsByIndex[1] ?? themePalette?.colorsByIndex[3] ?? null;\n const minorTypeface = themePalette?.minorLatinFont?.trim() || undefined;\n const derivedAxisColor = textColor ? applyLightnessTransform(textColor, 0.35, 0.55) : null;\n const derivedBorderColor = textColor\n ? applyLightnessTransform(textColor, chart.is3d ? 0.28 : 0.22, chart.is3d ? 0.6 : 0.7)\n : null;\n if (darkBuiltInStyle) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? \"#1f1f1f\";\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? \"#1f1f1f\";\n chart.textColor = chart.textColor ?? \"#f5f5f5\";\n chart.titleColor = chart.titleColor ?? \"#f5f5f5\";\n chart.axisLabelColor = chart.axisLabelColor ?? \"#d9d9d9\";\n chart.axisLineColor = chart.axisLineColor ?? \"#8c8c8c\";\n }\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? derivedBorderColor ?? undefined;\n chart.textColor = chart.textColor ?? textColor ?? undefined;\n chart.titleColor = chart.titleColor ?? textColor ?? undefined;\n chart.axisLabelColor = chart.axisLabelColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.axisLineColor = chart.axisLineColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.fontFamily = chart.fontFamily ?? minorTypeface;\n chart.titleFontFamily = chart.titleFontFamily ?? chart.fontFamily ?? minorTypeface;\n\n const seriesPalette = chart.chartColorPalette && chart.chartColorPalette.length > 0\n ? chart.chartColorPalette\n : buildThemeSeriesPalette(themePalette);\n if (!chart.chartColorPalette || chart.chartColorPalette.length === 0) {\n chart.chartColorPalette = seriesPalette;\n }\n\n chart.series = chart.series.map((series, index) => {\n const fallbackColor = seriesPalette[index % seriesPalette.length];\n return {\n ...series,\n color: series.color ?? series.lineColor ?? fallbackColor,\n lineColor: series.lineColor ?? series.color ?? fallbackColor,\n markerColor: series.markerColor ?? series.color ?? series.lineColor ?? fallbackColor,\n markerLineColor: series.markerLineColor ?? series.lineColor ?? series.color ?? fallbackColor\n };\n });\n chart.typeGroups = chart.typeGroups?.map((group, groupIndex) => ({\n ...group,\n series: group.series.map((series, seriesIndex) => {\n const fallbackColor = seriesPalette[(groupIndex + seriesIndex) % seriesPalette.length];\n return {\n ...series,\n color: series.color ?? series.lineColor ?? fallbackColor,\n lineColor: series.lineColor ?? series.color ?? fallbackColor,\n markerColor: series.markerColor ?? series.color ?? series.lineColor ?? fallbackColor,\n markerLineColor: series.markerLineColor ?? series.lineColor ?? series.color ?? fallbackColor\n };\n })\n }));\n applyBuiltinSurfaceDefaults(chart);\n}\n\nfunction parseChartPointStyles(seriesNode: Element, themePalette?: XlsxThemePalette | null): XlsxChartPointStyle[] {\n const pointStyles: XlsxChartPointStyle[] = [];\n\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n pointStyles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n\n return pointStyles;\n}\n\nfunction parseInvertNegativeStyle(seriesNode: Element, themePalette?: XlsxThemePalette | null) {\n const invertNode = getFirstLocalDescendant(seriesNode, \"invertSolidFillFmt\");\n const shapeProperties = invertNode ? getFirstLocalChild(invertNode, \"spPr\") : null;\n if (!shapeProperties) {\n return {\n color: undefined,\n lineColor: undefined\n };\n }\n\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n lineColor: lineStyle.color ?? undefined\n };\n}\n\nfunction parseChartCacheValues(\n parentNode: Element | null,\n cacheName: \"numCache\" | \"strCache\",\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"numRef\")\n ?? getFirstLocalChild(parentNode, \"strRef\")\n ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, cacheName);\n if (!cacheNode) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const pointNodes = getLocalChildren(cacheNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n } else {\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n }\n return values;\n}\n\nfunction parseChartMultiLevelCacheValues(\n parentNode: Element | null,\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"multiLvlStrRef\") ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, \"multiLvlStrCache\");\n if (!cacheNode) {\n return null;\n }\n\n const levelNodes = getLocalChildren(cacheNode, \"lvl\");\n if (levelNodes.length === 0) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const primaryLevelNode = mode === \"category\"\n ? levelNodes[levelNodes.length - 1] ?? levelNodes[0]\n : levelNodes[0];\n const pointNodes = getLocalChildren(primaryLevelNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n continue;\n }\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n return values;\n}\n\nfunction applyChartSeriesStyleFromXml(chart: XlsxChart, chartTypeNode: Element, themePalette?: XlsxThemePalette | null) {\n const seriesNodes = getLocalChildren(chartTypeNode, \"ser\");\n chart.series = chart.series.map((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return series;\n }\n\n const shapeProperties = getFirstLocalChild(seriesNode, \"spPr\");\n const markerNode = getFirstLocalChild(seriesNode, \"marker\");\n const markerShapeProperties = getFirstLocalChild(markerNode ?? chartTypeNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const markerLineStyle = resolveChartLineStyle(markerShapeProperties, themePalette);\n const fillColor = resolveChartFillColor(shapeProperties, themePalette);\n const markerSize = readChartNumericAttribute(markerNode, \"size\");\n const markerSymbolNode = markerNode ? getFirstLocalChild(markerNode, \"symbol\") : null;\n const markerSymbol = markerSymbolNode?.getAttribute(\"val\") ?? undefined;\n const pointStyles = parseChartPointStyles(seriesNode, themePalette);\n const seriesExplosion = readChartNumericAttribute(seriesNode, \"explosion\");\n const invertNegativeStyle = parseInvertNegativeStyle(seriesNode, themePalette);\n const invertIfNegative = readChartBooleanAttribute(seriesNode, \"invertIfNegative\");\n const isScatterChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n const cachedCategories = isScatterChart\n ? (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"numCache\", \"value\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"category\")\n )\n : (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"strCache\", \"category\")\n ?? parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"numCache\", \"category\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"category\")\n );\n const cachedValues = isScatterChart\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"yVal\"), \"numCache\", \"value\")\n : parseChartCacheValues(getFirstLocalChild(seriesNode, \"val\"), \"numCache\", \"value\");\n const cachedBubbleSizes = chart.chartType === \"Bubble\"\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"bubbleSize\"), \"numCache\", \"value\")\n : null;\n const existingShapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : null;\n const rawFillColor = typeof existingShapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof existingShapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.lineColorHex)\n : null;\n const resolvedLineColor = lineStyle.hidden\n ? undefined\n : rawLineColor ?? lineStyle.color ?? rawFillColor ?? fillColor ?? series.lineColor ?? series.color;\n\n const hasCategoryReference = typeof series.categoriesRef?.formula === \"string\" && series.categoriesRef.formula.length > 0;\n const hasValueReference = typeof series.valuesRef?.formula === \"string\" && series.valuesRef.formula.length > 0;\n const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === \"string\" && series.bubbleSizeRef.formula.length > 0;\n\n return {\n ...series,\n bubbleSizes: !hasBubbleSizeReference && cachedBubbleSizes\n ? cachedBubbleSizes.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.bubbleSizes,\n categories: !hasCategoryReference && cachedCategories ? cachedCategories : series.categories,\n color: rawFillColor ?? rawLineColor ?? fillColor ?? lineStyle.color ?? series.color,\n dataPointStyles: pointStyles.length > 0 ? pointStyles : series.dataPointStyles,\n lineColor: resolvedLineColor,\n lineWidthPx: lineStyle.hidden ? undefined : lineStyle.widthPx ?? series.lineWidthPx,\n markerColor: rawFillColor\n ?? rawLineColor\n ?? resolveChartFillColor(markerShapeProperties, themePalette)\n ?? fillColor\n ?? lineStyle.color\n ?? undefined,\n markerLineColor: rawLineColor\n ?? rawFillColor\n ?? markerLineStyle.color\n ?? lineStyle.color\n ?? fillColor\n ?? undefined,\n markerSize: markerSize ?? series.markerSize,\n markerSymbol,\n smooth: readChartBooleanAttribute(seriesNode, \"smooth\") ?? series.smooth,\n invertIfNegative: invertIfNegative ?? series.invertIfNegative,\n shapeProperties: {\n ...series.shapeProperties,\n xmlExplosion: seriesExplosion ?? undefined,\n xmlFillColor: fillColor ?? undefined,\n xmlLineHidden: lineStyle.hidden ? true : undefined,\n xmlLineColor: lineStyle.color ?? undefined,\n xmlLineWidthPx: lineStyle.widthPx ?? undefined,\n xmlNegativeFillColor: invertNegativeStyle.color ?? undefined,\n xmlNegativeLineColor: invertNegativeStyle.lineColor ?? undefined\n },\n negativeColor: invertNegativeStyle.color ?? series.negativeColor,\n negativeLineColor: invertNegativeStyle.lineColor ?? series.negativeLineColor,\n values: !hasValueReference && cachedValues\n ? cachedValues.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.values\n };\n });\n}\n\nfunction applyChartStyleFromXml(\n chart: XlsxChart,\n chartPath: string | undefined,\n archive: Record<string, Uint8Array>,\n themePalette?: XlsxThemePalette | null\n) {\n const chartXml = readArchiveText(archive, chartPath);\n if (!chartXml) {\n return;\n }\n const relationships = chartPath ? readChartRelationships(archive, chartPath) : new Map<string, string>();\n const fallbackPointStylesBySeries = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const fallbackSeriesStyles = parseFallbackSeriesStylesFromChartXml(chartXml, themePalette);\n const fallbackBubbleSizesBySeries = parseFallbackBubbleSizesFromChartXml(chartXml);\n const applyFallbackSeriesStyles = () => {\n if (fallbackBubbleSizesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackBubbleSizes = fallbackBubbleSizesBySeries[seriesIndex] ?? [];\n if (fallbackBubbleSizes.length === 0) {\n return series;\n }\n\n const currentNumericPointCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n const fallbackNumericPointCount = fallbackBubbleSizes.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n\n if (currentNumericPointCount >= fallbackNumericPointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackBubbleSizes\n };\n });\n }\n\n if (fallbackPointStylesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackPointStyles = fallbackPointStylesBySeries[seriesIndex] ?? [];\n if (fallbackPointStyles.length === 0) {\n return series;\n }\n\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackPointStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n\n if (fallbackSeriesStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyle = fallbackSeriesStyles[seriesIndex];\n if (!fallbackStyle) {\n return series;\n }\n const fallbackColor = fallbackStyle.color ?? fallbackStyle.lineColor;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? fallbackStyle.lineColor ?? fallbackColor,\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? fallbackStyle.lineColor ?? fallbackColor ?? series.lineColor\n };\n });\n }\n };\n const applyRelationshipStyles = () => {\n chart.chartColorPalette = readChartColorPalette(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE), themePalette);\n const styleAppearance = readChartStyleAppearance(\n archive,\n relationships.get(CHART_STYLE_REL_TYPE),\n themePalette\n );\n chart.axisLabelColor = styleAppearance.axisLabelColor ?? chart.axisLabelColor;\n chart.axisLineColor = styleAppearance.axisLineColor ?? chart.axisLineColor;\n chart.chartAreaBorderColor = styleAppearance.chartAreaBorderColor ?? chart.chartAreaBorderColor;\n chart.chartAreaFillColor = styleAppearance.chartAreaFillColor ?? chart.chartAreaFillColor;\n chart.chartColorPaletteOffset = styleAppearance.paletteOffset ?? chart.chartColorPaletteOffset;\n chart.textColor = styleAppearance.textColor ?? chart.textColor;\n chart.titleColor = styleAppearance.titleColor ?? chart.titleColor;\n return styleAppearance;\n };\n const applyModernChartExStyles = () => {\n const modernPlotAreaNode = chartDocument?.documentElement\n ? getFirstLocalDescendant(chartDocument.documentElement, \"plotArea\")\n : null;\n if (!modernPlotAreaNode) {\n return;\n }\n\n const parseModernBinning = (seriesNode: Element) => {\n const layoutPrNode = getFirstLocalChild(seriesNode, \"layoutPr\");\n const binningNode = layoutPrNode ? getFirstLocalChild(layoutPrNode, \"binning\") : null;\n if (!binningNode) {\n return null;\n }\n const binning: Record<string, unknown> = {};\n for (const attribute of Array.from(binningNode.attributes)) {\n const rawValue = attribute.value;\n const numeric = Number(rawValue);\n binning[attribute.localName || attribute.name] = Number.isFinite(numeric) && rawValue.trim() !== \"\"\n ? numeric\n : rawValue;\n }\n return Object.keys(binning).length > 0 ? binning : {};\n };\n\n const plotAreaShapeProperties = getFirstLocalChild(modernPlotAreaNode, \"spPr\");\n if (plotAreaShapeProperties) {\n const plotAreaFillColor = resolveChartFillColor(plotAreaShapeProperties, themePalette);\n const plotAreaLineStyle = resolveChartLineStyle(plotAreaShapeProperties, themePalette);\n if (plotAreaFillColor) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? plotAreaFillColor;\n }\n if (plotAreaLineStyle.color) {\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? plotAreaLineStyle.color;\n }\n }\n\n const modernSeriesNodes = getLocalDescendants(modernPlotAreaNode, \"series\");\n if (modernSeriesNodes.length === 0) {\n return;\n }\n\n chart.series = chart.series.map((series, seriesIndex) => {\n const modernSeriesNode = modernSeriesNodes[seriesIndex] ?? null;\n if (!modernSeriesNode) {\n return series;\n }\n const valueColorsNode = getFirstLocalChild(modernSeriesNode, \"valueColors\");\n const valueColors = valueColorsNode\n ? Array.from(valueColorsNode.childNodes)\n .filter((node): node is Element => node.nodeType === Node.ELEMENT_NODE)\n .map((node) => resolveChartColorNode(findFirstChartColorElement(node) ?? node, themePalette))\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n : [];\n const nextRaw = valueColors.length > 0\n ? {\n ...(series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : {}),\n valueColors\n }\n : series.raw;\n const seriesShapeProperties = getFirstLocalChild(modernSeriesNode, \"spPr\");\n if (!seriesShapeProperties) {\n return nextRaw === series.raw\n ? series\n : {\n ...series,\n raw: nextRaw\n };\n }\n const fillColor = resolveChartFillColor(seriesShapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(seriesShapeProperties, themePalette);\n const fallbackColor = fillColor ?? lineStyle.color ?? undefined;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? lineStyle.color ?? fillColor ?? fallbackColor,\n lineWidthPx: series.lineWidthPx ?? (typeof lineStyle.widthPx === \"number\" ? lineStyle.widthPx : undefined),\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? lineStyle.color ?? fallbackColor ?? series.lineColor,\n raw: nextRaw\n };\n });\n\n const seriesLayouts = modernSeriesNodes.map((node) => node.getAttribute(\"layoutId\") ?? node.getAttribute(\"layout\"));\n const clusteredColumnIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n if (clusteredColumnIndex >= 0) {\n const clusteredNode = modernSeriesNodes[clusteredColumnIndex] ?? null;\n const parsedBinning = clusteredNode ? parseModernBinning(clusteredNode) : null;\n if (parsedBinning) {\n const syntheticRawSeries: Record<string, unknown> = {\n layoutId: \"clusteredColumn\",\n layoutPr: {\n binning: parsedBinning\n }\n };\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const replaceColumnSeries = (series: XlsxChartSeries | null | undefined) => (\n series ? buildChartExHistogramSeries(series, syntheticRawSeries, hasParetoLine) : null\n );\n\n if (chart.typeGroups && chart.typeGroups.length > 0) {\n const nextTypeGroups = chart.typeGroups.map((group) => ({ ...group, series: [...group.series] }));\n const columnGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"ColumnClustered\");\n if (columnGroupIndex >= 0) {\n const originalColumnSeries = nextTypeGroups[columnGroupIndex]?.series[0] ?? null;\n const binnedColumnSeries = replaceColumnSeries(originalColumnSeries);\n if (binnedColumnSeries) {\n nextTypeGroups[columnGroupIndex].series = [binnedColumnSeries];\n const lineGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"Line\");\n if (lineGroupIndex >= 0 && nextTypeGroups[lineGroupIndex]?.series[0]) {\n const originalLineSeries = nextTypeGroups[lineGroupIndex].series[0];\n const recomputedLine = buildChartExParetoLineSeries(\n binnedColumnSeries,\n {\n text: originalLineSeries.name,\n ...(originalLineSeries.raw && typeof originalLineSeries.raw === \"object\"\n ? originalLineSeries.raw as Record<string, unknown>\n : {})\n },\n 0\n );\n nextTypeGroups[lineGroupIndex].series = [\n {\n ...originalLineSeries,\n categories: recomputedLine.categories,\n categoriesRef: recomputedLine.categoriesRef,\n raw: recomputedLine.raw,\n values: recomputedLine.values\n }\n ];\n chart.series = [binnedColumnSeries, nextTypeGroups[lineGroupIndex].series[0]];\n } else {\n chart.series = [binnedColumnSeries];\n }\n chart.typeGroups = nextTypeGroups;\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n }\n }\n };\n\n const chartDocument = parseXml(chartXml);\n const chartNode = chartDocument ? getFirstLocalDescendant(chartDocument, \"chart\") : null;\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const styleIdNode = chartDocument?.documentElement ? getFirstLocalDescendant(chartDocument.documentElement, \"style\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n\n if (!chartNode || !chartTypeNode) {\n applyRelationshipStyles();\n const fallbackStyleId = readChartNumericAttribute(styleIdNode, \"style\");\n if (typeof fallbackStyleId === \"number\" && Number.isFinite(fallbackStyleId)) {\n chart.chartStyleId = fallbackStyleId;\n }\n applyModernChartExStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n const plotArea = plotAreaNode;\n if (!plotArea) {\n applyRelationshipStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n\n switch (chartTypeNode.localName) {\n case \"barChart\":\n case \"bar3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n const barDir = getFirstLocalChild(chartTypeNode, \"barDir\")?.getAttribute(\"val\");\n const isHorizontalBar = barDir === \"bar\";\n chart.is3d = chartTypeNode.localName === \"bar3DChart\" ? true : chart.is3d;\n if (grouping === \"percentStacked\") {\n chart.chartType = isHorizontalBar ? \"BarPercentStacked\" : \"ColumnPercentStacked\";\n } else if (grouping === \"stacked\") {\n chart.chartType = isHorizontalBar ? \"BarStacked\" : \"ColumnStacked\";\n } else {\n chart.chartType = isHorizontalBar ? \"BarClustered\" : \"ColumnClustered\";\n }\n break;\n }\n case \"areaChart\":\n case \"area3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"area3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"AreaStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"AreaPercentStacked\";\n } else {\n chart.chartType = \"Area\";\n }\n break;\n }\n case \"lineChart\":\n case \"line3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"line3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"LineStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"LinePercentStacked\";\n } else {\n chart.chartType = \"Line\";\n }\n break;\n }\n case \"pieChart\":\n chart.chartType = \"Pie\";\n break;\n case \"pie3DChart\":\n chart.chartType = \"Pie3D\";\n chart.is3d = true;\n break;\n case \"doughnutChart\":\n chart.chartType = \"Doughnut\";\n break;\n case \"ofPieChart\":\n chart.chartType = \"BarOfPie\";\n break;\n case \"scatterChart\":\n chart.chartType = resolveScatterChartType(getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\"));\n break;\n case \"radarChart\":\n chart.chartType = \"Radar\";\n break;\n case \"surfaceChart\":\n chart.chartType = \"Surface\";\n chart.is3d = false;\n break;\n case \"surface3DChart\":\n chart.chartType = \"Surface\";\n chart.is3d = true;\n break;\n case \"stockChart\":\n chart.chartType = \"Stock\";\n break;\n case \"bubbleChart\":\n chart.chartType = \"Bubble\";\n break;\n default:\n break;\n }\n\n const legendNode = getFirstLocalChild(chartNode, \"legend\");\n const legendPosition = legendNode ? getFirstLocalChild(legendNode, \"legendPos\")?.getAttribute(\"val\") ?? undefined : undefined;\n const legendOverlay = legendNode ? getFirstLocalChild(legendNode, \"overlay\")?.getAttribute(\"val\") : undefined;\n\n chart.legend = legendNode ? {\n overlay: legendOverlay === \"1\",\n position: normalizeLegendPosition(legendPosition),\n raw: chart.legend?.raw\n } : chart.legend;\n const plotVisibleOnly = readChartBooleanAttribute(chartNode, \"plotVisOnly\");\n if (plotVisibleOnly !== undefined) {\n chart.plotVisibleOnly = plotVisibleOnly;\n }\n chart.displayBlanksAs = getFirstLocalChild(chartNode, \"dispBlanksAs\")?.getAttribute(\"val\") ?? chart.displayBlanksAs;\n const styleId = Number(styleIdNode?.getAttribute(\"val\") ?? Number.NaN);\n chart.chartStyleId = Number.isFinite(styleId) ? styleId : chart.chartStyleId;\n chart.firstSliceAngle = readChartNumericAttribute(chartTypeNode, \"firstSliceAng\") ?? chart.firstSliceAngle;\n chart.gapWidth = readChartNumericAttribute(chartTypeNode, \"gapWidth\") ?? chart.gapWidth;\n chart.overlap = readChartNumericAttribute(chartTypeNode, \"overlap\") ?? chart.overlap;\n chart.bubbleScale = readChartNumericAttribute(chartTypeNode, \"bubbleScale\") ?? chart.bubbleScale;\n chart.varyColors = readChartBooleanAttribute(chartTypeNode, \"varyColors\") ?? chart.varyColors;\n const bubble3dNode = getFirstLocalChild(chartTypeNode, \"bubble3D\");\n chart.bubble3d = bubble3dNode\n ? bubble3dNode.getAttribute(\"val\") !== \"0\"\n : chart.bubble3d;\n chart.holeSize = readChartNumericAttribute(chartTypeNode, \"holeSize\") ?? chart.holeSize;\n chart.radarStyle = getFirstLocalChild(chartTypeNode, \"radarStyle\")?.getAttribute(\"val\") ?? chart.radarStyle;\n chart.scatterStyle = getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\") ?? chart.scatterStyle;\n chart.shape3d = getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? chart.shape3d;\n const wireframeNode = getFirstLocalChild(chartTypeNode, \"wireframe\");\n chart.wireframe = wireframeNode\n ? wireframeNode.getAttribute(\"val\") !== \"0\"\n : chart.wireframe;\n const chartTypeDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(chartTypeNode, \"dLbls\"));\n const firstSeriesNode = getLocalChildren(chartTypeNode, \"ser\")[0] ?? null;\n const seriesDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(firstSeriesNode, \"dLbls\"));\n chart.dataLabels = chartTypeDataLabels ?? seriesDataLabels ?? chart.dataLabels;\n const seriesSp3dNode = firstSeriesNode ? getFirstLocalDescendant(firstSeriesNode, \"sp3d\") : null;\n chart.surfaceMaterial = seriesSp3dNode?.getAttribute(\"prstMaterial\") ?? chart.surfaceMaterial;\n const bandFormatsNode = getLocalChildren(chartTypeNode, \"bandFmts\")[0] ?? null;\n const bandFormatNodes = bandFormatsNode ? getLocalChildren(bandFormatsNode, \"bandFmt\") : [];\n const bandFormatColors = bandFormatNodes\n .map((bandFormatNode) => {\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n return resolveChartFillColor(shapeProperties, themePalette) ?? undefined;\n })\n .filter((color): color is string => typeof color === \"string\" && color.length > 0);\n const bandFormatLineColors = bandFormatNodes\n .map((bandFormatNode) => {\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n return resolveChartLineStyle(shapeProperties, themePalette).color ?? undefined;\n })\n .filter((color): color is string => typeof color === \"string\" && color.length > 0);\n\n chart.raw = {\n ...(chart.raw ?? {}),\n bandFormatCount: bandFormatNodes.length > 0 ? bandFormatNodes.length : undefined,\n bandFormatColors: bandFormatColors.length > 0 ? bandFormatColors : undefined,\n bandFormatLineColors: bandFormatLineColors.length > 0 ? bandFormatLineColors : undefined,\n date1904: readChartBooleanAttribute(chartDocument?.documentElement ?? null, \"date1904\"),\n bubble3d: chart.bubble3d,\n grouping: getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\") ?? undefined,\n ofPieType: getFirstLocalChild(chartTypeNode, \"ofPieType\")?.getAttribute(\"val\") ?? undefined,\n shape: getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? undefined,\n secondPieSize: readChartNumericAttribute(chartTypeNode, \"secondPieSize\"),\n scatterStyle: chart.scatterStyle,\n splitPos: readChartNumericAttribute(chartTypeNode, \"splitPos\"),\n splitType: getFirstLocalChild(chartTypeNode, \"splitType\")?.getAttribute(\"val\") ?? undefined,\n xmlChartType: chartTypeNode.localName\n };\n const view3dNode = getFirstLocalDescendant(chartNode, \"view3D\");\n if (view3dNode) {\n chart.view3d = {\n depthPercent: readChartNumericAttribute(view3dNode, \"depthPercent\"),\n perspective: readChartNumericAttribute(view3dNode, \"perspective\"),\n rAngAx: getFirstLocalChild(view3dNode, \"rAngAx\")?.getAttribute(\"val\") === \"1\",\n rotX: readChartNumericAttribute(view3dNode, \"rotX\"),\n rotY: readChartNumericAttribute(view3dNode, \"rotY\")\n };\n }\n chart.floor = readChartWallFromXml(getFirstLocalChild(chartNode, \"floor\"), themePalette) ?? chart.floor;\n chart.sideWall = readChartWallFromXml(getFirstLocalChild(chartNode, \"sideWall\"), themePalette) ?? chart.sideWall;\n chart.backWall = readChartWallFromXml(getFirstLocalChild(chartNode, \"backWall\"), themePalette) ?? chart.backWall;\n\n const styleAppearance = applyRelationshipStyles();\n const chartTextTypeface = readChartTextTypeface(getFirstLocalChild(chartNode, \"txPr\"), themePalette);\n const titleTypeface = readChartTextTypeface(getFirstLocalDescendant(chartNode, \"title\"), themePalette);\n chart.fontFamily = chartTextTypeface ?? chart.fontFamily;\n chart.titleFontFamily = titleTypeface ?? chart.titleFontFamily ?? chart.fontFamily;\n\n const chartAreaShapeProperties = chartDocument?.documentElement\n ? getFirstLocalChild(chartDocument.documentElement, \"spPr\")\n : null;\n const plotAreaShapeProperties = getFirstLocalChild(plotArea, \"spPr\");\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n const plotAreaNoFill = plotAreaShapeProperties ? getFirstLocalChild(plotAreaShapeProperties, \"noFill\") != null : false;\n chart.raw = {\n ...(chart.raw ?? {}),\n chartAreaNoFill: styleAppearance.chartAreaNoFill === true || chartAreaNoFill,\n plotAreaNoFill\n };\n if (chartAreaShapeProperties) {\n const chartAreaFillColor = resolveChartFillColor(chartAreaShapeProperties, themePalette);\n if (chartAreaFillColor) {\n chart.chartAreaFillColor = chartAreaFillColor;\n } else if (getFirstLocalChild(chartAreaShapeProperties, \"noFill\")) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const chartAreaLineStyle = resolveChartLineStyle(chartAreaShapeProperties, themePalette);\n if (chartAreaLineStyle.hidden) {\n chart.chartAreaBorderColor = \"transparent\";\n } else if (chartAreaLineStyle.color) {\n chart.chartAreaBorderColor = chartAreaLineStyle.color;\n }\n }\n if (!chart.chartAreaFillColor && (styleAppearance.chartAreaNoFill === true || plotAreaNoFill)) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const categoryAxisNodes = [\n ...getLocalChildren(plotArea, \"catAx\"),\n ...getLocalChildren(plotArea, \"dateAx\")\n ];\n const valueAxisNodes = getLocalChildren(plotArea, \"valAx\");\n const seriesAxisNode = getLocalChildren(plotArea, \"serAx\")[0] ?? null;\n const isScatterLikeChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n let categoryAxisNode = categoryAxisNodes[0] ?? null;\n let valueAxisNode = valueAxisNodes[0] ?? null;\n if (!categoryAxisNode && isScatterLikeChart && valueAxisNodes.length >= 2) {\n categoryAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"b\" || position === \"t\";\n }) ?? valueAxisNodes[0];\n valueAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"l\" || position === \"r\";\n }) ?? valueAxisNodes[1] ?? valueAxisNodes[0];\n }\n chart.categoryAxis = mergeChartAxis(chart.categoryAxis, readChartAxisFromXml(categoryAxisNode));\n chart.valueAxis = mergeChartAxis(chart.valueAxis, readChartAxisFromXml(valueAxisNode));\n chart.seriesAxis = mergeChartAxis(chart.seriesAxis, readChartAxisFromXml(seriesAxisNode));\n chart.axes = chart.axes.length > 0\n ? chart.axes.map((axis, index) => (\n index === 0 && categoryAxisNode\n ? { ...axis, ...readChartAxisFromXml(categoryAxisNode) }\n : index === 1 && valueAxisNode\n ? { ...axis, ...readChartAxisFromXml(valueAxisNode) }\n : axis\n ))\n : chart.axes;\n if (seriesAxisNode) {\n const seriesAxis = readChartAxisFromXml(seriesAxisNode);\n if (seriesAxis && !chart.axes.some((axis) => axis.id != null && axis.id === seriesAxis.id)) {\n chart.axes = [...chart.axes, seriesAxis as XlsxChartAxis];\n }\n }\n\n applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);\n applyFallbackSeriesStyles();\n if (chart.chartType === \"Bubble\") {\n const archiveFallbackBubbleSizes = resolveArchiveFallbackBubbleSizes(archive, chart.title);\n if (archiveFallbackBubbleSizes.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 1) {\n return series;\n }\n\n const numericBubbleCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n if (numericBubbleCount >= pointCount) {\n return series;\n }\n\n const fallbackCandidate = archiveFallbackBubbleSizes[seriesIndex] ?? archiveFallbackBubbleSizes[0] ?? [];\n const fallbackNumericCount = fallbackCandidate.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n if (fallbackNumericCount < pointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackCandidate\n };\n });\n }\n }\n if (chart.chartType === \"Pie\" || chart.chartType === \"Pie3D\" || chart.chartType === \"PieExploded\" || chart.chartType === \"Doughnut\" || chart.chartType === \"BarOfPie\") {\n const needsPointColorFallback = chart.series.some((series) => {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 0) {\n return false;\n }\n const coloredPointCount = (series.dataPointStyles ?? []).filter(\n (style) => typeof style.color === \"string\" && style.color.length > 0\n ).length;\n return coloredPointCount === 0;\n });\n if (needsPointColorFallback) {\n const archiveFallbackPointStyles = resolveArchiveFallbackPointStyles(\n archive,\n chart.title,\n chartTypeNode.localName,\n themePalette\n );\n if (archiveFallbackPointStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyles = archiveFallbackPointStyles[seriesIndex] ?? archiveFallbackPointStyles[0] ?? [];\n if (fallbackStyles.length === 0) {\n return series;\n }\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n }\n }\n applyBuiltinChartDefaults(chart, themePalette);\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const index = normalized.lastIndexOf(\"/\");\n return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction resolveRelationshipPath(basePath: string, target: string) {\n if (!target) {\n return \"\";\n }\n\n const normalizedTarget = target.replace(/\\\\/g, \"/\");\n if (normalizedTarget.startsWith(\"/\")) {\n return normalizeArchivePath(normalizedTarget);\n }\n const normalizedBasePath = normalizeArchivePath(basePath);\n let baseDirectory = dirname(normalizedBasePath);\n if (normalizedBasePath.endsWith(\".rels\")) {\n const relsMarker = \"/_rels/\";\n const relsMarkerIndex = normalizedBasePath.lastIndexOf(relsMarker);\n if (relsMarkerIndex >= 0) {\n const ownerPrefix = normalizedBasePath.slice(0, relsMarkerIndex);\n const relFileName = normalizedBasePath.slice(relsMarkerIndex + relsMarker.length);\n const ownerFileName = relFileName.endsWith(\".rels\")\n ? relFileName.slice(0, -\".rels\".length)\n : relFileName;\n baseDirectory = dirname(`${ownerPrefix}/${ownerFileName}`);\n }\n }\n\n const segments = [...baseDirectory.split(\"/\").filter(Boolean), ...normalizedTarget.split(\"/\").filter(Boolean)];\n const resolved: string[] = [];\n for (const segment of segments) {\n if (segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n resolved.pop();\n continue;\n }\n resolved.push(segment);\n }\n\n return resolved.join(\"/\");\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string | null | undefined) {\n if (!path) {\n return null;\n }\n\n const entry = archive[normalizeArchivePath(path)];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseXml(xml: string) {\n if (typeof DOMParser === \"undefined\") {\n return null;\n }\n\n try {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n } catch {\n return null;\n }\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction getLocalChildren(parent: ParentNode, localName: string) {\n return Array.from(parent.childNodes).filter(\n (node): node is Element => node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === localName\n );\n}\n\nfunction getLocalDescendants(parent: ParentNode, localName: string) {\n return Array.from((parent as Element | Document).getElementsByTagName(\"*\")).filter(\n (node) => node.localName === localName\n );\n}\n\nfunction getFirstLocalChild(parent: ParentNode, localName: string) {\n return getLocalChildren(parent, localName)[0] ?? null;\n}\n\nfunction getFirstLocalDescendant(parent: ParentNode, localName: string) {\n return getLocalDescendants(parent, localName)[0] ?? null;\n}\n\nfunction ensureChild(parent: Element, localName: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const existing = getFirstLocalChild(parent, localName);\n if (existing) {\n return existing;\n }\n\n const document = parent.ownerDocument;\n const node = document.createElementNS(namespace, `${prefix}:${localName}`);\n parent.appendChild(node);\n return node;\n}\n\nfunction setLeafValue(parent: Element, localName: string, value: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const node = ensureChild(parent, localName, namespace, prefix);\n node.textContent = value;\n return node;\n}\n\nfunction setBooleanValue(parent: Element, localName: string, value: boolean) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", value ? \"1\" : \"0\");\n return node;\n}\n\nfunction setNumericValue(parent: Element, localName: string, value: number) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", String(Math.round(value)));\n return node;\n}\n\nfunction unquoteSheetName(value: string) {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction splitSheetReference(reference: string) {\n let bangIndex = -1;\n let quoted = false;\n for (let index = 0; index < reference.length; index += 1) {\n const char = reference[index];\n if (char === \"'\") {\n quoted = !quoted;\n } else if (char === \"!\" && !quoted) {\n bangIndex = index;\n break;\n }\n }\n\n if (bangIndex < 0) {\n return null;\n }\n\n return {\n range: reference.slice(bangIndex + 1),\n sheetName: unquoteSheetName(reference.slice(0, bangIndex))\n };\n}\n\nfunction parseA1Cell(reference: string) {\n const match = /^\\$?([A-Z]+)\\$?(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n let col = 0;\n for (const char of match[1].toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(match[2]) - 1\n };\n}\n\nfunction parseA1Range(reference: string) {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1Cell(startRef ?? \"\");\n const end = parseA1Cell(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return {\n end: {\n col: Math.max(start.col, end.col),\n row: Math.max(start.row, end.row)\n },\n start: {\n col: Math.min(start.col, end.col),\n row: Math.min(start.row, end.row)\n }\n };\n}\n\nfunction formatA1Column(col: number) {\n let current = col + 1;\n let label = \"\";\n while (current > 0) {\n const remainder = (current - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n current = Math.floor((current - 1) / 26);\n }\n return label;\n}\n\nfunction buildA1RangeFormula(sheetName: string, start: { col: number; row: number }, end: { col: number; row: number }) {\n const escapedSheetName = sheetName.replace(/'/g, \"''\");\n return `'${escapedSheetName}'!$${formatA1Column(start.col)}$${start.row + 1}:$${formatA1Column(end.col)}$${end.row + 1}`;\n}\n\nfunction resolveReferenceSheet(workbook: Workbook, fallbackSheetIndex: number, formula?: string | null) {\n if (!formula) {\n return {\n range: null,\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n const trimmedFormula = formula.trim();\n if (trimmedFormula.length > 0 && !trimmedFormula.includes(\"!\")) {\n try {\n const namedRange = workbook.getNamedRange(trimmedFormula);\n if (typeof namedRange === \"string\" && namedRange.length > 0 && namedRange !== trimmedFormula) {\n return resolveReferenceSheet(workbook, fallbackSheetIndex, namedRange);\n }\n } catch {\n // Fall back to direct A1 parsing when the workbook has no matching name.\n }\n }\n\n const split = splitSheetReference(trimmedFormula);\n if (!split) {\n return {\n range: parseA1Range(trimmedFormula),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n try {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheetByName(split.sheetName),\n sheetName: split.sheetName\n };\n } catch {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n}\n\nfunction resolveChartReferenceLabel(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n fallbackLabel: string\n) {\n if (!reference?.formula) {\n return fallbackLabel;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return fallbackLabel;\n }\n\n const { start } = resolved.range;\n if (start.row > 0) {\n const headerDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row - 1, start.col)\n : null\n );\n if (headerDisplay.length > 0) {\n return headerDisplay;\n }\n }\n\n const firstDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row, start.col)\n : null\n );\n return firstDisplay.length > 0 ? firstDisplay : fallbackLabel;\n}\n\nfunction resolveReferenceRowPaths(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined\n) {\n if (!reference?.formula) {\n return [] as string[][];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return [];\n }\n\n const rows: string[][] = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n const parts: string[] = [];\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n const label = display.length > 0 ? display : (numeric != null ? String(numeric) : \"\");\n if (label.length > 0) {\n parts.push(label);\n }\n }\n rows.push(parts);\n }\n return rows;\n}\n\nfunction normalizeChartExLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const legend = raw as Record<string, unknown>;\n const position = typeof legend.pos === \"string\"\n ? normalizeLegendPosition(String(legend.pos))\n : undefined;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position,\n raw: legend\n };\n}\n\nfunction humanizeChartExLayoutLabel(layout: string | undefined) {\n if (!layout) {\n return undefined;\n }\n return layout\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n\nfunction normalizeChartExAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const axis = raw as Record<string, unknown>;\n const scaling = axis.scaling && typeof axis.scaling === \"object\"\n ? axis.scaling as Record<string, unknown>\n : null;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n delete: typeof axis.hidden === \"boolean\" ? axis.hidden : undefined,\n id: typeof axis.id === \"number\" && Number.isFinite(axis.id) ? axis.id : undefined,\n crossId: typeof axis.crossId === \"number\" && Number.isFinite(axis.crossId) ? axis.crossId : undefined,\n majorGridlines: axis.majorGridlines != null ? true : undefined,\n majorUnit: typeof scaling?.majorUnit === \"number\" ? scaling.majorUnit : undefined,\n max: typeof scaling?.max === \"number\" ? scaling.max : undefined,\n min: typeof scaling?.min === \"number\" ? scaling.min : undefined,\n minorGridlines: axis.minorGridlines != null ? true : undefined,\n minorUnit: typeof scaling?.minorUnit === \"number\" ? scaling.minorUnit : undefined,\n numberFormat: numberFormat\n ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n }\n : undefined,\n raw: axis,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction resolveChartExLayoutChartType(layout: string | undefined) {\n switch (layout) {\n case \"boxWhisker\":\n return \"BoxWhisker\";\n case \"clusteredColumn\":\n return \"ColumnClustered\";\n case \"funnel\":\n return \"Funnel\";\n case \"paretoLine\":\n return \"Line\";\n case \"regionMap\":\n return \"RegionMap\";\n case \"sunburst\":\n return \"Sunburst\";\n case \"treemap\":\n return \"Treemap\";\n case \"waterfall\":\n return \"Waterfall\";\n default:\n return layout ? `Unsupported(cx:${layout})` : \"ColumnClustered\";\n }\n}\n\nfunction resolveChartExSeriesLayout(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n return typeof record.layout === \"string\"\n ? record.layout\n : typeof record.layoutId === \"string\"\n ? record.layoutId\n : undefined;\n}\n\nfunction resolveChartExSeriesAxisIds(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n const record = raw as Record<string, unknown>;\n if (Array.isArray(record.axisIds)) {\n return record.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n }\n if (Array.isArray(record.axisId)) {\n return record.axisId.flatMap((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return [value];\n }\n if (value && typeof value === \"object\" && typeof (value as { val?: unknown }).val === \"number\") {\n return [(value as { val: number }).val];\n }\n return [];\n });\n }\n if (typeof record.axisId === \"number\" && Number.isFinite(record.axisId)) {\n return [record.axisId];\n }\n return [];\n}\n\nfunction niceHistogramStep(value: number) {\n if (!Number.isFinite(value) || value <= 0) {\n return 1;\n }\n const exponent = Math.floor(Math.log10(value));\n const scale = 10 ** exponent;\n const normalized = value / scale;\n if (normalized <= 1) {\n return scale;\n }\n if (normalized <= 2) {\n return scale * 2;\n }\n if (normalized <= 5) {\n return scale * 5;\n }\n return scale * 10;\n}\n\nfunction formatHistogramBinLabel(lower: number, upper: number, index: number, closedRight: boolean) {\n const leftBracket = closedRight\n ? (index === 0 ? \"[\" : \"(\")\n : \"[\";\n const rightBracket = closedRight ? \"]\" : \")\";\n return `${leftBracket}${Number(lower.toFixed(6))},${Number(upper.toFixed(6))}${rightBracket}`;\n}\n\ntype ChartExHistogramBin = {\n count: number;\n label: string;\n lower: number;\n upper: number;\n};\n\nfunction buildChartExHistogramBins(values: number[], rawSeries: unknown, sortByFrequency: boolean) {\n if (values.length === 0) {\n return [] as ChartExHistogramBin[];\n }\n\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const layoutProperties = rawRecord?.layoutPr && typeof rawRecord.layoutPr === \"object\"\n ? rawRecord.layoutPr as Record<string, unknown>\n : null;\n const rawBinning = layoutProperties?.binning && typeof layoutProperties.binning === \"object\"\n ? layoutProperties.binning as Record<string, unknown>\n : null;\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const explicitWidth = typeof rawBinning?.binWidth === \"number\" && Number.isFinite(rawBinning.binWidth) && rawBinning.binWidth > 0\n ? rawBinning.binWidth\n : typeof rawBinning?.width === \"number\" && Number.isFinite(rawBinning.width) && rawBinning.width > 0\n ? rawBinning.width\n : undefined;\n const explicitCount = typeof rawBinning?.binCount === \"number\" && Number.isFinite(rawBinning.binCount) && rawBinning.binCount > 0\n ? rawBinning.binCount\n : typeof rawBinning?.count === \"number\" && Number.isFinite(rawBinning.count) && rawBinning.count > 0\n ? rawBinning.count\n : undefined;\n const closedRight = rawBinning?.intervalClosed === \"r\" || rawBinning?.intervalClosed === \"right\";\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const variance = values.reduce((sum, value) => sum + ((value - mean) ** 2), 0) / Math.max(1, values.length);\n const standardDeviation = Math.sqrt(Math.max(0, variance));\n const allIntegers = values.every((value) => Math.abs(value - Math.round(value)) < 1e-9);\n const scottWidth = standardDeviation > 0\n ? (3.49 * standardDeviation) / Math.cbrt(values.length)\n : undefined;\n const fallbackWidth = explicitCount != null\n ? (maxValue - minValue) / Math.max(1, explicitCount)\n : scottWidth ?? ((maxValue - minValue) / Math.max(1, Math.ceil(Math.log2(values.length) + 1)));\n const roughWidth = explicitWidth\n ?? (allIntegers\n ? Math.max(1, Math.ceil(Math.max(fallbackWidth, 1e-6)))\n : niceHistogramStep(Math.max(fallbackWidth, 1e-6)));\n const binWidth = Math.max(roughWidth, 1e-6);\n const start = explicitWidth != null || explicitCount != null\n ? Math.floor(minValue / binWidth) * binWidth\n : minValue;\n const end = Math.max(start + binWidth, start + Math.ceil((maxValue - start) / binWidth) * binWidth);\n const binCount = Math.max(1, Math.ceil((end - start) / binWidth));\n const bins = Array.from({ length: binCount }, (_, index) => {\n const lower = start + binWidth * index;\n const upper = lower + binWidth;\n return {\n count: 0,\n label: formatHistogramBinLabel(lower, upper, index, closedRight),\n lower,\n upper\n } satisfies ChartExHistogramBin;\n });\n\n values.forEach((value) => {\n if (!Number.isFinite(value)) {\n return;\n }\n const offset = (value - start) / binWidth;\n let binIndex = Math.floor(offset);\n if (closedRight && Math.abs(offset - Math.round(offset)) < 1e-9 && value > start) {\n binIndex -= 1;\n }\n if (value >= end) {\n binIndex = bins.length - 1;\n }\n if (value <= start) {\n binIndex = 0;\n }\n const target = bins[Math.max(0, Math.min(bins.length - 1, binIndex))];\n if (target) {\n target.count += 1;\n }\n });\n\n if (sortByFrequency) {\n bins.sort((left, right) => (\n right.count - left.count\n || left.lower - right.lower\n ));\n }\n return bins;\n}\n\nfunction buildChartExHistogramSeries(\n series: XlsxChartSeries,\n rawSeries: unknown,\n sortByFrequency: boolean\n) {\n const layout = resolveChartExSeriesLayout(rawSeries);\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const hasBinning = Boolean(\n layout === \"clusteredColumn\"\n && rawRecord?.layoutPr\n && typeof rawRecord.layoutPr === \"object\"\n && (rawRecord.layoutPr as Record<string, unknown>).binning != null\n );\n if (!hasBinning) {\n return series;\n }\n\n const numericValues = series.values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n if (numericValues.length === 0) {\n return series;\n }\n\n const bins = buildChartExHistogramBins(numericValues, rawSeries, sortByFrequency);\n if (bins.length === 0) {\n return series;\n }\n\n return {\n ...series,\n categories: bins.map((bin) => bin.label),\n categoriesRef: null,\n raw: {\n ...series.raw,\n chartExHistogramBins: bins,\n chartExSourceValues: numericValues\n },\n values: bins.map((bin) => bin.count)\n };\n}\n\nfunction buildChartExParetoLineSeries(series: XlsxChartSeries, sourceRaw: unknown, index: number) {\n const counts = series.values.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : 0\n ));\n const total = counts.reduce((sum, value) => sum + value, 0);\n let running = 0;\n const cumulative = counts.map((value) => {\n running += value;\n return total > 0 ? (running / total) * 100 : 0;\n });\n return {\n ...series,\n color: undefined,\n lineColor: undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: 7,\n markerSymbol: \"circle\",\n name: typeof (sourceRaw as { text?: unknown } | null)?.text === \"string\"\n ? (sourceRaw as { text: string }).text\n : \"Pareto\",\n raw: {\n ...(series.raw ?? {}),\n chartExLayout: \"paretoLine\",\n source: sourceRaw && typeof sourceRaw === \"object\" ? sourceRaw as Record<string, unknown> : undefined\n },\n values: cumulative\n };\n}\n\nfunction resolveChartExTextFormula(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.formula === \"string\" && record.formula.length > 0) {\n return record.formula;\n }\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n if (typeof record.value === \"string\" && record.value.length > 0) {\n return record.value;\n }\n return undefined;\n}\n\nfunction resolveChartExTitleText(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n const nestedText = record.text && typeof record.text === \"object\"\n ? resolveChartExTextFormula(record.text)\n : undefined;\n if (nestedText) {\n return nestedText;\n }\n return typeof record.value === \"string\" && record.value.length > 0 ? record.value : undefined;\n}\n\nfunction resolveChartExFallbackCategoryReference(\n workbook: Workbook,\n fallbackSheetIndex: number,\n valueFormula: string | undefined\n) {\n if (!valueFormula) {\n return null;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, valueFormula);\n if (!resolved.sheet || !resolved.range || resolved.range.start.col <= 0) {\n return null;\n }\n\n return normalizeChartReference({\n formula: buildA1RangeFormula(\n resolved.sheetName,\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.start.row\n },\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.end.row\n }\n )\n });\n}\n\nfunction normalizeChartExSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n dataById: Map<number, Record<string, unknown>>,\n index: number,\n chartType?: XlsxChart[\"chartType\"]\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const dataId = typeof series.dataId === \"number\" ? series.dataId : null;\n const dataEntry = dataId != null ? dataById.get(dataId) ?? null : null;\n const dimensions = Array.isArray(dataEntry?.dimensions)\n ? dataEntry.dimensions.filter((value): value is Record<string, unknown> => Boolean(value && typeof value === \"object\"))\n : [];\n const categoryDimension = dimensions.find((dimension) => dimension.dimType === \"cat\")\n ?? dimensions.find((dimension) => dimension.dimType === \"name\")\n ?? null;\n const valueDimension = dimensions.find((dimension) => (\n dimension.dimType === \"val\"\n || dimension.dimType === \"y\"\n || dimension.dimType === \"colorVal\"\n || dimension.dimType === \"size\"\n ))\n ?? dimensions.find((dimension) => dimension !== categoryDimension)\n ?? categoryDimension;\n const categoryDimensionFormula = typeof categoryDimension?.formula === \"string\" ? categoryDimension.formula : undefined;\n const valueDimensionFormula = typeof valueDimension?.formula === \"string\" ? valueDimension.formula : undefined;\n const fallbackCategoryRef = (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && !categoryDimension\n && typeof valueDimensionFormula === \"string\"\n )\n ? resolveChartExFallbackCategoryReference(workbook, workbookSheetIndex, valueDimensionFormula)\n : null;\n const categoriesRef = categoryDimension\n ? normalizeChartReference({\n formula: categoryDimensionFormula\n })\n : fallbackCategoryRef;\n const valuesRef = valueDimension\n ? normalizeChartReference({\n formula: valueDimensionFormula\n })\n : null;\n const resolvedValueCells = resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\");\n const values = resolvedValueCells.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ));\n const colorStrings = chartType === \"RegionMap\" && valueDimension?.dimType === \"colorStr\"\n ? resolvedValueCells.map((value) => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n })\n : [];\n const categories = resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\");\n const hierarchyCategories = (\n chartType === \"Sunburst\" || chartType === \"Treemap\"\n )\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const seriesTextFormula = resolveChartExTextFormula(series.text);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n\n return {\n bubbleSizeRef: null,\n bubbleSizes: [],\n categories,\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n formatIdx: typeof series.formatIdx === \"number\" ? series.formatIdx : undefined,\n hidden: typeof series.hidden === \"boolean\" ? series.hidden : undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: undefined,\n markerColor: rawFillColor ?? undefined,\n markerLineColor: rawLineColor ?? rawFillColor ?? undefined,\n markerSize: undefined,\n markerSymbol: undefined,\n name: typeof series.text === \"string\"\n ? series.text\n : seriesTextFormula\n ? resolveSeriesName(workbook, workbookSheetIndex, seriesTextFormula)\n : resolveChartReferenceLabel(workbook, workbookSheetIndex, valuesRef, `Series ${index + 1}`),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: {\n ...series,\n chartExColorStrings: colorStrings,\n chartExHierarchyCategories: hierarchyCategories,\n data: dataEntry,\n dimType: typeof valueDimension?.dimType === \"string\" ? valueDimension.dimType : undefined\n },\n shapeProperties,\n smooth: undefined,\n values,\n valuesRef\n };\n}\n\nfunction collapseChartExPointSeries(chartType: XlsxChart[\"chartType\"], series: XlsxChartSeries[]) {\n if (chartType !== \"Funnel\" && chartType !== \"Waterfall\") {\n if (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && series.length > 1\n && series.every((entry) => {\n const raw = entry.raw && typeof entry.raw === \"object\" ? entry.raw as Record<string, unknown> : null;\n return raw?.dimType === \"size\";\n })\n ) {\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n return [\n {\n ...primarySeries,\n dataPoints: [],\n hidden: false\n }\n ];\n }\n return series;\n }\n\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n\n return [\n {\n ...primarySeries,\n categories: [],\n categoriesRef: null,\n dataPoints: [],\n hidden: false\n }\n ];\n}\n\nfunction normalizeChartExChart(\n workbook: Workbook,\n workbookSheetIndex: number,\n visibleSheetIndex: number,\n raw: unknown,\n index: number,\n themePalette?: XlsxThemePalette | null\n): XlsxChart {\n const chart = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const plotArea = chart.plotArea && typeof chart.plotArea === \"object\"\n ? chart.plotArea as Record<string, unknown>\n : {};\n const rawSeries = Array.isArray(plotArea.series) ? plotArea.series : [];\n const seriesLayouts = rawSeries.map(resolveChartExSeriesLayout);\n const dataEntries = Array.isArray(chart.data) ? chart.data : [];\n const dataById = new Map<number, Record<string, unknown>>();\n dataEntries.forEach((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return;\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.id === \"number\") {\n dataById.set(record.id, record);\n }\n });\n const axes = Array.isArray(plotArea.axes)\n ? plotArea.axes.map(normalizeChartExAxis).filter((value): value is XlsxChartAxis => Boolean(value))\n : [];\n const primaryLayout = typeof chart.layout === \"string\"\n ? chart.layout\n : seriesLayouts.find((value): value is string => typeof value === \"string\" && value.length > 0);\n const fallbackTitle = humanizeChartExLayoutLabel(primaryLayout);\n const chartTitle = resolveChartExTitleText(chart.title) ?? (chart.title != null ? \"Chart Title\" : fallbackTitle);\n const chartType = resolveChartExLayoutChartType(primaryLayout);\n const normalizedSeries = rawSeries.map((entry, seriesIndex) => (\n normalizeChartExSeries(workbook, workbookSheetIndex, `chart-ex-${workbookSheetIndex}-${index}`, entry, dataById, seriesIndex, chartType)\n ));\n const clusteredColumnSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const clusteredColumnAxisIds = clusteredColumnSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[clusteredColumnSeriesIndex])\n : [];\n const paretoLineSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"paretoLine\");\n const paretoLineAxisIds = paretoLineSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[paretoLineSeriesIndex])\n : [];\n const primaryHistogramSeries = clusteredColumnSeriesIndex >= 0\n ? buildChartExHistogramSeries(normalizedSeries[clusteredColumnSeriesIndex] ?? normalizedSeries[0], rawSeries[clusteredColumnSeriesIndex], hasParetoLine)\n : null;\n const synthesizedParetoSeries = (\n hasParetoLine\n && primaryHistogramSeries\n && primaryHistogramSeries.values.length > 0\n )\n ? buildChartExParetoLineSeries(primaryHistogramSeries, rawSeries[paretoLineSeriesIndex], paretoLineSeriesIndex)\n : null;\n const resolvedSeries = synthesizedParetoSeries\n ? [primaryHistogramSeries!, synthesizedParetoSeries]\n : primaryHistogramSeries\n ? [\n primaryHistogramSeries,\n ...normalizedSeries.filter((_, seriesIndex) => seriesIndex !== clusteredColumnSeriesIndex)\n ]\n : collapseChartExPointSeries(chartType, normalizedSeries);\n const resolvedChartType = primaryHistogramSeries ? \"ColumnClustered\" : chartType;\n const resolvedGapWidth = primaryHistogramSeries ? 0 : undefined;\n const typeGroups = synthesizedParetoSeries\n ? [\n {\n axisIds: clusteredColumnAxisIds,\n chartType: \"ColumnClustered\",\n gapWidth: 0,\n raw: {\n gapWidth: 0,\n layout: \"clusteredColumn\"\n },\n series: [primaryHistogramSeries!]\n },\n {\n axisIds: paretoLineAxisIds,\n chartType: \"Line\",\n raw: {\n layout: \"paretoLine\"\n },\n series: [synthesizedParetoSeries]\n }\n ]\n : [];\n const normalizedChart: XlsxChart = {\n anchor: normalizeChartAnchor(chart.anchor),\n autoTitleDeleted: undefined,\n axes,\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: axes[0] ?? null,\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartExLayout: primaryLayout,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: resolvedChartType,\n dataLabels: rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null,\n displayBlanksAs: undefined,\n editable: true,\n firstSliceAngle: undefined,\n fontFamily: undefined,\n gapWidth: resolvedGapWidth,\n holeSize: undefined,\n id: `chart-ex-${workbookSheetIndex}-${index}`,\n is3d: undefined,\n legend: normalizeChartExLegend(chart.legend),\n name: chartTitle,\n overlap: undefined,\n plotVisibleOnly: undefined,\n raw: chart,\n radarStyle: undefined,\n scatterStyle: undefined,\n roundedCorners: undefined,\n shape3d: undefined,\n seriesAxis: null,\n series: resolvedSeries,\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: undefined,\n bubble3d: undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: chartTitle,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups,\n valueAxis: axes.find((axis) => axis.numberFormat || axis.majorGridlines) ?? axes[1] ?? null,\n varyColors: typeof chart.valueColors === \"boolean\" ? chart.valueColors : undefined,\n view3d: undefined,\n wireframe: undefined,\n workbookSheetIndex,\n zIndex: index\n };\n\n applyBuiltinChartDefaults(normalizedChart, themePalette);\n return normalizedChart;\n}\n\nfunction cellValueToNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return null;\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asNumber?: () => unknown }).asNumber === \"function\") {\n candidates.push((value as { asNumber: () => unknown }).asNumber());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const parsed = Number(candidate.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n }\n if (typeof value === \"string\") {\n const parsed = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction cellValueToDisplay(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return \"\";\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) {\n continue;\n }\n if (typeof candidate === \"string\") {\n return candidate;\n }\n return String(candidate);\n }\n }\n return String(value);\n}\n\nfunction resolveReferenceValues(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n mode: \"category\" | \"value\"\n): Array<number | string | null> {\n if (!reference?.formula) {\n return reference?.values ?? [];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return reference.values ?? [];\n }\n\n const values: Array<number | string | null> = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n if (mode === \"value\") {\n values.push(cellValueToNumber(calculated ?? formatted));\n } else {\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n values.push(display.length > 0 ? display : (numeric !== null ? numeric : null));\n }\n }\n }\n\n return values;\n}\n\nfunction resolveSeriesName(workbook: Workbook, fallbackSheetIndex: number, rawName: unknown) {\n if (typeof rawName !== \"string\" || !rawName) {\n return undefined;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, rawName);\n if (!resolved.sheet || !resolved.range) {\n return rawName;\n }\n\n const value = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(resolved.range.start.row, resolved.range.start.col)\n : null;\n const display = cellValueToDisplay(value);\n return display || rawName;\n}\n\nfunction normalizeChartReference(raw: unknown): XlsxChartReference | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n return {\n formula: typeof record.formula === \"string\" ? record.formula : undefined,\n refType: typeof record.refType === \"string\" ? record.refType : undefined,\n values: Array.isArray(record.values) ? record.values as Array<number | string | null> : undefined\n };\n}\n\nfunction normalizeChartAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const rawAxis = raw as Record<string, unknown>;\n const axis = rawAxis.axis && typeof rawAxis.axis === \"object\"\n ? rawAxis.axis as Record<string, unknown>\n : rawAxis;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n crossId: typeof rawAxis.crossId === \"number\" && Number.isFinite(rawAxis.crossId) ? rawAxis.crossId : undefined,\n crosses: typeof axis.crosses === \"string\" ? axis.crosses : undefined,\n crossBetween: typeof axis.crossBetween === \"string\" ? axis.crossBetween : undefined,\n delete: typeof axis.delete === \"boolean\" ? axis.delete : undefined,\n id: typeof rawAxis.id === \"number\" && Number.isFinite(rawAxis.id) ? rawAxis.id : undefined,\n labelPosition: typeof axis.labelPosition === \"string\" ? axis.labelPosition : undefined,\n logBase: typeof axis.logBase === \"number\" ? axis.logBase : undefined,\n orientation: typeof axis.orientation === \"string\" ? axis.orientation : undefined,\n majorUnit: typeof axis.majorUnit === \"number\" ? axis.majorUnit : undefined,\n max: typeof axis.max === \"number\" ? axis.max : undefined,\n min: typeof axis.min === \"number\" ? axis.min : undefined,\n majorGridlines: typeof axis.majorGridlines === \"boolean\" ? axis.majorGridlines : undefined,\n majorTickMark: typeof axis.majorTickMark === \"string\" ? axis.majorTickMark : undefined,\n minorUnit: typeof axis.minorUnit === \"number\" ? axis.minorUnit : undefined,\n minorGridlines: typeof axis.minorGridlines === \"boolean\" ? axis.minorGridlines : undefined,\n minorTickMark: typeof axis.minorTickMark === \"string\" ? axis.minorTickMark : undefined,\n numberFormat: numberFormat ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n } : undefined,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n raw: axis,\n shapeProperties: axis.shapeProperties && typeof axis.shapeProperties === \"object\"\n ? axis.shapeProperties as Record<string, unknown>\n : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" && Number.isFinite(axis.tickLabelSkip) ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" && Number.isFinite(axis.tickMarkSkip) ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction mergeChartAxis(target: XlsxChartAxis | null | undefined, patch: Partial<XlsxChartAxis> | null | undefined) {\n if (!patch) {\n return target ?? null;\n }\n return {\n ...(target ?? {}),\n ...patch\n };\n}\n\nfunction readChartAxisFromXml(axisNode: Element | null): Partial<XlsxChartAxis> | null {\n if (!axisNode) {\n return null;\n }\n\n const numFmt = getFirstLocalChild(axisNode, \"numFmt\");\n const scalingNode = getFirstLocalChild(axisNode, \"scaling\");\n return {\n crossId: readChartNumericAttribute(axisNode, \"crossAx\"),\n crosses: getFirstLocalChild(axisNode, \"crosses\")?.getAttribute(\"val\") ?? undefined,\n crossBetween: getFirstLocalChild(axisNode, \"crossBetween\")?.getAttribute(\"val\") ?? undefined,\n delete: getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"1\"\n ? true\n : getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"0\"\n ? false\n : undefined,\n id: readChartNumericAttribute(axisNode, \"axId\"),\n labelPosition: getFirstLocalChild(axisNode, \"tickLblPos\")?.getAttribute(\"val\") ?? undefined,\n logBase: readChartNumericAttribute(getFirstLocalChild(axisNode, \"scaling\"), \"logBase\"),\n orientation: getFirstLocalChild(scalingNode ?? axisNode, \"orientation\")?.getAttribute(\"val\") ?? undefined,\n majorGridlines: Boolean(getFirstLocalChild(axisNode, \"majorGridlines\")),\n majorTickMark: getFirstLocalChild(axisNode, \"majorTickMark\")?.getAttribute(\"val\") ?? undefined,\n majorUnit: readChartNumericAttribute(axisNode, \"majorUnit\"),\n max: readChartNumericAttribute(scalingNode, \"max\"),\n min: readChartNumericAttribute(scalingNode, \"min\"),\n minorGridlines: Boolean(getFirstLocalChild(axisNode, \"minorGridlines\")),\n minorTickMark: getFirstLocalChild(axisNode, \"minorTickMark\")?.getAttribute(\"val\") ?? undefined,\n minorUnit: readChartNumericAttribute(axisNode, \"minorUnit\"),\n numberFormat: numFmt\n ? {\n formatCode: numFmt.getAttribute(\"formatCode\") ?? undefined,\n sourceLinked: numFmt.getAttribute(\"sourceLinked\") === \"1\"\n ? true\n : numFmt.getAttribute(\"sourceLinked\") === \"0\"\n ? false\n : undefined\n }\n : undefined,\n position: getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\") ?? undefined,\n tickLabelSkip: readChartNumericAttribute(axisNode, \"tickLblSkip\"),\n tickMarkSkip: readChartNumericAttribute(axisNode, \"tickMarkSkip\")\n };\n}\n\nfunction readChartWallFromXml(wallNode: Element | null, themePalette?: XlsxThemePalette | null): XlsxChartWall | null {\n if (!wallNode) {\n return null;\n }\n const shapeProperties = getFirstLocalChild(wallNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n fillColor: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n hidden: shapeProperties ? getFirstLocalChild(shapeProperties, \"noFill\") != null : undefined,\n lineColor: lineStyle.color ?? undefined,\n thickness: readChartNumericAttribute(wallNode, \"thickness\")\n };\n}\n\nfunction normalizeChartDataLabels(raw: unknown): XlsxChartDataLabels | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const labels = raw as Record<string, unknown>;\n const pointLabels = Array.isArray(labels.pointLabels)\n ? (() => {\n const normalized: XlsxChartPointDataLabel[] = [];\n for (const entry of labels.pointLabels) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const point = entry as Record<string, unknown>;\n const index = typeof point.index === \"number\" && Number.isFinite(point.index)\n ? point.index\n : null;\n if (index == null) {\n continue;\n }\n\n const nextPoint: XlsxChartPointDataLabel = { index };\n if (typeof point.deleted === \"boolean\") {\n nextPoint.deleted = point.deleted;\n }\n if (typeof point.fontSizePt === \"number\" && Number.isFinite(point.fontSizePt)) {\n nextPoint.fontSizePt = point.fontSizePt;\n }\n if (typeof point.showBubbleSize === \"boolean\") {\n nextPoint.showBubbleSize = point.showBubbleSize;\n }\n if (typeof point.showCategoryName === \"boolean\") {\n nextPoint.showCategoryName = point.showCategoryName;\n }\n if (typeof point.showPercent === \"boolean\") {\n nextPoint.showPercent = point.showPercent;\n }\n if (typeof point.showSeriesName === \"boolean\") {\n nextPoint.showSeriesName = point.showSeriesName;\n }\n if (typeof point.showValue === \"boolean\") {\n nextPoint.showValue = point.showValue;\n }\n if (typeof point.x === \"number\" && Number.isFinite(point.x)) {\n nextPoint.x = point.x;\n }\n if (typeof point.y === \"number\" && Number.isFinite(point.y)) {\n nextPoint.y = point.y;\n }\n normalized.push(nextPoint);\n }\n return normalized;\n })()\n : undefined;\n return {\n pointLabels: pointLabels && pointLabels.length > 0 ? pointLabels : undefined,\n raw: labels,\n showBubbleSize: typeof labels.showBubbleSize === \"boolean\" ? labels.showBubbleSize : undefined,\n showCategoryName: typeof labels.showCategoryName === \"boolean\" ? labels.showCategoryName : undefined,\n showLegendKey: typeof labels.showLegendKey === \"boolean\" ? labels.showLegendKey : undefined,\n showPercent: typeof labels.showPercent === \"boolean\" ? labels.showPercent : undefined,\n showSeriesName: typeof labels.showSeriesName === \"boolean\" ? labels.showSeriesName : undefined,\n showValue: typeof labels.showValue === \"boolean\" ? labels.showValue : undefined\n };\n}\n\nfunction normalizeChartAnchor(raw: unknown): XlsxImageAnchor {\n if (!raw || typeof raw !== \"object\") {\n return {\n kind: \"two-cell\",\n from: { col: 0, colOffsetEmu: 0, row: 0, rowOffsetEmu: 0 },\n to: { col: 8, colOffsetEmu: 0, row: 15, rowOffsetEmu: 0 }\n };\n }\n\n const anchor = raw as Record<string, unknown>;\n const fromCol = typeof anchor.fromCol === \"number\" ? anchor.fromCol : 0;\n const fromColOffsetEmu = typeof anchor.fromColOffset === \"number\" ? anchor.fromColOffset : 0;\n const fromRow = typeof anchor.fromRow === \"number\" ? anchor.fromRow : 0;\n const fromRowOffsetEmu = typeof anchor.fromRowOffset === \"number\" ? anchor.fromRowOffset : 0;\n const rawToCol = typeof anchor.toCol === \"number\" ? anchor.toCol : null;\n const rawToColOffsetEmu = typeof anchor.toColOffset === \"number\" ? anchor.toColOffset : 0;\n const rawToRow = typeof anchor.toRow === \"number\" ? anchor.toRow : null;\n const rawToRowOffsetEmu = typeof anchor.toRowOffset === \"number\" ? anchor.toRowOffset : 0;\n const hasExplicitTo = rawToCol !== null && rawToRow !== null;\n const collapsedWidth = hasExplicitTo && (\n rawToCol < fromCol ||\n (rawToCol === fromCol && rawToColOffsetEmu <= fromColOffsetEmu)\n );\n const collapsedHeight = hasExplicitTo && (\n rawToRow < fromRow ||\n (rawToRow === fromRow && rawToRowOffsetEmu <= fromRowOffsetEmu)\n );\n const fallbackToCol = Math.max(fromCol + 8, 8);\n const fallbackToRow = Math.max(fromRow + 15, 15);\n\n return {\n kind: \"two-cell\",\n from: {\n col: fromCol,\n colOffsetEmu: fromColOffsetEmu,\n row: fromRow,\n rowOffsetEmu: fromRowOffsetEmu\n },\n to: {\n col: !hasExplicitTo || collapsedWidth ? fallbackToCol : rawToCol,\n colOffsetEmu: !hasExplicitTo || collapsedWidth ? 0 : rawToColOffsetEmu,\n row: !hasExplicitTo || collapsedHeight ? fallbackToRow : rawToRow,\n rowOffsetEmu: !hasExplicitTo || collapsedHeight ? 0 : rawToRowOffsetEmu\n }\n };\n}\n\nfunction parseMarkerNode(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstLocalChild(node, \"col\")?.textContent ?? Number.NaN);\n const row = Number(getFirstLocalChild(node, \"row\")?.textContent ?? Number.NaN);\n const colOffsetEmu = Number(getFirstLocalChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstLocalChild(node, \"rowOff\")?.textContent ?? 0);\n\n if (!Number.isFinite(col) || !Number.isFinite(row)) {\n return null;\n }\n\n return {\n col: Math.max(0, Math.round(col)),\n colOffsetEmu: Number.isFinite(colOffsetEmu) ? Math.max(0, Math.round(colOffsetEmu)) : 0,\n row: Math.max(0, Math.round(row)),\n rowOffsetEmu: Number.isFinite(rowOffsetEmu) ? Math.max(0, Math.round(rowOffsetEmu)) : 0\n };\n}\n\nfunction parseChartAnchorNode(anchorNode: Element): XlsxImageAnchor | null {\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const to = parseMarkerNode(getFirstLocalChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\", to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return from && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n from,\n kind: \"one-cell\",\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const x = Number(pos?.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pos?.getAttribute(\"y\") ?? Number.NaN);\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n kind: \"absolute\",\n positionEmu: {\n x: Math.round(x),\n y: Math.round(y)\n },\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n}\n\nfunction isCollapsedChartAnchor(anchor: XlsxImageAnchor) {\n if (anchor.kind !== \"two-cell\") {\n return false;\n }\n\n const collapsedWidth = anchor.to.col < anchor.from.col\n || (anchor.to.col === anchor.from.col && anchor.to.colOffsetEmu <= anchor.from.colOffsetEmu);\n const collapsedHeight = anchor.to.row < anchor.from.row\n || (anchor.to.row === anchor.from.row && anchor.to.rowOffsetEmu <= anchor.from.rowOffsetEmu);\n return collapsedWidth || collapsedHeight;\n}\n\nfunction normalizeChartSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const categoriesRef = normalizeChartReference(series.categories);\n const valuesRef = normalizeChartReference(series.values);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n const bubbleSizeRef = normalizeChartReference(series.bubbleSize ?? series.bubbleSizes ?? series.bubbles);\n\n return {\n bubbleSizeRef,\n bubbleSizes: resolveReferenceValues(workbook, workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n categories: resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\"),\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: typeof series.invertIfNegative === \"boolean\" ? series.invertIfNegative : undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: series.marker && typeof series.marker === \"object\" ? series.marker as Record<string, unknown> : undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).size === \"number\"\n ? Number((series.marker as Record<string, unknown>).size)\n : undefined,\n markerSymbol: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).symbol === \"string\"\n ? String((series.marker as Record<string, unknown>).symbol)\n : undefined,\n name: resolveSeriesName(workbook, workbookSheetIndex, series.name),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: series,\n shapeProperties,\n smooth: typeof series.smooth === \"boolean\" ? series.smooth : undefined,\n values: resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n valuesRef\n };\n}\n\nfunction normalizeChartTypeGroup(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartTypeGroup | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const group = raw as Record<string, unknown>;\n const rawSeries = Array.isArray(group.series) ? group.series : [];\n return {\n axisIds: Array.isArray(group.axisIds)\n ? group.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value))\n : undefined,\n chartType: typeof group.chartType === \"string\" ? group.chartType : \"ColumnClustered\",\n dataLabels: normalizeChartDataLabels(group.dataLabels),\n gapWidth: typeof group.gapWidth === \"number\" && Number.isFinite(group.gapWidth) ? group.gapWidth : undefined,\n is3d: typeof group.is3d === \"boolean\" ? group.is3d : undefined,\n overlap: typeof group.overlap === \"number\" && Number.isFinite(group.overlap) ? group.overlap : undefined,\n raw: group,\n series: rawSeries.map((entry, seriesIndex) => (\n normalizeChartSeries(workbook, workbookSheetIndex, `${chartId}-group-${index}`, entry, seriesIndex)\n )),\n varyColors: typeof group.varyColors === \"boolean\" ? group.varyColors : undefined\n };\n}\n\nfunction normalizeChartsheet(raw: unknown, index: number): XlsxChartsheet {\n const chartsheet = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n return {\n chartIds: Array.isArray(chartsheet.chartIds) ? chartsheet.chartIds.filter((value): value is string => typeof value === \"string\") : [],\n chartPath: typeof chartsheet.chartPath === \"string\" ? chartsheet.chartPath : undefined,\n id: `chartsheet-${index}`,\n index,\n name: typeof chartsheet.name === \"string\" ? chartsheet.name : `Chart ${index + 1}`,\n raw: chartsheet,\n workbookSheetIndex: typeof chartsheet.workbookSheetIndex === \"number\" ? chartsheet.workbookSheetIndex : undefined\n };\n}\n\nfunction buildTabs(\n workbook: Workbook,\n chartsheets: XlsxChartsheet[],\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): XlsxWorkbookTab[] {\n const rawOrder = Array.isArray(workbook.sheetOrder) ? workbook.sheetOrder as Array<Record<string, unknown>> : [];\n if (rawOrder.length === 0) {\n return workbook.sheetNames.flatMap((name, index) => {\n const worksheet = workbook.getSheet(index);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${index}`,\n index,\n kind: \"sheet\" as const,\n name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(index) ?? index,\n visibility,\n workbookSheetIndex: index\n }];\n });\n }\n\n return rawOrder.flatMap<XlsxWorkbookTab>((entry, index) => {\n const slotType = typeof entry.slotType === \"string\" ? entry.slotType : \"worksheet\";\n const slotIndex = typeof entry.index === \"number\" ? entry.index : index;\n if (slotType === \"chartsheet\") {\n const chartsheet = chartsheets[slotIndex];\n return chartsheet ? [{\n chartsheetIndex: slotIndex,\n id: `chartsheet-${slotIndex}`,\n index,\n kind: \"chartsheet\" as const,\n name: chartsheet.name\n }] : [];\n }\n\n const worksheet = workbook.getSheet(slotIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${slotIndex}`,\n index,\n kind: \"sheet\" as const,\n name: worksheet.name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(slotIndex) ?? slotIndex,\n visibility,\n workbookSheetIndex: slotIndex\n }];\n });\n}\n\nfunction collectChartOriginsForSheet(\n archive: Record<string, Uint8Array>,\n origin: WorkbookImageSheetOrigin | null\n) {\n if (!origin) {\n return [] as WorkbookChartOrigin[];\n }\n\n const chartOrigins: WorkbookChartOrigin[] = [];\n\n for (const attachment of origin.attachments) {\n const drawingXml = readArchiveText(archive, attachment.drawingPath);\n const relsXml = readArchiveText(archive, attachment.drawingRelsPath);\n if (!drawingXml || !relsXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n const relsDocument = parseXml(relsXml);\n if (!drawingDocument || !relsDocument) {\n continue;\n }\n\n const relationships = new Map<string, { target: string; type: string | null }>();\n for (const node of getLocalDescendants(relsDocument, \"Relationship\")) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (id && target) {\n relationships.set(id, {\n target: resolveRelationshipPath(attachment.drawingRelsPath ?? attachment.drawingPath, target),\n type\n });\n }\n }\n\n const anchorNodes = Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n );\n\n let chartAnchorIndex = 0;\n for (const anchorNode of anchorNodes) {\n const graphicFrame = getFirstLocalDescendant(anchorNode, \"graphicFrame\");\n const chartNode = graphicFrame ? getFirstLocalDescendant(graphicFrame, \"chart\") : null;\n const relationshipId = chartNode?.getAttributeNS(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\", \"id\")\n ?? chartNode?.getAttribute(\"r:id\")\n ?? chartNode?.getAttribute(\"id\");\n if (!relationshipId) {\n continue;\n }\n const relationship = relationships.get(relationshipId);\n if (!relationship || (relationship.type !== CHART_REL_TYPE && relationship.type !== CHART_EX_REL_TYPE)) {\n continue;\n }\n\n chartOrigins.push({\n anchorIndex: chartAnchorIndex,\n anchor: parseChartAnchorNode(anchorNode),\n chartKind: relationship.type === CHART_EX_REL_TYPE ? \"modern\" : \"classic\",\n chartPath: relationship.target,\n drawingPath: attachment.drawingPath,\n workbookSheetIndex: origin.workbookSheetIndex\n });\n chartAnchorIndex += 1;\n }\n }\n\n return chartOrigins;\n}\n\nfunction applyChartOrigins(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n chartOriginsById: Map<string, WorkbookChartOrigin>,\n archive: Record<string, Uint8Array>,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n for (let workbookSheetIndex = 0; workbookSheetIndex < chartsByWorkbookSheetIndex.length; workbookSheetIndex += 1) {\n const charts = chartsByWorkbookSheetIndex[workbookSheetIndex] ?? [];\n const origins = collectChartOriginsForSheet(archive, sheetOrigins[workbookSheetIndex] ?? null);\n const originsByKind = {\n classic: origins.filter((origin) => origin.chartKind === \"classic\"),\n modern: origins.filter((origin) => origin.chartKind === \"modern\")\n };\n const chartIndexByKind = {\n classic: 0,\n modern: 0\n };\n\n charts.forEach((chart) => {\n const chartKind = chart.id.startsWith(\"chart-ex-\") ? \"modern\" : \"classic\";\n const origin = originsByKind[chartKind][chartIndexByKind[chartKind]];\n chartIndexByKind[chartKind] += 1;\n if (!origin) {\n return;\n }\n if (origin.anchor && isCollapsedChartAnchor(chart.anchor)) {\n chart.anchor = origin.anchor;\n } else if (origin.anchor && chart.anchor.kind === \"two-cell\" && chart.anchor.from.col === 0 && chart.anchor.from.row === 0) {\n chart.anchor = origin.anchor;\n }\n chart.chartPath = origin.chartPath ?? undefined;\n chartOriginsById.set(chart.id, origin);\n });\n }\n}\n\nexport function loadWorkbookChartAssets(\n workbook: Workbook,\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\"> | null,\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): WorkbookChartAssets {\n const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = workbook.getSheet(workbookSheetIndex);\n const rawCharts = Array.isArray(worksheet.charts) ? worksheet.charts : [];\n const rawChartsEx = Array.isArray(worksheet.chartsEx) ? worksheet.chartsEx : [];\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(workbookSheetIndex) ?? workbookSheetIndex;\n\n const classicCharts = rawCharts.map((rawChart, chartIndex) => {\n const chartId = `chart-${workbookSheetIndex}-${chartIndex}`;\n const chart = rawChart && typeof rawChart === \"object\" ? rawChart as Record<string, unknown> : {};\n const rawView3d = chart.view3d && typeof chart.view3d === \"object\"\n ? chart.view3d as Record<string, unknown>\n : null;\n const rawSeries = Array.isArray(chart.series) ? chart.series : [];\n const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);\n const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null;\n return {\n anchor: normalizeChartAnchor(chart.anchor),\n autoTitleDeleted: typeof chart.autoTitleDeleted === \"boolean\" ? chart.autoTitleDeleted : undefined,\n axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value): value is XlsxChartAxis => Boolean(value)) : [],\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: normalizeChartAxis(chart.categoryAxis),\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: typeof chart.chartType === \"string\" ? chart.chartType : \"ColumnClustered\",\n dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,\n displayBlanksAs: typeof chart.displayBlanksAs === \"string\" ? chart.displayBlanksAs : undefined,\n editable: true,\n firstSliceAngle: typeof chart.firstSliceAngle === \"number\" ? chart.firstSliceAngle : undefined,\n fontFamily: undefined,\n gapWidth: typeof chart.gapWidth === \"number\" ? chart.gapWidth : undefined,\n holeSize: typeof chart.holeSize === \"number\" ? chart.holeSize : undefined,\n id: chartId,\n is3d: typeof chart.is3d === \"boolean\" ? chart.is3d : undefined,\n legend: normalizeLegend(chart.legend)\n ? {\n ...normalizeLegend(chart.legend),\n position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)\n }\n : null,\n name: typeof chart.name === \"string\" ? chart.name : undefined,\n overlap: typeof chart.overlap === \"number\" ? chart.overlap : undefined,\n plotVisibleOnly: typeof chart.plotVisibleOnly === \"boolean\" ? chart.plotVisibleOnly : undefined,\n raw: chart,\n radarStyle: typeof chart.radarStyle === \"string\" ? chart.radarStyle : undefined,\n scatterStyle: typeof chart.scatterStyle === \"string\" ? chart.scatterStyle : undefined,\n roundedCorners: typeof chart.roundedCorners === \"boolean\" ? chart.roundedCorners : undefined,\n shape3d: typeof chart.shape === \"string\"\n ? chart.shape\n : typeof chart.shape3d === \"string\"\n ? chart.shape3d\n : undefined,\n seriesAxis: null,\n series: rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex)),\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: typeof chart.showDlblsOverMax === \"boolean\" ? chart.showDlblsOverMax : undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: typeof chart.bubbleScale === \"number\" ? chart.bubbleScale : undefined,\n bubble3d: typeof chart.bubble3d === \"boolean\" ? chart.bubble3d : undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: typeof chart.title === \"string\" ? chart.title : undefined,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups: Array.isArray(chart.typeGroups)\n ? chart.typeGroups\n .map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex))\n .filter((value): value is XlsxChartTypeGroup => value != null)\n : [],\n valueAxis: normalizeChartAxis(chart.valueAxis),\n varyColors: typeof chart.varyColors === \"boolean\" ? chart.varyColors : undefined,\n view3d: rawView3d\n ? {\n depthPercent: typeof rawView3d.depthPercent === \"number\" ? rawView3d.depthPercent : undefined,\n perspective: typeof rawView3d.perspective === \"number\" ? rawView3d.perspective : undefined,\n rAngAx: typeof rawView3d.rAngAx === \"boolean\"\n ? rawView3d.rAngAx\n : typeof rawView3d.rightAngleAxes === \"boolean\"\n ? rawView3d.rightAngleAxes\n : undefined,\n rotX: typeof rawView3d.rotX === \"number\"\n ? rawView3d.rotX\n : typeof rawView3d.rotateX === \"number\"\n ? rawView3d.rotateX\n : undefined,\n rotY: typeof rawView3d.rotY === \"number\"\n ? rawView3d.rotY\n : typeof rawView3d.rotateY === \"number\"\n ? rawView3d.rotateY\n : undefined\n }\n : undefined,\n wireframe: typeof chart.wireframe === \"boolean\" ? chart.wireframe : undefined,\n workbookSheetIndex,\n zIndex: 200 + chartIndex\n } satisfies XlsxChart;\n });\n\n const modernCharts = rawChartsEx.map((rawChartEx, chartExIndex) => (\n normalizeChartExChart(\n workbook,\n workbookSheetIndex,\n visibleSheetIndex,\n rawChartEx,\n chartExIndex,\n imageAssets?.themePalette ?? null\n )\n ));\n\n return [...classicCharts, ...modernCharts];\n });\n\n const chartsheets = Array.isArray(workbook.chartsheets)\n ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index))\n : [];\n const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets);\n const chartOriginsById = new Map<string, WorkbookChartOrigin>();\n\n if (imageAssets) {\n applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);\n applyBuiltinChartDefaults(chart, imageAssets.themePalette);\n }\n }\n } else {\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyBuiltinChartDefaults(chart, null);\n }\n }\n }\n\n return {\n chartOriginsById,\n chartsByWorkbookSheetIndex,\n chartsheets,\n tabs\n };\n}\n\nfunction getChartAnchorNodes(drawingDocument: XMLDocument) {\n return Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n )\n .filter((anchorNode) => {\n const graphicFrame = getFirstLocalChild(anchorNode, \"graphicFrame\");\n return Boolean(graphicFrame && getFirstLocalDescendant(graphicFrame, \"chart\"));\n });\n}\n\nfunction updateMarkerNode(markerNode: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!markerNode) {\n return;\n }\n\n setLeafValue(markerNode, \"col\", String(Math.max(0, Math.round(marker.col))));\n setLeafValue(markerNode, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setLeafValue(markerNode, \"row\", String(Math.max(0, Math.round(marker.row))));\n setLeafValue(markerNode, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImageAnchor) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n updateMarkerNode(getFirstLocalChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n if (pos) {\n pos.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n pos.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nfunction setChartTitle(chartNode: Element, value: string | undefined) {\n const existing = getFirstLocalChild(chartNode, \"title\");\n if (!value) {\n existing?.remove();\n return;\n }\n\n const titleNode = existing ?? chartNode.insertBefore(\n chartNode.ownerDocument.createElementNS(CHART_NS, \"c:title\"),\n chartNode.firstChild\n );\n while (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n const tx = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:tx\");\n const rich = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:rich\");\n const bodyPr = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:bodyPr\");\n const lstStyle = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:lstStyle\");\n const p = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:p\");\n const r = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:r\");\n const t = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:t\");\n t.textContent = value;\n r.appendChild(t);\n p.appendChild(r);\n rich.append(bodyPr, lstStyle, p);\n tx.appendChild(rich);\n titleNode.appendChild(tx);\n}\n\nfunction setRefFormula(parent: Element, refNodeName: string, formula: string | undefined) {\n if (!formula) {\n return;\n }\n\n const refNode = ensureChild(parent, refNodeName);\n setLeafValue(refNode, \"f\", formula);\n}\n\nfunction updateSeriesNodes(chartTypeNode: Element, chart: Partial<XlsxChart>) {\n if (!chart.series) {\n return;\n }\n\n const seriesNodes = getLocalDescendants(chartTypeNode, \"ser\");\n chart.series.forEach((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return;\n }\n\n if (series.name !== undefined) {\n const tx = ensureChild(seriesNode, \"tx\");\n const strRef = ensureChild(tx, \"strRef\");\n setLeafValue(strRef, \"f\", series.name);\n }\n if (series.categoriesRef?.formula) {\n const target = (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\"\n )\n ? ensureChild(seriesNode, \"xVal\")\n : ensureChild(seriesNode, \"cat\");\n setRefFormula(target, \"strRef\", series.categoriesRef.formula);\n }\n if (series.valuesRef?.formula) {\n const target = (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\"\n )\n ? ensureChild(seriesNode, \"yVal\")\n : ensureChild(seriesNode, \"val\");\n setRefFormula(target, \"numRef\", series.valuesRef.formula);\n }\n if (series.invertIfNegative !== undefined) {\n setBooleanValue(seriesNode, \"invertIfNegative\", series.invertIfNegative);\n }\n if (series.smooth !== undefined) {\n setBooleanValue(seriesNode, \"smooth\", series.smooth);\n }\n });\n}\n\nfunction updateAxisNode(axisNode: Element | null, axis: XlsxChartAxis | null | undefined) {\n if (!axisNode || !axis) {\n return;\n }\n\n if (axis.position) {\n setLeafValue(ensureChild(axisNode, \"axPos\"), \"val\", axis.position);\n getFirstLocalChild(axisNode, \"axPos\")?.setAttribute(\"val\", axis.position);\n }\n if (axis.majorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"majorGridlines\");\n if (axis.majorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:majorGridlines\"));\n } else if (!axis.majorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.minorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"minorGridlines\");\n if (axis.minorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:minorGridlines\"));\n } else if (!axis.minorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.majorTickMark) {\n getFirstLocalChild(axisNode, \"majorTickMark\")?.setAttribute(\"val\", axis.majorTickMark)\n ?? setBooleanValue(axisNode, \"majorTickMark\", false).setAttribute(\"val\", axis.majorTickMark);\n }\n if (axis.minorTickMark) {\n getFirstLocalChild(axisNode, \"minorTickMark\")?.setAttribute(\"val\", axis.minorTickMark)\n ?? setBooleanValue(axisNode, \"minorTickMark\", false).setAttribute(\"val\", axis.minorTickMark);\n }\n if (axis.labelPosition) {\n getFirstLocalChild(axisNode, \"tickLblPos\")?.setAttribute(\"val\", axis.labelPosition)\n ?? setBooleanValue(axisNode, \"tickLblPos\", false).setAttribute(\"val\", axis.labelPosition);\n }\n if (axis.crosses) {\n getFirstLocalChild(axisNode, \"crosses\")?.setAttribute(\"val\", axis.crosses)\n ?? setBooleanValue(axisNode, \"crosses\", false).setAttribute(\"val\", axis.crosses);\n }\n if (axis.crossBetween) {\n getFirstLocalChild(axisNode, \"crossBetween\")?.setAttribute(\"val\", axis.crossBetween)\n ?? setBooleanValue(axisNode, \"crossBetween\", false).setAttribute(\"val\", axis.crossBetween);\n }\n if (axis.delete !== undefined) {\n setBooleanValue(axisNode, \"delete\", axis.delete);\n }\n if (axis.numberFormat?.formatCode) {\n const numFmt = ensureChild(axisNode, \"numFmt\");\n numFmt.setAttribute(\"formatCode\", axis.numberFormat.formatCode);\n if (axis.numberFormat.sourceLinked !== undefined) {\n numFmt.setAttribute(\"sourceLinked\", axis.numberFormat.sourceLinked ? \"1\" : \"0\");\n }\n }\n}\n\nfunction updateDataLabels(chartTypeNode: Element, labels: XlsxChartDataLabels | null | undefined) {\n if (!labels) {\n return;\n }\n\n const labelsNode = ensureChild(chartTypeNode, \"dLbls\");\n if (labels.showLegendKey !== undefined) {\n setBooleanValue(labelsNode, \"showLegendKey\", labels.showLegendKey);\n }\n if (labels.showValue !== undefined) {\n setBooleanValue(labelsNode, \"showVal\", labels.showValue);\n }\n if (labels.showCategoryName !== undefined) {\n setBooleanValue(labelsNode, \"showCatName\", labels.showCategoryName);\n }\n if (labels.showSeriesName !== undefined) {\n setBooleanValue(labelsNode, \"showSerName\", labels.showSeriesName);\n }\n if (labels.showPercent !== undefined) {\n setBooleanValue(labelsNode, \"showPercent\", labels.showPercent);\n }\n if (labels.showBubbleSize !== undefined) {\n setBooleanValue(labelsNode, \"showBubbleSize\", labels.showBubbleSize);\n }\n}\n\nexport function updateWorkbookChartAnchor(\n imageAssets: Pick<WorkbookImageAssets, \"archive\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n anchor: XlsxImageAnchor\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin) {\n return false;\n }\n\n const drawingXml = readArchiveText(imageAssets.archive, origin.drawingPath);\n if (!drawingXml) {\n return false;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return false;\n }\n\n const anchorNode = getChartAnchorNodes(drawingDocument)[origin.anchorIndex];\n if (!anchorNode) {\n return false;\n }\n\n updateAnchorNode(anchorNode, anchor);\n imageAssets.archive[normalizeArchivePath(origin.drawingPath)] = strToU8(serializeXml(drawingDocument));\n return true;\n}\n\nexport function updateWorkbookChartDefinition(\n imageAssets: Pick<WorkbookImageAssets, \"archive\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n patch: Partial<XlsxChart>\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin?.chartPath) {\n return false;\n }\n\n const chartXml = readArchiveText(imageAssets.archive, origin.chartPath);\n if (!chartXml) {\n return false;\n }\n\n const chartDocument = parseXml(chartXml);\n if (!chartDocument) {\n return false;\n }\n\n const chartNode = getFirstLocalDescendant(chartDocument, \"chart\");\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n if (!chartNode || !plotAreaNode || !chartTypeNode) {\n return false;\n }\n\n if (patch.title !== undefined) {\n setChartTitle(chartNode, patch.title);\n }\n if (patch.displayBlanksAs) {\n const node = ensureChild(chartNode, \"dispBlanksAs\");\n node.setAttribute(\"val\", patch.displayBlanksAs);\n }\n if (patch.roundedCorners !== undefined) {\n setBooleanValue(chartNode, \"roundedCorners\", patch.roundedCorners);\n }\n if (patch.showDlblsOverMax !== undefined) {\n setBooleanValue(chartNode, \"showDLblsOverMax\", patch.showDlblsOverMax);\n }\n if (patch.varyColors !== undefined) {\n setBooleanValue(chartTypeNode, \"varyColors\", patch.varyColors);\n }\n if (patch.gapWidth !== undefined) {\n setNumericValue(chartTypeNode, \"gapWidth\", patch.gapWidth);\n }\n if (patch.overlap !== undefined) {\n const overlapNode = ensureChild(chartTypeNode, \"overlap\");\n overlapNode.setAttribute(\"val\", String(Math.round(patch.overlap)));\n }\n if (patch.dataLabels) {\n updateDataLabels(chartTypeNode, patch.dataLabels);\n }\n updateSeriesNodes(chartTypeNode, patch);\n updateAxisNode(\n getLocalChildren(plotAreaNode, \"catAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"dateAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"serAx\")[0]\n ?? null,\n patch.categoryAxis\n );\n updateAxisNode(getLocalChildren(plotAreaNode, \"valAx\")[0] ?? null, patch.valueAxis);\n\n imageAssets.archive[normalizeArchivePath(origin.chartPath)] = strToU8(serializeXml(chartDocument));\n return true;\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8, unzipSync, zipSync } from \"fflate\";\nimport { resolveWorkbookColor } from \"./colors\";\nimport type {\n XlsxCellAddress,\n XlsxConditionalDataBarRule,\n XlsxConditionalFormatIcon,\n XlsxConditionalFormatRule,\n XlsxConditionalFormatValueObject,\n XlsxConditionalIconSetRule,\n XlsxCellRange,\n XlsxFormControl,\n XlsxImage,\n XlsxImageRect,\n XlsxImageResizeHandlePosition,\n XlsxResolvedCellStyle,\n XlsxShape,\n XlsxSparkline,\n XlsxTableStyleDefinition,\n XlsxThemePalette\n} from \"./types\";\n\nconst REL_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst SPREADSHEET_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst CONTENT_TYPES_NS = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nconst DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\nconst VML_DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\";\nconst CTRL_PROP_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp\";\nconst IMAGE_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nconst HYPERLINK_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\nconst DRAWING_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.drawing+xml\";\nconst EMU_PER_PIXEL = 9525;\nconst MIN_COL_WIDTH_PX = 30;\nconst MIN_ROW_HEIGHT_PX = 16;\nconst DEFAULT_COL_WIDTH_EMU = 64 * EMU_PER_PIXEL;\nconst DEFAULT_ROW_HEIGHT_EMU = 20 * EMU_PER_PIXEL;\nconst DEFAULT_COLUMN_CHARACTER_WIDTH_PX = 7;\nconst columnCharacterWidthCache = new Map<string, number>();\ntype DukeWorksheet = ReturnType<Workbook[\"getSheet\"]>;\n\nfunction resolveDeviceGridlineThicknessPx() {\n if (typeof window === \"undefined\") {\n return 1;\n }\n\n const devicePixelRatio = window.devicePixelRatio;\n if (!Number.isFinite(devicePixelRatio) || devicePixelRatio <= 0) {\n return 1;\n }\n\n return 1 / devicePixelRatio;\n}\n\nfunction measureColumnCharacterWidthPx(fontFamily?: string | null, fontSizePt?: number | null) {\n const normalizedFamily = typeof fontFamily === \"string\" && fontFamily.trim().length > 0\n ? fontFamily.trim()\n : \"Calibri\";\n const normalizedSizePt = typeof fontSizePt === \"number\" && Number.isFinite(fontSizePt) && fontSizePt > 0\n ? fontSizePt\n : 11;\n const cacheKey = `${normalizedFamily}|${normalizedSizePt}`;\n const cached = columnCharacterWidthCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const fontSizePx = normalizedSizePt * (96 / 72);\n const font = `${fontSizePx}px \"${normalizedFamily}\"`;\n let width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n\n try {\n const context = typeof document !== \"undefined\"\n ? document.createElement(\"canvas\").getContext(\"2d\")\n : typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(32, 32).getContext(\"2d\")\n : null;\n if (context) {\n context.font = font;\n width = Math.max(1, context.measureText(\"0\").width);\n }\n } catch {\n width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n }\n\n columnCharacterWidthCache.set(cacheKey, width);\n return width;\n}\n\nfunction sheetColumnWidthToPixels(width: number, columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX) {\n if (!Number.isFinite(width) || width <= 0) {\n return MIN_COL_WIDTH_PX;\n }\n\n const digitWidth = Math.max(1, columnCharacterWidthPx);\n const pixels = width < 1\n ? Math.floor(width * (digitWidth + 5) + 0.5)\n : Math.floor(((256 * width + Math.floor(128 / digitWidth)) / 256) * digitWidth);\n return Math.max(MIN_COL_WIDTH_PX, pixels);\n}\n\nexport function resolveWorksheetDefaultColumnWidthPixels(\n worksheet: DukeWorksheet,\n columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX,\n fallbackPx = sheetColumnWidthToPixels(8.43, columnCharacterWidthPx)\n) {\n const width = typeof worksheet.defaultColumnWidth === \"number\" ? worksheet.defaultColumnWidth : Number.NaN;\n return Number.isFinite(width) && width > 0\n ? sheetColumnWidthToPixels(width, columnCharacterWidthPx)\n : fallbackPx;\n}\n\nexport function resolveWorksheetDefaultRowHeightPixels(\n worksheet: DukeWorksheet,\n fallbackPx = Math.max(MIN_ROW_HEIGHT_PX, Math.round(15 * 1.33))\n) {\n const height = typeof worksheet.defaultRowHeight === \"number\" ? worksheet.defaultRowHeight : Number.NaN;\n return Number.isFinite(height) && height > 0\n ? Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33))\n : fallbackPx;\n}\n\nexport function resolveWorksheetHiddenRows(worksheet: DukeWorksheet, maxRow: number) {\n if (!Number.isFinite(maxRow) || maxRow < 0 || typeof worksheet.isRowHidden !== \"function\") {\n return [] as number[];\n }\n\n const hiddenRows: number[] = [];\n for (let row = 0; row <= maxRow; row += 1) {\n if (worksheet.isRowHidden(row)) {\n hiddenRows.push(row);\n }\n }\n return hiddenRows;\n}\n\nexport function resolveWorksheetHiddenCols(worksheet: DukeWorksheet, maxCol: number) {\n if (!Number.isFinite(maxCol) || maxCol < 0 || typeof worksheet.isColumnHidden !== \"function\") {\n return [] as number[];\n }\n\n const hiddenCols: number[] = [];\n for (let col = 0; col <= maxCol; col += 1) {\n if (worksheet.isColumnHidden(col)) {\n hiddenCols.push(col);\n }\n }\n return hiddenCols;\n}\n\nexport function resolveWorksheetMergeMetadata(worksheet: DukeWorksheet) {\n const mergeMetadata = {\n hasHorizontalMerges: false,\n hasVerticalMerges: false,\n maxHorizontalMergeEndCol: -1,\n maxVerticalMergeEndRow: -1\n };\n const mergedRegions = Array.isArray(worksheet.mergedRegions) ? worksheet.mergedRegions : [];\n\n for (const rawRegion of mergedRegions) {\n let range: XlsxCellRange | null = null;\n if (typeof rawRegion === \"string\") {\n range = parseA1RangeReference(rawRegion);\n } else if (rawRegion && typeof rawRegion === \"object\") {\n const region = rawRegion as Record<string, unknown>;\n const startRow = typeof region.startRow === \"number\" ? region.startRow : Number.NaN;\n const startCol = typeof region.startCol === \"number\" ? region.startCol : Number.NaN;\n const endRow = typeof region.endRow === \"number\" ? region.endRow : Number.NaN;\n const endCol = typeof region.endCol === \"number\" ? region.endCol : Number.NaN;\n if ([startRow, startCol, endRow, endCol].every((value) => Number.isFinite(value) && value >= 0)) {\n range = {\n end: {\n col: Math.max(startCol, endCol),\n row: Math.max(startRow, endRow)\n },\n start: {\n col: Math.min(startCol, endCol),\n row: Math.min(startRow, endRow)\n }\n };\n } else if (typeof region.range === \"string\") {\n range = parseA1RangeReference(region.range);\n }\n }\n\n if (!range) {\n continue;\n }\n\n if (range.end.col > range.start.col) {\n mergeMetadata.hasHorizontalMerges = true;\n mergeMetadata.maxHorizontalMergeEndCol = Math.max(mergeMetadata.maxHorizontalMergeEndCol, range.end.col);\n }\n if (range.end.row > range.start.row) {\n mergeMetadata.hasVerticalMerges = true;\n mergeMetadata.maxVerticalMergeEndRow = Math.max(mergeMetadata.maxVerticalMergeEndRow, range.end.row);\n }\n }\n\n return mergeMetadata;\n}\n\ntype ArchiveEntries = Record<string, Uint8Array>;\n\ntype ContentTypesState = {\n defaultEntries: Map<string, string>;\n overrideEntries: Map<string, string>;\n};\n\ntype RelationshipRecord = {\n id: string;\n target: string;\n targetMode: string | null;\n type: string;\n};\n\ntype WorkbookSheetInfo = {\n name: string;\n path: string;\n};\n\ntype WorkbookSheetState = {\n cachedFormulaValues: Record<string, string>;\n columnWidthCharacterWidthPx?: number;\n colWidthOverridesPx: Record<number, number>;\n colStyleIds: Record<number, number>;\n conditionalFormatRules: XlsxConditionalFormatRule[];\n defaultColWidthPx: number;\n defaultRowHeightPx: number;\n hasHorizontalMerges: boolean;\n hasVerticalMerges: boolean;\n maxHorizontalMergeEndCol: number;\n maxVerticalMergeEndRow: number;\n maxContentCol: number;\n maxContentRow: number;\n minContentCol: number;\n minContentRow: number;\n hiddenCols: number[];\n hiddenRows: number[];\n rowHeightOverridesPx: Record<number, number>;\n rowStyleIds: Record<number, number>;\n showGridLines: boolean;\n sparklines: XlsxSparkline[];\n zoomScale: number;\n};\n\ntype ParseWorkbookStructureOptions = {\n includeCachedFormulaValues?: boolean;\n themePalette?: XlsxThemePalette | null;\n};\n\ntype ThemeState = {\n colors: Map<string, string>;\n majorLatinFont: string | null;\n minorLatinFont: string | null;\n};\n\ntype DrawingColor = {\n color: string;\n opacity: number;\n};\n\ntype DrawingRectEmu = {\n cx: number;\n cy: number;\n x: number;\n y: number;\n};\n\ntype ShapeVectorPath = {\n path: string;\n viewBox: {\n height: number;\n width: number;\n };\n};\n\ntype GroupTransform = {\n chCx: number;\n chCy: number;\n chX: number;\n chY: number;\n cx: number;\n cy: number;\n scaleX: number;\n scaleY: number;\n x: number;\n y: number;\n};\n\ntype XlsxImageAttachment = {\n drawingPath: string;\n drawingRelsPath: string | null;\n mediaPaths: string[];\n};\n\ntype WorkbookImageOrigin = {\n anchorIndex: number;\n workbookSheetIndex: number;\n};\n\ntype ParsedSheetFormControl = {\n anchor: XlsxFormControl[\"anchor\"] | null;\n controlRelationshipId: string | null;\n name?: string;\n shapeId: number | null;\n};\n\ntype ParsedCtrlProp = {\n checked?: boolean;\n linkedCell?: string;\n objectType?: string;\n};\n\ntype ParsedVmlFormControl = {\n checked?: boolean;\n fontFamily?: string;\n fontSizePt?: number;\n hidden: boolean;\n label?: string;\n linkedCell?: string;\n objectType?: string;\n shapeId: number | null;\n textAlign?: \"center\" | \"left\" | \"right\";\n textColor?: string;\n zIndex: number;\n};\n\nexport type WorkbookImageSheetOrigin = {\n attachments: XlsxImageAttachment[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookTableMetadata = {\n displayName?: string;\n headerRowCount?: number;\n headerRowCellStyle?: string;\n name?: string;\n reference?: string;\n totalsRowCount?: number;\n totalsRowShown?: boolean;\n};\n\nexport type WorkbookImageAssets = {\n archive: ArchiveEntries;\n formControlsByWorkbookSheetIndex: XlsxFormControl[][];\n imageOriginsById: Map<string, WorkbookImageOrigin>;\n imagesByWorkbookSheetIndex: XlsxImage[][];\n namedCellStyleByName: Record<string, XlsxResolvedCellStyle>;\n objectUrls: string[];\n shapesByWorkbookSheetIndex: XlsxShape[][];\n sheetStatesByWorkbookSheetIndex: Array<WorkbookSheetState | null>;\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>;\n styleById: Record<number, XlsxResolvedCellStyle>;\n tableMetadataByWorkbookSheetIndex: WorkbookTableMetadata[][];\n tableStyleByName: Record<string, XlsxTableStyleDefinition>;\n themePalette: XlsxThemePalette;\n};\n\nexport type WorkbookStructureAssets = Pick<\n WorkbookImageAssets,\n | \"namedCellStyleByName\"\n | \"sheetStatesByWorkbookSheetIndex\"\n | \"styleById\"\n | \"tableMetadataByWorkbookSheetIndex\"\n | \"tableStyleByName\"\n | \"themePalette\"\n>;\n\nexport type WorkbookChartStyleAssets = Pick<\n WorkbookImageAssets,\n | \"archive\"\n | \"sheetOrigins\"\n | \"themePalette\"\n>;\n\nfunction buildThemePalette(theme: ThemeState): XlsxThemePalette {\n const themeOrder = [\"lt1\", \"dk1\", \"lt2\", \"dk2\", \"accent1\", \"accent2\", \"accent3\", \"accent4\", \"accent5\", \"accent6\", \"hlink\", \"folHlink\"];\n const colorsByIndex: Record<number, string> = {};\n\n themeOrder.forEach((key, index) => {\n const color = theme.colors.get(key);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n\n return {\n colorsByIndex,\n majorLatinFont: theme.majorLatinFont ?? undefined,\n minorLatinFont: theme.minorLatinFont ?? undefined\n };\n}\n\nfunction cloneBytes(bytes: Uint8Array) {\n const nextBytes = new Uint8Array(bytes.byteLength);\n nextBytes.set(bytes);\n return nextBytes;\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction joinArchivePath(...parts: string[]) {\n return normalizeArchivePath(parts.join(\"/\"));\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash >= 0 ? normalized.slice(0, lastSlash) : \"\";\n}\n\nfunction resolveArchiveTarget(baseDocumentPath: string, target: string) {\n if (!target) {\n return normalizeArchivePath(baseDocumentPath);\n }\n\n if (target.startsWith(\"#\")) {\n return target;\n }\n\n if (target.startsWith(\"/\")) {\n return normalizeArchivePath(target);\n }\n\n const baseParts = dirname(baseDocumentPath).split(\"/\").filter(Boolean);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n baseParts.pop();\n continue;\n }\n baseParts.push(segment);\n }\n\n return normalizeArchivePath(baseParts.join(\"/\"));\n}\n\nfunction relativeArchivePath(fromDocumentPath: string, toPath: string) {\n const fromParts = dirname(fromDocumentPath).split(\"/\").filter(Boolean);\n const toParts = normalizeArchivePath(toPath).split(\"/\").filter(Boolean);\n let shared = 0;\n while (shared < fromParts.length && shared < toParts.length && fromParts[shared] === toParts[shared]) {\n shared += 1;\n }\n\n const upSegments = fromParts.slice(shared).map(() => \"..\");\n const downSegments = toParts.slice(shared);\n return [...upSegments, ...downSegments].join(\"/\") || \".\";\n}\n\nfunction relsPathForDocument(documentPath: string) {\n const baseName = documentPath.split(\"/\").pop();\n const parentDir = dirname(documentPath);\n return joinArchivePath(parentDir, \"_rels\", `${baseName}.rels`);\n}\n\nfunction parseXml(xml: string) {\n const parser = new DOMParser();\n const document = parser.parseFromString(xml, \"application/xml\");\n if (document.querySelector(\"parsererror\")) {\n return null;\n }\n return document;\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction readArchiveText(archive: ArchiveEntries, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseColumnReference(reference: string) {\n let value = 0;\n for (const character of reference.toUpperCase()) {\n if (character < \"A\" || character > \"Z\") {\n return null;\n }\n value = value * 26 + (character.charCodeAt(0) - 64);\n }\n return value > 0 ? value - 1 : null;\n}\n\nfunction parseA1CellReference(reference: string) {\n const match = /^\\$?([A-Za-z]+)\\$?(\\d+)$/.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const col = parseColumnReference(match[1] ?? \"\");\n const row = Number(match[2] ?? Number.NaN) - 1;\n if (col === null || !Number.isFinite(row) || row < 0) {\n return null;\n }\n\n return { col, row };\n}\n\nfunction parseA1RangeReference(reference: string) {\n const [startRef, endRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? startRef ?? \"\");\n return start && end ? { end, start } : null;\n}\n\nfunction stripSheetNameFromFormulaReference(reference: string) {\n const trimmed = reference.trim();\n const bangIndex = trimmed.lastIndexOf(\"!\");\n return bangIndex >= 0 ? trimmed.slice(bangIndex + 1) : trimmed;\n}\n\nfunction parseFormulaCellReference(reference: string) {\n const normalized = stripSheetNameFromFormulaReference(reference).split(/\\s+/)[0] ?? \"\";\n return parseA1CellReference(normalized);\n}\n\nfunction parseFormulaRangeReference(reference: string) {\n return parseA1RangeReference(stripSheetNameFromFormulaReference(reference));\n}\n\nfunction isElementNode(node: Node | null | undefined): node is Element {\n return Boolean(node && node.nodeType === 1);\n}\n\nfunction getLocalElements(parent: Document | Element, localName: string) {\n return Array.from(parent.getElementsByTagName(\"*\")).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getChildElements(parent: Element, localName: string) {\n return Array.from(parent.childNodes).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getFirstChild(parent: Element, localName: string) {\n return getChildElements(parent, localName)[0] ?? null;\n}\n\nfunction getFirstDescendant(parent: Document | Element, localName: string) {\n return getLocalElements(parent, localName)[0] ?? null;\n}\n\nfunction readFeaturePropertyBagCheckboxComplements(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/featurePropertyBag/featurePropertyBag.xml\");\n if (!xml) {\n return new Set<number>();\n }\n\n const document = parseXml(xml);\n if (!document?.documentElement) {\n return new Set<number>();\n }\n\n const bagNodes = getChildElements(document.documentElement, \"bag\");\n const bagTypeById = bagNodes.map((node) => node.getAttribute(\"type\") ?? \"\");\n const checkboxComplementIndices = new Set<number>();\n\n const xfComplementsBag = bagNodes.find((node) => node.getAttribute(\"type\") === \"XFComplements\") ?? null;\n const mappedBagIds = xfComplementsBag\n ? getLocalElements(xfComplementsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .filter((value) => Number.isFinite(value))\n : [];\n\n mappedBagIds.forEach((bagId, complementIndex) => {\n const xfComplementBag = bagNodes[bagId];\n if (!xfComplementBag || bagTypeById[bagId] !== \"XFComplement\") {\n return;\n }\n\n const xfControlsBagId = getLocalElements(xfComplementBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (xfControlsBagId === undefined) {\n return;\n }\n\n const xfControlsBag = bagNodes[xfControlsBagId];\n if (!xfControlsBag || bagTypeById[xfControlsBagId] !== \"XFControls\") {\n return;\n }\n\n const cellControlBagId = getLocalElements(xfControlsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (cellControlBagId === undefined) {\n return;\n }\n\n if (bagTypeById[cellControlBagId] === \"Checkbox\") {\n checkboxComplementIndices.add(complementIndex);\n }\n });\n\n return checkboxComplementIndices;\n}\n\nfunction getRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"id\") ?? element.getAttribute(\"r:id\") ?? element.getAttribute(\"id\");\n}\n\nfunction getEmbeddedRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"embed\") ?? element.getAttribute(\"r:embed\") ?? element.getAttribute(\"embed\");\n}\n\nfunction setChildText(parent: Element, localName: string, value: string) {\n const child = getFirstChild(parent, localName);\n if (child) {\n child.textContent = value;\n }\n}\n\nfunction updateMarkerElement(element: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!element) {\n return;\n }\n\n setChildText(element, \"col\", String(Math.max(0, marker.col)));\n setChildText(element, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setChildText(element, \"row\", String(Math.max(0, marker.row)));\n setChildText(element, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction parseContentTypes(archive: ArchiveEntries): ContentTypesState {\n const xml = readArchiveText(archive, \"[Content_Types].xml\");\n const defaultEntries = new Map<string, string>();\n const overrideEntries = new Map<string, string>();\n if (!xml) {\n return { defaultEntries, overrideEntries };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return { defaultEntries, overrideEntries };\n }\n\n for (const defaultNode of getLocalElements(document, \"Default\")) {\n const extension = defaultNode.getAttribute(\"Extension\");\n const contentType = defaultNode.getAttribute(\"ContentType\");\n if (extension && contentType) {\n defaultEntries.set(extension.toLowerCase(), contentType);\n }\n }\n\n for (const overrideNode of getLocalElements(document, \"Override\")) {\n const partName = overrideNode.getAttribute(\"PartName\");\n const contentType = overrideNode.getAttribute(\"ContentType\");\n if (partName && contentType) {\n overrideEntries.set(normalizeArchivePath(partName), contentType);\n }\n }\n\n return { defaultEntries, overrideEntries };\n}\n\nfunction resolveContentType(contentTypes: ContentTypesState, path: string) {\n const normalized = normalizeArchivePath(path);\n const override = contentTypes.overrideEntries.get(normalized);\n if (override) {\n return override;\n }\n\n const extension = normalized.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return \"application/octet-stream\";\n }\n\n return contentTypes.defaultEntries.get(extension) ?? \"application/octet-stream\";\n}\n\nfunction parseRelationships(archive: ArchiveEntries, relsPath: string, baseDocumentPath: string) {\n const xml = readArchiveText(archive, relsPath);\n const relationships = new Map<string, RelationshipRecord>();\n if (!xml) {\n return relationships;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return relationships;\n }\n\n for (const relationshipNode of getLocalElements(document, \"Relationship\")) {\n const id = relationshipNode.getAttribute(\"Id\");\n const target = relationshipNode.getAttribute(\"Target\");\n const type = relationshipNode.getAttribute(\"Type\");\n if (!id || !target || !type) {\n continue;\n }\n\n relationships.set(id, {\n id,\n target: resolveArchiveTarget(baseDocumentPath, target),\n targetMode: relationshipNode.getAttribute(\"TargetMode\"),\n type\n });\n }\n\n return relationships;\n}\n\nfunction parseWorkbookSheets(archive: ArchiveEntries) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n if (!workbookXml) {\n return [];\n }\n\n const workbookDocument = parseXml(workbookXml);\n if (!workbookDocument) {\n return [];\n }\n\n const workbookRelationships = parseRelationships(archive, \"xl/_rels/workbook.xml.rels\", \"xl/workbook.xml\");\n const sheets: WorkbookSheetInfo[] = [];\n\n for (const sheetNode of getLocalElements(workbookDocument, \"sheet\")) {\n const relationshipId = getRelationshipId(sheetNode);\n if (!relationshipId) {\n continue;\n }\n\n const relationship = workbookRelationships.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n sheets.push({\n name: sheetNode.getAttribute(\"name\") ?? `Sheet ${sheets.length + 1}`,\n path: relationship.target\n });\n }\n\n return sheets;\n}\n\nfunction parseWorkbookTheme(archive: ArchiveEntries): ThemeState {\n const defaultTheme: ThemeState = {\n colors: new Map([\n [\"accent1\", \"#5b9bd5\"],\n [\"accent2\", \"#ed7d31\"],\n [\"accent3\", \"#a5a5a5\"],\n [\"accent4\", \"#ffc000\"],\n [\"accent5\", \"#4472c4\"],\n [\"accent6\", \"#70ad47\"],\n [\"bg1\", \"#ffffff\"],\n [\"bg2\", \"#e7e6e6\"],\n [\"dk1\", \"#000000\"],\n [\"dk2\", \"#6e747a\"],\n [\"folHlink\", \"#993366\"],\n [\"hlink\", \"#085296\"],\n [\"lt1\", \"#ffffff\"],\n [\"lt2\", \"#e7e6e6\"],\n [\"tx1\", \"#000000\"],\n [\"tx2\", \"#6e747a\"]\n ]),\n majorLatinFont: null,\n minorLatinFont: null\n };\n\n const themeXml = readArchiveText(archive, \"xl/theme/theme1.xml\");\n if (!themeXml) {\n return defaultTheme;\n }\n\n const themeDocument = parseXml(themeXml);\n if (!themeDocument) {\n return defaultTheme;\n }\n\n const colors = new Map(defaultTheme.colors);\n const colorSchemeNode = getLocalElements(themeDocument, \"clrScheme\")[0] ?? null;\n if (colorSchemeNode) {\n for (const colorNode of Array.from(colorSchemeNode.childNodes).filter(isElementNode)) {\n const key = colorNode.localName;\n const srgbNode = getFirstChild(colorNode, \"srgbClr\");\n const sysNode = getFirstChild(colorNode, \"sysClr\");\n const hex = srgbNode?.getAttribute(\"val\") ?? sysNode?.getAttribute(\"lastClr\");\n if (hex) {\n colors.set(key, normalizeHexColor(hex));\n }\n }\n }\n\n const fontSchemeNode = getLocalElements(themeDocument, \"fontScheme\")[0] ?? null;\n const majorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"majorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n const minorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"minorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n\n colors.set(\"bg1\", colors.get(\"lt1\") ?? defaultTheme.colors.get(\"bg1\") ?? \"#ffffff\");\n colors.set(\"tx1\", colors.get(\"dk1\") ?? defaultTheme.colors.get(\"tx1\") ?? \"#000000\");\n colors.set(\"bg2\", colors.get(\"lt2\") ?? defaultTheme.colors.get(\"bg2\") ?? \"#e7e6e6\");\n colors.set(\"tx2\", colors.get(\"dk2\") ?? defaultTheme.colors.get(\"tx2\") ?? \"#6e747a\");\n\n return {\n colors,\n majorLatinFont,\n minorLatinFont\n };\n}\n\nfunction parseSpreadsheetColor(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const color: Record<string, unknown> = {};\n const rgb = node.getAttribute(\"rgb\");\n const theme = node.getAttribute(\"theme\");\n const tint = node.getAttribute(\"tint\");\n const indexed = node.getAttribute(\"indexed\");\n if (rgb) {\n color.rgb = normalizeHexColor(rgb);\n }\n if (theme !== null) {\n color.theme = Number(theme);\n }\n if (tint !== null) {\n color.tint = Number(tint);\n }\n if (indexed !== null) {\n color.indexed = Number(indexed);\n }\n\n return Object.keys(color).length > 0 ? color : undefined;\n}\n\nfunction hasEnabledSpreadsheetFlag(node: Element | null) {\n if (!node) {\n return false;\n }\n\n const value = node.getAttribute(\"val\");\n return value === null || (value !== \"0\" && value !== \"false\");\n}\n\nfunction parseSheetSparklines(\n document: XMLDocument,\n themePalette?: XlsxThemePalette | null\n) {\n const sparklines: XlsxSparkline[] = [];\n\n for (const groupNode of getLocalElements(document, \"sparklineGroup\")) {\n const rawType = groupNode.getAttribute(\"type\");\n const sparklineType: XlsxSparkline[\"type\"] = rawType === \"column\"\n ? \"column\"\n : rawType === \"stacked\"\n ? \"winLoss\"\n : \"line\";\n\n const markersNode = getFirstChild(groupNode, \"markers\");\n const negativeNode = getFirstChild(groupNode, \"negative\");\n const colorSeries = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorSeries\")), themePalette);\n const colorNegative = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorNegative\")), themePalette);\n const colorMarkers = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorMarkers\")), themePalette);\n const colorFirst = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorFirst\")), themePalette);\n const colorLast = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLast\")), themePalette);\n const colorHigh = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorHigh\")), themePalette);\n const colorLow = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLow\")), themePalette);\n const sparklineCollectionNode = getFirstChild(groupNode, \"sparklines\");\n if (!sparklineCollectionNode) {\n continue;\n }\n\n for (const sparklineNode of getChildElements(sparklineCollectionNode, \"sparkline\")) {\n const formula = getFirstChild(sparklineNode, \"f\")?.textContent ?? \"\";\n const targetReference = getFirstChild(sparklineNode, \"sqref\")?.textContent ?? \"\";\n const range = parseFormulaRangeReference(formula);\n const target = parseFormulaCellReference(targetReference);\n if (!range || !target) {\n continue;\n }\n\n sparklines.push({\n color: colorSeries ?? undefined,\n firstColor: colorFirst ?? undefined,\n highColor: colorHigh ?? undefined,\n lastColor: colorLast ?? undefined,\n lowColor: colorLow ?? undefined,\n markerColor: colorMarkers ?? undefined,\n markers: hasEnabledSpreadsheetFlag(markersNode),\n negative: hasEnabledSpreadsheetFlag(negativeNode),\n negativeColor: colorNegative ?? undefined,\n range,\n target,\n type: sparklineType\n });\n }\n }\n\n return sparklines;\n}\n\nfunction parseSpreadsheetFont(node: Element | null): XlsxResolvedCellStyle[\"font\"] {\n if (!node) {\n return undefined;\n }\n\n const font: Record<string, unknown> = {};\n const size = getFirstChild(node, \"sz\")?.getAttribute(\"val\");\n const name = getFirstChild(node, \"name\")?.getAttribute(\"val\");\n const family = getFirstChild(node, \"family\")?.getAttribute(\"val\");\n const scheme = getFirstChild(node, \"scheme\")?.getAttribute(\"val\");\n const charset = getFirstChild(node, \"charset\")?.getAttribute(\"val\");\n const verticalAlign = getFirstChild(node, \"vertAlign\")?.getAttribute(\"val\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"b\"))) {\n font.bold = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"i\"))) {\n font.italic = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"strike\"))) {\n font.strikethrough = true;\n }\n if (getFirstChild(node, \"u\")) {\n font.underline = getFirstChild(node, \"u\")?.getAttribute(\"val\") ?? \"single\";\n }\n if (size !== null && size !== undefined) {\n font.size = Number(size);\n }\n if (name) {\n font.name = name;\n }\n if (family !== null && family !== undefined) {\n font.family = Number(family);\n }\n if (scheme) {\n font.scheme = scheme;\n }\n if (charset !== null && charset !== undefined) {\n font.charset = Number(charset);\n }\n if (verticalAlign) {\n font.verticalAlign = verticalAlign;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"shadow\"))) {\n font.shadow = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"outline\"))) {\n font.outline = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"condense\"))) {\n font.condense = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"extend\"))) {\n font.extend = true;\n }\n if (color) {\n font.color = color;\n }\n\n return Object.keys(font).length > 0 ? font : undefined;\n}\n\nfunction parseSpreadsheetFill(node: Element | null): XlsxResolvedCellStyle[\"fill\"] {\n if (!node) {\n return undefined;\n }\n\n const gradientFill = getFirstChild(node, \"gradientFill\");\n if (gradientFill) {\n const stops = Array.from(gradientFill.childNodes)\n .filter(isElementNode)\n .filter((child) => child.localName === \"stop\")\n .map((stopNode) => ({\n color: parseSpreadsheetColor(Array.from(stopNode.childNodes).find(isElementNode) ?? null),\n position: Number(stopNode.getAttribute(\"position\") ?? Number.NaN)\n }))\n .filter((stop) => stop.color && Number.isFinite(stop.position));\n if (stops.length > 0) {\n return {\n degree: Number(gradientFill.getAttribute(\"degree\") ?? 0),\n fillType: \"gradient\",\n gradientType: gradientFill.getAttribute(\"type\") ?? \"linear\",\n stops\n };\n }\n }\n\n const patternFill = getFirstChild(node, \"patternFill\");\n if (!patternFill) {\n return undefined;\n }\n\n const patternType = patternFill.getAttribute(\"patternType\") ?? \"none\";\n const foreground = parseSpreadsheetColor(getFirstChild(patternFill, \"fgColor\"));\n const background = parseSpreadsheetColor(getFirstChild(patternFill, \"bgColor\"));\n const solidColor = foreground ?? background;\n if (patternType === \"solid\" && solidColor) {\n return {\n color: solidColor,\n fillType: \"solid\"\n };\n }\n // Differential table styles sometimes omit patternType and only set bgColor.\n // Preserve those fills so header/table overrides are not dropped during import.\n if ((patternType === \"none\" || patternType === \"gray125\") && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n if (patternType !== \"none\" && patternType !== \"gray125\" && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n\n return undefined;\n}\n\nfunction parseSpreadsheetBorderEdge(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const style = node.getAttribute(\"style\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (!style || style === \"none\") {\n return undefined;\n }\n\n return {\n color,\n style\n };\n}\n\nfunction parseSpreadsheetBorder(node: Element | null): XlsxResolvedCellStyle[\"border\"] {\n if (!node) {\n return undefined;\n }\n\n const border: Record<string, Record<string, unknown>> = {};\n ([\"top\", \"right\", \"bottom\", \"left\", \"horizontal\", \"vertical\"] as const).forEach((edge) => {\n const parsedEdge = parseSpreadsheetBorderEdge(getFirstChild(node, edge));\n if (parsedEdge) {\n border[edge] = parsedEdge;\n }\n });\n\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parseSpreadsheetAlignment(node: Element | null): XlsxResolvedCellStyle[\"alignment\"] {\n if (!node) {\n return undefined;\n }\n\n const alignment: Record<string, unknown> = {};\n const horizontal = node.getAttribute(\"horizontal\");\n const vertical = node.getAttribute(\"vertical\");\n const wrapText = node.getAttribute(\"wrapText\");\n const indent = node.getAttribute(\"indent\");\n const shrinkToFit = node.getAttribute(\"shrinkToFit\");\n const textRotation = node.getAttribute(\"textRotation\");\n if (horizontal) {\n alignment.horizontal = horizontal;\n }\n if (vertical) {\n alignment.vertical = vertical;\n }\n if (wrapText !== null) {\n alignment.wrapText = wrapText === \"1\";\n }\n if (shrinkToFit !== null) {\n alignment.shrinkToFit = shrinkToFit === \"1\";\n }\n if (indent !== null) {\n alignment.indent = Number(indent);\n }\n if (textRotation !== null) {\n const parsedRotation = Number(textRotation);\n if (Number.isFinite(parsedRotation)) {\n alignment.textRotation = parsedRotation;\n }\n }\n\n return Object.keys(alignment).length > 0 ? alignment : undefined;\n}\n\nfunction parseDifferentialStyle(node: Element | null): XlsxResolvedCellStyle {\n if (!node) {\n return {};\n }\n\n const style: XlsxResolvedCellStyle = {};\n const font = parseSpreadsheetFont(getFirstChild(node, \"font\"));\n const fill = parseSpreadsheetFill(getFirstChild(node, \"fill\"));\n const border = parseSpreadsheetBorder(getFirstChild(node, \"border\"));\n const alignment = parseSpreadsheetAlignment(getFirstChild(node, \"alignment\"));\n\n if (font) {\n style.font = font;\n }\n if (fill) {\n style.fill = fill;\n }\n if (border) {\n style.border = border;\n }\n if (alignment) {\n style.alignment = alignment;\n }\n\n return style;\n}\n\nfunction parseResolvedXfStyle(\n xfNode: Element,\n fonts: Array<XlsxResolvedCellStyle[\"font\"]>,\n fills: Array<XlsxResolvedCellStyle[\"fill\"]>,\n borders: Array<XlsxResolvedCellStyle[\"border\"]>,\n checkboxComplementIndices?: Set<number>\n) {\n const style: XlsxResolvedCellStyle = {};\n const fontId = Number(xfNode.getAttribute(\"fontId\") ?? Number.NaN);\n const fillId = Number(xfNode.getAttribute(\"fillId\") ?? Number.NaN);\n const borderId = Number(xfNode.getAttribute(\"borderId\") ?? Number.NaN);\n const alignment = parseSpreadsheetAlignment(getFirstChild(xfNode, \"alignment\"));\n\n if (Number.isFinite(fontId) && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n if (Number.isFinite(fillId) && fills[fillId]) {\n style.fill = fills[fillId];\n }\n if (Number.isFinite(borderId) && borders[borderId]) {\n style.border = borders[borderId];\n }\n if (alignment) {\n style.alignment = alignment;\n }\n const xfComplementNode = getFirstDescendant(xfNode, \"xfComplement\");\n const xfComplementIndex = Number(xfComplementNode?.getAttribute(\"i\") ?? Number.NaN);\n if (Number.isFinite(xfComplementIndex) && checkboxComplementIndices?.has(xfComplementIndex)) {\n style.cellControl = { kind: \"checkbox\" };\n }\n\n return style;\n}\n\nfunction parseWorkbookStyles(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/styles.xml\");\n if (!xml) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const fontsNode = getFirstDescendant(document, \"fonts\");\n const fillsNode = getFirstDescendant(document, \"fills\");\n const bordersNode = getFirstDescendant(document, \"borders\");\n const cellStyleXfsNode = getFirstDescendant(document, \"cellStyleXfs\");\n const cellStylesNode = getFirstDescendant(document, \"cellStyles\");\n const cellXfsNode = getFirstDescendant(document, \"cellXfs\");\n const dxfsNode = getFirstDescendant(document, \"dxfs\");\n const tableStylesNode = getFirstDescendant(document, \"tableStyles\");\n if (!cellXfsNode) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const checkboxComplementIndices = readFeaturePropertyBagCheckboxComplements(archive);\n const fonts = getChildElements(fontsNode ?? document.documentElement, \"font\").map((node) => parseSpreadsheetFont(node));\n const fills = getChildElements(fillsNode ?? document.documentElement, \"fill\").map((node) => parseSpreadsheetFill(node));\n const borders = getChildElements(bordersNode ?? document.documentElement, \"border\").map((node) => parseSpreadsheetBorder(node));\n const differentialStyles = getChildElements(dxfsNode ?? document.documentElement, \"dxf\").map((node) => parseDifferentialStyle(node));\n const cellStyleXfs = getChildElements(cellStyleXfsNode ?? document.documentElement, \"xf\").map(\n (node) => parseResolvedXfStyle(node, fonts, fills, borders, checkboxComplementIndices)\n );\n const namedCellStyleByName: Record<string, XlsxResolvedCellStyle> = {};\n const styleById: Record<number, XlsxResolvedCellStyle> = {};\n const tableStyleByName: Record<string, XlsxTableStyleDefinition> = {};\n\n getChildElements(cellXfsNode, \"xf\").forEach((xfNode, index) => {\n styleById[index] = parseResolvedXfStyle(xfNode, fonts, fills, borders, checkboxComplementIndices);\n });\n\n getChildElements(cellStylesNode ?? document.documentElement, \"cellStyle\").forEach((cellStyleNode) => {\n const name = cellStyleNode.getAttribute(\"name\");\n const xfId = Number(cellStyleNode.getAttribute(\"xfId\") ?? Number.NaN);\n if (!name || !Number.isFinite(xfId)) {\n return;\n }\n\n const resolvedStyle = cellStyleXfs[xfId];\n if (resolvedStyle) {\n namedCellStyleByName[name] = resolvedStyle;\n }\n });\n\n getChildElements(tableStylesNode ?? document.documentElement, \"tableStyle\").forEach((tableStyleNode) => {\n const name = tableStyleNode.getAttribute(\"name\");\n if (!name) {\n return;\n }\n\n const elements: XlsxTableStyleDefinition = {};\n getChildElements(tableStyleNode, \"tableStyleElement\").forEach((elementNode) => {\n const type = elementNode.getAttribute(\"type\");\n const dxfId = Number(elementNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(dxfId)) {\n return;\n }\n\n const differentialStyle = differentialStyles[dxfId];\n if (differentialStyle) {\n elements[type] = differentialStyle;\n }\n });\n tableStyleByName[name] = elements;\n });\n\n const normalFont = (namedCellStyleByName.Normal?.font ?? styleById[0]?.font ?? fonts[0]) as Record<string, unknown> | undefined;\n const defaultFont = normalFont ? {\n family: typeof normalFont.name === \"string\" ? normalFont.name : undefined,\n sizePt: typeof normalFont.size === \"number\" ? normalFont.size : undefined\n } : null;\n\n return {\n defaultFont,\n namedCellStyleByName,\n styleById,\n tableStyleByName\n };\n}\n\nfunction parseSqrefRanges(sqref: string | null | undefined): XlsxCellRange[] {\n if (!sqref) {\n return [];\n }\n\n return sqref\n .trim()\n .split(/\\s+/)\n .flatMap((reference) => {\n const range = parseA1RangeReference(reference);\n return range ? [range] : [];\n });\n}\n\nfunction parseConditionalFormatValueObject(node: Element | null): XlsxConditionalFormatValueObject | null {\n if (!node) {\n return null;\n }\n\n const type = node.getAttribute(\"type\");\n if (!type) {\n return null;\n }\n\n const rawValue = node.getAttribute(\"val\") ?? getFirstChild(node, \"f\")?.textContent ?? undefined;\n const numericValue = rawValue !== undefined ? Number(rawValue) : Number.NaN;\n return {\n type,\n value: Number.isFinite(numericValue) ? numericValue : undefined\n };\n}\n\nfunction parseSpreadsheetBooleanAttribute(node: Element | null, name: string) {\n if (!node) {\n return undefined;\n }\n\n const value = node.getAttribute(name);\n if (value === null) {\n return undefined;\n }\n\n return value !== \"0\" && value !== \"false\";\n}\n\nfunction parseStandardConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"colorScale\") {\n const colorScaleNode = getFirstChild(cfRuleNode, \"colorScale\");\n if (!colorScaleNode) {\n return null;\n }\n\n const cfvos = getChildElements(colorScaleNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const colors = getChildElements(colorScaleNode, \"color\")\n .map((node) => parseSpreadsheetColor(node))\n .filter((value): value is Record<string, unknown> => Boolean(value));\n if (cfvos.length === 0 || colors.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n colors,\n kind: \"colorScale\",\n priority,\n ranges\n };\n }\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n const extId = getFirstDescendant(cfRuleNode, \"id\")?.textContent?.trim() || undefined;\n return {\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"color\")),\n kind: \"dataBar\",\n priority,\n ranges,\n id: extId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const iconSetName = iconSetNode.getAttribute(\"iconSet\");\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (!iconSetName || cfvos.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons: cfvos.map((_, index) => ({\n iconId: index,\n iconSet: iconSetName\n })),\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\")\n };\n }\n\n return null;\n}\n\nfunction parseExtendedConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const ruleId = cfRuleNode.getAttribute(\"id\") ?? undefined;\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n return {\n axisColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"axisColor\")),\n border: parseSpreadsheetBooleanAttribute(dataBarNode, \"border\"),\n borderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"borderColor\")),\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"fillColor\")),\n gradient: parseSpreadsheetBooleanAttribute(dataBarNode, \"gradient\"),\n kind: \"dataBar\",\n maxLength: Number(dataBarNode.getAttribute(\"maxLength\") ?? Number.NaN),\n minLength: Number(dataBarNode.getAttribute(\"minLength\") ?? Number.NaN),\n negativeBarBorderColorSameAsPositive: parseSpreadsheetBooleanAttribute(dataBarNode, \"negativeBarBorderColorSameAsPositive\"),\n negativeBorderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeBorderColor\")),\n negativeFillColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeFillColor\")),\n priority,\n ranges,\n showValue: parseSpreadsheetBooleanAttribute(dataBarNode, \"showValue\"),\n id: ruleId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const icons = getChildElements(iconSetNode, \"cfIcon\")\n .map((iconNode) => {\n const iconSet = iconNode.getAttribute(\"iconSet\");\n const rawIconId = Number(iconNode.getAttribute(\"iconId\") ?? Number.NaN);\n if (!iconSet || !Number.isFinite(rawIconId)) {\n return null;\n }\n\n return {\n iconId: rawIconId,\n iconSet\n } satisfies XlsxConditionalFormatIcon;\n })\n .filter((icon): icon is XlsxConditionalFormatIcon => Boolean(icon));\n\n if (cfvos.length === 0 || icons.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons,\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\"),\n id: ruleId\n };\n }\n\n return null;\n}\n\nfunction mergeConditionalFormatRule(\n baseRule: XlsxConditionalFormatRule & { id?: string },\n extendedRule: XlsxConditionalFormatRule & { id?: string }\n) {\n if (baseRule.kind !== extendedRule.kind) {\n return baseRule;\n }\n\n if (baseRule.kind === \"colorScale\" && extendedRule.kind === \"colorScale\") {\n return {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n colors: extendedRule.colors.length > 0 ? extendedRule.colors : baseRule.colors,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n }\n\n if (baseRule.kind === \"dataBar\" && extendedRule.kind === \"dataBar\") {\n const merged: XlsxConditionalDataBarRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n axisColor: extendedRule.axisColor ?? baseRule.axisColor,\n border: extendedRule.border ?? baseRule.border,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n color: extendedRule.color ?? baseRule.color,\n negativeBarBorderColorSameAsPositive: extendedRule.negativeBarBorderColorSameAsPositive ?? baseRule.negativeBarBorderColorSameAsPositive,\n negativeBorderColor: extendedRule.negativeBorderColor ?? baseRule.negativeBorderColor,\n negativeFillColor: extendedRule.negativeFillColor ?? baseRule.negativeFillColor,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n if (baseRule.kind === \"iconSet\" && extendedRule.kind === \"iconSet\") {\n const merged: XlsxConditionalIconSetRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n icons: extendedRule.icons.length > 0 ? extendedRule.icons : baseRule.icons,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n return baseRule;\n}\n\nfunction parseConditionalFormatRules(document: Document) {\n const standardRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n const extendedRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n\n getLocalElements(document, \"conditionalFormatting\").forEach((conditionalFormattingNode) => {\n const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;\n const ranges = isExtended\n ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, \"sqref\")?.textContent ?? \"\")\n : parseSqrefRanges(conditionalFormattingNode.getAttribute(\"sqref\"));\n\n getChildElements(conditionalFormattingNode, \"cfRule\").forEach((cfRuleNode) => {\n const parsedRule = isExtended\n ? parseExtendedConditionalFormatRule(cfRuleNode, ranges)\n : parseStandardConditionalFormatRule(cfRuleNode, ranges);\n if (parsedRule) {\n if (isExtended) {\n extendedRules.push(parsedRule);\n } else {\n standardRules.push(parsedRule);\n }\n }\n });\n });\n\n const mergedRules: XlsxConditionalFormatRule[] = [];\n const usedExtendedRuleIds = new Set<string>();\n const extendedRulesById = new Map(\n extendedRules\n .filter((rule) => typeof rule.id === \"string\" && rule.id.length > 0)\n .map((rule) => [rule.id as string, rule])\n );\n\n standardRules.forEach((rule) => {\n const matchingExtendedRule = rule.id ? extendedRulesById.get(rule.id) : undefined;\n if (matchingExtendedRule) {\n usedExtendedRuleIds.add(rule.id as string);\n mergedRules.push(mergeConditionalFormatRule(rule, matchingExtendedRule));\n return;\n }\n\n mergedRules.push(rule);\n });\n\n extendedRules.forEach((rule) => {\n if (rule.id && usedExtendedRuleIds.has(rule.id)) {\n return;\n }\n\n mergedRules.push(rule);\n });\n\n return mergedRules\n .map((rule) => {\n const nextRule = { ...rule } as XlsxConditionalFormatRule & { id?: string };\n delete nextRule.id;\n return nextRule;\n })\n .filter((rule) => rule.ranges.length > 0)\n .sort((left, right) => left.priority - right.priority);\n}\n\nfunction parseSheetState(\n archive: ArchiveEntries,\n path: string,\n options?: ParseWorkbookStructureOptions & {\n defaultFont?: {\n family?: string;\n sizePt?: number;\n } | null;\n }\n): WorkbookSheetState | null {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return null;\n }\n\n const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;\n const cachedFormulaValues: Record<string, string> = {};\n const conditionalFormatRules = parseConditionalFormatRules(document);\n const sparklines = parseSheetSparklines(document, options?.themePalette);\n const sheetFormatNode = getLocalElements(document, \"sheetFormatPr\")[0] ?? null;\n const sheetViewNode = getLocalElements(document, \"sheetView\")[0] ?? null;\n const rowHeightOverridesPx: Record<number, number> = {};\n const colWidthOverridesPx: Record<number, number> = {};\n const rowStyleIds: Record<number, number> = {};\n const colStyleIds: Record<number, number> = {};\n let minContentCol = Number.POSITIVE_INFINITY;\n let minContentRow = Number.POSITIVE_INFINITY;\n let maxContentCol = -1;\n let maxContentRow = -1;\n const columnWidthCharacterWidthPx = measureColumnCharacterWidthPx(\n options?.defaultFont?.family,\n options?.defaultFont?.sizePt\n );\n\n const defaultRowHeight = Number(sheetFormatNode?.getAttribute(\"defaultRowHeight\") ?? 15);\n const defaultColWidth = Number(\n sheetFormatNode?.getAttribute(\"defaultColWidth\")\n ?? sheetFormatNode?.getAttribute(\"baseColWidth\")\n ?? 8.43\n );\n const rawZoomScale = Number(\n sheetViewNode?.getAttribute(\"zoomScale\")\n ?? sheetViewNode?.getAttribute(\"zoomScaleNormal\")\n ?? Number.NaN\n );\n const zoomScale = Number.isFinite(rawZoomScale) && rawZoomScale > 0\n ? rawZoomScale\n : 100;\n const trackContentCell = (cellRef: string | null) => {\n if (!cellRef) {\n return;\n }\n\n const cell = parseA1CellReference(cellRef);\n if (!cell) {\n return;\n }\n\n minContentCol = Math.min(minContentCol, cell.col);\n minContentRow = Math.min(minContentRow, cell.row);\n maxContentCol = Math.max(maxContentCol, cell.col);\n maxContentRow = Math.max(maxContentRow, cell.row);\n };\n const isMeaningfulCellNode = (cellNode: Element) => {\n if (getFirstChild(cellNode, \"f\") || getFirstChild(cellNode, \"is\")) {\n return true;\n }\n\n const valueNode = getFirstChild(cellNode, \"v\");\n return Boolean(valueNode && (valueNode.textContent ?? \"\").length > 0);\n };\n\n getLocalElements(document, \"row\").forEach((rowNode) => {\n const rowIndex = Number(rowNode.getAttribute(\"r\") ?? 0) - 1;\n const height = Number(rowNode.getAttribute(\"ht\") ?? Number.NaN);\n const styleId = Number(rowNode.getAttribute(\"s\") ?? Number.NaN);\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n if (rowIndex >= 0 && Number.isFinite(styleId)) {\n rowStyleIds[rowIndex] = styleId;\n }\n\n getChildElements(rowNode, \"c\").forEach((cellNode) => {\n const cellRef = cellNode.getAttribute(\"r\");\n if (isMeaningfulCellNode(cellNode)) {\n trackContentCell(cellRef);\n }\n\n if (includeCachedFormulaValues) {\n const formulaNode = getFirstChild(cellNode, \"f\");\n const valueNode = getFirstChild(cellNode, \"v\");\n if (formulaNode && valueNode && cellRef) {\n cachedFormulaValues[cellRef] = valueNode.textContent ?? \"\";\n }\n }\n });\n });\n\n const maxMetadataCol = Math.max(maxContentCol, 0) + 256;\n getLocalElements(document, \"col\").forEach((colNode) => {\n const min = Number(colNode.getAttribute(\"min\") ?? 0) - 1;\n const max = Number(colNode.getAttribute(\"max\") ?? 0) - 1;\n const width = Number(colNode.getAttribute(\"width\") ?? Number.NaN);\n const styleId = Number(colNode.getAttribute(\"style\") ?? Number.NaN);\n if (!Number.isFinite(width)) {\n if (!Number.isFinite(styleId)) {\n return;\n }\n }\n\n for (let col = min; col <= Math.min(max, maxMetadataCol); col += 1) {\n if (col >= 0) {\n if (Number.isFinite(width)) {\n const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n colWidthOverridesPx[col] = widthPx;\n }\n if (Number.isFinite(styleId)) {\n colStyleIds[col] = styleId;\n }\n }\n }\n });\n\n return {\n cachedFormulaValues,\n columnWidthCharacterWidthPx,\n colWidthOverridesPx,\n colStyleIds,\n conditionalFormatRules,\n defaultColWidthPx: sheetColumnWidthToPixels(defaultColWidth, columnWidthCharacterWidthPx),\n defaultRowHeightPx: Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33)),\n hasHorizontalMerges: false,\n hasVerticalMerges: false,\n maxHorizontalMergeEndCol: -1,\n maxVerticalMergeEndRow: -1,\n maxContentCol,\n maxContentRow,\n minContentCol: Number.isFinite(minContentCol) ? minContentCol : -1,\n minContentRow: Number.isFinite(minContentRow) ? minContentRow : -1,\n hiddenCols: [],\n hiddenRows: [],\n rowHeightOverridesPx,\n rowStyleIds,\n showGridLines: (sheetViewNode?.getAttribute(\"showGridLines\") ?? \"1\") !== \"0\",\n sparklines,\n zoomScale\n };\n}\n\nfunction clampChannel(value: number) {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return \"#000000\";\n}\n\nfunction hexToRgb(hex: string) {\n const normalized = normalizeHexColor(hex);\n return {\n b: Number.parseInt(normalized.slice(5, 7), 16),\n g: Number.parseInt(normalized.slice(3, 5), 16),\n r: Number.parseInt(normalized.slice(1, 3), 16)\n };\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((value) => clampChannel(value).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyDrawingColorTransforms(\n baseColor: string,\n transformNodes: Element[]\n): DrawingColor {\n let { r, g, b } = hexToRgb(baseColor);\n let opacity = 1;\n let lumMod = 1;\n let lumOff = 0;\n\n transformNodes.forEach((node) => {\n const rawValue = Number(node.getAttribute(\"val\") ?? 0);\n const value = Number.isFinite(rawValue) ? rawValue / 100000 : 0;\n switch (node.localName) {\n case \"alpha\":\n opacity *= value;\n break;\n case \"lumMod\":\n lumMod *= value;\n break;\n case \"lumOff\":\n lumOff += value;\n break;\n case \"shade\":\n r *= value;\n g *= value;\n b *= value;\n break;\n case \"tint\":\n r = r + (255 - r) * value;\n g = g + (255 - g) * value;\n b = b + (255 - b) * value;\n break;\n default:\n break;\n }\n });\n\n if (lumMod !== 1 || lumOff !== 0) {\n r = r * lumMod + 255 * lumOff;\n g = g * lumMod + 255 * lumOff;\n b = b * lumMod + 255 * lumOff;\n }\n\n return {\n color: rgbToHex(r, g, b),\n opacity: Math.max(0, Math.min(1, opacity))\n };\n}\n\nfunction resolveThemeColorName(theme: ThemeState, name: string | null) {\n if (!name) {\n return null;\n }\n\n const aliases: Record<string, string> = {\n bg1: \"bg1\",\n bg2: \"bg2\",\n tx1: \"tx1\",\n tx2: \"tx2\"\n };\n const key = aliases[name] ?? name;\n return theme.colors.get(key) ?? null;\n}\n\nfunction resolveColorValue(colorNode: Element | null, theme: ThemeState): DrawingColor | null {\n if (!colorNode) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (colorNode.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"val\") ?? \"\");\n } else if (colorNode.localName === \"schemeClr\") {\n baseColor = resolveThemeColorName(theme, colorNode.getAttribute(\"val\"));\n } else if (colorNode.localName === \"scrgbClr\") {\n const r = Number(colorNode.getAttribute(\"r\") ?? 0) * 255 / 100000;\n const g = Number(colorNode.getAttribute(\"g\") ?? 0) * 255 / 100000;\n const b = Number(colorNode.getAttribute(\"b\") ?? 0) * 255 / 100000;\n baseColor = rgbToHex(r, g, b);\n } else if (colorNode.localName === \"sysClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"lastClr\") ?? \"\");\n }\n\n if (!baseColor) {\n return null;\n }\n\n return applyDrawingColorTransforms(baseColor, Array.from(colorNode.childNodes).filter(isElementNode));\n}\n\nfunction resolveFillColor(fillParent: Element | null, theme: ThemeState): DrawingColor | null {\n if (!fillParent) {\n return null;\n }\n\n const solidFillNode = getFirstChild(fillParent, \"solidFill\");\n if (!solidFillNode) {\n return null;\n }\n\n return resolveColorValue(Array.from(solidFillNode.childNodes).filter(isElementNode)[0] ?? null, theme);\n}\n\nfunction resolveTextTypeface(typeface: string | null, theme: ThemeState) {\n if (!typeface) {\n return undefined;\n }\n\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return theme.minorLatinFont ?? undefined;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return theme.majorLatinFont ?? undefined;\n }\n\n return typeface;\n}\n\nfunction isThemeTypeface(typeface: string | null | undefined) {\n return Boolean(typeface && typeface.startsWith(\"+\"));\n}\n\nfunction resolvePreferredTextTypeface(node: Element | null, theme: ThemeState) {\n if (!node) {\n return undefined;\n }\n\n const latin = getFirstChild(node, \"latin\")?.getAttribute(\"typeface\") ?? null;\n const eastAsian = getFirstChild(node, \"ea\")?.getAttribute(\"typeface\") ?? null;\n const complexScript = getFirstChild(node, \"cs\")?.getAttribute(\"typeface\") ?? null;\n const candidates = [latin, eastAsian, complexScript];\n const explicit = candidates.find((candidate) => candidate && !isThemeTypeface(candidate));\n if (explicit) {\n return explicit;\n }\n\n return resolveTextTypeface(candidates.find(Boolean) ?? null, theme);\n}\n\ntype ShapeTextStyle = {\n bold?: boolean;\n color?: string;\n fontFamily?: string;\n fontSizePt?: number;\n italic?: boolean;\n underline?: boolean;\n};\n\nfunction parseShapeTextStyle(node: Element | null, theme: ThemeState, fallbackColor?: DrawingColor | null): ShapeTextStyle {\n if (!node) {\n return {\n color: fallbackColor?.color\n };\n }\n\n const fillColor = resolveFillColor(node, theme) ?? fallbackColor ?? null;\n const underlineValue = node.getAttribute(\"u\");\n return {\n bold: node.getAttribute(\"b\") === \"1\" || undefined,\n color: fillColor?.color,\n fontFamily: resolvePreferredTextTypeface(node, theme),\n fontSizePt: node.getAttribute(\"sz\") ? Number(node.getAttribute(\"sz\")) / 100 : undefined,\n italic: node.getAttribute(\"i\") === \"1\" || undefined,\n underline: underlineValue && underlineValue !== \"none\" ? true : undefined\n };\n}\n\nfunction mergeShapeTextStyles(...styles: Array<ShapeTextStyle | undefined>): ShapeTextStyle {\n return styles.reduce<ShapeTextStyle>((acc, style) => {\n if (!style) {\n return acc;\n }\n return {\n bold: style.bold ?? acc.bold,\n color: style.color ?? acc.color,\n fontFamily: style.fontFamily ?? acc.fontFamily,\n fontSizePt: style.fontSizePt ?? acc.fontSizePt,\n italic: style.italic ?? acc.italic,\n underline: style.underline ?? acc.underline\n };\n }, {});\n}\n\nfunction parseMarker(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstChild(node, \"col\")?.textContent ?? 0);\n const row = Number(getFirstChild(node, \"row\")?.textContent ?? 0);\n const colOffsetEmu = Number(getFirstChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstChild(node, \"rowOff\")?.textContent ?? 0);\n\n return {\n col,\n colOffsetEmu,\n row,\n rowOffsetEmu\n };\n}\n\nfunction parseSpreadsheetBooleanValue(value: string | null | undefined) {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (!normalized) {\n return true;\n }\n\n return ![\"0\", \"false\", \"none\", \"off\", \"unchecked\"].includes(normalized);\n}\n\nfunction parseSpreadsheetBooleanNode(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n return parseSpreadsheetBooleanValue(node.getAttribute(\"val\") ?? node.textContent);\n}\n\nfunction parseFormControlKind(rawType: string | null | undefined): XlsxFormControl[\"kind\"] {\n const normalized = (rawType ?? \"\").trim().toLowerCase();\n switch (normalized) {\n case \"button\":\n return \"button\";\n case \"checkbox\":\n return \"checkbox\";\n case \"drop\":\n return \"dropdown\";\n case \"editbox\":\n return \"editbox\";\n case \"gbox\":\n return \"group-box\";\n case \"label\":\n return \"label\";\n case \"list\":\n return \"listbox\";\n case \"radio\":\n return \"radio\";\n case \"scroll\":\n return \"scrollbar\";\n case \"spin\":\n return \"spinner\";\n default:\n return \"unknown\";\n }\n}\n\nfunction parseFormControlShapeId(value: string | null | undefined) {\n const match = (value ?? \"\").match(/(\\d+)(?!.*\\d)/);\n if (!match) {\n return null;\n }\n\n const parsed = Number(match[1]);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction parseCssDeclarationValue(styleText: string | null | undefined, property: string) {\n if (!styleText) {\n return null;\n }\n\n const pattern = new RegExp(`${property}\\\\s*:\\\\s*([^;]+)`, \"i\");\n const match = pattern.exec(styleText);\n return match?.[1]?.trim() ?? null;\n}\n\nfunction parseControlTextAlign(styleText: string | null | undefined): XlsxFormControl[\"textAlign\"] {\n const value = parseCssDeclarationValue(styleText, \"text-align\")?.toLowerCase();\n if (value === \"center\" || value === \"right\") {\n return value;\n }\n return value === \"left\" ? \"left\" : undefined;\n}\n\nfunction parseVmlFontSizePt(value: string | null | undefined) {\n const parsed = Number(value ?? Number.NaN);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return undefined;\n }\n\n return parsed > 40 ? parsed / 20 : parsed;\n}\n\nfunction normalizeControlLabel(label: string | null | undefined) {\n if (!label) {\n return undefined;\n }\n\n const normalized = label\n .replace(/\\u00a0/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction isPlaceholderFormControlName(name: string | null | undefined) {\n const normalized = normalizeControlLabel(name)?.toLowerCase();\n if (!normalized) {\n return false;\n }\n\n return /^(option button|group box|check box|drop down|dropdown|list box|edit box|scroll bar|spinner|spin button|button)\\s+\\d+$/.test(normalized);\n}\n\nfunction resolveNamedFormControlLabel(name: string | null | undefined) {\n return isPlaceholderFormControlName(name) ? undefined : normalizeControlLabel(name);\n}\n\nfunction parseAnchor(anchorNode: Element) {\n if (anchorNode.localName === \"anchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const extNode = getFirstChild(anchorNode, \"ext\");\n return from && extNode\n ? {\n from,\n kind: \"one-cell\" as const,\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n const extNode = getFirstChild(anchorNode, \"ext\");\n return positionNode && extNode\n ? {\n kind: \"absolute\" as const,\n positionEmu: {\n x: Number(positionNode.getAttribute(\"x\") ?? 0),\n y: Number(positionNode.getAttribute(\"y\") ?? 0)\n },\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n}\n\nfunction anchorToRect(anchor: XlsxImage[\"anchor\"]): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.positionEmu.x,\n y: anchor.positionEmu.y\n };\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n }\n\n return {\n cx: Math.max(0, (anchor.to.col - anchor.from.col) * DEFAULT_COL_WIDTH_EMU + anchor.to.colOffsetEmu - anchor.from.colOffsetEmu),\n cy: Math.max(0, (anchor.to.row - anchor.from.row) * DEFAULT_ROW_HEIGHT_EMU + anchor.to.rowOffsetEmu - anchor.from.rowOffsetEmu),\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n}\n\nfunction resolveSheetColumnWidthPx(sheetState: WorkbookSheetState | null, col: number) {\n if (col < 0) {\n return 0;\n }\n return sheetState?.colWidthOverridesPx[col] ?? sheetState?.defaultColWidthPx ?? emuToPixels(DEFAULT_COL_WIDTH_EMU);\n}\n\nfunction resolveSheetRowHeightPx(sheetState: WorkbookSheetState | null, row: number) {\n if (row < 0) {\n return 0;\n }\n return sheetState?.rowHeightOverridesPx[row] ?? sheetState?.defaultRowHeightPx ?? emuToPixels(DEFAULT_ROW_HEIGHT_EMU);\n}\n\nfunction sumSheetColumnWidthsEmu(sheetState: WorkbookSheetState | null, beforeCol: number) {\n let total = 0;\n for (let col = 0; col < beforeCol; col += 1) {\n total += pixelsToEmu(resolveSheetColumnWidthPx(sheetState, col));\n }\n return total;\n}\n\nfunction sumSheetRowHeightsEmu(sheetState: WorkbookSheetState | null, beforeRow: number) {\n let total = 0;\n for (let row = 0; row < beforeRow; row += 1) {\n total += pixelsToEmu(resolveSheetRowHeightPx(sheetState, row));\n }\n return total;\n}\n\nfunction anchorToAbsoluteRect(anchor: XlsxImage[\"anchor\"], sheetState: WorkbookSheetState | null): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return anchorToRect(anchor);\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu,\n y: sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu\n };\n }\n\n const left = sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu;\n const top = sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu;\n const right = sumSheetColumnWidthsEmu(sheetState, anchor.to.col) + anchor.to.colOffsetEmu;\n const bottom = sumSheetRowHeightsEmu(sheetState, anchor.to.row) + anchor.to.rowOffsetEmu;\n\n return {\n cx: Math.max(0, right - left),\n cy: Math.max(0, bottom - top),\n x: left,\n y: top\n };\n}\n\nfunction rectToAbsoluteAnchor(rect: DrawingRectEmu): XlsxImage[\"anchor\"] {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: rect.x,\n y: rect.y\n },\n sizeEmu: {\n cx: rect.cx,\n cy: rect.cy\n }\n };\n}\n\nfunction parseTransformRect(xfrmNode: Element | null) {\n if (!xfrmNode) {\n return null;\n }\n\n const offNode = getFirstChild(xfrmNode, \"off\");\n const extNode = getFirstChild(xfrmNode, \"ext\");\n if (!offNode || !extNode) {\n return null;\n }\n\n return {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0),\n flipH: xfrmNode.getAttribute(\"flipH\") === \"1\",\n flipV: xfrmNode.getAttribute(\"flipV\") === \"1\",\n rot: Number(xfrmNode.getAttribute(\"rot\") ?? 0) / 60000,\n x: Number(offNode.getAttribute(\"x\") ?? 0),\n y: Number(offNode.getAttribute(\"y\") ?? 0)\n };\n}\n\nfunction applyGroupTransform(rect: DrawingRectEmu, group: GroupTransform): DrawingRectEmu {\n return {\n cx: rect.cx * group.scaleX,\n cy: rect.cy * group.scaleY,\n x: group.x + (rect.x - group.chX) * group.scaleX,\n y: group.y + (rect.y - group.chY) * group.scaleY\n };\n}\n\nfunction parseGroupTransform(\n groupNode: Element,\n parentGroup: GroupTransform | null,\n fallbackAnchor: XlsxImage[\"anchor\"],\n sheetState: WorkbookSheetState | null\n) {\n const xfrmNode = getFirstDescendant(getFirstChild(groupNode, \"grpSpPr\") ?? groupNode, \"xfrm\");\n const anchorRect = anchorToAbsoluteRect(fallbackAnchor, sheetState);\n const rect = parseTransformRect(xfrmNode) ?? anchorRect;\n const rootRectMatchesAnchorOrigin = Math.abs(rect.x - anchorRect.x) <= EMU_PER_PIXEL\n && Math.abs(rect.y - anchorRect.y) <= EMU_PER_PIXEL;\n const chOffNode = getFirstChild(xfrmNode ?? groupNode, \"chOff\");\n const chExtNode = getFirstChild(xfrmNode ?? groupNode, \"chExt\");\n const rootScaleX = rect.cx !== 0 ? anchorRect.cx / rect.cx : 1;\n const rootScaleY = rect.cy !== 0 ? anchorRect.cy / rect.cy : 1;\n const useRectFrameForRoot = !parentGroup && (\n rootScaleX < 0.85\n || rootScaleX > 1.15\n || rootScaleY < 0.85\n || rootScaleY > 1.15\n );\n const absoluteRect = parentGroup\n ? applyGroupTransform(rect, parentGroup)\n : rootRectMatchesAnchorOrigin\n ? rect\n : anchorRect;\n const childRectX = parentGroup\n ? Number(chOffNode?.getAttribute(\"x\") ?? 0)\n : useRectFrameForRoot\n ? rect.x\n : Number(chOffNode?.getAttribute(\"x\") ?? 0);\n const childRectY = parentGroup\n ? Number(chOffNode?.getAttribute(\"y\") ?? 0)\n : useRectFrameForRoot\n ? rect.y\n : Number(chOffNode?.getAttribute(\"y\") ?? 0);\n const childRectCx = parentGroup\n ? Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx)\n : useRectFrameForRoot\n ? rect.cx\n : Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx);\n const childRectCy = parentGroup\n ? Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy)\n : useRectFrameForRoot\n ? rect.cy\n : Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy);\n return {\n chCx: childRectCx,\n chCy: childRectCy,\n chX: childRectX,\n chY: childRectY,\n cx: absoluteRect.cx,\n cy: absoluteRect.cy,\n scaleX: childRectCx !== 0 ? absoluteRect.cx / childRectCx : (parentGroup?.scaleX ?? 1),\n scaleY: childRectCy !== 0 ? absoluteRect.cy / childRectCy : (parentGroup?.scaleY ?? 1),\n x: absoluteRect.x,\n y: absoluteRect.y\n };\n}\n\nfunction anchorFromNodeOrFallback(\n node: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n parentGroup: GroupTransform | null\n) {\n const xfrmNode = getFirstDescendant(node, \"xfrm\");\n const rect = parseTransformRect(xfrmNode);\n if (rect) {\n const scaleX = parentGroup?.scaleX ?? 1;\n const scaleY = parentGroup?.scaleY ?? 1;\n return {\n anchor: parentGroup ? rectToAbsoluteAnchor(applyGroupTransform(rect, parentGroup)) : fallbackAnchor,\n flipH: rect.flipH,\n flipV: rect.flipV,\n rotationDeg: rect.rot,\n scaleX,\n scaleY\n };\n }\n\n return {\n anchor: fallbackAnchor,\n flipH: false,\n flipV: false,\n rotationDeg: 0,\n scaleX: parentGroup?.scaleX ?? 1,\n scaleY: parentGroup?.scaleY ?? 1\n };\n}\n\nfunction mapParagraphAlign(value: string | null | undefined): XlsxShape[\"paragraphs\"][number][\"align\"] | undefined {\n switch (value) {\n case \"ctr\":\n return \"center\";\n case \"just\":\n return \"justify\";\n case \"r\":\n return \"right\";\n case \"l\":\n return \"left\";\n default:\n return undefined;\n }\n}\n\nfunction mapVerticalAnchor(value: string | null | undefined): \"bottom\" | \"middle\" | \"top\" {\n switch (value) {\n case \"b\":\n return \"bottom\";\n case \"ctr\":\n return \"middle\";\n default:\n return \"top\";\n }\n}\n\nfunction createImageAnchorNodes(document: XMLDocument) {\n return document.documentElement\n ? Array.from(document.documentElement.childNodes).filter(\n (node): node is Element =>\n isElementNode(node) &&\n (node.localName === \"twoCellAnchor\" || node.localName === \"oneCellAnchor\" || node.localName === \"absoluteAnchor\")\n )\n : [];\n}\n\nfunction createImageSource(bytes: Uint8Array, mimeType: string, objectUrls: string[]) {\n if (typeof URL !== \"undefined\" && typeof Blob !== \"undefined\") {\n const objectUrl = URL.createObjectURL(new Blob([cloneBytes(bytes)], { type: mimeType }));\n objectUrls.push(objectUrl);\n return objectUrl;\n }\n\n let binary = \"\";\n for (const value of bytes) {\n binary += String.fromCharCode(value);\n }\n const base64 = typeof btoa === \"function\" ? btoa(binary) : \"\";\n return `data:${mimeType};base64,${base64}`;\n}\n\nfunction isStrokeOnlyGeometry(geometry: string) {\n return geometry === \"line\" || geometry === \"arc\" || geometry === \"leftBrace\";\n}\n\nfunction parseShapeStroke(node: Element, styleNode: Element | null, theme: ThemeState): XlsxShape[\"stroke\"] | undefined {\n const lineNode = getFirstDescendant(node, \"ln\");\n const lineRefNode = styleNode ? getFirstChild(styleNode, \"lnRef\") : null;\n if (!lineNode && !lineRefNode) {\n return undefined;\n }\n\n if (lineNode && getFirstChild(lineNode, \"noFill\")) {\n return { none: true };\n }\n\n const color = resolveFillColor(lineNode, theme)\n ?? resolveColorValue(Array.from(lineRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const widthEmu = Number(lineNode?.getAttribute(\"w\") ?? 0);\n return {\n color: color?.color,\n dash: getFirstChild(lineNode ?? node, \"prstDash\")?.getAttribute(\"val\") ?? undefined,\n headEndType: getFirstChild(lineNode ?? node, \"headEnd\")?.getAttribute(\"type\") ?? undefined,\n none: false,\n opacity: color?.opacity,\n tailEndType: getFirstChild(lineNode ?? node, \"tailEnd\")?.getAttribute(\"type\") ?? undefined,\n widthPx: widthEmu > 0 ? emuToPixels(widthEmu) : undefined\n };\n}\n\nfunction parseShapeFill(\n node: Element,\n styleNode: Element | null,\n theme: ThemeState,\n geometry: string\n): XlsxShape[\"fill\"] | undefined {\n const shapePropsNode = getFirstChild(node, \"spPr\") ?? node;\n const noFillNode = getFirstChild(shapePropsNode, \"noFill\");\n if (noFillNode) {\n return { none: true };\n }\n\n if (isStrokeOnlyGeometry(geometry)) {\n return { none: true };\n }\n\n const fillRefNode = styleNode ? getFirstChild(styleNode, \"fillRef\") : null;\n const fillColor = resolveFillColor(shapePropsNode, theme)\n ?? resolveColorValue(Array.from(fillRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n if (!fillColor) {\n return undefined;\n }\n\n return {\n color: fillColor.color,\n none: false,\n opacity: fillColor.opacity\n };\n}\n\nfunction parsePointNode(pointNode: Element | null) {\n if (!pointNode) {\n return null;\n }\n\n const x = Number(pointNode.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pointNode.getAttribute(\"y\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;\n}\n\nfunction parseCustomGeometryPath(shapeNode: Element): ShapeVectorPath | undefined {\n const pathNode = getFirstDescendant(shapeNode, \"path\");\n if (!pathNode) {\n return undefined;\n }\n\n const width = Number(pathNode.getAttribute(\"w\") ?? Number.NaN);\n const height = Number(pathNode.getAttribute(\"h\") ?? Number.NaN);\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n return undefined;\n }\n\n const commands: string[] = [];\n let lastPoint: { x: number; y: number } | null = null;\n for (const child of Array.from(pathNode.childNodes).filter(isElementNode)) {\n if (child.localName === \"moveTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point) {\n commands.push(`M ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"lnTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point && (!lastPoint || point.x !== lastPoint.x || point.y !== lastPoint.y)) {\n commands.push(`L ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"cubicBezTo\") {\n const points = getChildElements(child, \"pt\").map(parsePointNode).filter((point): point is { x: number; y: number } => point !== null);\n if (points.length === 3) {\n commands.push(`C ${points[0].x} ${points[0].y} ${points[1].x} ${points[1].y} ${points[2].x} ${points[2].y}`);\n lastPoint = points[2];\n }\n continue;\n }\n\n if (child.localName === \"close\") {\n commands.push(\"Z\");\n lastPoint = null;\n }\n }\n\n if (commands.length === 0) {\n return undefined;\n }\n\n return {\n path: commands.join(\" \"),\n viewBox: {\n height,\n width\n }\n };\n}\n\nfunction parseShapeGeometryAdjustments(shapeNode: Element) {\n const presetGeometry = getFirstDescendant(shapeNode, \"prstGeom\");\n if (!presetGeometry) {\n return undefined;\n }\n\n const adjustments: Record<string, number> = {};\n getChildElements(getFirstChild(presetGeometry, \"avLst\"), \"gd\").forEach((adjustmentNode) => {\n const name = adjustmentNode.getAttribute(\"name\");\n const formula = adjustmentNode.getAttribute(\"fmla\") ?? \"\";\n const match = formula.match(/^val\\s+(-?\\d+(?:\\.\\d+)?)$/);\n if (!name || !match) {\n return;\n }\n\n const value = Number.parseFloat(match[1] ?? \"\");\n if (Number.isFinite(value)) {\n adjustments[name] = value;\n }\n });\n\n return Object.keys(adjustments).length > 0 ? adjustments : undefined;\n}\n\nfunction parseShapeParagraphs(\n shapeNode: Element,\n styleNode: Element | null,\n theme: ThemeState\n): XlsxShape[\"paragraphs\"] {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return [];\n }\n\n const defaultFontRef = styleNode ? getFirstChild(styleNode, \"fontRef\") : null;\n const defaultFontColor = resolveColorValue(Array.from(defaultFontRef?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const listStyleNode = getFirstChild(txBodyNode, \"lstStyle\");\n const paragraphs: XlsxShape[\"paragraphs\"] = [];\n\n getChildElements(txBodyNode, \"p\").forEach((paragraphNode) => {\n const paragraphProps = getFirstChild(paragraphNode, \"pPr\");\n const paragraphLevel = Number(paragraphProps?.getAttribute(\"lvl\") ?? 0);\n const listLevelProps = getFirstChild(listStyleNode ?? txBodyNode, `lvl${paragraphLevel + 1}pPr`);\n const inheritedStyle = mergeShapeTextStyles(\n parseShapeTextStyle(getFirstChild(listLevelProps ?? txBodyNode, \"defRPr\"), theme, defaultFontColor),\n parseShapeTextStyle(getFirstChild(paragraphProps ?? paragraphNode, \"defRPr\"), theme, defaultFontColor)\n );\n const runs: XlsxShape[\"paragraphs\"][number][\"runs\"] = [];\n let sawRenderableChild = false;\n\n Array.from(paragraphNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"br\") {\n sawRenderableChild = true;\n runs.push({ text: \"\\n\" });\n return;\n }\n if (child.localName !== \"r\") {\n return;\n }\n\n sawRenderableChild = true;\n const text = getFirstChild(child, \"t\")?.textContent ?? \"\";\n const runProps = getFirstChild(child, \"rPr\");\n const runStyle = mergeShapeTextStyles(\n inheritedStyle,\n parseShapeTextStyle(runProps, theme, defaultFontColor)\n );\n\n runs.push({\n bold: runStyle.bold,\n color: runStyle.color,\n fontFamily: runStyle.fontFamily,\n fontSizePt: runStyle.fontSizePt,\n italic: runStyle.italic,\n text,\n underline: runStyle.underline\n });\n });\n\n if (runs.length === 0) {\n if (!sawRenderableChild && !getFirstChild(paragraphNode, \"endParaRPr\")) {\n return;\n }\n\n runs.push({\n bold: inheritedStyle.bold,\n color: inheritedStyle.color,\n fontFamily: inheritedStyle.fontFamily,\n fontSizePt: inheritedStyle.fontSizePt,\n italic: inheritedStyle.italic,\n text: \" \",\n underline: inheritedStyle.underline\n });\n }\n\n paragraphs.push({\n align: mapParagraphAlign(paragraphProps?.getAttribute(\"algn\")),\n runs\n });\n });\n\n return paragraphs;\n}\n\nfunction parseTextBox(shapeNode: Element): XlsxShape[\"textBox\"] | undefined {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return undefined;\n }\n\n const bodyProps = getFirstChild(txBodyNode, \"bodyPr\");\n const leftInset = emuToPixels(Number(bodyProps?.getAttribute(\"lIns\") ?? 91440));\n const rightInset = emuToPixels(Number(bodyProps?.getAttribute(\"rIns\") ?? 91440));\n const topInset = emuToPixels(Number(bodyProps?.getAttribute(\"tIns\") ?? 45720));\n const bottomInset = emuToPixels(Number(bodyProps?.getAttribute(\"bIns\") ?? 45720));\n\n return {\n horizontalAlign: bodyProps?.getAttribute(\"anchorCtr\") === \"1\" ? \"center\" : \"left\",\n insetPx: {\n bottom: bottomInset,\n left: leftInset,\n right: rightInset,\n top: topInset\n },\n verticalAlign: mapVerticalAnchor(bodyProps?.getAttribute(\"anchor\"))\n };\n}\n\nfunction getHyperlinkTarget(\n node: Element | null,\n drawingRelationships: Map<string, RelationshipRecord>\n) {\n const hyperlinkNode = node ? getFirstDescendant(node, \"hlinkClick\") : null;\n const hyperlinkTargetNode = hyperlinkNode ?? node;\n const hyperlinkId = hyperlinkTargetNode ? getRelationshipId(hyperlinkTargetNode) : null;\n return hyperlinkId ? drawingRelationships.get(hyperlinkId)?.target ?? undefined : undefined;\n}\n\nfunction parsePictureNode(\n pictureNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n imageId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const blipNode = getFirstDescendant(pictureNode, \"blip\");\n const svgBlipNode = blipNode ? getFirstDescendant(blipNode, \"svgBlip\") : null;\n const embedId = (svgBlipNode ? getEmbeddedRelationshipId(svgBlipNode) : null) ?? (blipNode ? getEmbeddedRelationshipId(blipNode) : null);\n if (!embedId) {\n return null;\n }\n\n const mediaRelationship = drawingRelationships.get(embedId);\n if (!mediaRelationship || mediaRelationship.type !== IMAGE_REL_TYPE) {\n return null;\n }\n\n const mediaBytes = archive[mediaRelationship.target];\n if (!mediaBytes) {\n return null;\n }\n\n const nonVisualProps = getFirstDescendant(pictureNode, \"cNvPr\");\n const transform = anchorFromNodeOrFallback(pictureNode, fallbackAnchor, parentGroup);\n return {\n image: {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? pictureNode, drawingRelationships),\n id: imageId,\n mediaPath: mediaRelationship.target,\n mimeType: resolveContentType(contentTypes, mediaRelationship.target),\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n sheetIndex: workbookSheetIndex,\n src: createImageSource(mediaBytes, resolveContentType(contentTypes, mediaRelationship.target), objectUrls),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxImage,\n mediaPath: mediaRelationship.target\n };\n}\n\nfunction parseShapeNode(\n shapeNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n theme: ThemeState,\n workbookSheetIndex: number,\n shapeId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const nonVisualProps = getFirstDescendant(shapeNode, \"cNvPr\");\n const styleNode = getFirstChild(shapeNode, \"style\");\n const transform = anchorFromNodeOrFallback(shapeNode, fallbackAnchor, parentGroup);\n const geometry = getFirstDescendant(shapeNode, \"prstGeom\")?.getAttribute(\"prst\")\n ?? (getFirstDescendant(shapeNode, \"custGeom\") ? \"custom\" : \"rect\");\n const customPath = geometry === \"custom\" ? parseCustomGeometryPath(shapeNode) : undefined;\n const geometryAdjustments = parseShapeGeometryAdjustments(shapeNode);\n return {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n fill: parseShapeFill(shapeNode, styleNode, theme, geometry),\n flipH: transform.flipH,\n flipV: transform.flipV,\n geometry,\n geometryAdjustments,\n hidden: nonVisualProps?.getAttribute(\"hidden\") === \"1\" || undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? shapeNode, drawingRelationships),\n id: shapeId,\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n paragraphs: parseShapeParagraphs(shapeNode, styleNode, theme),\n rotationDeg: transform.rotationDeg,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n sheetIndex: workbookSheetIndex,\n svgPath: customPath?.path,\n svgViewBox: customPath?.viewBox,\n stroke: parseShapeStroke(shapeNode, styleNode, theme),\n textBox: parseTextBox(shapeNode),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxShape;\n}\n\nfunction parseAnchorContents(\n anchorNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n theme: ThemeState,\n ids: { image: number; shape: number; z: number },\n imageOriginsById: Map<string, WorkbookImageOrigin>,\n anchorIndex: number,\n sheetState: WorkbookSheetState | null,\n parentGroup: GroupTransform | null = null\n) {\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n\n Array.from(anchorNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"pic\") {\n const imageId = `sheet-${workbookSheetIndex}-${ids.image}`;\n const parsed = parsePictureNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n imageId,\n ids.z++,\n parentGroup\n );\n ids.image += 1;\n if (parsed) {\n images.push(parsed.image);\n mediaPaths.add(parsed.mediaPath);\n imageOriginsById.set(imageId, {\n anchorIndex,\n workbookSheetIndex\n });\n }\n return;\n }\n\n if (child.localName === \"sp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName === \"cxnSp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName !== \"grpSp\") {\n return;\n }\n\n const nextGroup = parseGroupTransform(\n child,\n parentGroup,\n fallbackAnchor,\n sheetState\n );\n const groupFallbackAnchor = rectToAbsoluteAnchor({\n cx: nextGroup.cx,\n cy: nextGroup.cy,\n x: nextGroup.x,\n y: nextGroup.y\n });\n const parsedGroup = parseAnchorContents(\n child,\n groupFallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n nextGroup\n );\n parsedGroup.images.forEach((image) => images.push(image));\n parsedGroup.shapes.forEach((shape) => shapes.push(shape));\n parsedGroup.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths,\n shapes\n };\n}\n\nfunction parseDrawingObjects(\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n drawingPath: string,\n objectUrls: string[],\n workbookSheetIndex: number,\n zIndexBase: number,\n theme: ThemeState,\n sheetState: WorkbookSheetState | null,\n imageOriginsById: Map<string, WorkbookImageOrigin>\n) {\n const drawingXml = readArchiveText(archive, drawingPath);\n if (!drawingXml) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingRelationships = parseRelationships(archive, relsPathForDocument(drawingPath), drawingPath);\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const ids = {\n image: zIndexBase,\n shape: zIndexBase,\n z: zIndexBase\n };\n\n anchorNodes.forEach((anchorNode, anchorIndex) => {\n const anchor = parseAnchor(anchorNode);\n if (!anchor) {\n return;\n }\n\n const parsed = parseAnchorContents(\n anchorNode,\n anchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState\n );\n parsed.images.forEach((image) => images.push(image));\n parsed.shapes.forEach((shape) => shapes.push(shape));\n parsed.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths: [...mediaPaths],\n shapes\n };\n}\n\nfunction parseSheetFormControlNodes(\n archive: ArchiveEntries,\n sheetPath: string\n) {\n const sheetXml = readArchiveText(archive, sheetPath);\n if (!sheetXml) {\n return [] as ParsedSheetFormControl[];\n }\n\n const sheetDocument = parseXml(sheetXml);\n if (!sheetDocument) {\n return [] as ParsedSheetFormControl[];\n }\n\n return getLocalElements(sheetDocument, \"control\").map((controlNode) => ({\n anchor: parseAnchor(getFirstDescendant(controlNode, \"anchor\") ?? controlNode),\n controlRelationshipId: getRelationshipId(controlNode),\n name: controlNode.getAttribute(\"name\") ?? undefined,\n shapeId: parseFormControlShapeId(controlNode.getAttribute(\"shapeId\"))\n }));\n}\n\nfunction parseCtrlPropDocument(\n archive: ArchiveEntries,\n ctrlPropPath: string\n) {\n const xml = readArchiveText(archive, ctrlPropPath);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n const root = document?.documentElement;\n if (!root) {\n return null;\n }\n\n return {\n checked: parseSpreadsheetBooleanValue(root.getAttribute(\"checked\")),\n linkedCell: root.getAttribute(\"fmlaLink\") ?? undefined,\n objectType: root.getAttribute(\"objectType\") ?? undefined\n } satisfies ParsedCtrlProp;\n}\n\nfunction parseVmlFormControls(\n archive: ArchiveEntries,\n vmlDrawingPath: string\n) {\n const xml = readArchiveText(archive, vmlDrawingPath);\n if (!xml) {\n return new Map<number, ParsedVmlFormControl>();\n }\n\n const document = parseXml(xml);\n if (!document) {\n return new Map<number, ParsedVmlFormControl>();\n }\n\n const controls = new Map<number, ParsedVmlFormControl>();\n for (const shapeNode of getLocalElements(document, \"shape\")) {\n const clientDataNode = getFirstChild(shapeNode, \"ClientData\");\n if (!clientDataNode) {\n continue;\n }\n\n const shapeId = parseFormControlShapeId(\n shapeNode.getAttributeNS(\"urn:schemas-microsoft-com:office:office\", \"spid\")\n ?? shapeNode.getAttribute(\"o:spid\")\n ?? shapeNode.getAttribute(\"spid\")\n ?? shapeNode.getAttribute(\"id\")\n );\n if (shapeId === null) {\n continue;\n }\n\n const styleText = shapeNode.getAttribute(\"style\");\n const textboxNode = getFirstChild(shapeNode, \"textbox\");\n const fontNode = textboxNode ? getFirstDescendant(textboxNode, \"font\") : null;\n const textContainerNode = textboxNode ? getFirstDescendant(textboxNode, \"div\") : null;\n const label = normalizeControlLabel(textboxNode?.textContent);\n const zIndex = Number(parseCssDeclarationValue(styleText, \"z-index\") ?? Number.NaN);\n\n controls.set(shapeId, {\n checked: parseSpreadsheetBooleanNode(getFirstChild(clientDataNode, \"Checked\")),\n fontFamily: fontNode?.getAttribute(\"face\") ?? undefined,\n fontSizePt: parseVmlFontSizePt(fontNode?.getAttribute(\"size\")),\n hidden: (parseCssDeclarationValue(styleText, \"visibility\") ?? \"\").toLowerCase() === \"hidden\",\n label,\n linkedCell: normalizeControlLabel(getFirstChild(clientDataNode, \"FmlaLink\")?.textContent),\n objectType: clientDataNode.getAttribute(\"ObjectType\") ?? undefined,\n shapeId,\n textAlign: parseControlTextAlign(textContainerNode?.getAttribute(\"style\")),\n textColor: fontNode?.getAttribute(\"color\") ?? undefined,\n zIndex: Number.isFinite(zIndex) ? zIndex : controls.size + 1\n });\n }\n\n return controls;\n}\n\nfunction parseSheetFormControls(\n archive: ArchiveEntries,\n sheetPath: string,\n sheetRelationships: Map<string, RelationshipRecord>,\n workbookSheetIndex: number,\n zIndexBase: number\n) {\n const controlNodes = parseSheetFormControlNodes(archive, sheetPath);\n if (controlNodes.length === 0) {\n return [] as XlsxFormControl[];\n }\n\n const legacyDrawingRelationship = [...sheetRelationships.values()].find(\n (relationship) => relationship.type === VML_DRAWING_REL_TYPE\n );\n const vmlControlsByShapeId = legacyDrawingRelationship\n ? parseVmlFormControls(archive, legacyDrawingRelationship.target)\n : new Map<number, ParsedVmlFormControl>();\n const parsedControls: XlsxFormControl[] = [];\n\n controlNodes.forEach((controlNode, index) => {\n if (!controlNode.anchor) {\n return;\n }\n\n const ctrlPropRelationship = controlNode.controlRelationshipId\n ? sheetRelationships.get(controlNode.controlRelationshipId) ?? null\n : null;\n const ctrlPropPath = ctrlPropRelationship?.type === CTRL_PROP_REL_TYPE\n ? ctrlPropRelationship.target\n : null;\n const ctrlProp = ctrlPropPath\n ? parseCtrlPropDocument(archive, ctrlPropPath)\n : null;\n const vmlControl = controlNode.shapeId !== null\n ? vmlControlsByShapeId.get(controlNode.shapeId) ?? null\n : null;\n const kind = parseFormControlKind(ctrlProp?.objectType ?? vmlControl?.objectType);\n\n parsedControls.push({\n anchor: controlNode.anchor,\n checked: ctrlProp?.checked ?? vmlControl?.checked,\n fontFamily: vmlControl?.fontFamily,\n fontSizePt: vmlControl?.fontSizePt,\n hidden: vmlControl?.hidden ?? false,\n id: `form-control-${workbookSheetIndex}-${index}`,\n kind,\n label: vmlControl?.label,\n linkedCell: ctrlProp?.linkedCell ?? vmlControl?.linkedCell,\n name: controlNode.name,\n sheetIndex: workbookSheetIndex,\n textAlign: vmlControl?.textAlign,\n textColor: vmlControl?.textColor,\n workbookSheetIndex,\n zIndex: zIndexBase + (vmlControl?.zIndex ?? index + 1)\n });\n });\n\n return parsedControls.sort((left, right) => left.zIndex - right.zIndex);\n}\n\nfunction flattenShapeText(shape: XlsxShape) {\n const text = shape.paragraphs\n .flatMap((paragraph) => paragraph.runs.map((run) => run.text))\n .join(\" \");\n return normalizeControlLabel(text);\n}\n\nfunction rectArea(rect: DrawingRectEmu) {\n return Math.max(0, rect.cx) * Math.max(0, rect.cy);\n}\n\nfunction rectIntersectionArea(left: DrawingRectEmu, right: DrawingRectEmu) {\n const overlapX = Math.max(0, Math.min(left.x + left.cx, right.x + right.cx) - Math.max(left.x, right.x));\n const overlapY = Math.max(0, Math.min(left.y + left.cy, right.y + right.cy) - Math.max(left.y, right.y));\n return overlapX * overlapY;\n}\n\nfunction rectCenterDistance(left: DrawingRectEmu, right: DrawingRectEmu) {\n const leftCenterX = left.x + left.cx / 2;\n const leftCenterY = left.y + left.cy / 2;\n const rightCenterX = right.x + right.cx / 2;\n const rightCenterY = right.y + right.cy / 2;\n return Math.hypot(leftCenterX - rightCenterX, leftCenterY - rightCenterY);\n}\n\nfunction findHiddenShapeControlMatch(\n control: XlsxFormControl,\n shapes: XlsxShape[],\n sheetState: WorkbookSheetState | null\n): XlsxShape | null {\n const controlRect = anchorToAbsoluteRect(control.anchor, sheetState);\n const controlArea = Math.max(1, rectArea(controlRect));\n const placeholderName = isPlaceholderFormControlName(control.name);\n let bestMatch: XlsxShape | null = null;\n let bestScore = Number.NEGATIVE_INFINITY;\n\n shapes.forEach((shape) => {\n if (!shape.hidden) {\n return;\n }\n\n const shapeRect = anchorToAbsoluteRect(shape.anchor, sheetState);\n const shapeArea = Math.max(1, rectArea(shapeRect));\n const intersectionArea = rectIntersectionArea(controlRect, shapeRect);\n const overlapScore = intersectionArea / Math.min(controlArea, shapeArea);\n const distance = rectCenterDistance(controlRect, shapeRect);\n const maxDimension = Math.max(controlRect.cx, controlRect.cy, shapeRect.cx, shapeRect.cy, 1);\n const distanceScore = distance / maxDimension;\n const textLabel = flattenShapeText(shape);\n const sameName = normalizeControlLabel(shape.name)?.toLowerCase() === normalizeControlLabel(control.name)?.toLowerCase();\n let score = overlapScore * 4 - distanceScore;\n\n if (sameName) {\n score += 1;\n }\n\n if (control.kind === \"group-box\") {\n score += textLabel ? -3 : 0.5;\n score += shape.stroke?.none ? -1.5 : 0.75;\n } else {\n score += textLabel ? 2 : -1;\n score += shape.stroke?.none ? 0.2 : -0.5;\n }\n\n if (!placeholderName && textLabel && textLabel === resolveNamedFormControlLabel(control.name)) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestMatch = shape;\n bestScore = score;\n }\n });\n\n return bestScore >= 0.25 ? bestMatch : null;\n}\n\nfunction enrichFormControlsWithHiddenShapes(\n formControls: XlsxFormControl[],\n shapes: XlsxShape[],\n sheetState: WorkbookSheetState | null\n) {\n return formControls.map((control) => {\n const matchedShape = findHiddenShapeControlMatch(control, shapes, sheetState);\n const matchedLabel = matchedShape ? flattenShapeText(matchedShape) : undefined;\n const fallbackLabel = resolveNamedFormControlLabel(control.name);\n let resolvedAnchor = control.anchor;\n if (matchedShape && (control.kind === \"group-box\" || matchedLabel || isPlaceholderFormControlName(control.name))) {\n resolvedAnchor = matchedShape.anchor;\n }\n\n return {\n ...control,\n anchor: resolvedAnchor,\n label: control.label ?? matchedLabel ?? fallbackLabel\n };\n });\n}\n\nexport function revokeWorkbookImageAssets(assets: WorkbookImageAssets | null) {\n if (!assets) {\n return;\n }\n\n for (const objectUrl of assets.objectUrls) {\n if (objectUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nfunction parseWorkbookStructureAssetsFromArchive(\n archive: ArchiveEntries,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets & {\n contentTypes: ContentTypesState;\n theme: ThemeState;\n workbookSheets: WorkbookSheetInfo[];\n} {\n const contentTypes = parseContentTypes(archive);\n const workbookSheets = parseWorkbookSheets(archive);\n const theme = parseWorkbookTheme(archive);\n const themePalette = buildThemePalette(theme);\n const { defaultFont, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);\n return {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {\n ...options,\n defaultFont,\n themePalette\n })),\n styleById,\n tableMetadataByWorkbookSheetIndex: workbookSheets.map(() => [] as WorkbookTableMetadata[]),\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n };\n}\n\nexport function parseWorkbookStructureAssets(\n bytes: Uint8Array,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets {\n const archive = unzipSync(bytes);\n const {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n } = parseWorkbookStructureAssetsFromArchive(archive, options);\n\n return {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nexport function parseWorkbookChartStyleAssets(bytes: Uint8Array): WorkbookChartStyleAssets {\n const archive = unzipSync(bytes);\n const {\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: []\n });\n }\n\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n sheetOrigins,\n themePalette\n };\n}\n\nexport function parseWorkbookImageAssets(bytes: Uint8Array): WorkbookImageAssets {\n const archive = unzipSync(bytes);\n const {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const objectUrls: string[] = [];\n const formControlsByWorkbookSheetIndex: XlsxFormControl[][] = [];\n const imagesByWorkbookSheetIndex: XlsxImage[][] = [];\n const shapesByWorkbookSheetIndex: XlsxShape[][] = [];\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n const imageOriginsById = new Map<string, WorkbookImageOrigin>();\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n const imageList: XlsxImage[] = [];\n const shapeList: XlsxShape[] = [];\n let zIndexBase = 1;\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n const drawingImages = parseDrawingObjects(\n archive,\n contentTypes,\n drawingPath,\n objectUrls,\n workbookSheetIndex,\n zIndexBase,\n theme,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null,\n imageOriginsById\n );\n imageList.push(...drawingImages.images);\n shapeList.push(...drawingImages.shapes);\n zIndexBase += drawingImages.images.length + drawingImages.shapes.length + 10;\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: drawingImages.mediaPaths\n });\n }\n\n const formControlList = parseSheetFormControls(\n archive,\n sheet.path,\n sheetRelationships,\n workbookSheetIndex,\n zIndexBase\n );\n const visibleShapeList = shapeList.filter((shape) => !shape.hidden);\n const enrichedFormControlList = enrichFormControlsWithHiddenShapes(\n formControlList,\n shapeList,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null\n );\n\n formControlsByWorkbookSheetIndex[workbookSheetIndex] = enrichedFormControlList;\n imagesByWorkbookSheetIndex[workbookSheetIndex] = imageList;\n shapesByWorkbookSheetIndex[workbookSheetIndex] = visibleShapeList;\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n formControlsByWorkbookSheetIndex,\n imageOriginsById,\n imagesByWorkbookSheetIndex,\n namedCellStyleByName,\n objectUrls,\n shapesByWorkbookSheetIndex,\n sheetOrigins,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImage[\"anchor\"]) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n updateMarkerElement(getFirstChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n if (positionNode) {\n positionNode.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n positionNode.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nexport function updateWorkbookImageAnchor(\n assets: WorkbookImageAssets,\n imageId: string,\n anchor: XlsxImage[\"anchor\"]\n) {\n const origin = assets.imageOriginsById.get(imageId);\n if (!origin) {\n return false;\n }\n\n const attachments = assets.sheetOrigins[origin.workbookSheetIndex]?.attachments ?? [];\n for (const attachment of attachments) {\n const drawingXml = readArchiveText(assets.archive, attachment.drawingPath);\n if (!drawingXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n continue;\n }\n\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const anchorNode = anchorNodes[origin.anchorIndex];\n if (!anchorNode || !getFirstChild(anchorNode, \"pic\")) {\n continue;\n }\n\n updateAnchorNode(anchorNode, anchor);\n assets.archive[attachment.drawingPath] = strToU8(serializeXml(drawingDocument));\n const imageList = assets.imagesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? [];\n const imageIndex = imageList.findIndex((image) => image.id === imageId);\n if (imageIndex >= 0) {\n imageList[imageIndex] = {\n ...imageList[imageIndex],\n anchor\n };\n }\n return true;\n }\n\n return false;\n}\n\nfunction ensureRelationshipsDocument(archive: ArchiveEntries, relsPath: string) {\n const existing = readArchiveText(archive, relsPath);\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"${PKG_REL_NS}\"></Relationships>`\n );\n}\n\nfunction ensureContentTypesDocument(archive: ArchiveEntries) {\n const existing = readArchiveText(archive, \"[Content_Types].xml\");\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"${CONTENT_TYPES_NS}\"></Types>`\n );\n}\n\nfunction mergeContentTypeForPath(\n targetDocument: XMLDocument,\n originalDocument: XMLDocument | null,\n partPath: string\n) {\n const normalizedPartName = `/${normalizeArchivePath(partPath)}`;\n const targetRoot = targetDocument.documentElement;\n if (!targetRoot) {\n return;\n }\n\n const existingOverride = getLocalElements(targetDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (!existingOverride && originalDocument) {\n const sourceOverride = getLocalElements(originalDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (sourceOverride) {\n targetRoot.appendChild(sourceOverride.cloneNode(true));\n return;\n }\n }\n\n const extension = normalizedPartName.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return;\n }\n\n const existingDefault = getLocalElements(targetDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (existingDefault) {\n return;\n }\n\n if (originalDocument) {\n const sourceDefault = getLocalElements(originalDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (sourceDefault) {\n targetRoot.appendChild(sourceDefault.cloneNode(true));\n return;\n }\n }\n\n if (extension === \"xml\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/xml\");\n targetRoot.appendChild(defaultNode);\n return;\n }\n\n if (extension === \"rels\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/vnd.openxmlformats-package.relationships+xml\");\n targetRoot.appendChild(defaultNode);\n }\n}\n\nfunction removeDrawingReferences(sheetDocument: XMLDocument, relDocument: XMLDocument) {\n getLocalElements(sheetDocument, \"drawing\").forEach((node) => node.remove());\n getLocalElements(relDocument, \"Relationship\")\n .filter((node) => node.getAttribute(\"Type\") === DRAWING_REL_TYPE)\n .forEach((node) => node.remove());\n}\n\nfunction nextRelationshipId(relDocument: XMLDocument) {\n const existingIds = new Set(\n getLocalElements(relDocument, \"Relationship\")\n .map((node) => node.getAttribute(\"Id\"))\n .filter((value): value is string => Boolean(value))\n );\n\n let index = 1;\n while (existingIds.has(`rIdReactXlsxImage${index}`)) {\n index += 1;\n }\n\n return `rIdReactXlsxImage${index}`;\n}\n\nfunction appendSheetDrawingReference(\n sheetDocument: XMLDocument,\n relationshipId: string\n) {\n const worksheet = sheetDocument.documentElement;\n if (!worksheet) {\n return;\n }\n\n const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, \"drawing\");\n drawingNode.setAttributeNS(REL_NS, \"r:id\", relationshipId);\n\n const extLst = getFirstChild(worksheet, \"extLst\");\n if (extLst) {\n worksheet.insertBefore(drawingNode, extLst);\n return;\n }\n\n worksheet.appendChild(drawingNode);\n}\n\nexport function mergeWorkbookImageAssets(\n savedBytes: Uint8Array,\n sourceAssets: WorkbookImageAssets | null,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n if (!sourceAssets || sheetOrigins.every((origin) => !origin?.attachments.length)) {\n return cloneBytes(savedBytes);\n }\n\n try {\n const archive = unzipSync(savedBytes);\n const workbookSheets = parseWorkbookSheets(archive);\n const originalContentTypesDocument = parseXml(readArchiveText(sourceAssets.archive, \"[Content_Types].xml\") ?? \"\");\n const targetContentTypesDocument = ensureContentTypesDocument(archive);\n if (!targetContentTypesDocument) {\n return cloneBytes(savedBytes);\n }\n\n sheetOrigins.forEach((origin, workbookSheetIndex) => {\n if (!origin?.attachments.length) {\n return;\n }\n\n const currentSheet = workbookSheets[workbookSheetIndex];\n if (!currentSheet) {\n return;\n }\n\n const sheetXml = readArchiveText(archive, currentSheet.path);\n if (!sheetXml) {\n return;\n }\n\n const sheetDocument = parseXml(sheetXml);\n const relsPath = relsPathForDocument(currentSheet.path);\n const relDocument = ensureRelationshipsDocument(archive, relsPath);\n if (!sheetDocument || !relDocument) {\n return;\n }\n\n removeDrawingReferences(sheetDocument, relDocument);\n\n origin.attachments.forEach((attachment) => {\n const drawingBytes = sourceAssets.archive[attachment.drawingPath];\n if (!drawingBytes) {\n return;\n }\n\n archive[attachment.drawingPath] = cloneBytes(drawingBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingPath);\n\n if (attachment.drawingRelsPath) {\n const drawingRelsBytes = sourceAssets.archive[attachment.drawingRelsPath];\n if (drawingRelsBytes) {\n archive[attachment.drawingRelsPath] = cloneBytes(drawingRelsBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingRelsPath);\n }\n }\n\n attachment.mediaPaths.forEach((mediaPath) => {\n const mediaBytes = sourceAssets.archive[mediaPath];\n if (!mediaBytes) {\n return;\n }\n\n archive[mediaPath] = cloneBytes(mediaBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, mediaPath);\n });\n\n const relationshipId = nextRelationshipId(relDocument);\n const relationshipNode = relDocument.createElementNS(PKG_REL_NS, \"Relationship\");\n relationshipNode.setAttribute(\"Id\", relationshipId);\n relationshipNode.setAttribute(\"Type\", DRAWING_REL_TYPE);\n relationshipNode.setAttribute(\"Target\", relativeArchivePath(currentSheet.path, attachment.drawingPath));\n relDocument.documentElement?.appendChild(relationshipNode);\n appendSheetDrawingReference(sheetDocument, relationshipId);\n });\n\n archive[currentSheet.path] = strToU8(serializeXml(sheetDocument));\n archive[relsPath] = strToU8(serializeXml(relDocument));\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n });\n\n const hasDrawingOverride = getLocalElements(targetContentTypesDocument, \"Override\").some(\n (node) => node.getAttribute(\"ContentType\") === DRAWING_CONTENT_TYPE\n );\n if (!hasDrawingOverride) {\n for (const path of Object.keys(archive)) {\n if (path.startsWith(\"xl/drawings/\") && path.endsWith(\".xml\")) {\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, path);\n }\n }\n }\n\n archive[\"[Content_Types].xml\"] = strToU8(serializeXml(targetContentTypesDocument));\n return zipSync(archive, { level: 6 });\n } catch {\n return cloneBytes(savedBytes);\n }\n}\n\nexport function emuToPixels(value: number) {\n return value / EMU_PER_PIXEL;\n}\n\nexport function pixelsToEmu(value: number) {\n return value * EMU_PER_PIXEL;\n}\n\nexport function pxToSheetColumnWidth(widthPx: number) {\n return (Math.max(widthPx, MIN_COL_WIDTH_PX) - 5) / 7;\n}\n\nexport function resolveSheetColumnWidthPixels(width: number, columnWidthCharacterWidthPx?: number) {\n return sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n}\n\nexport function resolveSheetRowHeightPixels(height: number) {\n return Math.max(Math.round(height * 1.33), MIN_ROW_HEIGHT_PX);\n}\n\nexport function resolveRenderedSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx) + (showGridLines ? resolveDeviceGridlineThicknessPx() : 0);\n}\n\nexport function resolveContentSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx - (showGridLines ? resolveDeviceGridlineThicknessPx() : 0));\n}\n\nfunction markerFromOffset(offsetPx: number, getSizePx: (index: number) => number) {\n let remaining = Math.max(0, offsetPx);\n let index = 0;\n while (remaining > 0) {\n const size = Math.max(1, getSizePx(index));\n if (remaining < size) {\n break;\n }\n remaining -= size;\n index += 1;\n }\n\n return {\n index,\n offsetPx: remaining\n };\n}\n\nexport function rectToImageAnchor(\n rect: XlsxImageRect,\n currentAnchor: XlsxImage[\"anchor\"],\n options: {\n contentOffsetLeft: number;\n contentOffsetTop: number;\n getColumnWidthPx: (col: number) => number;\n getRowHeightPx: (row: number) => number;\n }\n): XlsxImage[\"anchor\"] {\n const contentLeft = Math.max(0, rect.left - options.contentOffsetLeft);\n const contentTop = Math.max(0, rect.top - options.contentOffsetTop);\n const contentRight = Math.max(contentLeft + 1, rect.left + rect.width - options.contentOffsetLeft);\n const contentBottom = Math.max(contentTop + 1, rect.top + rect.height - options.contentOffsetTop);\n\n if (currentAnchor.kind === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: pixelsToEmu(contentLeft),\n y: pixelsToEmu(contentTop)\n },\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const fromCol = markerFromOffset(contentLeft, options.getColumnWidthPx);\n const fromRow = markerFromOffset(contentTop, options.getRowHeightPx);\n if (currentAnchor.kind === \"one-cell\") {\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const toCol = markerFromOffset(contentRight, options.getColumnWidthPx);\n const toRow = markerFromOffset(contentBottom, options.getRowHeightPx);\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"two-cell\",\n to: {\n col: toCol.index,\n colOffsetEmu: pixelsToEmu(toCol.offsetPx),\n row: toRow.index,\n rowOffsetEmu: pixelsToEmu(toRow.offsetPx)\n }\n };\n}\n\nexport function resizeImageRect(\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number,\n minimumSize = 16\n) {\n let left = rect.left;\n let top = rect.top;\n let width = rect.width;\n let height = rect.height;\n\n if (handle.includes(\"w\")) {\n left += deltaX;\n width -= deltaX;\n }\n if (handle.includes(\"e\")) {\n width += deltaX;\n }\n if (handle.includes(\"n\")) {\n top += deltaY;\n height -= deltaY;\n }\n if (handle.includes(\"s\")) {\n height += deltaY;\n }\n\n if (width < minimumSize) {\n if (handle.includes(\"w\")) {\n left -= minimumSize - width;\n }\n width = minimumSize;\n }\n if (height < minimumSize) {\n if (handle.includes(\"n\")) {\n top -= minimumSize - height;\n }\n height = minimumSize;\n }\n\n return { height, left, top, width };\n}\n","import type { XlsxThemePalette } from \"./types\";\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n const match = normalized ? /^#([0-9a-f]{6})$/.exec(normalized) : null;\n if (!match) {\n return null;\n }\n\n const hex = match[1];\n return [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, channel)).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyExcelTint(baseColor: string, tint: number) {\n const rgb = parseHexColor(baseColor);\n if (!rgb || !Number.isFinite(tint) || tint === 0) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = tint < 0\n ? lightness * (1 + tint)\n : lightness * (1 - tint) + tint;\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, Math.max(0, Math.min(1, nextLightness)));\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nexport function resolveWorkbookColor(\n color: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!color) {\n return null;\n }\n\n const directHex = [\"hex\", \"rgb\", \"argb\"]\n .map((key) => color[key])\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n if (directHex) {\n return normalizeHexColor(directHex);\n }\n\n const themeValue = color.theme;\n const numericTheme = typeof themeValue === \"number\"\n ? themeValue\n : typeof themeValue === \"string\" && themeValue.trim().length > 0\n ? Number(themeValue)\n : Number.NaN;\n const themeColor = Number.isFinite(numericTheme) ? themePalette?.colorsByIndex[numericTheme] ?? null : null;\n if (!themeColor) {\n return null;\n }\n\n const tintValue = color.tint;\n const tint = typeof tintValue === \"number\"\n ? tintValue\n : typeof tintValue === \"string\" && tintValue.trim().length > 0\n ? Number(tintValue)\n : Number.NaN;\n\n return Number.isFinite(tint) ? applyExcelTint(themeColor, tint) : themeColor;\n}\n\nexport function resolveWorkbookFillColor(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!fill) {\n return null;\n }\n\n if (fill.fillType === \"solid\") {\n return resolveWorkbookColor(\n (fill.color as Record<string, unknown> | undefined)\n ?? (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n if (fill.fillType === \"pattern\") {\n return resolveWorkbookColor(\n (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.color as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n return null;\n}\n\nexport function resolveWorkbookFillStyle(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n if (!fill) {\n return {\n backgroundColor: null,\n backgroundImage: null\n };\n }\n\n if (fill.fillType === \"gradient\") {\n const rawStops = Array.isArray(fill.stops) ? fill.stops as Array<Record<string, unknown>> : [];\n const stops = rawStops\n .map((stop) => ({\n color: resolveWorkbookColor(stop.color as Record<string, unknown> | undefined, themePalette),\n position: typeof stop.position === \"number\" ? stop.position : Number(stop.position)\n }))\n .filter((stop): stop is { color: string; position: number } => Boolean(stop.color) && Number.isFinite(stop.position))\n .sort((left, right) => left.position - right.position);\n if (stops.length > 0) {\n const gradientType = typeof fill.gradientType === \"string\" ? fill.gradientType : \"linear\";\n if (gradientType === \"path\") {\n const backgroundColor = stops[stops.length - 1]?.color ?? null;\n return {\n backgroundColor,\n backgroundImage: `radial-gradient(circle at center, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n\n const degree = typeof fill.degree === \"number\" ? fill.degree : Number(fill.degree ?? 0);\n const cssAngle = Number.isFinite(degree) ? 90 - degree : 90;\n return {\n backgroundColor: stops[stops.length - 1]?.color ?? null,\n backgroundImage: `linear-gradient(${cssAngle}deg, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n }\n\n return {\n backgroundColor: resolveWorkbookFillColor(fill, themePalette),\n backgroundImage: null\n };\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\n\nconst SHEET_REF_REGEX = /'((?:[^']|'')+)'!|([A-Za-z_\\u0080-\\uFFFF][\\w.\\u0080-\\uFFFF]*)!/g;\n\ntype FormulaCell = { formula?: string | null };\n\nfunction collectReferencedSheetNames(workbook: Workbook): Set<string> {\n const referenced = new Set<string>();\n for (let sheetIdx = 0; sheetIdx < workbook.sheetCount; sheetIdx += 1) {\n let sheet;\n try {\n sheet = workbook.getSheet(sheetIdx);\n } catch {\n continue;\n }\n const cells = sheet.formulaCells as FormulaCell[] | null | undefined;\n if (!Array.isArray(cells)) {\n continue;\n }\n for (const cell of cells) {\n const formula = cell?.formula;\n if (!formula) {\n continue;\n }\n SHEET_REF_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SHEET_REF_REGEX.exec(formula)) !== null) {\n const raw = match[1] ?? match[2];\n if (!raw) {\n continue;\n }\n referenced.add(raw.replace(/''/g, \"'\"));\n }\n }\n }\n return referenced;\n}\n\nfunction hasUnresolvedSheetReferences(workbook: Workbook): boolean {\n let names: string[];\n try {\n names = workbook.sheetNames;\n } catch {\n return false;\n }\n const known = new Set(names);\n const referenced = collectReferencedSheetNames(workbook);\n for (const name of referenced) {\n if (!known.has(name)) {\n return true;\n }\n }\n return false;\n}\n\nexport type SafeCalculateSkipReason = \"unresolved-sheet-refs\" | \"calculate-trapped\";\n\nexport type SafeCalculateResult = {\n workbook: Workbook;\n calculated: boolean;\n skipReason: SafeCalculateSkipReason | null;\n};\n\nexport type SafeCalculateOptions = {\n reparse?: () => Workbook;\n};\n\n// Pre-scans for formulas referencing missing sheets (which cause the Rust\n// engine to panic into a wasm `unreachable` trap that poisons the Workbook\n// instance). On trap, `reparse` is used to return a fresh usable instance.\nexport function safeCalculate(workbook: Workbook, options: SafeCalculateOptions = {}): SafeCalculateResult {\n if (hasUnresolvedSheetReferences(workbook)) {\n return { workbook, calculated: false, skipReason: \"unresolved-sheet-refs\" };\n }\n try {\n workbook.calculate();\n return { workbook, calculated: true, skipReason: null };\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped; falling back to cached formula values\", err);\n if (options.reparse) {\n try {\n return { workbook: options.reparse(), calculated: false, skipReason: \"calculate-trapped\" };\n } catch (reparseErr) {\n console.warn(\"[react-xlsx] workbook reparse after calculate trap failed\", reparseErr);\n }\n }\n return { workbook, calculated: false, skipReason: \"calculate-trapped\" };\n }\n}\n\nexport function tryRecalculate(workbook: Workbook): { calculated: boolean; error: unknown } {\n try {\n workbook.calculate();\n return { calculated: true, error: null };\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped during recalculation\", err);\n return { calculated: false, error: err };\n }\n}\n","let wasmModulePromise: Promise<typeof import(\"@dukelib/sheets-wasm\")> | null = null;\n\nexport type XlsxWasmSource =\n | string\n | URL\n | Request\n | Response\n | BufferSource\n | WebAssembly.Module;\n\nexport type WorkerWasmSource = string | ArrayBuffer | WebAssembly.Module;\n\nlet hasConfiguredWasmSource = false;\nlet configuredWasmSource: XlsxWasmSource | undefined;\nlet configuredWorkerWasmSource: WorkerWasmSource | undefined;\n\nfunction bufferSourceToArrayBuffer(source: ArrayBuffer | ArrayBufferView<ArrayBufferLike>): ArrayBuffer {\n if (source instanceof ArrayBuffer) {\n return source.slice(0);\n }\n\n const bytes = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n const copy = new Uint8Array(bytes);\n return copy.buffer;\n}\n\nfunction sourceToWorkerSource(source: XlsxWasmSource): WorkerWasmSource | undefined {\n if (typeof source === \"string\") {\n return source;\n }\n if (typeof URL !== \"undefined\" && source instanceof URL) {\n return source.href;\n }\n if (typeof Request !== \"undefined\" && source instanceof Request) {\n return source.url;\n }\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return bufferSourceToArrayBuffer(source);\n }\n if (typeof WebAssembly !== \"undefined\" && source instanceof WebAssembly.Module) {\n return source;\n }\n\n return undefined;\n}\n\nexport function setWasmSource(source: XlsxWasmSource): void {\n hasConfiguredWasmSource = true;\n configuredWasmSource = source;\n configuredWorkerWasmSource = sourceToWorkerSource(source);\n}\n\nexport function initWasm(source?: XlsxWasmSource) {\n if (source !== undefined) {\n setWasmSource(source);\n }\n\n return getSheetsWasmModule();\n}\n\nexport function canUseConfiguredWasmSourceInWorker(): boolean {\n return !hasConfiguredWasmSource || configuredWorkerWasmSource !== undefined;\n}\n\nexport function getConfiguredWorkerWasmSource(): WorkerWasmSource | undefined {\n return configuredWorkerWasmSource;\n}\n\nexport function getSheetsWasmModule() {\n if (!wasmModulePromise) {\n wasmModulePromise = import(\"@dukelib/sheets-wasm\").then(async (mod) => {\n if (configuredWasmSource !== undefined) {\n await mod.default({ module_or_path: configuredWasmSource });\n } else {\n await mod.default();\n }\n return mod;\n });\n }\n\n return wasmModulePromise;\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { loadWorkbookChartAssets } from \"./charts\";\nimport {\n parseWorkbookChartStyleAssets,\n parseWorkbookStructureAssets,\n resolveSheetColumnWidthPixels,\n resolveWorksheetDefaultColumnWidthPixels,\n resolveWorksheetDefaultRowHeightPixels,\n resolveWorksheetHiddenCols,\n resolveWorksheetHiddenRows,\n resolveWorksheetMergeMetadata\n} from \"./images\";\nimport type { WorkbookStructureAssets } from \"./images\";\nimport { safeCalculate } from \"./safe-calculate\";\nimport { getSheetsWasmModule, setWasmSource, type WorkerWasmSource } from \"./wasm\";\nimport type {\n XlsxChart,\n XlsxChartsheet,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxDataValidation,\n XlsxFreezePanes,\n XlsxResolvedCellStyle,\n XlsxSheetData,\n XlsxSheetVisibility,\n XlsxTable,\n XlsxTableStyleDefinition,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst DEFAULT_ROW_HEIGHT = 24;\nconst DEFAULT_COL_WIDTH = 80;\nconst DEFAULT_ZOOM_SCALE = 100;\nconst FORMULA_COUNT_THRESHOLD = 1000;\nconst FAST_STRUCTURE_PARSE_THRESHOLD_BYTES = 5 * 1024 * 1024;\n\nfunction isLegacyXlsWorkbook(bytes: Uint8Array) {\n return bytes.byteLength >= 8\n && bytes[0] === 0xd0\n && bytes[1] === 0xcf\n && bytes[2] === 0x11\n && bytes[3] === 0xe0\n && bytes[4] === 0xa1\n && bytes[5] === 0xb1\n && bytes[6] === 0x1a\n && bytes[7] === 0xe1;\n}\n\nfunction shouldSkipXmlParsingForWorkbook(bytes: Uint8Array, skipXmlParsing = false) {\n return skipXmlParsing || isLegacyXlsWorkbook(bytes);\n}\n\nfunction normalizeWorksheetVisibility(value: unknown): XlsxSheetVisibility {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\n\ntype WorkerRequest =\n | {\n id: number;\n type: \"load\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"parseCharts\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"getCellSnapshot\";\n payload: {\n workbookSheetIndex: number;\n row: number;\n col: number;\n };\n }\n | {\n id: number;\n type: \"getRowsBatch\";\n payload: {\n workbookSheetIndex: number;\n startRow: number;\n rowCount: number;\n };\n };\n\ntype WorkerSuccessResponse = {\n id: number;\n success: true;\n result:\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n }\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n sheets: XlsxSheetData[];\n tablesByWorkbookSheetIndex: XlsxTable[][];\n tabs: XlsxWorkbookTab[];\n }\n | {\n displayValue: string;\n formula: string;\n }\n | unknown[]\n | null;\n};\n\ntype WorkerErrorResponse = {\n id: number;\n success: false;\n error: string;\n};\n\ntype WorkerResponse = WorkerSuccessResponse | WorkerErrorResponse;\n\nlet workbook: Workbook | null = null;\nlet chartsByWorkbookSheetIndex: XlsxChart[][] = [];\nlet chartsheets: XlsxChartsheet[] = [];\nlet sheets: XlsxSheetData[] = [];\nlet tablesByWorkbookSheetIndex: XlsxTable[][] = [];\nlet tabs: XlsxWorkbookTab[] = [];\n\nfunction buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook: Workbook, showHiddenSheets = false) {\n const mapping = new Map<number, number>();\n let visibleIndex = 0;\n for (let workbookSheetIndex = 0; workbookSheetIndex < nextWorkbook.sheetCount; workbookSheetIndex += 1) {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n mapping.set(workbookSheetIndex, visibleIndex);\n visibleIndex += 1;\n }\n return mapping;\n}\n\nfunction normalizeRange(range: XlsxCellRange): XlsxCellRange {\n return {\n start: {\n col: Math.min(range.start.col, range.end.col),\n row: Math.min(range.start.row, range.end.row)\n },\n end: {\n col: Math.max(range.start.col, range.end.col),\n row: Math.max(range.start.row, range.end.row)\n }\n };\n}\n\nfunction parseA1CellReference(reference: string): XlsxCellAddress | null {\n const match = /^([A-Z]+)(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const [, columnPart, rowPart] = match;\n let col = 0;\n for (const char of columnPart.toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(rowPart) - 1\n };\n}\n\nfunction parseA1RangeReference(reference: string): XlsxCellRange | null {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return normalizeRange({ end, start });\n}\n\nfunction parseWorksheetFreezePanes(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxFreezePanes | null {\n const rawFreezePanes = worksheet.freezePanes as Record<string, unknown> | null | undefined;\n const row = typeof rawFreezePanes?.row === \"number\" && rawFreezePanes.row >= 0 ? rawFreezePanes.row : null;\n const col = typeof rawFreezePanes?.col === \"number\" && rawFreezePanes.col >= 0 ? rawFreezePanes.col : null;\n if (row === null && col === null) {\n return null;\n }\n\n return {\n col: col ?? 0,\n row: row ?? 0\n };\n}\n\nfunction parseWorksheetDataValidations(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxDataValidation[] {\n const rawDataValidations = Array.isArray(worksheet.dataValidations) ? worksheet.dataValidations : [];\n\n return rawDataValidations.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return [];\n }\n\n const validation = entry as Record<string, unknown>;\n const ranges = Array.isArray(validation.ranges)\n ? validation.ranges.flatMap((range) => {\n if (typeof range !== \"string\") {\n return [];\n }\n\n const parsedRange = parseA1RangeReference(range);\n return parsedRange ? [parsedRange] : [];\n })\n : [];\n const validationType = typeof validation.validationType === \"string\" ? validation.validationType : null;\n if (!validationType || ranges.length === 0) {\n return [];\n }\n\n return [{\n allowBlank: typeof validation.allowBlank === \"boolean\" ? validation.allowBlank : undefined,\n errorMessage: typeof validation.errorMessage === \"string\" ? validation.errorMessage : undefined,\n errorStyle: typeof validation.errorStyle === \"string\" ? validation.errorStyle : undefined,\n inputMessage: typeof validation.inputMessage === \"string\" ? validation.inputMessage : undefined,\n listSource: typeof validation.listSource === \"string\" ? validation.listSource : undefined,\n ranges,\n showDropdown: typeof validation.showDropdown === \"boolean\" ? validation.showDropdown : undefined,\n showErrorAlert: typeof validation.showErrorAlert === \"boolean\" ? validation.showErrorAlert : undefined,\n showInputMessage: typeof validation.showInputMessage === \"boolean\" ? validation.showInputMessage : undefined,\n validationType\n } satisfies XlsxDataValidation];\n });\n}\n\nfunction resolveWorksheetZoomScale(\n worksheet: ReturnType<Workbook[\"getSheet\"]>,\n sheetState?: WorkbookStructureAssets[\"sheetStatesByWorkbookSheetIndex\"][number] | null\n) {\n const candidates = [\n sheetState?.zoomScale,\n typeof worksheet.zoomScale === \"number\" ? worksheet.zoomScale : undefined\n ];\n const value = candidates.find((entry): entry is number => typeof entry === \"number\" && Number.isFinite(entry) && entry > 0);\n return value ?? DEFAULT_ZOOM_SCALE;\n}\n\nfunction resolveSheetDisplayUsedRange(\n usedRange: [number, number, number, number],\n sheetState?: {\n maxContentCol?: number;\n maxContentRow?: number;\n maxHorizontalMergeEndCol?: number;\n maxVerticalMergeEndRow?: number;\n minContentCol?: number;\n minContentRow?: number;\n } | null\n): [number, number, number, number] {\n const [minRow, minCol, maxRow, maxCol] = usedRange;\n const maxContentRow = sheetState?.maxContentRow ?? -1;\n const maxContentCol = sheetState?.maxContentCol ?? -1;\n const maxVerticalMergeEndRow = sheetState?.maxVerticalMergeEndRow ?? -1;\n const maxHorizontalMergeEndCol = sheetState?.maxHorizontalMergeEndCol ?? -1;\n const maxMeaningfulRow = Math.max(maxContentRow, maxVerticalMergeEndRow);\n const maxMeaningfulCol = Math.max(maxContentCol, maxHorizontalMergeEndCol);\n\n if (maxMeaningfulRow < 0 && maxMeaningfulCol < 0) {\n return usedRange;\n }\n\n return [\n sheetState?.minContentRow !== undefined && sheetState.minContentRow >= 0 ? Math.min(minRow, sheetState.minContentRow) : minRow,\n sheetState?.minContentCol !== undefined && sheetState.minContentCol >= 0 ? Math.min(minCol, sheetState.minContentCol) : minCol,\n maxMeaningfulRow >= 0\n ? (maxContentRow >= 0 ? Math.min(maxRow, maxMeaningfulRow) : Math.max(maxRow, maxMeaningfulRow))\n : maxRow,\n maxMeaningfulCol >= 0\n ? (maxContentCol >= 0 ? Math.min(maxCol, maxMeaningfulCol) : Math.max(maxCol, maxMeaningfulCol))\n : maxCol\n ];\n}\n\nfunction buildSheetList(\n nextWorkbook: Workbook,\n structureAssets?: WorkbookStructureAssets | null,\n showHiddenSheets = false\n) {\n const sheetsByWorkbookSheetIndex: XlsxSheetData[] = [];\n\n for (let index = 0; index < nextWorkbook.sheetCount; index += 1) {\n const worksheet = nextWorkbook.getSheet(index);\n const sheetState = structureAssets?.sheetStatesByWorkbookSheetIndex[index] ?? null;\n const mergeMetadata = resolveWorksheetMergeMetadata(worksheet);\n const effectiveSheetState = {\n ...sheetState,\n ...mergeMetadata\n };\n const defaultColWidthPx = resolveWorksheetDefaultColumnWidthPixels(\n worksheet,\n sheetState?.columnWidthCharacterWidthPx,\n sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH\n );\n const defaultRowHeightPx = resolveWorksheetDefaultRowHeightPixels(\n worksheet,\n sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT\n );\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n\n const resolveColumnWidthPx = (col: number) => {\n const width = worksheet.getColumnWidth(col);\n if (width !== undefined && width !== null) {\n return resolveSheetColumnWidthPixels(width, sheetState?.columnWidthCharacterWidthPx);\n }\n\n return sheetState?.colWidthOverridesPx?.[col] ?? defaultColWidthPx;\n };\n\n const resolveRowHeightPx = (row: number) => {\n const height = worksheet.getRowHeight(row);\n if (height !== undefined && height !== null) {\n return Math.max(Math.round(height * 1.33), 16);\n }\n\n return sheetState?.rowHeightOverridesPx?.[row] ?? defaultRowHeightPx;\n };\n\n const usedRange = worksheet.usedRange() as [number, number, number, number] | null;\n if (!usedRange) {\n sheetsByWorkbookSheetIndex.push({\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: 0,\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: [],\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx,\n defaultRowHeightPx,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: mergeMetadata.hasHorizontalMerges,\n hasVerticalMerges: mergeMetadata.hasVerticalMerges,\n maxHorizontalMergeEndCol: mergeMetadata.maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow: mergeMetadata.maxVerticalMergeEndRow,\n hiddenCols: sheetState?.hiddenCols ?? [],\n hiddenRows: sheetState?.hiddenRows ?? [],\n minUsedCol: -1,\n minUsedRow: -1,\n maxUsedCol: -1,\n maxUsedRow: -1,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: 0,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: [],\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette: structureAssets?.themePalette ?? { colorsByIndex: {} },\n visibleCols: [],\n visibleRows: [],\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n continue;\n }\n\n const [minRow, minCol, maxRow, maxCol] = resolveSheetDisplayUsedRange(usedRange, effectiveSheetState);\n const hiddenRows = resolveWorksheetHiddenRows(worksheet, maxRow);\n const hiddenCols = resolveWorksheetHiddenCols(worksheet, maxCol);\n\n sheetsByWorkbookSheetIndex.push({\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: Math.max(0, maxCol + 1 - hiddenCols.length),\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: [],\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx,\n defaultRowHeightPx,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: mergeMetadata.hasHorizontalMerges,\n hasVerticalMerges: mergeMetadata.hasVerticalMerges,\n maxHorizontalMergeEndCol: mergeMetadata.maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow: mergeMetadata.maxVerticalMergeEndRow,\n hiddenCols,\n hiddenRows,\n minUsedCol: minCol,\n minUsedRow: minRow,\n maxUsedCol: maxCol,\n maxUsedRow: maxRow,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: Math.max(0, maxRow + 1 - hiddenRows.length),\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: [],\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette: structureAssets?.themePalette ?? { colorsByIndex: {} },\n visibleCols: [],\n visibleRows: [],\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n }\n\n return sheetsByWorkbookSheetIndex;\n}\n\nfunction mapWorksheetTables(worksheet: ReturnType<Workbook[\"getSheet\"]> | null): XlsxTable[] {\n const rawTables = (worksheet?.tables ?? []) as Array<Record<string, unknown>>;\n return rawTables.flatMap((table, index) => {\n const rawColumns = Array.isArray(table.columns) ? table.columns : [];\n const rawName = typeof table.name === \"string\" ? table.name : `Table${index + 1}`;\n const rawDisplayName =\n typeof table.displayName === \"string\"\n ? table.displayName\n : typeof table.name === \"string\"\n ? table.name\n : `Table ${index + 1}`;\n const rawReference = typeof table.reference === \"string\" ? table.reference : \"\";\n const reference = rawReference;\n const parsedRange = parseA1RangeReference(reference);\n if (!parsedRange) {\n return [];\n }\n\n return [{\n columns: rawColumns.map((column, columnIndex) => ({\n id: typeof (column as { id?: unknown }).id === \"number\" ? ((column as { id?: number }).id ?? columnIndex + 1) : columnIndex + 1,\n index: columnIndex,\n name: typeof (column as { name?: unknown }).name === \"string\" ? ((column as { name?: string }).name ?? `Column ${columnIndex + 1}`) : `Column ${columnIndex + 1}`\n })),\n displayName: rawDisplayName,\n end: parsedRange.end,\n headerRowCount: resolveWorkbookTableCount(table.headerRowCount, 1),\n headerRowCellStyle: typeof table.headerRowCellStyle === \"string\" ? table.headerRowCellStyle : undefined,\n name: rawName,\n reference,\n start: parsedRange.start,\n styleInfo: table.styleInfo as XlsxTable[\"styleInfo\"] | undefined,\n totalsRowCount: resolveWorkbookTableCount(table.totalsRowCount, 0),\n totalsRowShown: resolveWorkbookTableBoolean(table.totalsRowShown)\n }];\n });\n}\n\nfunction resolveWorkbookTableCount(value: unknown, fallback: number) {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n\n return fallback;\n}\n\nfunction resolveWorkbookTableBoolean(value: unknown) {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"\") {\n return false;\n }\n if (normalized === \"1\" || normalized === \"true\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/"/g, \"\\\"\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction getCellDisplayValue(worksheet: ReturnType<Workbook[\"getSheet\"]>, row: number, col: number, activeSheet?: XlsxSheetData | null) {\n const formula = worksheet.getFormulaAt(row, col);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1({ row, col })] : undefined;\n const formatted = worksheet.getFormattedValueAt(row, col);\n if (formatted && !(formula && cachedFormulaValue !== undefined && formatted.startsWith(\"#\"))) {\n return decodeHtmlEntities(formatted);\n }\n\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (formula && cachedFormulaValue !== undefined && cellValue.is_error) {\n return cachedFormulaValue;\n }\n if (cellValue.is_error) {\n return cellValue.asError() ?? \"\";\n }\n if (cellValue.is_empty) {\n return \"\";\n }\n\n return cellValue.toString();\n}\n\nfunction cellAddressToA1(cell: XlsxCellAddress) {\n let col = cell.col + 1;\n let label = \"\";\n while (col > 0) {\n const remainder = (col - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n col = Math.floor((col - 1) / 26);\n }\n return `${label}${cell.row + 1}`;\n}\n\nasync function loadWorkbook(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const shouldUseFastStructureParse =\n bytes.byteLength >= FAST_STRUCTURE_PARSE_THRESHOLD_BYTES && totalFormulas <= FORMULA_COUNT_THRESHOLD;\n const structureAssets = effectiveSkipXmlParsing || shouldUseFastStructureParse\n ? null\n : parseWorkbookStructureAssets(bytes, {\n includeCachedFormulaValues: true\n });\n workbook = nextWorkbook;\n sheets = buildSheetList(nextWorkbook, structureAssets, showHiddenSheets);\n tablesByWorkbookSheetIndex = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) =>\n mapWorksheetTables(nextWorkbook.getSheet(workbookSheetIndex))\n );\n const visibleSheetIndexByWorkbookSheetIndex = new Map(sheets.map((sheet, index) => [sheet.workbookSheetIndex, index]));\n const hasCharts = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const hasClassicCharts = Array.isArray(worksheet.charts) && worksheet.charts.length > 0;\n const hasModernCharts = Array.isArray(worksheet.chartsEx) && worksheet.chartsEx.length > 0;\n return hasClassicCharts || hasModernCharts;\n }).some(Boolean);\n const chartStyleAssets = effectiveSkipXmlParsing || !hasCharts ? null : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n chartsByWorkbookSheetIndex = chartAssets.chartsByWorkbookSheetIndex;\n chartsheets = chartAssets.chartsheets;\n tabs = chartAssets.tabs;\n return {\n chartsByWorkbookSheetIndex,\n chartsheets,\n sheets,\n tablesByWorkbookSheetIndex,\n tabs\n };\n}\n\nasync function parseCharts(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const visibleSheetIndexByWorkbookSheetIndex = buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook, showHiddenSheets);\n const chartStyleAssets = effectiveSkipXmlParsing ? null : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n return {\n chartsByWorkbookSheetIndex: chartAssets.chartsByWorkbookSheetIndex,\n chartsheets: chartAssets.chartsheets,\n tabs: chartAssets.tabs\n };\n}\n\nfunction respond(message: WorkerResponse) {\n self.postMessage(message);\n}\n\nasync function handleMessage(message: WorkerRequest) {\n switch (message.type) {\n case \"load\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return loadWorkbook(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"parseCharts\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return parseCharts(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"getCellSnapshot\": {\n if (!workbook) {\n return {\n displayValue: \"\",\n formula: \"\"\n };\n }\n\n const targetSheet = sheets.find((sheet) => sheet.workbookSheetIndex === message.payload.workbookSheetIndex) ?? null;\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex);\n return {\n displayValue: getCellDisplayValue(worksheet, message.payload.row, message.payload.col, targetSheet),\n formula: worksheet.getFormulaAt(message.payload.row, message.payload.col) ?? \"\"\n };\n }\n case \"getRowsBatch\": {\n if (!workbook) {\n return null;\n }\n\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex) as ReturnType<Workbook[\"getSheet\"]> & {\n getRowsBatch?: (startRow: number, maxRows: number, options?: unknown) => unknown;\n };\n if (typeof worksheet.getRowsBatch !== \"function\") {\n return null;\n }\n\n return worksheet.getRowsBatch(message.payload.startRow, message.payload.rowCount, {\n includeFormulas: true,\n includeHyperlinks: true,\n includeMergeInfo: true,\n includeStyles: true,\n useFormattedValues: true\n }) as unknown[] | null;\n }\n default:\n return null;\n }\n}\n\nself.addEventListener(\"message\", (event: MessageEvent<WorkerRequest>) => {\n const message = event.data;\n void handleMessage(message)\n .then((result) => {\n respond({\n id: message.id,\n result,\n success: true\n });\n })\n .catch((error: unknown) => {\n respond({\n error: error instanceof Error ? error.message : \"Worker request failed.\",\n id: message.id,\n success: false\n } satisfies WorkerErrorResponse);\n });\n});\n"],"mappings":"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","names":["styleAppearance","plotAreaShapeProperties","workbook","primarySeries","ext","cx","cy","chartsheets","chartsByWorkbookSheetIndex","tabs","strFromU8","strToU8","normalizeHexColor","parseHexColor","rgbToHsl","hueToRgb","hslToRgb","rgbToHex","EMU_PER_PIXEL","normalizeArchivePath","dirname","dirname","parseXml","document","readArchiveText","strFromU8","isElementNode","document","parseXml","readArchiveText","document","parseXml","normalizeArchivePath","readArchiveText","document","parseXml","sheets","isElementNode","normalizeHexColor","normalizeHexColor","workbook","normalizeWorksheetVisibility","parseA1CellReference","parseA1RangeReference"]}
|