mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines • 112 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/rendering-util/rendering-elements/edgeMarker.ts", "../../../src/rendering-util/rendering-elements/edges.js", "../../../src/rendering-util/rendering-elements/markers.js"],
"sourcesContent": ["import type { SVG } from '../../diagram-api/types.js';\nimport { log } from '../../logger.js';\nimport type { EdgeData } from '../../types.js';\n/**\n * Adds SVG markers to a path element based on the arrow types specified in the edge.\n *\n * @param svgPath - The SVG path element to add markers to.\n * @param edge - The edge data object containing the arrow types.\n * @param url - The URL of the SVG marker definitions.\n * @param id - The ID prefix for the SVG marker definitions.\n * @param diagramType - The type of diagram being rendered.\n */\nexport const addEdgeMarkers = (\n svgPath: SVG,\n edge: Pick<EdgeData, 'arrowTypeStart' | 'arrowTypeEnd'>,\n url: string,\n id: string,\n diagramType: string,\n useMargin = false,\n strokeColor?: string\n) => {\n if (edge.arrowTypeStart) {\n addEdgeMarker(\n svgPath,\n 'start',\n edge.arrowTypeStart,\n url,\n id,\n diagramType,\n useMargin,\n strokeColor\n );\n }\n if (edge.arrowTypeEnd) {\n addEdgeMarker(svgPath, 'end', edge.arrowTypeEnd, url, id, diagramType, useMargin, strokeColor);\n }\n};\n\nconst arrowTypesMap = {\n arrow_cross: { type: 'cross', fill: false },\n arrow_point: { type: 'point', fill: true },\n arrow_barb: { type: 'barb', fill: true },\n arrow_barb_neo: { type: 'barb', fill: true },\n arrow_circle: { type: 'circle', fill: false },\n aggregation: { type: 'aggregation', fill: false },\n extension: { type: 'extension', fill: false },\n composition: { type: 'composition', fill: true },\n dependency: { type: 'dependency', fill: true },\n lollipop: { type: 'lollipop', fill: false },\n only_one: { type: 'onlyOne', fill: false },\n zero_or_one: { type: 'zeroOrOne', fill: false },\n one_or_more: { type: 'oneOrMore', fill: false },\n zero_or_more: { type: 'zeroOrMore', fill: false },\n requirement_arrow: { type: 'requirement_arrow', fill: false },\n requirement_contains: { type: 'requirement_contains', fill: false },\n} as const;\n\nconst arrowTypesWithMarginSupport = [\n 'cross',\n 'point',\n 'circle',\n 'lollipop',\n 'aggregation',\n 'extension',\n 'composition',\n 'dependency',\n 'barb',\n];\n\nconst addEdgeMarker = (\n svgPath: SVG,\n position: 'start' | 'end',\n arrowType: string,\n url: string,\n id: string,\n diagramType: string,\n useMargin = false,\n strokeColor?: string\n) => {\n const arrowTypeInfo = arrowTypesMap[arrowType as keyof typeof arrowTypesMap];\n const marginSupport = arrowTypeInfo && arrowTypesWithMarginSupport.includes(arrowTypeInfo.type);\n\n if (!arrowTypeInfo) {\n log.warn(`Unknown arrow type: ${arrowType}`);\n return; // unknown arrow type, ignore\n }\n\n const endMarkerType = arrowTypeInfo.type;\n const suffix = position === 'start' ? 'Start' : 'End';\n\n const offset = useMargin && marginSupport ? '-margin' : '';\n const originalMarkerId = `${id}_${diagramType}-${endMarkerType}${suffix}${offset}`;\n\n // If stroke color is specified and non-empty, create or use a colored variant of the marker\n if (strokeColor && strokeColor.trim() !== '') {\n // Create a sanitized color value for use in IDs\n const colorId = strokeColor.replace(/[^\\dA-Za-z]/g, '_');\n const coloredMarkerId = `${originalMarkerId}_${colorId}`;\n\n // Check if the colored marker already exists\n if (!document.getElementById(coloredMarkerId)) {\n // Get the original marker\n const originalMarker = document.getElementById(originalMarkerId);\n if (originalMarker) {\n // Clone the marker and create colored version\n const coloredMarker = originalMarker.cloneNode(true) as Element;\n coloredMarker.id = coloredMarkerId;\n\n // Apply colors to the paths inside the marker\n const paths = coloredMarker.querySelectorAll('path, circle, line');\n paths.forEach((path) => {\n path.setAttribute('stroke', strokeColor);\n\n // Apply fill only to markers that should be filled\n if (arrowTypeInfo.fill) {\n path.setAttribute('fill', strokeColor);\n }\n });\n\n // Add the new colored marker to the defs section\n originalMarker.parentNode?.appendChild(coloredMarker);\n }\n }\n\n // Use the colored marker\n svgPath.attr(`marker-${position}`, `url(${url}#${coloredMarkerId})`);\n } else {\n // Always use the original marker for unstyled edges\n svgPath.attr(`marker-${position}`, `url(${url}#${originalMarkerId})`);\n }\n};\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { getEffectiveHtmlLabels } from '../../config.js';\nimport { log } from '../../logger.js';\nimport { createText } from '../createText.js';\nimport { computeLabelTransform } from '../labelTransform.js';\nimport utils, { handleUndefinedAttr } from '../../utils.js';\nimport {\n getLineFunctionsWithOffset,\n markerOffsets,\n markerOffsets2,\n} from '../../utils/lineWithOffset.js';\nimport { getSubGraphTitleMargins } from '../../utils/subGraphTitleMargins.js';\n\nimport {\n curveBasis,\n curveLinear,\n curveCardinal,\n curveBumpX,\n curveBumpY,\n curveCatmullRom,\n curveMonotoneX,\n curveMonotoneY,\n curveNatural,\n curveStep,\n curveStepAfter,\n curveStepBefore,\n line,\n select,\n} from 'd3';\nimport rough from 'roughjs';\nimport createLabel from './createLabel.js';\nimport { addEdgeMarkers } from './edgeMarker.ts';\nimport { isLabelStyle, styles2String } from './shapes/handDrawnShapeStyles.js';\n\n/**\n * Resolve the effective curve type for an edge.\n * If edge.curve is a string (e.g. 'rounded', 'linear'), use it directly.\n * Otherwise (undefined, null, or a D3 CurveFactory function), fall back to config.\n * @param {*} edgeCurve - The edge.curve value (string, function, or undefined/null)\n * @returns {string|undefined} - The resolved curve type string\n */\nexport const resolveEdgeCurveType = (edgeCurve) => {\n return typeof edgeCurve === 'string' ? edgeCurve : getConfig()?.flowchart?.curve;\n};\n\nexport const edgeLabels = new Map();\nexport const terminalLabels = new Map();\n\nexport const clear = () => {\n edgeLabels.clear();\n terminalLabels.clear();\n};\n\nexport const getLabelStyles = (styleArray) => {\n if (!styleArray) {\n return '';\n }\n if (typeof styleArray === 'string') {\n return styleArray;\n }\n return styleArray.reduce((acc, style) => acc + ';' + style, '');\n};\n\nexport const insertEdgeLabel = async (elem, edge) => {\n const config = getConfig();\n let useHtmlLabels = getEffectiveHtmlLabels(config);\n const { labelStyles } = styles2String(edge);\n edge.labelStyle = labelStyles;\n\n // Create outer g, edgeLabel, this will be positioned after graph layout\n const edgeLabel = elem.insert('g').attr('class', 'edgeLabel');\n\n // Create inner g, label, this will be positioned now for centering the text\n const label = edgeLabel.insert('g').attr('class', 'label').attr('data-id', edge.id);\n\n const isMarkdown = edge.labelType === 'markdown';\n const markdownWidth = undefined; // Use default width for markdown labels\n const labelElement = await createText(\n elem,\n edge.label,\n {\n style: getLabelStyles(edge.labelStyle),\n useHtmlLabels,\n addSvgBackground: true,\n isNode: false,\n markdown: isMarkdown,\n // Plain text edge labels should auto-wrap, markdown edge labels respect markdownAutoWrap config\n width: isMarkdown ? markdownWidth : undefined,\n },\n config\n );\n\n label.node().appendChild(labelElement);\n log.info('abc82', edge, edge.labelType);\n\n // Center the label\n let bbox = labelElement.getBBox();\n let transformBbox = bbox;\n if (useHtmlLabels) {\n const div = labelElement.children[0];\n const dv = select(labelElement);\n bbox = div.getBoundingClientRect();\n transformBbox = bbox;\n dv.attr('width', bbox.width);\n dv.attr('height', bbox.height);\n } else {\n // For SVG labels, use text element's bbox so the text is centered on the edge\n const textEl = select(labelElement).select('text').node();\n if (textEl && typeof textEl.getBBox === 'function') {\n transformBbox = textEl.getBBox();\n }\n }\n label.attr('transform', computeLabelTransform(transformBbox, useHtmlLabels));\n\n // Make element accessible by id for positioning\n edgeLabels.set(edge.id, edgeLabel);\n\n // Update the abstract data of the edge with the new information about its width and height\n edge.width = bbox.width;\n edge.height = bbox.height;\n\n let fo;\n if (edge.startLabelLeft) {\n // Create the actual text element\n const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner');\n const startLabelElement = await createLabel(\n inner,\n edge.startLabelLeft,\n getLabelStyles(edge.labelStyle) || '',\n false,\n false\n );\n fo = startLabelElement;\n let slBox = startLabelElement.getBBox();\n if (useHtmlLabels) {\n const div = startLabelElement.children[0];\n const dv = select(startLabelElement);\n slBox = div.getBoundingClientRect();\n dv.attr('width', slBox.width);\n dv.attr('height', slBox.height);\n }\n inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).startLeft = startEdgeLabelLeft;\n setTerminalWidth(fo, edge.startLabelLeft);\n }\n if (edge.startLabelRight) {\n const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n const inner = startEdgeLabelRight.insert('g').attr('class', 'inner');\n const startLabelElement = await createLabel(\n inner,\n edge.startLabelRight,\n getLabelStyles(edge.labelStyle) || '',\n false,\n false\n );\n fo = startLabelElement;\n let slBox = startLabelElement.getBBox();\n if (useHtmlLabels) {\n const div = startLabelElement.children[0];\n const dv = select(startLabelElement);\n slBox = div.getBoundingClientRect();\n dv.attr('width', slBox.width);\n dv.attr('height', slBox.height);\n }\n inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).startRight = startEdgeLabelRight;\n setTerminalWidth(fo, edge.startLabelRight);\n }\n if (edge.endLabelLeft) {\n const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n // TODO: Remove? `inner` is not used\n const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n const endLabelElement = await createLabel(\n endEdgeLabelLeft,\n edge.endLabelLeft,\n getLabelStyles(edge.labelStyle) || '',\n false,\n false\n );\n fo = endLabelElement;\n let slBox = endLabelElement.getBBox();\n if (useHtmlLabels) {\n const div = endLabelElement.children[0];\n const dv = select(endLabelElement);\n slBox = div.getBoundingClientRect();\n dv.attr('width', slBox.width);\n dv.attr('height', slBox.height);\n }\n inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).endLeft = endEdgeLabelLeft;\n setTerminalWidth(fo, edge.endLabelLeft);\n }\n if (edge.endLabelRight) {\n const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n // TODO: Remove? `inner` is not used\n const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n\n const endLabelElement = await createLabel(\n endEdgeLabelRight,\n edge.endLabelRight,\n getLabelStyles(edge.labelStyle) || '',\n false,\n false\n );\n fo = endLabelElement;\n let slBox = endLabelElement.getBBox();\n if (useHtmlLabels) {\n const div = endLabelElement.children[0];\n const dv = select(endLabelElement);\n slBox = div.getBoundingClientRect();\n dv.attr('width', slBox.width);\n dv.attr('height', slBox.height);\n }\n inner.attr('transform', computeLabelTransform(slBox, useHtmlLabels));\n\n if (!terminalLabels.get(edge.id)) {\n terminalLabels.set(edge.id, {});\n }\n terminalLabels.get(edge.id).endRight = endEdgeLabelRight;\n setTerminalWidth(fo, edge.endLabelRight);\n }\n return labelElement;\n};\n\n/**\n * @param {any} fo\n * @param {any} value\n */\nfunction setTerminalWidth(fo, value) {\n if (getEffectiveHtmlLabels(getConfig()) && fo) {\n fo.style.width = value.length * 9 + 'px';\n fo.style.height = '12px';\n }\n}\n\nexport const positionEdgeLabel = (edge, paths) => {\n log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels.get(edge.id), paths);\n let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n if (edge.label) {\n const el = edgeLabels.get(edge.id);\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils.calcLabelPosition(path);\n log.debug(\n 'Moving label ' + edge.label + ' from (',\n x,\n ',',\n y,\n ') to (',\n pos.x,\n ',',\n pos.y,\n ') abc88'\n );\n if (paths.updatedPath) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr('transform', `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n\n if (edge.startLabelLeft) {\n const el = terminalLabels.get(edge.id).startLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, 'start_left', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', `translate(${x}, ${y})`);\n }\n if (edge.startLabelRight) {\n const el = terminalLabels.get(edge.id).startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils.calcTerminalLabelPosition(\n edge.arrowTypeStart ? 10 : 0,\n 'start_right',\n path\n );\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', `translate(${x}, ${y})`);\n }\n if (edge.endLabelLeft) {\n const el = terminalLabels.get(edge.id).endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, 'end_left', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', `translate(${x}, ${y})`);\n }\n if (edge.endLabelRight) {\n const el = terminalLabels.get(edge.id).endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, 'end_right', path);\n x = pos.x;\n y = pos.y;\n }\n el.attr('transform', `translate(${x}, ${y})`);\n }\n};\n\n// Swimlanes-only helper, kept module-private: it self-gates to `-to-label` edges\n// (the swimlanes edge-label waypoint mechanism) and is called only from insertEdge's\n// `layout === 'swimlane'` branch, so it is a no-op for every other layout.\nconst orthogonalizeToLabelClippedPoints = (edge, points) => {\n if (!edge?.isLabelEdge || !edge?.id?.endsWith('-to-label') || !Array.isArray(points)) {\n return points;\n }\n\n if (points.length !== 2) {\n return points;\n }\n\n const [start, end] = points;\n const dx = Math.abs(end.x - start.x);\n const dy = Math.abs(end.y - start.y);\n\n if (dx < 1e-3 || dy < 1e-3) {\n return points;\n }\n\n if (dy >= dx) {\n return [start, { x: start.x, y: end.y }, end];\n }\n\n return [start, { x: end.x, y: start.y }, end];\n};\n\nconst outsideNode = (node, point) => {\n const x = node.x;\n const y = node.y;\n const dx = Math.abs(point.x - x);\n const dy = Math.abs(point.y - y);\n const w = node.width / 2;\n const h = node.height / 2;\n return dx >= w || dy >= h;\n};\n\nexport const intersection = (node, outsidePoint, insidePoint) => {\n log.debug(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(outsidePoint)}\n insidePoint : ${JSON.stringify(insidePoint)}\n node : x:${node.x} y:${node.y} w:${node.width} h:${node.height}`);\n const x = node.x;\n const y = node.y;\n\n const dx = Math.abs(x - insidePoint.x);\n const w = node.width / 2;\n let r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;\n const h = node.height / 2;\n\n const Q = Math.abs(outsidePoint.y - insidePoint.y);\n const R = Math.abs(outsidePoint.x - insidePoint.x);\n\n if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {\n // Intersection is top or bottom of rect.\n let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;\n r = (R * q) / Q;\n const res = {\n x: insidePoint.x < outsidePoint.x ? insidePoint.x + r : insidePoint.x - R + r,\n y: insidePoint.y < outsidePoint.y ? insidePoint.y + Q - q : insidePoint.y - Q + q,\n };\n\n if (r === 0) {\n res.x = outsidePoint.x;\n res.y = outsidePoint.y;\n }\n if (R === 0) {\n res.x = outsidePoint.x;\n }\n if (Q === 0) {\n res.y = outsidePoint.y;\n }\n\n log.debug(`abc89 top/bottom calc, Q ${Q}, q ${q}, R ${R}, r ${r}`, res);\n\n return res;\n } else {\n // Intersection on sides of rect\n if (insidePoint.x < outsidePoint.x) {\n r = outsidePoint.x - w - x;\n } else {\n r = x - w - outsidePoint.x;\n }\n let q = (Q * r) / R;\n let _x = insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - R + r;\n let _y = insidePoint.y < outsidePoint.y ? insidePoint.y + q : insidePoint.y - q;\n log.debug(`sides calc abc89, Q ${Q}, q ${q}, R ${R}, r ${r}`, { _x, _y });\n if (r === 0) {\n _x = outsidePoint.x;\n _y = outsidePoint.y;\n }\n if (R === 0) {\n _x = outsidePoint.x;\n }\n if (Q === 0) {\n _y = outsidePoint.y;\n }\n\n return { x: _x, y: _y };\n }\n};\n\nconst cutPathAtIntersect = (_points, boundaryNode) => {\n log.warn('abc88 cutPathAtIntersect', _points, boundaryNode);\n let points = [];\n let lastPointOutside = _points[0];\n let isInside = false;\n _points.forEach((point) => {\n log.info('abc88 checking point', point, boundaryNode);\n\n if (!outsideNode(boundaryNode, point) && !isInside) {\n const inter = intersection(boundaryNode, lastPointOutside, point);\n log.debug('abc88 inside', point, lastPointOutside, inter);\n log.debug('abc88 intersection', inter, boundaryNode);\n\n let pointPresent = false;\n points.forEach((p) => {\n pointPresent = pointPresent || (p.x === inter.x && p.y === inter.y);\n });\n\n if (!points.some((e) => e.x === inter.x && e.y === inter.y)) {\n points.push(inter);\n } else {\n log.warn('abc88 no intersect', inter, points);\n }\n isInside = true;\n } else {\n log.warn('abc88 outside', point, lastPointOutside);\n lastPointOutside = point;\n if (!isInside) {\n points.push(point);\n }\n }\n });\n log.debug('returning points', points);\n return points;\n};\n\nfunction extractCornerPoints(points) {\n const cornerPoints = [];\n const cornerPointPositions = [];\n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n if (\n prev.x === curr.x &&\n curr.y === next.y &&\n Math.abs(curr.x - next.x) > 5 &&\n Math.abs(curr.y - prev.y) > 5\n ) {\n cornerPoints.push(curr);\n cornerPointPositions.push(i);\n } else if (\n prev.y === curr.y &&\n curr.x === next.x &&\n Math.abs(curr.x - prev.x) > 5 &&\n Math.abs(curr.y - next.y) > 5\n ) {\n cornerPoints.push(curr);\n cornerPointPositions.push(i);\n }\n }\n return { cornerPoints, cornerPointPositions };\n}\n\nconst findAdjacentPoint = function (pointA, pointB, distance) {\n const xDiff = pointB.x - pointA.x;\n const yDiff = pointB.y - pointA.y;\n const length = Math.sqrt(xDiff * xDiff + yDiff * yDiff);\n const ratio = distance / length;\n return { x: pointB.x - ratio * xDiff, y: pointB.y - ratio * yDiff };\n};\n\nconst fixCorners = function (lineData) {\n const { cornerPointPositions } = extractCornerPoints(lineData);\n const newLineData = [];\n for (let i = 0; i < lineData.length; i++) {\n if (cornerPointPositions.includes(i)) {\n const prevPoint = lineData[i - 1];\n const nextPoint = lineData[i + 1];\n const cornerPoint = lineData[i];\n\n const newPrevPoint = findAdjacentPoint(prevPoint, cornerPoint, 5);\n const newNextPoint = findAdjacentPoint(nextPoint, cornerPoint, 5);\n\n const xDiff = newNextPoint.x - newPrevPoint.x;\n const yDiff = newNextPoint.y - newPrevPoint.y;\n newLineData.push(newPrevPoint);\n\n const a = Math.sqrt(2) * 2;\n let newCornerPoint = { x: cornerPoint.x, y: cornerPoint.y };\n if (Math.abs(nextPoint.x - prevPoint.x) > 10 && Math.abs(nextPoint.y - prevPoint.y) >= 10) {\n log.debug(\n 'Corner point fixing',\n Math.abs(nextPoint.x - prevPoint.x),\n Math.abs(nextPoint.y - prevPoint.y)\n );\n const r = 5;\n if (cornerPoint.x === newPrevPoint.x) {\n newCornerPoint = {\n x: xDiff < 0 ? newPrevPoint.x - r + a : newPrevPoint.x + r - a,\n y: yDiff < 0 ? newPrevPoint.y - a : newPrevPoint.y + a,\n };\n } else {\n newCornerPoint = {\n x: xDiff < 0 ? newPrevPoint.x - a : newPrevPoint.x + a,\n y: yDiff < 0 ? newPrevPoint.y - r + a : newPrevPoint.y + r - a,\n };\n }\n } else {\n log.debug(\n 'Corner point skipping fixing',\n Math.abs(nextPoint.x - prevPoint.x),\n Math.abs(nextPoint.y - prevPoint.y)\n );\n }\n newLineData.push(newCornerPoint, newNextPoint);\n } else {\n newLineData.push(lineData[i]);\n }\n }\n return newLineData;\n};\n\nconst generateDashArray = (len, oValueS, oValueE) => {\n const middleLength = len - oValueS - oValueE;\n const dashLength = 2; // Length of each dash\n const gapLength = 2; // Length of each gap\n const dashGapPairLength = dashLength + gapLength;\n\n // Calculate number of complete dash-gap pairs that can fit\n const numberOfPairs = Math.floor(middleLength / dashGapPairLength);\n\n // Generate the middle pattern array\n const middlePattern = Array(numberOfPairs).fill(`${dashLength} ${gapLength}`).join(' ');\n\n // Combine all parts\n const dashArray = `0 ${oValueS} ${middlePattern} ${oValueE}`;\n\n return dashArray;\n};\n\nexport const insertEdge = function (\n elem,\n edge,\n clusterDb,\n diagramType,\n startNode,\n endNode,\n diagramId,\n skipIntersect = false\n) {\n if (!diagramId) {\n throw new Error(\n `insertEdge: missing diagramId for edge \"${edge.id}\" \u2014 edge IDs require a diagram prefix for uniqueness`\n );\n }\n const { handDrawnSeed, layout } = getConfig();\n let points = edge.points;\n let pointsHasChanged = false;\n const tail = startNode;\n var head = endNode;\n const edgeClassStyles = [];\n for (const key in edge.cssCompiledStyles) {\n if (isLabelStyle(key)) {\n continue;\n }\n edgeClassStyles.push(edge.cssCompiledStyles[key]);\n }\n\n // Edge endpoint clipping. The swimlanes layout produces orthogonal edges whose\n // axis-aligned entry/exit segments must be preserved, so it uses a dedicated\n // boundary-clipping path. Every other layout (dagre, ELK, \u2026) keeps the original\n // clipping below, so their edge ports are unaffected by swimlanes.\n if (layout === 'swimlane') {\n if (head.intersect && tail.intersect && Array.isArray(points) && points.length >= 2) {\n if (points.length === 2) {\n // Simple straight edge: just clip the two endpoints to the node boundaries.\n points = [tail.intersect(points[0]), head.intersect(points[1])];\n } else {\n // For multi-segment paths, keep the inner bend points and just adjust the entry/exit\n // segments near the nodes.\n const innerPoints = points.slice(1, -1);\n const firstInner = innerPoints[0];\n const lastInner = innerPoints[innerPoints.length - 1];\n const TOLERANCE = 0.5;\n const lastIsPinned =\n Math.abs(points[points.length - 1].x - lastInner.x) < TOLERANCE &&\n Math.abs(points[points.length - 1].y - lastInner.y) < TOLERANCE;\n\n const newFirst = tail.intersect(firstInner);\n const newLast = lastIsPinned ? lastInner : head.intersect(lastInner);\n\n // When the boundary intersection lands ~on the inner point, skip it to\n // avoid a zero-length final segment (keeps the entry/exit segment orthogonal).\n const lastIsDuplicate =\n Math.abs(newLast.x - lastInner.x) < TOLERANCE &&\n Math.abs(newLast.y - lastInner.y) < TOLERANCE;\n const firstIsDuplicate =\n Math.abs(newFirst.x - firstInner.x) < TOLERANCE &&\n Math.abs(newFirst.y - firstInner.y) < TOLERANCE;\n\n const startPoints = firstIsDuplicate ? [] : [newFirst];\n const endPoints = lastIsDuplicate ? [] : [newLast];\n\n points = [...startPoints, ...innerPoints, ...endPoints];\n }\n }\n points = orthogonalizeToLabelClippedPoints(edge, points);\n } else if (head.intersect && tail.intersect && !skipIntersect) {\n // Original clipping \u2014 unchanged for dagre / ELK / every non-swimlanes layout.\n points = points.slice(1, edge.points.length - 1);\n points.unshift(tail.intersect(points[0]));\n points.push(head.intersect(points[points.length - 1]));\n }\n const pointsStr = btoa(JSON.stringify(points));\n if (edge.toCluster) {\n log.info('to cluster abc88', clusterDb.get(edge.toCluster));\n points = cutPathAtIntersect(edge.points, clusterDb.get(edge.toCluster).node);\n\n pointsHasChanged = true;\n }\n\n if (edge.fromCluster) {\n log.debug(\n 'from cluster abc88',\n clusterDb.get(edge.fromCluster),\n JSON.stringify(points, null, 2)\n );\n points = cutPathAtIntersect(points.reverse(), clusterDb.get(edge.fromCluster).node).reverse();\n\n pointsHasChanged = true;\n }\n\n let lineData = points.filter((p) => !Number.isNaN(p.y));\n // Resolve curve type: use edge.curve if it's a string, otherwise fall back to config default\n const edgeCurveType = resolveEdgeCurveType(edge.curve);\n // Apply fixCorners for non-rounded curves to pre-round right-angle corners\n // (rounded curve type uses generateRoundedPath instead)\n if (edgeCurveType !== 'rounded') {\n lineData = fixCorners(lineData);\n }\n let curve = curveLinear;\n switch (edgeCurveType) {\n case 'linear':\n curve = curveLinear;\n break;\n case 'basis':\n curve = curveBasis;\n break;\n case 'cardinal':\n curve = curveCardinal;\n break;\n case 'bumpX':\n curve = curveBumpX;\n break;\n case 'bumpY':\n curve = curveBumpY;\n break;\n case 'catmullRom':\n curve = curveCatmullRom;\n break;\n case 'monotoneX':\n curve = curveMonotoneX;\n break;\n case 'monotoneY':\n curve = curveMonotoneY;\n break;\n case 'natural':\n curve = curveNatural;\n break;\n case 'step':\n curve = curveStep;\n break;\n case 'stepAfter':\n curve = curveStepAfter;\n break;\n case 'stepBefore':\n curve = curveStepBefore;\n break;\n case 'rounded':\n curve = curveLinear;\n break;\n default:\n curve = curveBasis;\n }\n\n const { x, y } = getLineFunctionsWithOffset(edge);\n const lineFunction = line().x(x).y(y).curve(curve);\n\n let strokeClasses;\n switch (edge.thickness) {\n case 'normal':\n strokeClasses = 'edge-thickness-normal';\n break;\n case 'thick':\n strokeClasses = 'edge-thickness-thick';\n break;\n case 'invisible':\n strokeClasses = 'edge-thickness-invisible';\n break;\n default:\n strokeClasses = 'edge-thickness-normal';\n }\n switch (edge.pattern) {\n case 'solid':\n strokeClasses += ' edge-pattern-solid';\n break;\n case 'dotted':\n strokeClasses += ' edge-pattern-dotted';\n break;\n case 'dashed':\n strokeClasses += ' edge-pattern-dashed';\n break;\n default:\n strokeClasses += ' edge-pattern-solid';\n }\n let svgPath;\n let linePath =\n edgeCurveType === 'rounded'\n ? generateRoundedPath(applyMarkerOffsetsToPoints(lineData, edge), 5)\n : lineFunction(lineData);\n const edgeStyles = Array.isArray(edge.style) ? edge.style : [edge.style];\n let strokeColor = edgeStyles.find((style) => style?.startsWith('stroke:'));\n\n let animationClass = '';\n if (edge.animate) {\n animationClass = 'edge-animation-fast';\n }\n if (edge.animation) {\n animationClass = 'edge-animation-' + edge.animation;\n }\n\n let animatedEdge = false;\n if (edge.look === 'handDrawn') {\n const rc = rough.svg(elem);\n Object.assign([], lineData);\n\n const svgPathNode = rc.path(linePath, {\n roughness: 0.3,\n seed: handDrawnSeed,\n });\n\n strokeClasses += ' transition';\n\n svgPath = select(svgPathNode)\n .select('path')\n .attr('id', `${diagramId}-${edge.id}`)\n .attr(\n 'class',\n ' ' +\n strokeClasses +\n (edge.classes ? ' ' + edge.classes : '') +\n (animationClass ? ' ' + animationClass : '')\n )\n .attr('style', edgeStyles ? edgeStyles.reduce((acc, style) => acc + ';' + style, '') : '');\n let d = svgPath.attr('d');\n svgPath.attr('d', d);\n elem.node().appendChild(svgPath.node());\n } else {\n const stylesFromClasses = edgeClassStyles.join(';');\n const styles = edgeStyles ? edgeStyles.reduce((acc, style) => acc + style + ';', '') : '';\n\n const pathStyle =\n (stylesFromClasses ? stylesFromClasses + ';' + styles + ';' : styles) +\n ';' +\n (edgeStyles ? edgeStyles.reduce((acc, style) => acc + ';' + style, '') : '');\n svgPath = elem\n .append('path')\n .attr('d', linePath)\n .attr('id', `${diagramId}-${edge.id}`)\n .attr(\n 'class',\n ' ' +\n strokeClasses +\n (edge.classes ? ' ' + edge.classes : '') +\n (animationClass ? ' ' + animationClass : '')\n )\n .attr('style', pathStyle);\n\n //eslint-disable-next-line @typescript-eslint/prefer-regexp-exec\n strokeColor = pathStyle.match(/stroke:([^;]+)/)?.[1];\n\n // Possible fix to remove eslint-disable-next-line\n //strokeColor = /stroke:([^;]+)/.exec(pathStyle)?.[1];\n\n animatedEdge =\n edge.animate === true || !!edge.animation || stylesFromClasses.includes('animation');\n const pathNode = svgPath.node();\n const len = typeof pathNode.getTotalLength === 'function' ? pathNode.getTotalLength() : 0;\n const oValueS = markerOffsets2[edge.arrowTypeStart] || 0;\n const oValueE = markerOffsets2[edge.arrowTypeEnd] || 0;\n\n if (edge.look === 'neo' && !animatedEdge) {\n const dashArray =\n edge.pattern === 'dotted' || edge.pattern === 'dashed'\n ? generateDashArray(len, oValueS, oValueE)\n : `0 ${oValueS} ${len - oValueS - oValueE} ${oValueE}`;\n\n // No offset needed because we already start with a zero-length dash that effectively sets us up for a gap at the start.\n const mOffset = `stroke-dasharray: ${dashArray}; stroke-dashoffset: 0;`;\n svgPath.attr('style', mOffset + svgPath.attr('style'));\n }\n }\n\n // MC Special\n svgPath.attr('data-edge', true);\n svgPath.attr('data-et', 'edge');\n svgPath.attr('data-id', edge.id);\n svgPath.attr('data-points', pointsStr);\n // Add data attributes for neo look support\n svgPath.attr('data-look', handleUndefinedAttr(edge.look));\n // DEBUG code, adds a red circle at each edge coordinate\n // cornerPoints.forEach((point) => {\n // elem\n // .append('circle')\n // .style('stroke', 'blue')\n // .style('fill', 'blue')\n // .attr('r', 3)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n if (edge.showPoints) {\n lineData.forEach((point) => {\n elem\n .append('circle')\n .style('stroke', 'red')\n .style('fill', 'red')\n .attr('r', 1)\n .attr('cx', point.x)\n .attr('cy', point.y);\n });\n }\n // lineData.forEach((point) => {\n // elem\n // .append('circle')\n // .style('stroke', 'red')\n // .style('fill', 'red')\n // .attr('r', 1)\n // .attr('cx', point.x)\n // .attr('cy', point.y);\n // });\n\n let url = '';\n if (getConfig().flowchart.arrowMarkerAbsolute || getConfig().state.arrowMarkerAbsolute) {\n url =\n window.location.protocol +\n '//' +\n window.location.host +\n window.location.pathname +\n window.location.search;\n url = url.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n }\n log.info('arrowTypeStart', edge.arrowTypeStart);\n log.info('arrowTypeEnd', edge.arrowTypeEnd);\n\n const useMargin = !animatedEdge && edge?.look === 'neo';\n addEdgeMarkers(svgPath, edge, url, diagramId, diagramType, useMargin, strokeColor);\n const midIndex = Math.floor(points.length / 2);\n const point = points[midIndex];\n if (!utils.isLabelCoordinateInPath(point, svgPath.attr('d'))) {\n pointsHasChanged = true;\n }\n\n let paths = {};\n if (pointsHasChanged) {\n paths.updatedPath = points;\n }\n paths.originalPath = edge.points;\n return paths;\n};\n\n/**\n * Generates SVG path data with rounded corners from an array of points.\n * @param {Array} points - Array of points in the format [{x: Number, y: Number}, ...]\n * @param {Number} radius - The radius of the rounded corners\n * @returns {String} - SVG path data string\n */\nexport function generateRoundedPath(points, radius) {\n if (points.length < 2) {\n return '';\n }\n\n let path = '';\n const size = points.length;\n const epsilon = 1e-5;\n\n for (let i = 0; i < size; i++) {\n const currPoint = points[i];\n const prevPoint = points[i - 1];\n const nextPoint = points[i + 1];\n\n if (i === 0) {\n // Move to the first point\n path += `M${currPoint.x},${currPoint.y}`;\n } else if (i === size - 1) {\n // Last point, draw a straight line to the final point\n path += `L${currPoint.x},${currPoint.y}`;\n } else {\n // Calculate vectors for incoming and outgoing segments\n const dx1 = currPoint.x - prevPoint.x;\n const dy1 = currPoint.y - prevPoint.y;\n const dx2 = nextPoint.x - currPoint.x;\n const dy2 = nextPoint.y - currPoint.y;\n\n const len1 = Math.hypot(dx1, dy1);\n const len2 = Math.hypot(dx2, dy2);\n\n // Prevent division by zero\n if (len1 < epsilon || len2 < epsilon) {\n path += `L${currPoint.x},${currPoint.y}`;\n continue;\n }\n\n // Normalize the vectors\n const nx1 = dx1 / len1;\n const ny1 = dy1 / len1;\n const nx2 = dx2 / len2;\n const ny2 = dy2 / len2;\n\n // Calculate the angle between the vectors\n const dot = nx1 * nx2 + ny1 * ny2;\n // Clamp the dot product to avoid numerical issues with acos\n const clampedDot = Math.max(-1, Math.min(1, dot));\n const angle = Math.acos(clampedDot);\n\n // Skip rounding if the angle is too small or too close to 180 degrees\n if (angle < epsilon || Math.abs(Math.PI - angle) < epsilon) {\n path += `L${currPoint.x},${currPoint.y}`;\n continue;\n }\n\n // Calculate the distance to offset the control point\n const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n\n // Calculate the start and end points of the curve\n const startX = currPoint.x - nx1 * cutLen;\n const startY = currPoint.y - ny1 * cutLen;\n const endX = currPoint.x + nx2 * cutLen;\n const endY = currPoint.y + ny2 * cutLen;\n\n // Draw the line to the start of the curve\n path += `L${startX},${startY}`;\n\n // Draw the quadratic Bezier curve\n path += `Q${currPoint.x},${currPoint.y} ${endX},${endY}`;\n }\n }\n\n return path;\n}\n// Helper function to calculate delta and angle between two points\nfunction calculateDeltaAndAngle(point1, point2) {\n if (!point1 || !point2) {\n return { angle: 0, deltaX: 0, deltaY: 0 };\n }\n const deltaX = point2.x - point1.x;\n const deltaY = point2.y - point1.y;\n const angle = Math.atan2(deltaY, deltaX);\n return { angle, deltaX, deltaY };\n}\n\n// Function to adjust the first and last points of the points array\nexport function applyMarkerOffsetsToPoints(points, edge) {\n // Copy the points array to avoid mutating the original data\n const newPoints = points.map((point) => ({ ...point }));\n\n // Handle the first point (start of the edge)\n if (points.length >= 2 && markerOffsets[edge.arrowTypeStart]) {\n const offsetValue = markerOffsets[edge.arrowTypeStart];\n\n const point1 = points[0];\n const point2 = points[1];\n\n const { angle } = calculateDeltaAndAngle(point1, point2);\n\n const offsetX = offsetValue * Math.cos(angle);\n const offsetY = offsetValue * Math.sin(angle);\n\n newPoints[0].x = point1.x + offsetX;\n newPoints[0].y = point1.y + offsetY;\n }\n\n // Handle the last point (end of the edge)\n const n = points.length;\n if (n >= 2 && markerOffsets[edge.arrowTypeEnd]) {\n const offsetValue = markerOffsets[edge.arrowTypeEnd];\n\n const point1 = points[n - 1];\n const point2 = points[n - 2];\n\n const { angle } = calculateDeltaAndAngle(point2, point1);\n\n const offsetX = offsetValue * Math.cos(angle);\n const offsetY = offsetValue * Math.sin(angle);\n\n newPoints[n - 1].x = point1.x - offsetX;\n newPoints[n - 1].y = point1.y - offsetY;\n }\n\n return newPoints;\n}\n", "/** Setup arrow head and define the marker. The result is appended to the svg. */\nimport { log } from '../../logger.js';\nimport * as configApi from '../../config.js';\n\n// Only add the number of markers that the diagram needs\nconst insertMarkers = (elem, markerArray, type, id) => {\n markerArray.forEach((markerName) => {\n markers[markerName](elem, type, id);\n });\n};\n\nconst extension = (elem, type, id) => {\n log.trace('Making markers for ', id);\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionStart')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .attr('d', 'M 1,7 L18,13 V 1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionEnd')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-extensionStart-margin')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('viewBox', '0 0 20 14')\n .append('polygon')\n .attr('points', '10,7 18,13 18,1')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '0');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-extensionEnd-margin')\n .attr('class', 'marker extension ' + type)\n .attr('refX', 9)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('viewBox', '0 0 20 14')\n .append('polygon')\n .attr('points', '10,1 10,13 18,7')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '0');\n};\n\nconst composition = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionStart')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionEnd')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionStart-margin')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 15)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .style('stroke-width', 0)\n .attr('viewBox', '0 0 15 15')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-compositionEnd-margin')\n .attr('class', 'marker composition ' + type)\n .attr('refX', 3.5)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .style('stroke-width', 0)\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst aggregation = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationStart')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 18)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationEnd')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationStart-margin')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 15)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .style('stroke-width', 2)\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-aggregationEnd-margin')\n .attr('class', 'marker aggregation ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .style('stroke-width', 2)\n .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');\n};\nconst dependency = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyStart')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 6)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyEnd')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyStart-margin')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 4)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .style('stroke-width', 0)\n .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-dependencyEnd-margin')\n .attr('class', 'marker dependency ' + type)\n .attr('refX', 16)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 28)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .style('stroke-width', 0)\n .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');\n};\nconst lollipop = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopStart')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopEnd')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .append('circle')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6);\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopStart-margin')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 13)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('circle')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6)\n .attr('stroke-width', 2);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-lollipopEnd-margin')\n .attr('class', 'marker lollipop ' + type)\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerWidth', 190)\n .attr('markerHeight', 240)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('circle')\n .attr('fill', 'transparent')\n .attr('cx', 7)\n .attr('cy', 7)\n .attr('r', 6)\n .attr('stroke-width', 2);\n};\nconst point = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 5)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 8)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 10 5 L 0 10 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 4.5)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 8)\n .attr('markerHeight', 8)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 5 L 10 10 L 10 0 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointEnd-margin') //arrows with gap(offset)\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 11.5 14')\n .attr('refX', 11.5) // Adjust to position the arrowhead relative to the line\n .attr('refY', 7) // Half of 14 for vertical center\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 10.5)\n .attr('markerHeight', 14)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 0 0 L 11.5 7 L 0 14 z')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 0)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-pointStart-margin')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 11.5 14')\n .attr('refX', 1)\n .attr('refY', 7)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11.5)\n .attr('markerHeight', 14)\n .attr('orient', 'auto')\n .append('polygon')\n .attr('points', '0,7 11.5,14 11.5,0')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 0)\n .style('stroke-dasharray', '1,0');\n};\nconst circle = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleEnd')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', 11)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleStart')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', -1)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 1)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleEnd-margin')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refY', 5) // Vertical center of viewBox (0 0 10 10)\n .attr('refX', 12.25)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 14)\n .attr('markerHeight', 14)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 0)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-circleStart-margin')\n .attr('class', 'marker ' + type)\n .attr('viewBox', '0 0 10 10')\n .attr('refX', -2)\n .attr('refY', 5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 14)\n .attr('markerHeight', 14)\n .attr('orient', 'auto')\n .append('circle')\n .attr('cx', '5')\n .attr('cy', '5')\n .attr('r', '5')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 0)\n .style('stroke-dasharray', '1,0');\n};\nconst cross = (elem, type, id) => {\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossEnd')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', 12)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossStart')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 11 11')\n .attr('refX', -1)\n .attr('refY', 5.2)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 11)\n .attr('markerHeight', 11)\n .attr('orient', 'auto')\n .append('path')\n // .attr('stroke', 'black')\n .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2)\n .style('stroke-dasharray', '1,0');\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossEnd-margin')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 15 15')\n .attr('refX', 17.7)\n .attr('refY', 7.5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 L 14,14 M 1,14 L 14,1')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2.5);\n\n elem\n .append('marker')\n .attr('id', id + '_' + type + '-crossStart-margin')\n .attr('class', 'marker cross ' + type)\n .attr('viewBox', '0 0 15 15')\n .attr('refX', -3.5)\n .attr('refY', 7.5)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('markerWidth', 12)\n .attr('markerHeight', 12)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 1,1 L 14,14 M 1,14 L 14,1')\n .attr('class', 'arrowMarkerPath')\n .style('stroke-width', 2.5)\n .style('stroke-dasharray', '1,0');\n};\nconst barb = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-barbEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');\n};\nconst barbNeo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { transitionColor } = themeVariables;\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-barbEnd')\n .attr('refX', 19)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'strokeWidth')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L11,14 L13,7 L11,0 Z');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-barbEnd-margin')\n .attr('refX', 17)\n .attr('refY', 7)\n .attr('markerWidth', 20)\n .attr('markerHeight', 14)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M 19,7 L11,14 L13,7 L11,0 Z')\n .attr('fill', `${transitionColor}`);\n};\n// erDiagram specific markers\nconst only_one = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-onlyOneStart')\n .attr('class', 'marker onlyOne ' + type)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M9,0 L9,18 M15,0 L15,18');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-onlyOneEnd')\n .attr('class', 'marker onlyOne ' + type)\n .attr('refX', 18)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M3,0 L3,18 M9,0 L9,18');\n};\n\nconst zero_or_one = (elem, type, id) => {\n const startMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrOneStart')\n .attr('class', 'marker zeroOrOne ' + type)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto');\n startMarker\n .append('circle')\n .attr('fill', 'white') // Fill white for now?\n .attr('cx', 21)\n .attr('cy', 9)\n .attr('r', 6);\n startMarker.append('path').attr('d', 'M9,0 L9,18');\n\n const endMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrOneEnd')\n .attr('class', 'marker zeroOrOne ' + type)\n .attr('refX', 30)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto');\n endMarker\n .append('circle')\n .attr('fill', 'white') // Fill white for now?\n .attr('cx', 9)\n .attr('cy', 9)\n .attr('r', 6);\n endMarker.append('path').attr('d', 'M21,0 L21,18');\n};\n\nconst one_or_more = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-oneOrMoreStart')\n .attr('class', 'marker oneOrMore ' + type)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27');\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-oneOrMoreEnd')\n .attr('class', 'marker oneOrMore ' + type)\n .attr('refX', 27)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18');\n};\n\nconst zero_or_more = (elem, type, id) => {\n const startMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrMoreStart')\n .attr('class', 'marker zeroOrMore ' + type)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto');\n startMarker.append('circle').attr('fill', 'white').attr('cx', 48).attr('cy', 18).attr('r', 6);\n startMarker.append('path').attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18');\n\n const endMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrMoreEnd')\n .attr('class', 'marker zeroOrMore ' + type)\n .attr('refX', 39)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto');\n endMarker.append('circle').attr('fill', 'white').attr('cx', 9).attr('cy', 18).attr('r', 6);\n endMarker.append('path').attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18');\n};\n\nconst only_one_neo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { strokeWidth } = themeVariables;\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-onlyOneStart')\n .attr('class', 'marker onlyOne ' + type)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .attr('d', 'M9,0 L9,18 M15,0 L15,18')\n .attr('stroke-width', `${strokeWidth}`);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-onlyOneEnd')\n .attr('class', 'marker onlyOne ' + type)\n .attr('refX', 18)\n .attr('refY', 9)\n .attr('markerWidth', 18)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .attr('d', 'M3,0 L3,18 M9,0 L9,18')\n .attr('stroke-width', `${strokeWidth}`);\n};\n\nconst zero_or_one_neo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { strokeWidth, mainBkg } = themeVariables;\n const startMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrOneStart')\n .attr('class', 'marker zeroOrOne ' + type)\n .attr('refX', 0)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse');\n startMarker\n .append('circle')\n .attr('fill', mainBkg ?? 'white')\n .attr('cx', 21)\n .attr('cy', 9)\n .attr('stroke-width', `${strokeWidth}`)\n .attr('r', 6);\n startMarker.append('path').attr('d', 'M9,0 L9,18').attr('stroke-width', `${strokeWidth}`);\n\n const endMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrOneEnd')\n .attr('class', 'marker zeroOrOne ' + type)\n .attr('refX', 30)\n .attr('refY', 9)\n .attr('markerWidth', 30)\n .attr('markerHeight', 18)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('orient', 'auto');\n endMarker\n .append('circle')\n .attr('fill', mainBkg ?? 'white')\n .attr('cx', 9)\n .attr('cy', 9)\n .attr('stroke-width', `${strokeWidth}`)\n .attr('r', 6);\n endMarker.append('path').attr('d', 'M21,0 L21,18').attr('stroke-width', `${strokeWidth}`);\n};\n\nconst one_or_more_neo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { strokeWidth } = themeVariables;\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-oneOrMoreStart')\n .attr('class', 'marker oneOrMore ' + type)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('path')\n .attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27')\n .attr('stroke-width', `${strokeWidth}`);\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-oneOrMoreEnd')\n .attr('class', 'marker oneOrMore ' + type)\n .attr('refX', 27)\n .attr('refY', 18)\n .attr('markerWidth', 45)\n .attr('markerHeight', 36)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18')\n .attr('stroke-width', `${strokeWidth}`);\n};\n\nconst zero_or_more_neo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { strokeWidth, mainBkg } = themeVariables;\n const startMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrMoreStart')\n .attr('class', 'marker zeroOrMore ' + type)\n .attr('refX', 18)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('orient', 'auto');\n startMarker\n .append('circle')\n .attr('fill', mainBkg ?? 'white')\n .attr('cx', 45.5)\n .attr('cy', 18)\n .attr('r', 6)\n .attr('stroke-width', `${strokeWidth}`);\n startMarker\n .append('path')\n .attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18')\n .attr('stroke-width', `${strokeWidth}`);\n\n const endMarker = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-zeroOrMoreEnd')\n .attr('class', 'marker zeroOrMore ' + type)\n .attr('refX', 39)\n .attr('refY', 18)\n .attr('markerWidth', 57)\n .attr('markerHeight', 36)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse');\n endMarker\n .append('circle')\n .attr('fill', mainBkg ?? 'white')\n .attr('cx', 11)\n .attr('cy', 18)\n .attr('r', 6)\n .attr('stroke-width', `${strokeWidth}`);\n endMarker\n .append('path')\n .attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18')\n .attr('stroke-width', `${strokeWidth}`);\n};\n\nconst requirement_arrow = (elem, type, id) => {\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-requirement_arrowEnd')\n .attr('refX', 20)\n .attr('refY', 10)\n .attr('markerWidth', 20)\n .attr('markerHeight', 20)\n .attr('orient', 'auto')\n .append('path')\n .attr(\n 'd',\n `M0,0\n L20,10\n M20,10\n L0,20`\n );\n};\n\nconst requirement_arrow_neo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { strokeWidth } = themeVariables;\n\n elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-requirement_arrowEnd')\n .attr('refX', 20)\n .attr('refY', 10)\n .attr('markerWidth', 20)\n .attr('markerHeight', 20)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .attr('stroke-width', `${strokeWidth}`)\n .attr('viewBox', '0 0 25 20')\n .append('path')\n .attr(\n 'd',\n `M0,0\n L20,10\n M20,10\n L0,20`\n )\n .attr('stroke-linejoin', 'miter');\n};\n\nconst requirement_contains = (elem, type, id) => {\n const containsNode = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-requirement_containsStart')\n .attr('refX', 0)\n .attr('refY', 10)\n .attr('markerWidth', 20)\n .attr('markerHeight', 20)\n .attr('orient', 'auto')\n .append('g');\n\n containsNode.append('circle').attr('cx', 10).attr('cy', 10).attr('r', 9).attr('fill', 'none');\n\n containsNode.append('line').attr('x1', 1).attr('x2', 19).attr('y1', 10).attr('y2', 10);\n\n containsNode.append('line').attr('y1', 1).attr('y2', 19).attr('x1', 10).attr('x2', 10);\n};\n\nconst requirement_contains_neo = (elem, type, id) => {\n const config = configApi.getConfig();\n const { themeVariables } = config;\n const { strokeWidth } = themeVariables;\n const containsNode = elem\n .append('defs')\n .append('marker')\n .attr('id', id + '_' + type + '-requirement_containsStart')\n .attr('refX', 0)\n .attr('refY', 10)\n .attr('markerWidth', 20)\n .attr('markerHeight', 20)\n .attr('orient', 'auto')\n .attr('markerUnits', 'userSpaceOnUse')\n .append('g');\n\n containsNode.append('circle').attr('cx', 10).attr('cy', 10).attr('r', 9).attr('fill', 'none');\n\n containsNode.append('line').attr('x1', 1).attr('x2', 19).attr('y1', 10).attr('y2', 10);\n\n containsNode.append('line').attr('y1', 1).attr('y2', 19).attr('x1', 10).attr('x2', 10);\n containsNode.selectAll('*').attr('stroke-width', `${strokeWidth}`);\n};\n\n// TODO rename the class diagram markers to something shape descriptive and semantic free\nconst markers = {\n extension,\n composition,\n aggregation,\n dependency,\n lollipop,\n point,\n circle,\n cross,\n barb,\n barbNeo,\n only_one,\n zero_or_one,\n one_or_more,\n zero_or_more,\n only_one_neo,\n zero_or_one_neo,\n one_or_more_neo,\n zero_or_more_neo,\n requirement_arrow,\n requirement_contains,\n requirement_arrow_neo,\n requirement_contains_neo,\n};\nexport default insertMarkers;\n"],
"mappings": "kkBAYO,IAAMA,GAAiBC,EAAA,CAC5BC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAY,GACZC,IACG,CACCL,EAAK,gBACPM,GACEP,EACA,QACAC,EAAK,eACLC,EACAC,EACAC,EACAC,EACAC,CACF,EAEEL,EAAK,cACPM,GAAcP,EAAS,MAAOC,EAAK,aAAcC,EAAKC,EAAIC,EAAaC,EAAWC,CAAW,CAEjG,EAxB8B,kBA0BxBE,GAAgB,CACpB,YAAa,CAAE,KAAM,QAAS,KAAM,EAAM,EAC1C,YAAa,CAAE,KAAM,QAAS,KAAM,EAAK,EACzC,WAAY,CAAE,KAAM,OAAQ,KAAM,EAAK,EACvC,eAAgB,CAAE,KAAM,OAAQ,KAAM,EAAK,EAC3C,aAAc,CAAE,KAAM,SAAU,KAAM,EAAM,EAC5C,YAAa,CAAE,KAAM,cAAe,KAAM,EAAM,EAChD,UAAW,CAAE,KAAM,YAAa,KAAM,EAAM,EAC5C,YAAa,CAAE,KAAM,cAAe,KAAM,EAAK,EAC/C,WAAY,CAAE,KAAM,aAAc,KAAM,EAAK,EAC7C,SAAU,CAAE,KAAM,WAAY,KAAM,EAAM,EAC1C,SAAU,CAAE,KAAM,UAAW,KAAM,EAAM,EACzC,YAAa,CAAE,KAAM,YAAa,KAAM,EAAM,EAC9C,YAAa,CAAE,KAAM,YAAa,KAAM,EAAM,EAC9C,aAAc,CAAE,KAAM,aAAc,KAAM,EAAM,EAChD,kBAAmB,CAAE,KAAM,oBAAqB,KAAM,EAAM,EAC5D,qBAAsB,CAAE,KAAM,uBAAwB,KAAM,EAAM,CACpE,EAEMC,GAA8B,CAClC,QACA,QACA,SACA,WACA,cACA,YACA,cACA,aACA,MACF,EAEMF,GAAgBR,EAAA,CACpBC,EACAU,EACAC,EACAT,EACAC,EACAC,EACAC,EAAY,GACZC,IACG,CACH,IAAMM,EAAgBJ,GAAcG,CAAuC,EACrEE,EAAgBD,GAAiBH,GAA4B,SAASG,EAAc,IAAI,EAE9F,GAAI,CAACA,EAAe,CAClBE,EAAI,KAAK,uBAAuBH,CAAS,EAAE,EAC3C,MACF,CAEA,IAAMI,EAAgBH,EAAc,KAI9BI,EAAmB,GAAGb,CAAE,IAAIC,CAAW,IAAIW,CAAa,GAH/CL,IAAa,QAAU,QAAU,KAGuB,GADxDL,GAAaQ,EAAgB,UAAY,EACwB,GAGhF,GAAIP,GAAeA,EAAY,KAAK,IAAM,GAAI,CAE5C,IAAMW,EAAUX,EAAY,QAAQ,eAAgB,GAAG,EACjDY,EAAkB,GAAGF,CAAgB,IAAIC,CAAO,GAGtD,GAAI,CAAC,SAAS,eAAeC,CAAe,EAAG,CAE7C,IAAMC,EAAiB,SAAS,eAAeH,CAAgB,EAC/D,GAAIG,EAAgB,CAElB,IAAMC,EAAgBD,EAAe,UAAU,EAAI,EACnDC,EAAc,GAAKF,EAGLE,EAAc,iBAAiB,oBAAoB,EAC3D,QAASC,GAAS,CACtBA,EAAK,aAAa,SAAUf,CAAW,EAGnCM,EAAc,MAChBS,EAAK,aAAa,OAAQf,CAAW,CAEzC,CAAC,EAGDa,EAAe,YAAY,YAAYC,CAAa,CACtD,CACF,CAGApB,EAAQ,KAAK,UAAUU,CAAQ,GAAI,OAAOR,CAAG,IAAIgB,CAAe,GAAG,CACrE,MAEElB,EAAQ,KAAK,UAAUU,CAAQ,GAAI,OAAOR,CAAG,IAAIc,CAAgB,GAAG,CAExE,EA7DsB,iBC5Bf,IAAMM,GAAuBC,EAACC,GAC5B,OAAOA,GAAc,SAAWA,EAAYC,EAAU,GAAG,WAAW,MADzC,wBAIvBC,EAAa,IAAI,IACjBC,EAAiB,IAAI,IAErBC,GAAQL,EAAA,IAAM,CACzBG,EAAW,MAAM,EACjBC,EAAe,MAAM,CACvB,EAHqB,SAKRE,EAAiBN,EAACO,GACxBA,EAGD,OAAOA,GAAe,SACjBA,EAEFA,EAAW,OAAO,CAACC,EAAKC,IAAUD,EAAM,IAAMC,EAAO,EAAE,EALrD,GAFmB,kBAUjBC,GAAkBV,EAAA,MAAOW,EAAMC,IAAS,CACnD,IAAMC,EAASX,EAAU,EACrBY,EAAgBC,GAAuBF,CAAM,EAC3C,CAAE,YAAAG,CAAY,EAAIC,GAAcL,CAAI,EAC1CA,EAAK,WAAaI,EAGlB,IAAME,EAAYP,EAAK,OAAO,GAAG,EAAE,KAAK,QAAS,WAAW,EAGtDQ,EAAQD,EAAU,OAAO,GAAG,EAAE,KAAK,QAAS,OAAO,EAAE,KAAK,UAAWN,EAAK,EAAE,EAE5EQ,EAAaR,EAAK,YAAc,WAEhCS,EAAe,MAAMC,GACzBX,EACAC,EAAK,MACL,CACE,MAAON,EAAeM,EAAK,UAAU,EACrC,cAAAE,EACA,iBAAkB,GAClB,OAAQ,GACR,SAAUM,EAEV,MAAOA,EAXW,OAWkB,MACtC,EACAP,CACF,EAEAM,EAAM,KAAK,EAAE,YAAYE,CAAY,EACrCE,EAAI,KAAK,QAASX,EAAMA,EAAK,SAAS,EAGtC,IAAIY,EAAOH,EAAa,QAAQ,EAC5BI,EAAgBD,EACpB,GAAIV,EAAe,CACjB,IAAMY,EAAML,EAAa,SAAS,CAAC,EAC7BM,EAAKC,EAAOP,CAAY,EAC9BG,EAAOE,EAAI,sBAAsB,EACjCD,EAAgBD,EAChBG,EAAG,KAAK,QAASH,EAAK,KAAK,EAC3BG,EAAG,KAAK,SAAUH,EAAK,MAAM,CAC/B,KAAO,CAEL,IAAMK,EAASD,EAAOP,CAAY,EAAE,OAAO,MAAM,EAAE,KAAK,EACpDQ,GAAU,OAAOA,EAAO,SAAY,aACtCJ,EAAgBI,EAAO,QAAQ,EAEnC,CACAV,EAAM,KAAK,YAAaW,EAAsBL,EAAeX,CAAa,CAAC,EAG3EX,EAAW,IAAIS,EAAK,GAAIM,CAAS,EAGjCN,EAAK,MAAQY,EAAK,MAClBZ,EAAK,OAASY,EAAK,OAEnB,IAAIO,EACJ,GAAInB,EAAK,eAAgB,CAEvB,IAAMoB,EAAqBrB,EAAK,OAAO,GAAG,EAAE,KAAK,QAAS,eAAe,EACnEsB,EAAQD,EAAmB,OAAO,GAAG,EAAE,KAAK,QAAS,OAAO,EAC5DE,EAAoB,MAAMC,EAC9BF,EACArB,EAAK,eACLN,EAAeM,EAAK,UAAU,GAAK,GACnC,GACA,EACF,EACAmB,EAAKG,EACL,IAAIE,EAAQF,EAAkB,QAAQ,EACtC,GAAIpB,EAAe,CACjB,IAAMY,EAAMQ,EAAkB,SAAS,CAAC,EAClCP,EAAKC,EAAOM,CAAiB,EACnCE,EAAQV,EAAI,sBAAsB,EAClCC,EAAG,KAAK,QAASS,EAAM,KAAK,EAC5BT,EAAG,KAAK,SAAUS,EAAM,MAAM,CAChC,CACAH,EAAM,KAAK,YAAaH,EAAsBM,EAAOtB,CAAa,CAAC,EAC9DV,EAAe,IAAIQ,EAAK,EAAE,GAC7BR,EAAe,IAAIQ,EAAK,GAAI,CAAC,CAAC,EAEhCR,EAAe,IAAIQ,EAAK,EAAE,EAAE,UAAYoB,EACxCK,EAAiBN,EAAInB,EAAK,cAAc,CAC1C,CACA,GAAIA,EAAK,gBAAiB,CACxB,IAAM0B,EAAsB3B,EAAK,OAAO,GAAG,EAAE,KAAK,QAAS,eAAe,EACpEsB,EAAQK,EAAoB,OAAO,GAAG,EAAE,KAAK,QAAS,OAAO,EAC7DJ,EAAoB,MAAMC,EAC9BF,EACArB,EAAK,gBACLN,EAAeM,EAAK,UAAU,GAAK,GACnC,GACA,EACF,EACAmB,EAAKG,EACL,IAAIE,EAAQF,EAAkB,QAAQ,EACtC,GAAIpB,EAAe,CACjB,IAAMY,EAAMQ,EAAkB,SAAS,CAAC,EAClCP,EAAKC,EAAOM,CAAiB,EACnCE,EAAQV,EAAI,sBAAsB,EAClCC,EAAG,KAAK,QAASS,EAAM,KAAK,EAC5BT,EAAG,KAAK,SAAUS,EAAM,MAAM,CAChC,CACAH,EAAM,KAAK,YAAaH,EAAsBM,EAAOtB,CAAa,CAAC,EAE9DV,EAAe,IAAIQ,EAAK,EAAE,GAC7BR,EAAe,IAAIQ,EAAK,GAAI,CAAC,CAAC,EAEhCR,EAAe,IAAIQ,EAAK,EAAE,EAAE,WAAa0B,EACzCD,EAAiBN,EAAInB,EAAK,eAAe,CAC3C,CACA,GAAIA,EAAK,aAAc,CACrB,IAAM2B,EAAmB5B,EAAK,OAAO,GAAG,EAAE,KAAK,QAAS,eAAe,EAEjEsB,EAAQM,EAAiB,OAAO,GAAG,EAAE,KAAK,QAAS,OAAO,EAC1DC,EAAkB,MAAML,EAC5BI,EACA3B,EAAK,aACLN,EAAeM,EAAK,UAAU,GAAK,GACnC,GACA,EACF,EACAmB,EAAKS,EACL,IAAIJ,EAAQI,EAAgB,QAAQ,EACpC,GAAI1B,EAAe,CACjB,IAAMY,EAAMc,EAAgB,SAAS,CAAC,EAChCb,EAAKC,EAAOY,CAAe,EACjCJ,EAAQV,EAAI,sBAAsB,EAClCC,EAAG,KAAK,QAASS,EAAM,KAAK,EAC5BT,EAAG,KAAK,SAAUS,EAAM,MAAM,CAChC,CACAH,EAAM,KAAK,YAAaH,EAAsBM,EAAOtB,CAAa,CAAC,EAE9DV,EAAe,IAAIQ,EAAK,EAAE,GAC7BR,EAAe,IAAIQ,EAAK,GAAI,CAAC,CAAC,EAEhCR,EAAe,IAAIQ,EAAK,EAAE,EAAE,QAAU2B,EACtCF,EAAiBN,EAAInB,EAAK,YAAY,CACxC,CACA,GAAIA,EAAK,cAAe,CACtB,IAAM6B,EAAoB9B,EAAK,OAAO,GAAG,EAAE,KAAK,QAAS,eAAe,EAElEsB,EAAQQ,EAAkB,OAAO,GAAG,EAAE,KAAK,QAAS,OAAO,EAE3DD,EAAkB,MAAML,EAC5BM,EACA7B,EAAK,cACLN,EAAeM,EAAK,UAAU,GAAK,GACnC,GACA,EACF,EACAmB,EAAKS,EACL,IAAIJ,EAAQI,EAAgB,QAAQ,EACpC,GAAI1B,EAAe,CACjB,IAAMY,EAAMc,EAAgB,SAAS,CAAC,EAChCb,EAAKC,EAAOY,CAAe,EACjCJ,EAAQV,EAAI,sBAAsB,EAClCC,EAAG,KAAK,QAASS,EAAM,KAAK,EAC5BT,EAAG,KAAK,SAAUS,EAAM,MAAM,CAChC,CACAH,EAAM,KAAK,YAAaH,EAAsBM,EAAOtB,CAAa,CAAC,EAE9DV,EAAe,IAAIQ,EAAK,EAAE,GAC7BR,EAAe,IAAIQ,EAAK,GAAI,CAAC,CAAC,EAEhCR,EAAe,IAAIQ,EAAK,EAAE,EAAE,SAAW6B,EACvCJ,EAAiBN,EAAInB,EAAK,aAAa,CACzC,CACA,OAAOS,CACT,EA3K+B,mBAiL/B,SAASgB,EAAiBN,EAAIW,EAAO,CAC/B3B,GAAuBb,EAAU,CAAC,GAAK6B,IACzCA,EAAG,MAAM,MAAQW,EAAM,OAAS,EAAI,KACpCX,EAAG,MAAM,OAAS,OAEtB,CALS/B,EAAAqC,EAAA,oBAOF,IAAMM,GAAoB3C,EAAA,CAACY,EAAMgC,IAAU,CAChDrB,EAAI,MAAM,sBAAuBX,EAAK,GAAIA,EAAK,MAAOT,EAAW,IAAIS,EAAK,EAAE,EAAGgC,CAAK,EACpF,IAAIC,EAAOD,EAAM,YAAcA,EAAM,YAAcA,EAAM,aACnDE,EAAa5C,EAAU,EACvB,CAAE,yBAAA6C,CAAyB,EAAIC,GAAwBF,CAAU,EACvE,GAAIlC,EAAK,MAAO,CACd,IAAMqC,EAAK9C,EAAW,IAAIS,EAAK,EAAE,EAC7BsC,EAAItC,EAAK,EACTuC,EAAIvC,EAAK,EACb,GAAIiC,EAAM,CACR,IAAMO,EAAMC,EAAM,kBAAkBR,CAAI,EACxCtB,EAAI,MACF,gBAAkBX,EAAK,MAAQ,UAC/BsC,EACA,IACAC,EACA,SACAC,EAAI,EACJ,IACAA,EAAI,EACJ,SACF,EACIR,EAAM,cACRM,EAAIE,EAAI,EACRD,EAAIC,EAAI,EAEZ,CACAH,EAAG,KAAK,YAAa,aAAaC,CAAC,KAAKC,EAAIJ,EAA2B,CAAC,GAAG,CAC7E,CAEA,GAAInC,EAAK,eAAgB,CACvB,IAAMqC,EAAK7C,EAAe,IAAIQ,EAAK,EAAE,EAAE,UACnCsC,EAAItC,EAAK,EACTuC,EAAIvC,EAAK,EACb,GAAIiC,EAAM,CACR,IAAMO,EAAMC,EAAM,0BAA0BzC,EAAK,eAAiB,GAAK,EAAG,aAAciC,CAAI,EAC5FK,EAAIE,EAAI,EACRD,EAAIC,EAAI,CACV,CACAH,EAAG,KAAK,YAAa,aAAaC,CAAC,KAAKC,CAAC,GAAG,CAC9C,CACA,GAAIvC,EAAK,gBAAiB,CACxB,IAAMqC,EAAK7C,EAAe,IAAIQ,EAAK,EAAE,EAAE,WACnCsC,EAAItC,EAAK,EACTuC,EAAIvC,EAAK,EACb,GAAIiC,EAAM,CACR,IAAMO,EAAMC,EAAM,0BAChBzC,EAAK,eAAiB,GAAK,EAC3B,cACAiC,CACF,EACAK,EAAIE,EAAI,EACRD,EAAIC,EAAI,CACV,CACAH,EAAG,KAAK,YAAa,aAAaC,CAAC,KAAKC,CAAC,GAAG,CAC9C,CACA,GAAIvC,EAAK,aAAc,CACrB,IAAMqC,EAAK7C,EAAe,IAAIQ,EAAK,EAAE,EAAE,QACnCsC,EAAItC,EAAK,EACTuC,EAAIvC,EAAK,EACb,GAAIiC,EAAM,CACR,IAAMO,EAAMC,EAAM,0BAA0BzC,EAAK,aAAe,GAAK,EAAG,WAAYiC,CAAI,EACxFK,EAAIE,EAAI,EACRD,EAAIC,EAAI,CACV,CACAH,EAAG,KAAK,YAAa,aAAaC,CAAC,KAAKC,CAAC,GAAG,CAC9C,CACA,GAAIvC,EAAK,cAAe,CACtB,IAAMqC,EAAK7C,EAAe,IAAIQ,EAAK,EAAE,EAAE,SACnCsC,EAAItC,EAAK,EACTuC,EAAIvC,EAAK,EACb,GAAIiC,EAAM,CACR,IAAMO,EAAMC,EAAM,0BAA0BzC,EAAK,aAAe,GAAK,EAAG,YAAaiC,CAAI,EACzFK,EAAIE,EAAI,EACRD,EAAIC,EAAI,CACV,CACAH,EAAG,KAAK,YAAa,aAAaC,CAAC,KAAKC,CAAC,GAAG,CAC9C,CACF,EA9EiC,qBAmF3BG,GAAoCtD,EAAA,CAACY,EAAM2C,IAAW,CAK1D,GAJI,CAAC3C,GAAM,aAAe,CAACA,GAAM,IAAI,SAAS,WAAW,GAAK,CAAC,MAAM,QAAQ2C,CAAM,GAI/EA,EAAO,SAAW,EACpB,OAAOA,EAGT,GAAM,CAACC,EAAOC,CAAG,EAAIF,EACfG,EAAK,KAAK,IAAID,EAAI,EAAID,EAAM,CAAC,EAC7BG,EAAK,KAAK,IAAIF,EAAI,EAAID,EAAM,CAAC,EAEnC,OAAIE,EAAK,MAAQC,EAAK,KACbJ,EAGLI,GAAMD,EACD,CAACF,EAAO,CAAE,EAAGA,EAAM,EAAG,EAAGC,EAAI,CAAE,EAAGA,CAAG,EAGvC,CAACD,EAAO,CAAE,EAAGC,EAAI,EAAG,EAAGD,EAAM,CAAE,EAAGC,CAAG,CAC9C,EAtB0C,qCAwBpCG,GAAc5D,EAAA,CAAC6D,EAAMC,IAAU,CACnC,IAAMZ,EAAIW,EAAK,EACTV,EAAIU,EAAK,EACTH,EAAK,KAAK,IAAII,EAAM,EAAIZ,CAAC,EACzBS,EAAK,KAAK,IAAIG,EAAM,EAAIX,CAAC,EACzBY,EAAIF,EAAK,MAAQ,EACjBG,EAAIH,EAAK,OAAS,EACxB,OAAOH,GAAMK,GAAKJ,GAAMK,CAC1B,EARoB,eAUPC,GAAejE,EAAA,CAAC6D,EAAMK,EAAcC,IAAgB,CAC/D5C,EAAI,MAAM;AAAA,kBACM,KAAK,UAAU2C,CAAY,CAAC;AAAA,kBAC5B,KAAK,UAAUC,CAAW,CAAC;AAAA,oBACzBN,EAAK,CAAC,MAAMA,EAAK,CAAC,MAAMA,EAAK,KAAK,MAAMA,EAAK,MAAM,EAAE,EACvE,IAAMX,EAAIW,EAAK,EACTV,EAAIU,EAAK,EAETH,EAAK,KAAK,IAAIR,EAAIiB,EAAY,CAAC,EAC/BJ,EAAIF,EAAK,MAAQ,EACnBO,EAAID,EAAY,EAAID,EAAa,EAAIH,EAAIL,EAAKK,EAAIL,EAChDM,EAAIH,EAAK,OAAS,EAElBQ,EAAI,KAAK,IAAIH,EAAa,EAAIC,EAAY,CAAC,EAC3CG,EAAI,KAAK,IAAIJ,EAAa,EAAIC,EAAY,CAAC,EAEjD,GAAI,KAAK,IAAIhB,EAAIe,EAAa,CAAC,EAAIH,EAAI,KAAK,IAAIb,EAAIgB,EAAa,CAAC,EAAIF,EAAG,CAEvE,IAAIO,EAAIJ,EAAY,EAAID,EAAa,EAAIA,EAAa,EAAIF,EAAIb,EAAIA,EAAIa,EAAIE,EAAa,EACvFE,EAAKE,EAAIC,EAAKF,EACd,IAAMG,EAAM,CACV,EAAGL,EAAY,EAAID,EAAa,EAAIC,EAAY,EAAIC,EAAID,EAAY,EAAIG,EAAIF,EAC5E,EAAGD,EAAY,EAAID,EAAa,EAAIC,EAAY,EAAIE,EAAIE,EAAIJ,EAAY,EAAIE,EAAIE,CAClF,EAEA,OAAIH,IAAM,IACRI,EAAI,EAAIN,EAAa,EACrBM,EAAI,EAAIN,EAAa,GAEnBI,IAAM,IACRE,EAAI,EAAIN,EAAa,GAEnBG,IAAM,IACRG,EAAI,EAAIN,EAAa,GAGvB3C,EAAI,MAAM,4BAA4B8C,CAAC,OAAOE,CAAC,OAAOD,CAAC,OAAOF,CAAC,GAAII,CAAG,EAE/DA,CACT,KAAO,CAEDL,EAAY,EAAID,EAAa,EAC/BE,EAAIF,EAAa,EAAIH,EAAIb,EAEzBkB,EAAIlB,EAAIa,EAAIG,EAAa,EAE3B,IAAIK,EAAKF,EAAID,EAAKE,EACdG,EAAKN,EAAY,EAAID,EAAa,EAAIC,EAAY,EAAIG,EAAIF,EAAID,EAAY,EAAIG,EAAIF,EAClFM,EAAKP,EAAY,EAAID,EAAa,EAAIC,EAAY,EAAII,EAAIJ,EAAY,EAAII,EAC9E,OAAAhD,EAAI,MAAM,uBAAuB8C,CAAC,OAAOE,CAAC,OAAOD,CAAC,OAAOF,CAAC,GAAI,CAAE,GAAAK,EAAI,GAAAC,CAAG,CAAC,EACpEN,IAAM,IACRK,EAAKP,EAAa,EAClBQ,EAAKR,EAAa,GAEhBI,IAAM,IACRG,EAAKP,EAAa,GAEhBG,IAAM,IACRK,EAAKR,EAAa,GAGb,CAAE,EAAGO,EAAI,EAAGC,CAAG,CACxB,CACF,EA/D4B,gBAiEtBC,GAAqB3E,EAAA,CAAC4E,EAASC,IAAiB,CACpDtD,EAAI,KAAK,2BAA4BqD,EAASC,CAAY,EAC1D,IAAItB,EAAS,CAAC,EACVuB,EAAmBF,EAAQ,CAAC,EAC5BG,EAAW,GACf,OAAAH,EAAQ,QAASd,GAAU,CAGzB,GAFAvC,EAAI,KAAK,uBAAwBuC,EAAOe,CAAY,EAEhD,CAACjB,GAAYiB,EAAcf,CAAK,GAAK,CAACiB,EAAU,CAClD,IAAMC,EAAQf,GAAaY,EAAcC,EAAkBhB,CAAK,EAChEvC,EAAI,MAAM,eAAgBuC,EAAOgB,EAAkBE,CAAK,EACxDzD,EAAI,MAAM,qBAAsByD,EAAOH,CAAY,EAEnD,IAAII,EAAe,GACnB1B,EAAO,QAAS2B,GAAM,CACpBD,EAAeA,GAAiBC,EAAE,IAAMF,EAAM,GAAKE,EAAE,IAAMF,EAAM,CACnE,CAAC,EAEIzB,EAAO,KAAM4B,GAAMA,EAAE,IAAMH,EAAM,GAAKG,EAAE,IAAMH,EAAM,CAAC,EAGxDzD,EAAI,KAAK,qBAAsByD,EAAOzB,CAAM,EAF5CA,EAAO,KAAKyB,CAAK,EAInBD,EAAW,EACb,MACExD,EAAI,KAAK,gBAAiBuC,EAAOgB,CAAgB,EACjDA,EAAmBhB,EACdiB,GACHxB,EAAO,KAAKO,CAAK,CAGvB,CAAC,EACDvC,EAAI,MAAM,mBAAoBgC,CAAM,EAC7BA,CACT,EAlC2B,sBAoC3B,SAAS6B,GAAoB7B,EAAQ,CACnC,IAAM8B,EAAe,CAAC,EAChBC,EAAuB,CAAC,EAC9B,QAASC,EAAI,EAAGA,EAAIhC,EAAO,OAAS,EAAGgC,IAAK,CAC1C,IAAMC,EAAOjC,EAAOgC,EAAI,CAAC,EACnBE,EAAOlC,EAAOgC,CAAC,EACfG,EAAOnC,EAAOgC,EAAI,CAAC,GAEvBC,EAAK,IAAMC,EAAK,GAChBA,EAAK,IAAMC,EAAK,GAChB,KAAK,IAAID,EAAK,EAAIC,EAAK,CAAC,EAAI,GAC5B,KAAK,IAAID,EAAK,EAAID,EAAK,CAAC,EAAI,GAK5BA,EAAK,IAAMC,EAAK,GAChBA,EAAK,IAAMC,EAAK,GAChB,KAAK,IAAID,EAAK,EAAID,EAAK,CAAC,EAAI,GAC5B,KAAK,IAAIC,EAAK,EAAIC,EAAK,CAAC,EAAI,KAE5BL,EAAa,KAAKI,CAAI,EACtBH,EAAqB,KAAKC,CAAC,EAE/B,CACA,MAAO,CAAE,aAAAF,EAAc,qBAAAC,CAAqB,CAC9C,CA1BStF,EAAAoF,GAAA,uBA4BT,IAAMO,GAAoB3F,EAAA,SAAU4F,EAAQC,EAAQC,EAAU,CAC5D,IAAMC,EAAQF,EAAO,EAAID,EAAO,EAC1BI,EAAQH,EAAO,EAAID,EAAO,EAC1BK,EAAS,KAAK,KAAKF,EAAQA,EAAQC,EAAQA,CAAK,EAChDE,EAAQJ,EAAWG,EACzB,MAAO,CAAE,EAAGJ,EAAO,EAAIK,EAAQH,EAAO,EAAGF,EAAO,EAAIK,EAAQF,CAAM,CACpE,EAN0B,qBAQpBG,GAAanG,EAAA,SAAUoG,EAAU,CACrC,GAAM,CAAE,qBAAAd,CAAqB,EAAIF,GAAoBgB,CAAQ,EACvDC,EAAc,CAAC,EACrB,QAASd,EAAI,EAAGA,EAAIa,EAAS,OAAQb,IACnC,GAAID,EAAqB,SAASC,CAAC,EAAG,CACpC,IAAMe,EAAYF,EAASb,EAAI,CAAC,EAC1BgB,EAAYH,EAASb,EAAI,CAAC,EAC1BiB,EAAcJ,EAASb,CAAC,EAExBkB,EAAed,GAAkBW,EAAWE,EAAa,CAAC,EAC1DE,EAAef,GAAkBY,EAAWC,EAAa,CAAC,EAE1DT,EAAQW,EAAa,EAAID,EAAa,EACtCT,EAAQU,EAAa,EAAID,EAAa,EAC5CJ,EAAY,KAAKI,CAAY,EAE7B,IAAME,EAAI,KAAK,KAAK,CAAC,EAAI,EACrBC,EAAiB,CAAE,EAAGJ,EAAY,EAAG,EAAGA,EAAY,CAAE,EAC1D,GAAI,KAAK,IAAID,EAAU,EAAID,EAAU,CAAC,EAAI,IAAM,KAAK,IAAIC,EAAU,EAAID,EAAU,CAAC,GAAK,GAAI,CACzF/E,EAAI,MACF,sBACA,KAAK,IAAIgF,EAAU,EAAID,EAAU,CAAC,EAClC,KAAK,IAAIC,EAAU,EAAID,EAAU,CAAC,CACpC,EACA,IAAMlC,EAAI,EACNoC,EAAY,IAAMC,EAAa,EACjCG,EAAiB,CACf,EAAGb,EAAQ,EAAIU,EAAa,EAAIrC,EAAIuC,EAAIF,EAAa,EAAIrC,EAAIuC,EAC7D,EAAGX,EAAQ,EAAIS,EAAa,EAAIE,EAAIF,EAAa,EAAIE,CACvD,EAEAC,EAAiB,CACf,EAAGb,EAAQ,EAAIU,EAAa,EAAIE,EAAIF,EAAa,EAAIE,EACrD,EAAGX,EAAQ,EAAIS,EAAa,EAAIrC,EAAIuC,EAAIF,EAAa,EAAIrC,EAAIuC,CAC/D,CAEJ,MACEpF,EAAI,MACF,+BACA,KAAK,IAAIgF,EAAU,EAAID,EAAU,CAAC,EAClC,KAAK,IAAIC,EAAU,EAAID,EAAU,CAAC,CACpC,EAEFD,EAAY,KAAKO,EAAgBF,CAAY,CAC/C,MACEL,EAAY,KAAKD,EAASb,CAAC,CAAC,EAGhC,OAAOc,CACT,EAjDmB,cAmDbQ,GAAoB7G,EAAA,CAAC8G,EAAKC,EAASC,IAAY,CACnD,IAAMC,EAAeH,EAAMC,EAAUC,EAC/BE,EAAa,EACbC,EAAY,EACZC,EAAoBF,EAAaC,EAGjCE,EAAgB,KAAK,MAAMJ,EAAeG,CAAiB,EAG3DE,EAAgB,MAAMD,CAAa,EAAE,KAAK,GAAGH,CAAU,IAAIC,CAAS,EAAE,EAAE,KAAK,GAAG,EAKtF,MAFkB,KAAKJ,CAAO,IAAIO,CAAa,IAAIN,CAAO,EAG5D,EAhB0B,qBAkBbO,GAAavH,EAAA,SACxBW,EACAC,EACA4G,EACAC,EACAC,EACAC,EACAC,EACAC,EAAgB,GAChB,CACA,GAAI,CAACD,EACH,MAAM,IAAI,MACR,2CAA2ChH,EAAK,EAAE,2DACpD,EAEF,GAAM,CAAE,cAAAkH,EAAe,OAAAC,CAAO,EAAI7H,EAAU,EACxCqD,EAAS3C,EAAK,OACdoH,EAAmB,GACjBC,EAAOP,EACb,IAAIQ,EAAOP,EACX,IAAMQ,EAAkB,CAAC,EACzB,QAAWC,KAAOxH,EAAK,kBACjByH,GAAaD,CAAG,GAGpBD,EAAgB,KAAKvH,EAAK,kBAAkBwH,CAAG,CAAC,EAOlD,GAAIL,IAAW,WAAY,CACzB,GAAIG,EAAK,WAAaD,EAAK,WAAa,MAAM,QAAQ1E,CAAM,GAAKA,EAAO,QAAU,EAChF,GAAIA,EAAO,SAAW,EAEpBA,EAAS,CAAC0E,EAAK,UAAU1E,EAAO,CAAC,CAAC,EAAG2E,EAAK,UAAU3E,EAAO,CAAC,CAAC,CAAC,MACzD,CAGL,IAAM+E,EAAc/E,EAAO,MAAM,EAAG,EAAE,EAChCgF,EAAaD,EAAY,CAAC,EAC1BE,EAAYF,EAAYA,EAAY,OAAS,CAAC,EAC9CG,EAAY,GACZC,EACJ,KAAK,IAAInF,EAAOA,EAAO,OAAS,CAAC,EAAE,EAAIiF,EAAU,CAAC,EAAIC,GACtD,KAAK,IAAIlF,EAAOA,EAAO,OAAS,CAAC,EAAE,EAAIiF,EAAU,CAAC,EAAIC,EAElDE,EAAWV,EAAK,UAAUM,CAAU,EACpCK,EAAUF,EAAeF,EAAYN,EAAK,UAAUM,CAAS,EAI7DK,EACJ,KAAK,IAAID,EAAQ,EAAIJ,EAAU,CAAC,EAAIC,GACpC,KAAK,IAAIG,EAAQ,EAAIJ,EAAU,CAAC,EAAIC,EAKhCK,GAHJ,KAAK,IAAIH,EAAS,EAAIJ,EAAW,CAAC,EAAIE,GACtC,KAAK,IAAIE,EAAS,EAAIJ,EAAW,CAAC,EAAIE,EAED,CAAC,EAAI,CAACE,CAAQ,EAC/CI,GAAYF,EAAkB,CAAC,EAAI,CAACD,CAAO,EAEjDrF,EAAS,CAAC,GAAGuF,GAAa,GAAGR,EAAa,GAAGS,EAAS,CACxD,CAEFxF,EAASD,GAAkC1C,EAAM2C,CAAM,CACzD,MAAW2E,EAAK,WAAaD,EAAK,WAAa,CAACJ,IAE9CtE,EAASA,EAAO,MAAM,EAAG3C,EAAK,OAAO,OAAS,CAAC,EAC/C2C,EAAO,QAAQ0E,EAAK,UAAU1E,EAAO,CAAC,CAAC,CAAC,EACxCA,EAAO,KAAK2E,EAAK,UAAU3E,EAAOA,EAAO,OAAS,CAAC,CAAC,CAAC,GAEvD,IAAMyF,EAAY,KAAK,KAAK,UAAUzF,CAAM,CAAC,EACzC3C,EAAK,YACPW,EAAI,KAAK,mBAAoBiG,EAAU,IAAI5G,EAAK,SAAS,CAAC,EAC1D2C,EAASoB,GAAmB/D,EAAK,OAAQ4G,EAAU,IAAI5G,EAAK,SAAS,EAAE,IAAI,EAE3EoH,EAAmB,IAGjBpH,EAAK,cACPW,EAAI,MACF,qBACAiG,EAAU,IAAI5G,EAAK,WAAW,EAC9B,KAAK,UAAU2C,EAAQ,KAAM,CAAC,CAChC,EACAA,EAASoB,GAAmBpB,EAAO,QAAQ,EAAGiE,EAAU,IAAI5G,EAAK,WAAW,EAAE,IAAI,EAAE,QAAQ,EAE5FoH,EAAmB,IAGrB,IAAI5B,EAAW7C,EAAO,OAAQ2B,GAAM,CAAC,OAAO,MAAMA,EAAE,CAAC,CAAC,EAEhD+D,EAAgBlJ,GAAqBa,EAAK,KAAK,EAGjDqI,IAAkB,YACpB7C,EAAWD,GAAWC,CAAQ,GAEhC,IAAI8C,EAAQC,EACZ,OAAQF,EAAe,CACrB,IAAK,SACHC,EAAQC,EACR,MACF,IAAK,QACHD,EAAQE,GACR,MACF,IAAK,WACHF,EAAQG,GACR,MACF,IAAK,QACHH,EAAQI,GACR,MACF,IAAK,QACHJ,EAAQK,GACR,MACF,IAAK,aACHL,EAAQM,GACR,MACF,IAAK,YACHN,EAAQO,GACR,MACF,IAAK,YACHP,EAAQQ,GACR,MACF,IAAK,UACHR,EAAQS,GACR,MACF,IAAK,OACHT,EAAQU,GACR,MACF,IAAK,YACHV,EAAQW,GACR,MACF,IAAK,aACHX,EAAQY,GACR,MACF,IAAK,UACHZ,EAAQC,EACR,MACF,QACED,EAAQE,EACZ,CAEA,GAAM,CAAE,EAAAlG,EAAG,EAAAC,CAAE,EAAI4G,GAA2BnJ,CAAI,EAC1CoJ,EAAeC,GAAK,EAAE,EAAE/G,CAAC,EAAE,EAAEC,CAAC,EAAE,MAAM+F,CAAK,EAE7CgB,EACJ,OAAQtJ,EAAK,UAAW,CACtB,IAAK,SACHsJ,EAAgB,wBAChB,MACF,IAAK,QACHA,EAAgB,uBAChB,MACF,IAAK,YACHA,EAAgB,2BAChB,MACF,QACEA,EAAgB,uBACpB,CACA,OAAQtJ,EAAK,QAAS,CACpB,IAAK,QACHsJ,GAAiB,sBACjB,MACF,IAAK,SACHA,GAAiB,uBACjB,MACF,IAAK,SACHA,GAAiB,uBACjB,MACF,QACEA,GAAiB,qBACrB,CACA,IAAIC,EACAC,EACFnB,IAAkB,UACdoB,GAAoBC,GAA2BlE,EAAUxF,CAAI,EAAG,CAAC,EACjEoJ,EAAa5D,CAAQ,EACrBmE,EAAa,MAAM,QAAQ3J,EAAK,KAAK,EAAIA,EAAK,MAAQ,CAACA,EAAK,KAAK,EACnE4J,EAAcD,EAAW,KAAM9J,GAAUA,GAAO,WAAW,SAAS,CAAC,EAErEgK,EAAiB,GACjB7J,EAAK,UACP6J,EAAiB,uBAEf7J,EAAK,YACP6J,EAAiB,kBAAoB7J,EAAK,WAG5C,IAAI8J,EAAe,GACnB,GAAI9J,EAAK,OAAS,YAAa,CAC7B,IAAM+J,EAAKC,GAAM,IAAIjK,CAAI,EACzB,OAAO,OAAO,CAAC,EAAGyF,CAAQ,EAE1B,IAAMyE,EAAcF,EAAG,KAAKP,EAAU,CACpC,UAAW,GACX,KAAMtC,CACR,CAAC,EAEDoC,GAAiB,cAEjBC,EAAUvI,EAAOiJ,CAAW,EACzB,OAAO,MAAM,EACb,KAAK,KAAM,GAAGjD,CAAS,IAAIhH,EAAK,EAAE,EAAE,EACpC,KACC,QACA,IACEsJ,GACCtJ,EAAK,QAAU,IAAMA,EAAK,QAAU,KACpC6J,EAAiB,IAAMA,EAAiB,GAC7C,EACC,KAAK,QAASF,EAAaA,EAAW,OAAO,CAAC/J,EAAKC,IAAUD,EAAM,IAAMC,EAAO,EAAE,EAAI,EAAE,EAC3F,IAAIqK,EAAIX,EAAQ,KAAK,GAAG,EACxBA,EAAQ,KAAK,IAAKW,CAAC,EACnBnK,EAAK,KAAK,EAAE,YAAYwJ,EAAQ,KAAK,CAAC,CACxC,KAAO,CACL,IAAMY,EAAoB5C,EAAgB,KAAK,GAAG,EAC5C6C,EAAST,EAAaA,EAAW,OAAO,CAAC/J,EAAKC,IAAUD,EAAMC,EAAQ,IAAK,EAAE,EAAI,GAEjFwK,GACHF,EAAoBA,EAAoB,IAAMC,EAAS,IAAMA,GAC9D,KACCT,EAAaA,EAAW,OAAO,CAAC/J,EAAKC,IAAUD,EAAM,IAAMC,EAAO,EAAE,EAAI,IAC3E0J,EAAUxJ,EACP,OAAO,MAAM,EACb,KAAK,IAAKyJ,CAAQ,EAClB,KAAK,KAAM,GAAGxC,CAAS,IAAIhH,EAAK,EAAE,EAAE,EACpC,KACC,QACA,IACEsJ,GACCtJ,EAAK,QAAU,IAAMA,EAAK,QAAU,KACpC6J,EAAiB,IAAMA,EAAiB,GAC7C,EACC,KAAK,QAASQ,CAAS,EAG1BT,EAAcS,EAAU,MAAM,gBAAgB,IAAI,CAAC,EAKnDP,EACE9J,EAAK,UAAY,IAAQ,CAAC,CAACA,EAAK,WAAamK,EAAkB,SAAS,WAAW,EACrF,IAAMG,EAAWf,EAAQ,KAAK,EACxBrD,EAAM,OAAOoE,EAAS,gBAAmB,WAAaA,EAAS,eAAe,EAAI,EAClFnE,EAAUoE,GAAevK,EAAK,cAAc,GAAK,EACjDoG,EAAUmE,GAAevK,EAAK,YAAY,GAAK,EAErD,GAAIA,EAAK,OAAS,OAAS,CAAC8J,EAAc,CAOxC,IAAMU,EAAU,qBALdxK,EAAK,UAAY,UAAYA,EAAK,UAAY,SAC1CiG,GAAkBC,EAAKC,EAASC,CAAO,EACvC,KAAKD,CAAO,IAAID,EAAMC,EAAUC,CAAO,IAAIA,CAAO,EAGV,0BAC9CmD,EAAQ,KAAK,QAASiB,EAAUjB,EAAQ,KAAK,OAAO,CAAC,CACvD,CACF,CAGAA,EAAQ,KAAK,YAAa,EAAI,EAC9BA,EAAQ,KAAK,UAAW,MAAM,EAC9BA,EAAQ,KAAK,UAAWvJ,EAAK,EAAE,EAC/BuJ,EAAQ,KAAK,cAAenB,CAAS,EAErCmB,EAAQ,KAAK,YAAakB,GAAoBzK,EAAK,IAAI,CAAC,EAWpDA,EAAK,YACPwF,EAAS,QAAStC,GAAU,CAC1BnD,EACG,OAAO,QAAQ,EACf,MAAM,SAAU,KAAK,EACrB,MAAM,OAAQ,KAAK,EACnB,KAAK,IAAK,CAAC,EACX,KAAK,KAAMmD,EAAM,CAAC,EAClB,KAAK,KAAMA,EAAM,CAAC,CACvB,CAAC,EAYH,IAAIwH,EAAM,IACNpL,EAAU,EAAE,UAAU,qBAAuBA,EAAU,EAAE,MAAM,uBACjEoL,EACE,OAAO,SAAS,SAChB,KACA,OAAO,SAAS,KAChB,OAAO,SAAS,SAChB,OAAO,SAAS,OAClBA,EAAMA,EAAI,QAAQ,MAAO,KAAK,EAAE,QAAQ,MAAO,KAAK,GAEtD/J,EAAI,KAAK,iBAAkBX,EAAK,cAAc,EAC9CW,EAAI,KAAK,eAAgBX,EAAK,YAAY,EAE1C,IAAM2K,GAAY,CAACb,GAAgB9J,GAAM,OAAS,MAClD4K,GAAerB,EAASvJ,EAAM0K,EAAK1D,EAAWH,EAAa8D,GAAWf,CAAW,EACjF,IAAMiB,GAAW,KAAK,MAAMlI,EAAO,OAAS,CAAC,EACvCO,GAAQP,EAAOkI,EAAQ,EACxBpI,EAAM,wBAAwBS,GAAOqG,EAAQ,KAAK,GAAG,CAAC,IACzDnC,EAAmB,IAGrB,IAAIpF,EAAQ,CAAC,EACb,OAAIoF,IACFpF,EAAM,YAAcW,GAEtBX,EAAM,aAAehC,EAAK,OACnBgC,CACT,EAxU0B,cAgVnB,SAASyH,GAAoB9G,EAAQmI,EAAQ,CAClD,GAAInI,EAAO,OAAS,EAClB,MAAO,GAGT,IAAIV,EAAO,GACL8I,EAAOpI,EAAO,OACdqI,EAAU,KAEhB,QAASrG,EAAI,EAAGA,EAAIoG,EAAMpG,IAAK,CAC7B,IAAMsG,EAAYtI,EAAOgC,CAAC,EACpBe,EAAY/C,EAAOgC,EAAI,CAAC,EACxBgB,EAAYhD,EAAOgC,EAAI,CAAC,EAE9B,GAAIA,IAAM,EAER1C,GAAQ,IAAIgJ,EAAU,CAAC,IAAIA,EAAU,CAAC,WAC7BtG,IAAMoG,EAAO,EAEtB9I,GAAQ,IAAIgJ,EAAU,CAAC,IAAIA,EAAU,CAAC,OACjC,CAEL,IAAMC,EAAMD,EAAU,EAAIvF,EAAU,EAC9ByF,EAAMF,EAAU,EAAIvF,EAAU,EAC9B0F,EAAMzF,EAAU,EAAIsF,EAAU,EAC9BI,EAAM1F,EAAU,EAAIsF,EAAU,EAE9BK,EAAO,KAAK,MAAMJ,EAAKC,CAAG,EAC1BI,EAAO,KAAK,MAAMH,EAAKC,CAAG,EAGhC,GAAIC,EAAON,GAAWO,EAAOP,EAAS,CACpC/I,GAAQ,IAAIgJ,EAAU,CAAC,IAAIA,EAAU,CAAC,GACtC,QACF,CAGA,IAAMO,EAAMN,EAAMI,EACZG,EAAMN,EAAMG,EACZI,EAAMN,EAAMG,EACZI,EAAMN,EAAME,EAGZK,EAAMJ,EAAME,EAAMD,EAAME,EAExBE,EAAa,KAAK,IAAI,GAAI,KAAK,IAAI,EAAGD,CAAG,CAAC,EAC1CE,EAAQ,KAAK,KAAKD,CAAU,EAGlC,GAAIC,EAAQd,GAAW,KAAK,IAAI,KAAK,GAAKc,CAAK,EAAId,EAAS,CAC1D/I,GAAQ,IAAIgJ,EAAU,CAAC,IAAIA,EAAU,CAAC,GACtC,QACF,CAGA,IAAMc,EAAS,KAAK,IAAIjB,EAAS,KAAK,IAAIgB,EAAQ,CAAC,EAAGR,EAAO,EAAGC,EAAO,CAAC,EAGlES,EAASf,EAAU,EAAIO,EAAMO,EAC7BE,EAAShB,EAAU,EAAIQ,EAAMM,EAC7BG,EAAOjB,EAAU,EAAIS,EAAMK,EAC3BI,EAAOlB,EAAU,EAAIU,EAAMI,EAGjC9J,GAAQ,IAAI+J,CAAM,IAAIC,CAAM,GAG5BhK,GAAQ,IAAIgJ,EAAU,CAAC,IAAIA,EAAU,CAAC,IAAIiB,CAAI,IAAIC,CAAI,EACxD,CACF,CAEA,OAAOlK,CACT,CAxEgB7C,EAAAqK,GAAA,uBA0EhB,SAAS2C,GAAuBC,EAAQC,EAAQ,CAC9C,GAAI,CAACD,GAAU,CAACC,EACd,MAAO,CAAE,MAAO,EAAG,OAAQ,EAAG,OAAQ,CAAE,EAE1C,IAAMC,EAASD,EAAO,EAAID,EAAO,EAC3BG,EAASF,EAAO,EAAID,EAAO,EAEjC,MAAO,CAAE,MADK,KAAK,MAAMG,EAAQD,CAAM,EACvB,OAAAA,EAAQ,OAAAC,CAAO,CACjC,CARSpN,EAAAgN,GAAA,0BAWF,SAAS1C,GAA2B/G,EAAQ3C,EAAM,CAEvD,IAAMyM,EAAY9J,EAAO,IAAKO,IAAW,CAAE,GAAGA,CAAM,EAAE,EAGtD,GAAIP,EAAO,QAAU,GAAK+J,EAAc1M,EAAK,cAAc,EAAG,CAC5D,IAAM2M,EAAcD,EAAc1M,EAAK,cAAc,EAE/CqM,EAAS1J,EAAO,CAAC,EACjB2J,EAAS3J,EAAO,CAAC,EAEjB,CAAE,MAAAmJ,CAAM,EAAIM,GAAuBC,EAAQC,CAAM,EAEjDM,EAAUD,EAAc,KAAK,IAAIb,CAAK,EACtCe,EAAUF,EAAc,KAAK,IAAIb,CAAK,EAE5CW,EAAU,CAAC,EAAE,EAAIJ,EAAO,EAAIO,EAC5BH,EAAU,CAAC,EAAE,EAAIJ,EAAO,EAAIQ,CAC9B,CAGA,IAAMC,EAAInK,EAAO,OACjB,GAAImK,GAAK,GAAKJ,EAAc1M,EAAK,YAAY,EAAG,CAC9C,IAAM2M,EAAcD,EAAc1M,EAAK,YAAY,EAE7CqM,EAAS1J,EAAOmK,EAAI,CAAC,EACrBR,EAAS3J,EAAOmK,EAAI,CAAC,EAErB,CAAE,MAAAhB,CAAM,EAAIM,GAAuBE,EAAQD,CAAM,EAEjDO,EAAUD,EAAc,KAAK,IAAIb,CAAK,EACtCe,EAAUF,EAAc,KAAK,IAAIb,CAAK,EAE5CW,EAAUK,EAAI,CAAC,EAAE,EAAIT,EAAO,EAAIO,EAChCH,EAAUK,EAAI,CAAC,EAAE,EAAIT,EAAO,EAAIQ,CAClC,CAEA,OAAOJ,CACT,CAtCgBrN,EAAAsK,GAAA,8BC19BhB,IAAMqD,GAAgBC,EAAA,CAACC,EAAMC,EAAaC,EAAMC,IAAO,CACrDF,EAAY,QAASG,GAAe,CAClCC,GAAQD,CAAU,EAAEJ,EAAME,EAAMC,CAAE,CACpC,CAAC,CACH,EAJsB,iBAMhBG,GAAYP,EAAA,CAACC,EAAME,EAAMC,IAAO,CACpCI,EAAI,MAAM,sBAAuBJ,CAAE,EACnCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,KAAK,IAAK,oBAAoB,EAEjCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,oBAAoB,EAEjCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,wBAAwB,EACrD,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,KAAK,UAAW,WAAW,EAC3B,OAAO,SAAS,EAChB,KAAK,SAAU,iBAAiB,EAChC,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,GAAG,EAEhCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,sBAAsB,EACnD,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,KAAK,UAAW,WAAW,EAC3B,OAAO,SAAS,EAChB,KAAK,SAAU,iBAAiB,EAChC,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,GAAG,CAClC,EA7DkB,aA+DZM,GAAcT,EAAA,CAACC,EAAME,EAAMC,IAAO,CACtCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,mBAAmB,EAChD,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,0BAA0B,EAEvCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,0BAA0B,EAEvCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,0BAA0B,EACvD,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,MAAM,eAAgB,CAAC,EACvB,KAAK,UAAW,WAAW,EAC3B,KAAK,IAAK,0BAA0B,EAEvCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,wBAAwB,EACrD,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,GAAG,EAChB,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,MAAM,eAAgB,CAAC,EACvB,KAAK,IAAK,0BAA0B,CACzC,EAzDoB,eA0DdO,GAAcV,EAAA,CAACC,EAAME,EAAMC,IAAO,CACtCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,mBAAmB,EAChD,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,0BAA0B,EAEvCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,0BAA0B,EAEvCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,0BAA0B,EACvD,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,MAAM,eAAgB,CAAC,EACvB,KAAK,IAAK,0BAA0B,EAEvCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,wBAAwB,EACrD,KAAK,QAAS,sBAAwBA,CAAI,EAC1C,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,MAAM,eAAgB,CAAC,EACvB,KAAK,IAAK,0BAA0B,CACzC,EAxDoB,eAyDdQ,GAAaX,EAAA,CAACC,EAAME,EAAMC,IAAO,CACrCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,kBAAkB,EAC/C,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,yBAAyB,EAEtCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,gBAAgB,EAC7C,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,2BAA2B,EACxCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,yBAAyB,EACtD,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,MAAM,eAAgB,CAAC,EACvB,KAAK,IAAK,yBAAyB,EAEtCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,uBAAuB,EACpD,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,MAAM,eAAgB,CAAC,EACvB,KAAK,IAAK,2BAA2B,CAC1C,EAvDmB,cAwDbS,GAAWZ,EAAA,CAACC,EAAME,EAAMC,IAAO,CACnCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,gBAAgB,EAC7C,KAAK,QAAS,mBAAqBA,CAAI,EACvC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,OAAO,QAAQ,EACf,KAAK,OAAQ,aAAa,EAC1B,KAAK,KAAM,CAAC,EACZ,KAAK,KAAM,CAAC,EACZ,KAAK,IAAK,CAAC,EAEdF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,cAAc,EAC3C,KAAK,QAAS,mBAAqBA,CAAI,EACvC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,OAAO,QAAQ,EACf,KAAK,OAAQ,aAAa,EAC1B,KAAK,KAAM,CAAC,EACZ,KAAK,KAAM,CAAC,EACZ,KAAK,IAAK,CAAC,EACdF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,uBAAuB,EACpD,KAAK,QAAS,mBAAqBA,CAAI,EACvC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,QAAQ,EACf,KAAK,OAAQ,aAAa,EAC1B,KAAK,KAAM,CAAC,EACZ,KAAK,KAAM,CAAC,EACZ,KAAK,IAAK,CAAC,EACX,KAAK,eAAgB,CAAC,EAEzBF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,qBAAqB,EAClD,KAAK,QAAS,mBAAqBA,CAAI,EACvC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,GAAG,EACvB,KAAK,eAAgB,GAAG,EACxB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,QAAQ,EACf,KAAK,OAAQ,aAAa,EAC1B,KAAK,KAAM,CAAC,EACZ,KAAK,KAAM,CAAC,EACZ,KAAK,IAAK,CAAC,EACX,KAAK,eAAgB,CAAC,CAC3B,EAnEiB,YAoEXU,GAAQb,EAAA,CAACC,EAAME,EAAMC,IAAO,CAChCH,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,WAAW,EACxC,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,CAAC,EACrB,KAAK,eAAgB,CAAC,EACtB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,uBAAuB,EACjC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAClCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,aAAa,EAC1C,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,GAAG,EAChB,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,CAAC,EACrB,KAAK,eAAgB,CAAC,EACtB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,wBAAwB,EAClC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAClCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,kBAAkB,EAC/C,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,aAAa,EAC7B,KAAK,OAAQ,IAAI,EACjB,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,IAAI,EACxB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,yBAAyB,EACnC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAClCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,oBAAoB,EACjD,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,aAAa,EAC7B,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,IAAI,EACxB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,SAAS,EAChB,KAAK,SAAU,oBAAoB,EACnC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,CACpC,EAjEc,SAkERW,GAASd,EAAA,CAACC,EAAME,EAAMC,IAAO,CACjCH,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,YAAY,EACzC,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,QAAQ,EACf,KAAK,KAAM,GAAG,EACd,KAAK,KAAM,GAAG,EACd,KAAK,IAAK,GAAG,EACb,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAElCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,cAAc,EAC3C,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,QAAQ,EACf,KAAK,KAAM,GAAG,EACd,KAAK,KAAM,GAAG,EACd,KAAK,IAAK,GAAG,EACb,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAClCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,mBAAmB,EAChD,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,KAAK,EAClB,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,QAAQ,EACf,KAAK,KAAM,GAAG,EACd,KAAK,KAAM,GAAG,EACd,KAAK,IAAK,GAAG,EACb,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAElCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,qBAAqB,EAClD,KAAK,QAAS,UAAYA,CAAI,EAC9B,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,QAAQ,EACf,KAAK,KAAM,GAAG,EACd,KAAK,KAAM,GAAG,EACd,KAAK,IAAK,GAAG,EACb,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,CACpC,EA3Ee,UA4ETY,GAAQf,EAAA,CAACC,EAAME,EAAMC,IAAO,CAChCH,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,WAAW,EACxC,KAAK,QAAS,gBAAkBA,CAAI,EACpC,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,GAAG,EAChB,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EAEb,KAAK,IAAK,2BAA2B,EACrC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAElCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,aAAa,EAC1C,KAAK,QAAS,gBAAkBA,CAAI,EACpC,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,GAAG,EAChB,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EAEb,KAAK,IAAK,2BAA2B,EACrC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,CAAC,EACvB,MAAM,mBAAoB,KAAK,EAClCF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,kBAAkB,EAC/C,KAAK,QAAS,gBAAkBA,CAAI,EACpC,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,IAAI,EACjB,KAAK,OAAQ,GAAG,EAChB,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,6BAA6B,EACvC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,GAAG,EAE5BF,EACG,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,oBAAoB,EACjD,KAAK,QAAS,gBAAkBA,CAAI,EACpC,KAAK,UAAW,WAAW,EAC3B,KAAK,OAAQ,IAAI,EACjB,KAAK,OAAQ,GAAG,EAChB,KAAK,cAAe,gBAAgB,EACpC,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,6BAA6B,EACvC,KAAK,QAAS,iBAAiB,EAC/B,MAAM,eAAgB,GAAG,EACzB,MAAM,mBAAoB,KAAK,CACpC,EApEc,SAqERa,GAAOhB,EAAA,CAACC,EAAME,EAAMC,IAAO,CAC/BH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,UAAU,EACvC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,cAAe,gBAAgB,EACpC,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,2BAA2B,CAC1C,EAba,QAcPc,GAAUjB,EAAA,CAACC,EAAME,EAAMC,IAAO,CAClC,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,gBAAAG,CAAgB,EAAID,EAC5BnB,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,UAAU,EACvC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,cAAe,aAAa,EACjC,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,6BAA6B,EAE1CF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,cAAe,gBAAgB,EACpC,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,6BAA6B,EACvC,KAAK,OAAQ,GAAGkB,CAAe,EAAE,CACtC,EA9BgB,WAgCVC,GAAWtB,EAAA,CAACC,EAAME,EAAMC,IAAO,CACnCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,kBAAoBA,CAAI,EACtC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,yBAAyB,EAEtCF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,aAAa,EAC1C,KAAK,QAAS,kBAAoBA,CAAI,EACtC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,uBAAuB,CACtC,EA1BiB,YA4BXoB,GAAcvB,EAAA,CAACC,EAAME,EAAMC,IAAO,CACtC,IAAMoB,EAAcvB,EACjB,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACxBqB,EACG,OAAO,QAAQ,EACf,KAAK,OAAQ,OAAO,EACpB,KAAK,KAAM,EAAE,EACb,KAAK,KAAM,CAAC,EACZ,KAAK,IAAK,CAAC,EACdA,EAAY,OAAO,MAAM,EAAE,KAAK,IAAK,YAAY,EAEjD,IAAMC,EAAYxB,EACf,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACxBsB,EACG,OAAO,QAAQ,EACf,KAAK,OAAQ,OAAO,EACpB,KAAK,KAAM,CAAC,EACZ,KAAK,KAAM,CAAC,EACZ,KAAK,IAAK,CAAC,EACdA,EAAU,OAAO,MAAM,EAAE,KAAK,IAAK,cAAc,CACnD,EApCoB,eAsCdC,GAAc1B,EAAA,CAACC,EAAME,EAAMC,IAAO,CACtCH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,8CAA8C,EAE3DF,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,0CAA0C,CACzD,EA1BoB,eA4BdwB,GAAe3B,EAAA,CAACC,EAAME,EAAMC,IAAO,CACvC,IAAMoB,EAAcvB,EACjB,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,kBAAkB,EAC/C,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACxBqB,EAAY,OAAO,QAAQ,EAAE,KAAK,OAAQ,OAAO,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,IAAK,CAAC,EAC5FA,EAAY,OAAO,MAAM,EAAE,KAAK,IAAK,+BAA+B,EAEpE,IAAMC,EAAYxB,EACf,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,gBAAgB,EAC7C,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACxBsB,EAAU,OAAO,QAAQ,EAAE,KAAK,OAAQ,OAAO,EAAE,KAAK,KAAM,CAAC,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,IAAK,CAAC,EACzFA,EAAU,OAAO,MAAM,EAAE,KAAK,IAAK,iCAAiC,CACtE,EA1BqB,gBA4BfG,GAAe5B,EAAA,CAACC,EAAME,EAAMC,IAAO,CACvC,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,YAAAW,CAAY,EAAIT,EAExBnB,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,kBAAoBA,CAAI,EACtC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,KAAK,IAAK,yBAAyB,EACnC,KAAK,eAAgB,GAAG0B,CAAW,EAAE,EAExC5B,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,aAAa,EAC1C,KAAK,QAAS,kBAAoBA,CAAI,EACtC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,KAAK,IAAK,uBAAuB,EACjC,KAAK,eAAgB,GAAG0B,CAAW,EAAE,CAC1C,EAlCqB,gBAoCfC,GAAkB9B,EAAA,CAACC,EAAME,EAAMC,IAAO,CAC1C,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,YAAAW,EAAa,QAAAE,CAAQ,EAAIX,EAC3BI,EAAcvB,EACjB,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACvCqB,EACG,OAAO,QAAQ,EACf,KAAK,OAAQO,GAAW,OAAO,EAC/B,KAAK,KAAM,EAAE,EACb,KAAK,KAAM,CAAC,EACZ,KAAK,eAAgB,GAAGF,CAAW,EAAE,EACrC,KAAK,IAAK,CAAC,EACdL,EAAY,OAAO,MAAM,EAAE,KAAK,IAAK,YAAY,EAAE,KAAK,eAAgB,GAAGK,CAAW,EAAE,EAExF,IAAMJ,EAAYxB,EACf,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,CAAC,EACd,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,cAAe,gBAAgB,EACpC,KAAK,SAAU,MAAM,EACxBsB,EACG,OAAO,QAAQ,EACf,KAAK,OAAQM,GAAW,OAAO,EAC/B,KAAK,KAAM,CAAC,EACZ,KAAK,KAAM,CAAC,EACZ,KAAK,eAAgB,GAAGF,CAAW,EAAE,EACrC,KAAK,IAAK,CAAC,EACdJ,EAAU,OAAO,MAAM,EAAE,KAAK,IAAK,cAAc,EAAE,KAAK,eAAgB,GAAGI,CAAW,EAAE,CAC1F,EA3CwB,mBA6ClBG,GAAkBhC,EAAA,CAACC,EAAME,EAAMC,IAAO,CAC1C,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,YAAAW,CAAY,EAAIT,EACxBnB,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,iBAAiB,EAC9C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,MAAM,EACb,KAAK,IAAK,8CAA8C,EACxD,KAAK,eAAgB,GAAG0B,CAAW,EAAE,EAExC5B,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,eAAe,EAC5C,KAAK,QAAS,oBAAsBA,CAAI,EACxC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,cAAe,gBAAgB,EACpC,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KAAK,IAAK,0CAA0C,EACpD,KAAK,eAAgB,GAAG0B,CAAW,EAAE,CAC1C,EAjCwB,mBAmClBI,GAAmBjC,EAAA,CAACC,EAAME,EAAMC,IAAO,CAC3C,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,YAAAW,EAAa,QAAAE,CAAQ,EAAIX,EAC3BI,EAAcvB,EACjB,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,kBAAkB,EAC/C,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,cAAe,gBAAgB,EACpC,KAAK,SAAU,MAAM,EACxBqB,EACG,OAAO,QAAQ,EACf,KAAK,OAAQO,GAAW,OAAO,EAC/B,KAAK,KAAM,IAAI,EACf,KAAK,KAAM,EAAE,EACb,KAAK,IAAK,CAAC,EACX,KAAK,eAAgB,GAAGF,CAAW,EAAE,EACxCL,EACG,OAAO,MAAM,EACb,KAAK,IAAK,+BAA+B,EACzC,KAAK,eAAgB,GAAGK,CAAW,EAAE,EAExC,IAAMJ,EAAYxB,EACf,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,gBAAgB,EAC7C,KAAK,QAAS,qBAAuBA,CAAI,EACzC,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACvCsB,EACG,OAAO,QAAQ,EACf,KAAK,OAAQM,GAAW,OAAO,EAC/B,KAAK,KAAM,EAAE,EACb,KAAK,KAAM,EAAE,EACb,KAAK,IAAK,CAAC,EACX,KAAK,eAAgB,GAAGF,CAAW,EAAE,EACxCJ,EACG,OAAO,MAAM,EACb,KAAK,IAAK,iCAAiC,EAC3C,KAAK,eAAgB,GAAGI,CAAW,EAAE,CAC1C,EAjDyB,oBAmDnBK,GAAoBlC,EAAA,CAACC,EAAME,EAAMC,IAAO,CAC5CH,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,uBAAuB,EACpD,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,MAAM,EACb,KACC,IACA;AAAA;AAAA;AAAA,YAIF,CACJ,EAlB0B,qBAoBpBgC,GAAwBnC,EAAA,CAACC,EAAME,EAAMC,IAAO,CAChD,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,YAAAW,CAAY,EAAIT,EAExBnB,EACG,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,uBAAuB,EACpD,KAAK,OAAQ,EAAE,EACf,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,KAAK,eAAgB,GAAG0B,CAAW,EAAE,EACrC,KAAK,UAAW,WAAW,EAC3B,OAAO,MAAM,EACb,KACC,IACA;AAAA;AAAA;AAAA,YAIF,EACC,KAAK,kBAAmB,OAAO,CACpC,EA1B8B,yBA4BxBO,GAAuBpC,EAAA,CAACC,EAAME,EAAMC,IAAO,CAC/C,IAAMiC,EAAepC,EAClB,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,4BAA4B,EACzD,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,OAAO,GAAG,EAEbkC,EAAa,OAAO,QAAQ,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,IAAK,CAAC,EAAE,KAAK,OAAQ,MAAM,EAE5FA,EAAa,OAAO,MAAM,EAAE,KAAK,KAAM,CAAC,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAErFA,EAAa,OAAO,MAAM,EAAE,KAAK,KAAM,CAAC,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,CACvF,EAjB6B,wBAmBvBC,GAA2BtC,EAAA,CAACC,EAAME,EAAMC,IAAO,CACnD,IAAMc,EAAmBC,EAAU,EAC7B,CAAE,eAAAC,CAAe,EAAIF,EACrB,CAAE,YAAAW,CAAY,EAAIT,EAClBiB,EAAepC,EAClB,OAAO,MAAM,EACb,OAAO,QAAQ,EACf,KAAK,KAAMG,EAAK,IAAMD,EAAO,4BAA4B,EACzD,KAAK,OAAQ,CAAC,EACd,KAAK,OAAQ,EAAE,EACf,KAAK,cAAe,EAAE,EACtB,KAAK,eAAgB,EAAE,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,cAAe,gBAAgB,EACpC,OAAO,GAAG,EAEbkC,EAAa,OAAO,QAAQ,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,IAAK,CAAC,EAAE,KAAK,OAAQ,MAAM,EAE5FA,EAAa,OAAO,MAAM,EAAE,KAAK,KAAM,CAAC,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAErFA,EAAa,OAAO,MAAM,EAAE,KAAK,KAAM,CAAC,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EAAE,KAAK,KAAM,EAAE,EACrFA,EAAa,UAAU,GAAG,EAAE,KAAK,eAAgB,GAAGR,CAAW,EAAE,CACnE,EAtBiC,4BAyB3BvB,GAAU,CACd,UAAAC,GACA,YAAAE,GACA,YAAAC,GACA,WAAAC,GACA,SAAAC,GACA,MAAAC,GACA,OAAAC,GACA,MAAAC,GACA,KAAAC,GACA,QAAAC,GACA,SAAAK,GACA,YAAAC,GACA,YAAAG,GACA,aAAAC,GACA,aAAAC,GACA,gBAAAE,GACA,gBAAAE,GACA,iBAAAC,GACA,kBAAAC,GACA,qBAAAE,GACA,sBAAAD,GACA,yBAAAG,EACF,EACOC,GAAQxC",
"names": ["addEdgeMarkers", "__name", "svgPath", "edge", "url", "id", "diagramType", "useMargin", "strokeColor", "addEdgeMarker", "arrowTypesMap", "arrowTypesWithMarginSupport", "position", "arrowType", "arrowTypeInfo", "marginSupport", "log", "endMarkerType", "originalMarkerId", "colorId", "coloredMarkerId", "originalMarker", "coloredMarker", "path", "resolveEdgeCurveType", "__name", "edgeCurve", "getConfig", "edgeLabels", "terminalLabels", "clear", "getLabelStyles", "styleArray", "acc", "style", "insertEdgeLabel", "elem", "edge", "config", "useHtmlLabels", "getEffectiveHtmlLabels", "labelStyles", "styles2String", "edgeLabel", "label", "isMarkdown", "labelElement", "createText", "log", "bbox", "transformBbox", "div", "dv", "select_default", "textEl", "computeLabelTransform", "fo", "startEdgeLabelLeft", "inner", "startLabelElement", "createLabel_default", "slBox", "setTerminalWidth", "startEdgeLabelRight", "endEdgeLabelLeft", "endLabelElement", "endEdgeLabelRight", "value", "positionEdgeLabel", "paths", "path", "siteConfig", "subGraphTitleTotalMargin", "getSubGraphTitleMargins", "el", "x", "y", "pos", "utils_default", "orthogonalizeToLabelClippedPoints", "points", "start", "end", "dx", "dy", "outsideNode", "node", "point", "w", "h", "intersection", "outsidePoint", "insidePoint", "r", "Q", "R", "q", "res", "_x", "_y", "cutPathAtIntersect", "_points", "boundaryNode", "lastPointOutside", "isInside", "inter", "pointPresent", "p", "e", "extractCornerPoints", "cornerPoints", "cornerPointPositions", "i", "prev", "curr", "next", "findAdjacentPoint", "pointA", "pointB", "distance", "xDiff", "yDiff", "length", "ratio", "fixCorners", "lineData", "newLineData", "prevPoint", "nextPoint", "cornerPoint", "newPrevPoint", "newNextPoint", "a", "newCornerPoint", "generateDashArray", "len", "oValueS", "oValueE", "middleLength", "dashLength", "gapLength", "dashGapPairLength", "numberOfPairs", "middlePattern", "insertEdge", "clusterDb", "diagramType", "startNode", "endNode", "diagramId", "skipIntersect", "handDrawnSeed", "layout", "pointsHasChanged", "tail", "head", "edgeClassStyles", "key", "isLabelStyle", "innerPoints", "firstInner", "lastInner", "TOLERANCE", "lastIsPinned", "newFirst", "newLast", "lastIsDuplicate", "startPoints", "endPoints", "pointsStr", "edgeCurveType", "curve", "linear_default", "basis_default", "cardinal_default", "bumpX", "bumpY", "catmullRom_default", "monotoneX", "monotoneY", "natural_default", "step_default", "stepAfter", "stepBefore", "getLineFunctionsWithOffset", "lineFunction", "line_default", "strokeClasses", "svgPath", "linePath", "generateRoundedPath", "applyMarkerOffsetsToPoints", "edgeStyles", "strokeColor", "animationClass", "animatedEdge", "rc", "at", "svgPathNode", "d", "stylesFromClasses", "styles", "pathStyle", "pathNode", "markerOffsets2", "mOffset", "handleUndefinedAttr", "url", "useMargin", "addEdgeMarkers", "midIndex", "radius", "size", "epsilon", "currPoint", "dx1", "dy1", "dx2", "dy2", "len1", "len2", "nx1", "ny1", "nx2", "ny2", "dot", "clampedDot", "angle", "cutLen", "startX", "startY", "endX", "endY", "calculateDeltaAndAngle", "point1", "point2", "deltaX", "deltaY", "newPoints", "markerOffsets", "offsetValue", "offsetX", "offsetY", "n", "insertMarkers", "__name", "elem", "markerArray", "type", "id", "markerName", "markers", "extension", "log", "composition", "aggregation", "dependency", "lollipop", "point", "circle", "cross", "barb", "barbNeo", "config", "getConfig", "themeVariables", "transitionColor", "only_one", "zero_or_one", "startMarker", "endMarker", "one_or_more", "zero_or_more", "only_one_neo", "strokeWidth", "zero_or_one_neo", "mainBkg", "one_or_more_neo", "zero_or_more_neo", "requirement_arrow", "requirement_arrow_neo", "requirement_contains", "containsNode", "requirement_contains_neo", "markers_default"]
}