|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if (!String.prototype.replaceAll) { | 
					
						
						|  | String.prototype.replaceAll = function (str, newStr) { | 
					
						
						|  |  | 
					
						
						|  | if ( | 
					
						
						|  | Object.prototype.toString.call(str).toLowerCase() === "[object regexp]" | 
					
						
						|  | ) { | 
					
						
						|  | return this.replace(str, newStr); | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | return this.replace(new RegExp(str, "g"), newStr); | 
					
						
						|  | }; | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | const mermaidOpts = { | 
					
						
						|  | startOnLoad: false, | 
					
						
						|  | }; | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | const defaultCSS = | 
					
						
						|  | '.label text {fill: var(--mermaid-fg-color);}.node circle, .node ellipse, .node path, .node polygon, .node rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}marker {fill: var(--mermaid-edge-color) !important;}.edgeLabel .label rect {fill: #0000;}.label {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.label foreignObject {line-height: normal;overflow: visible;}.label div .edgeLabel {color: var(--mermaid-label-fg-color);}.edgeLabel, .edgeLabel rect, .label div .edgeLabel {background-color: var(--mermaid-label-bg-color);}.edgeLabel, .edgeLabel rect {fill: var(--mermaid-label-bg-color);color: var(--mermaid-edge-color);}.edgePath .path, .flowchart-link {stroke: var(--mermaid-edge-color);}.edgePath .arrowheadPath {fill: var(--mermaid-edge-color);stroke: none;}.cluster rect {fill: var(--mermaid-fg-color--lightest);stroke: var(--mermaid-fg-color--lighter);}.cluster span {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}defs #flowchart-circleEnd, defs #flowchart-circleStart, defs #flowchart-crossEnd, defs #flowchart-crossStart, defs #flowchart-pointEnd, defs #flowchart-pointStart {stroke: none;}g.classGroup line, g.classGroup rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}g.classGroup text {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.classLabel .box {fill: var(--mermaid-label-bg-color);background-color: var(--mermaid-label-bg-color);opacity: 1;}.classLabel .label {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.node .divider {stroke: var(--mermaid-node-fg-color);}.relation {stroke: var(--mermaid-edge-color);}.cardinality {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.cardinality text {fill: inherit !important;}defs #classDiagram-compositionEnd, defs #classDiagram-compositionStart, defs #classDiagram-dependencyEnd, defs #classDiagram-dependencyStart, defs #classDiagram-extensionEnd, defs #classDiagram-extensionStart {fill: var(--mermaid-edge-color) !important;stroke: var(--mermaid-edge-color) !important;}defs #classDiagram-aggregationEnd, defs #classDiagram-aggregationStart {fill: var(--mermaid-label-bg-color) !important;stroke: var(--mermaid-edge-color) !important;}g.stateGroup rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}g.stateGroup .state-title {fill: var(--mermaid-label-fg-color) !important;font-family: var(--mermaid-font-family);}g.stateGroup .composit {fill: var(--mermaid-label-bg-color);}.nodeLabel {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.node circle.state-end, .node circle.state-start, .start-state {fill: var(--mermaid-edge-color);stroke: none;}.end-state-inner, .end-state-outer {fill: var(--mermaid-edge-color);}.end-state-inner, .node circle.state-end {stroke: var(--mermaid-label-bg-color);}.transition {stroke: var(--mermaid-edge-color);}[id^="state-fork"] rect, [id^="state-join"] rect {fill: var(--mermaid-edge-color) !important;stroke: none !important;}.statediagram-cluster.statediagram-cluster .inner {fill: var(--mermaid-bg-color);}.statediagram-cluster rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}.statediagram-state rect.divider {fill: var(--mermaid-fg-color--lightest);stroke: var(--mermaid-fg-color--lighter);}defs #statediagram-barbEnd {stroke: var(--mermaid-edge-color);}.entityBox {fill: var(--mermaid-label-bg-color);stroke: var(--mermaid-node-fg-color);}.entityLabel {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.relationshipLabelBox {fill: var(--mermaid-label-bg-color);fill-opacity: 1;background-color: var(--mermaid-label-bg-color);opacity: 1;}.relationshipLabel {fill: var(--mermaid-label-fg-color);}.relationshipLine {stroke: var(--mermaid-edge-color);}defs #ONE_OR_MORE_END *, defs #ONE_OR_MORE_START *, defs #ONLY_ONE_END *, defs #ONLY_ONE_START *, defs #ZERO_OR_MORE_END *, defs #ZERO_OR_MORE_START *, defs #ZERO_OR_ONE_END *, defs #ZERO_OR_ONE_START * {stroke: var(--mermaid-edge-color) !important;}.actor, defs #ZERO_OR_MORE_END circle, defs #ZERO_OR_MORE_START circle {fill: var(--mermaid-label-bg-color);}.actor {stroke: var(--mermaid-node-fg-color);}text.actor > tspan {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}line {stroke: var(--mermaid-fg-color--lighter);}.messageLine0, .messageLine1 {stroke: var(--mermaid-edge-color);}.loopText > tspan, .messageText, .noteText > tspan {fill: var(--mermaid-edge-color);stroke: none;font-family: var(--mermaid-font-family) !important;}.noteText > tspan {fill: #000;}#arrowhead path {fill: var(--mermaid-edge-color);stroke: none;}.loopLine {stroke: var(--mermaid-node-fg-color);}.labelBox, .loopLine {fill: var(--mermaid-node-bg-color);}.labelBox {stroke: none;}.labelText, .labelText > span {fill: var(--mermaid-node-fg-color);font-family: var(--mermaid-font-family);}'; | 
					
						
						|  |  | 
					
						
						|  | const mermaidThemeEl = document.querySelector('meta[name="mermaid-theme"]'); | 
					
						
						|  | if (mermaidThemeEl) { | 
					
						
						|  | mermaidOpts.theme = mermaidThemeEl.content; | 
					
						
						|  | } else { | 
					
						
						|  | mermaidOpts.themeCSS = defaultCSS; | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | mermaid.initialize(mermaidOpts); | 
					
						
						|  |  | 
					
						
						|  | const _quartoMermaid = { | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | setSvgSize(svg) { | 
					
						
						|  | const { widthInPoints, heightInPoints, explicitHeight, explicitWidth } = | 
					
						
						|  | this.resolveSize(svg); | 
					
						
						|  |  | 
					
						
						|  | if (explicitWidth && explicitHeight) { | 
					
						
						|  | svg.setAttribute("width", widthInPoints); | 
					
						
						|  | svg.setAttribute("height", heightInPoints); | 
					
						
						|  | svg.style.maxWidth = null; | 
					
						
						|  | } else { | 
					
						
						|  | if (explicitWidth) { | 
					
						
						|  | svg.style.maxWidth = `${widthInPoints}px`; | 
					
						
						|  | } | 
					
						
						|  | if (explicitHeight) { | 
					
						
						|  | svg.style.maxHeight = `${heightInPoints}px`; | 
					
						
						|  | } | 
					
						
						|  | } | 
					
						
						|  | }, | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | makeResponsive(svg) { | 
					
						
						|  | const width = svg.getAttribute("width"); | 
					
						
						|  | if (width === null) { | 
					
						
						|  | throw new Error("Couldn't find SVG width"); | 
					
						
						|  | } | 
					
						
						|  | const numWidth = Number(width.slice(0, -2)); | 
					
						
						|  |  | 
					
						
						|  | if (numWidth > 650) { | 
					
						
						|  | changed = true; | 
					
						
						|  | svg.setAttribute("width", "100%"); | 
					
						
						|  | svg.removeAttribute("height"); | 
					
						
						|  | } | 
					
						
						|  | }, | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | fixupAlignment(svg, align) { | 
					
						
						|  | let style = svg.getAttribute("style") || ""; | 
					
						
						|  |  | 
					
						
						|  | switch (align) { | 
					
						
						|  | case "left": | 
					
						
						|  | style = `${style}; display: block; margin: auto auto auto 0`; | 
					
						
						|  | break; | 
					
						
						|  | case "right": | 
					
						
						|  | style = `${style}; display: block; margin: auto 0 auto auto`; | 
					
						
						|  | break; | 
					
						
						|  | case "center": | 
					
						
						|  | style = `${style}; display: block; margin: auto auto auto auto`; | 
					
						
						|  | break; | 
					
						
						|  | } | 
					
						
						|  | svg.setAttribute("style", style); | 
					
						
						|  | }, | 
					
						
						|  |  | 
					
						
						|  | resolveOptions(svgEl) { | 
					
						
						|  | return svgEl.parentElement.parentElement.parentElement.parentElement | 
					
						
						|  | .dataset; | 
					
						
						|  | }, | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | resolveSize(svgEl) { | 
					
						
						|  | const inInches = (size) => { | 
					
						
						|  | if (size.endsWith("in")) { | 
					
						
						|  | return Number(size.slice(0, -2)); | 
					
						
						|  | } | 
					
						
						|  | if (size.endsWith("pt") || size.endsWith("px")) { | 
					
						
						|  |  | 
					
						
						|  | return Number(size.slice(0, -2)) / 96; | 
					
						
						|  | } | 
					
						
						|  | return Number(size); | 
					
						
						|  | }; | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | const kFigWidth = "figWidth", | 
					
						
						|  | kFigHeight = "figHeight"; | 
					
						
						|  | const options = this.resolveOptions(svgEl); | 
					
						
						|  | let width = svgEl.getAttribute("width"); | 
					
						
						|  | let height = svgEl.getAttribute("height"); | 
					
						
						|  | const getViewBox = () => { | 
					
						
						|  | const vb = svgEl.attributes.getNamedItem("viewBox").value; | 
					
						
						|  | if (!vb) return undefined; | 
					
						
						|  | const lst = vb.trim().split(" ").map(Number); | 
					
						
						|  | if (lst.length !== 4) return undefined; | 
					
						
						|  | if (lst.some(isNaN)) return undefined; | 
					
						
						|  | return lst; | 
					
						
						|  | }; | 
					
						
						|  | if (!width || !height) { | 
					
						
						|  |  | 
					
						
						|  | const viewBox = getViewBox(); | 
					
						
						|  | if (viewBox !== undefined) { | 
					
						
						|  | const [_mx, _my, vbWidth, vbHeight] = viewBox; | 
					
						
						|  | width = `${vbWidth}px`; | 
					
						
						|  | height = `${vbHeight}px`; | 
					
						
						|  | } else { | 
					
						
						|  | throw new Error( | 
					
						
						|  | "Mermaid generated an SVG without a viewbox attribute. Without knowing the diagram dimensions, quarto cannot convert it to a PNG" | 
					
						
						|  | ); | 
					
						
						|  | } | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | let svgWidthInInches, svgHeightInInches; | 
					
						
						|  |  | 
					
						
						|  | if ( | 
					
						
						|  | (width.slice(0, -2) === "pt" && height.slice(0, -2) === "pt") || | 
					
						
						|  | (width.slice(0, -2) === "px" && height.slice(0, -2) === "px") || | 
					
						
						|  | (!isNaN(Number(width)) && !isNaN(Number(height))) | 
					
						
						|  | ) { | 
					
						
						|  |  | 
					
						
						|  | svgWidthInInches = Number(width.slice(0, -2)) / 96; | 
					
						
						|  | svgHeightInInches = Number(height.slice(0, -2)) / 96; | 
					
						
						|  | } | 
					
						
						|  | const viewBox = getViewBox(); | 
					
						
						|  | if (viewBox !== undefined) { | 
					
						
						|  |  | 
					
						
						|  | const [_mx, _my, vbWidth, vbHeight] = viewBox; | 
					
						
						|  | svgWidthInInches = vbWidth / 96; | 
					
						
						|  | svgHeightInInches = vbHeight / 96; | 
					
						
						|  | } else { | 
					
						
						|  | throw new Error( | 
					
						
						|  | "Internal Error: Couldn't resolve width and height of SVG" | 
					
						
						|  | ); | 
					
						
						|  | } | 
					
						
						|  | const svgWidthOverHeight = svgWidthInInches / svgHeightInInches; | 
					
						
						|  | let widthInInches, heightInInches; | 
					
						
						|  |  | 
					
						
						|  | if (options[kFigWidth] && options[kFigHeight]) { | 
					
						
						|  |  | 
					
						
						|  | widthInInches = inInches(String(options[kFigWidth])); | 
					
						
						|  | heightInInches = inInches(String(options[kFigHeight])); | 
					
						
						|  | } else if (options[kFigWidth]) { | 
					
						
						|  |  | 
					
						
						|  | widthInInches = inInches(String(options[kFigWidth])); | 
					
						
						|  | heightInInches = widthInInches / svgWidthOverHeight; | 
					
						
						|  | } else if (options[kFigHeight]) { | 
					
						
						|  |  | 
					
						
						|  | heightInInches = inInches(String(options[kFigHeight])); | 
					
						
						|  | widthInInches = heightInInches * svgWidthOverHeight; | 
					
						
						|  | } else { | 
					
						
						|  |  | 
					
						
						|  | heightInInches = svgHeightInInches; | 
					
						
						|  | widthInInches = svgWidthInInches; | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | return { | 
					
						
						|  | widthInInches, | 
					
						
						|  | heightInInches, | 
					
						
						|  | widthInPoints: Math.round(widthInInches * 96), | 
					
						
						|  | heightInPoints: Math.round(heightInInches * 96), | 
					
						
						|  | explicitWidth: options?.[kFigWidth] !== undefined, | 
					
						
						|  | explicitHeight: options?.[kFigHeight] !== undefined, | 
					
						
						|  | }; | 
					
						
						|  | }, | 
					
						
						|  |  | 
					
						
						|  | postProcess(svg) { | 
					
						
						|  | const options = this.resolveOptions(svg); | 
					
						
						|  | if ( | 
					
						
						|  | options.responsive && | 
					
						
						|  | options["figWidth"] === undefined && | 
					
						
						|  | options["figHeight"] === undefined | 
					
						
						|  | ) { | 
					
						
						|  | this.makeResponsive(svg); | 
					
						
						|  | } else { | 
					
						
						|  | this.setSvgSize(svg); | 
					
						
						|  | } | 
					
						
						|  | if (options["reveal"]) { | 
					
						
						|  | this.fixupAlignment(svg, options["figAlign"] || "center"); | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | const div = svg.parentElement.parentElement.parentElement; | 
					
						
						|  | const align = div.parentElement.parentElement.dataset.layoutAlign; | 
					
						
						|  | if (align) { | 
					
						
						|  | div.classList.remove("quarto-figure-left"); | 
					
						
						|  | div.classList.remove("quarto-figure-center"); | 
					
						
						|  | div.classList.remove("quarto-figure-right"); | 
					
						
						|  | div.classList.add(`quarto-figure-${align}`); | 
					
						
						|  | } | 
					
						
						|  | }, | 
					
						
						|  | }; | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | window.addEventListener( | 
					
						
						|  | "load", | 
					
						
						|  | async function () { | 
					
						
						|  | let i = 0; | 
					
						
						|  |  | 
					
						
						|  | for (const el of Array.from(document.querySelectorAll("pre.mermaid-js"))) { | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | const text = el.innerText.replaceAll(" ", " "); | 
					
						
						|  | const { svg: output } = await mermaid.mermaidAPI.render( | 
					
						
						|  | `mermaid-${++i}`, | 
					
						
						|  | text, | 
					
						
						|  | el | 
					
						
						|  | ); | 
					
						
						|  | el.innerHTML = output; | 
					
						
						|  | if (el.dataset.label) { | 
					
						
						|  |  | 
					
						
						|  | const svg = el.firstChild; | 
					
						
						|  | const style = svg.querySelector("style"); | 
					
						
						|  | style.innerHTML = style.innerHTML.replaceAll( | 
					
						
						|  | `#${svg.id}`, | 
					
						
						|  | `#${el.dataset.label}` | 
					
						
						|  | ); | 
					
						
						|  | svg.id = el.dataset.label; | 
					
						
						|  | delete el.dataset.label; | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  | const svg = el.querySelector("svg"); | 
					
						
						|  | const parent = el.parentElement; | 
					
						
						|  | parent.removeChild(el); | 
					
						
						|  | parent.appendChild(svg); | 
					
						
						|  | svg.classList.add("mermaid-js"); | 
					
						
						|  | } | 
					
						
						|  | for (const svgEl of Array.from( | 
					
						
						|  | document.querySelectorAll("svg.mermaid-js") | 
					
						
						|  | )) { | 
					
						
						|  | _quartoMermaid.postProcess(svgEl); | 
					
						
						|  | } | 
					
						
						|  | }, | 
					
						
						|  | false | 
					
						
						|  | ); | 
					
						
						|  |  |