{
  "version": 3,
  "sources": ["../../../src/rendering-util/labelTransform.ts", "../../../src/utils/lineWithOffset.ts", "../../../src/rendering-util/rendering-elements/edgeStepAnimation.ts", "../../../src/rendering-util/edgeStep.ts", "../../../src/rendering-util/rendering-elements/edges.js", "../../../src/rendering-util/rendering-elements/edgeMarker.ts", "../../../src/rendering-util/rendering-elements/markers.js"],
  "sourcesContent": ["/**\n * Bounding box used for label transform computation.\n * For SVG getBBox(), x/y may be present; for HTML getBoundingClientRect(), only width/height are used.\n */\nexport interface LabelBBox {\n  x?: number;\n  y?: number;\n  width: number;\n  height: number;\n}\n\n/**\n * Compute the SVG translate transform needed to center a label element at the origin.\n *\n * For HTML labels, getBoundingClientRect() is used and its x/y are viewport-absolute,\n * so only width/height are relevant for centering within the SVG group.\n *\n * For SVG labels, getBBox() returns coordinates in the element's local coordinate system.\n * When addSvgBackground is true, the background <rect> extends beyond the text (making\n * bbox.x/y negative), so we include those offsets to correctly center the visual\n * content at the origin.\n *\n * @param bbox - The bounding box of the label element\n * @param useHtmlLabels - Whether HTML labels are in use\n * @returns SVG transform string, e.g. \"translate(-20, -10)\"\n */\nexport const computeLabelTransform = (bbox: LabelBBox, useHtmlLabels: boolean): string => {\n  if (useHtmlLabels) {\n    return 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')';\n  }\n  const x = bbox.x ?? 0;\n  const y = bbox.y ?? 0;\n  return 'translate(' + -(x + bbox.width / 2) + ', ' + -(y + bbox.height / 2) + ')';\n};\n", "import type { EdgeData, Point } from '../types.js';\n\n// We need to draw the lines a bit shorter to avoid drawing\n// under any transparent markers.\n// The offsets are calculated from the markers' dimensions.\nexport const markerOffsets = {\n  aggregation: 17.25,\n  extension: 17.25,\n  composition: 17.25,\n  dependency: 6,\n  lollipop: 13.5,\n  arrow_point: 4,\n  arrow_barb: 0,\n  arrow_barb_neo: 5.5,\n  //arrow_cross: 24,\n} as const;\n\n// We need to draw the lines a bit shorter to avoid drawing\n// under any transparent markers.\n// The offsets are calculated from the markers' dimensions.\nexport const markerOffsets2 = {\n  arrow_point: 4,\n  arrow_cross: 12.5,\n  arrow_circle: 12.5,\n  arrow_open_head: 4,\n  arrow_hollow_circle: 8,\n} as const;\n\n/**\n * Calculate the deltas and angle between two points\n * @param point1 - First point\n * @param point2 - Second point\n * @returns The angle, deltaX and deltaY\n */\nfunction calculateDeltaAndAngle(\n  point1?: Point | [number, number],\n  point2?: Point | [number, number]\n): { angle: number; deltaX: number; deltaY: number } {\n  if (point1 === undefined || point2 === undefined) {\n    return { angle: 0, deltaX: 0, deltaY: 0 };\n  }\n  point1 = pointTransformer(point1);\n  point2 = pointTransformer(point2);\n  const [x1, y1] = [point1.x, point1.y];\n  const [x2, y2] = [point2.x, point2.y];\n  const deltaX = x2 - x1;\n  const deltaY = y2 - y1;\n  return { angle: Math.atan(deltaY / deltaX), deltaX, deltaY };\n}\n\nconst pointTransformer = (data: Point | [number, number]) => {\n  if (Array.isArray(data)) {\n    return { x: data[0], y: data[1] };\n  }\n  return data;\n};\n\nexport const getLineFunctionsWithOffset = (\n  edge: Pick<EdgeData, 'arrowTypeStart' | 'arrowTypeEnd'>\n) => {\n  return {\n    x: function (\n      this: void,\n      d: Point | [number, number],\n      i: number,\n      data: (Point | [number, number])[]\n    ) {\n      let offset = 0;\n      const DIRECTION =\n        pointTransformer(data[0]).x < pointTransformer(data[data.length - 1]).x ? 'left' : 'right';\n      if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {\n        const { angle, deltaX } = calculateDeltaAndAngle(data[0], data[1]);\n        offset =\n          markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *\n          Math.cos(angle) *\n          (deltaX >= 0 ? 1 : -1);\n      } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {\n        const { angle, deltaX } = calculateDeltaAndAngle(\n          data[data.length - 1],\n          data[data.length - 2]\n        );\n        offset =\n          markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets] *\n          Math.cos(angle) *\n          (deltaX >= 0 ? 1 : -1);\n      }\n\n      const differenceToEnd = Math.abs(\n        pointTransformer(d).x - pointTransformer(data[data.length - 1]).x\n      );\n      const differenceInYEnd = Math.abs(\n        pointTransformer(d).y - pointTransformer(data[data.length - 1]).y\n      );\n      const differenceToStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);\n      const differenceInYStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);\n      const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];\n      const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];\n      const extraRoom = 1;\n\n      // Adjust the offset if the difference is smaller than the marker height\n      if (\n        differenceToEnd < endMarkerHeight &&\n        differenceToEnd > 0 &&\n        differenceInYEnd < endMarkerHeight\n      ) {\n        let adjustment = endMarkerHeight + extraRoom - differenceToEnd;\n        adjustment *= DIRECTION === 'right' ? -1 : 1;\n        // Adjust the offset by the amount needed to fit the marker\n        offset -= adjustment;\n      }\n\n      if (\n        differenceToStart < startMarkerHeight &&\n        differenceToStart > 0 &&\n        differenceInYStart < startMarkerHeight\n      ) {\n        let adjustment = startMarkerHeight + extraRoom - differenceToStart;\n        adjustment *= DIRECTION === 'right' ? -1 : 1;\n        offset += adjustment;\n      }\n\n      return pointTransformer(d).x + offset;\n    },\n    y: function (\n      this: void,\n      d: Point | [number, number],\n      i: number,\n      data: (Point | [number, number])[]\n    ) {\n      let offset = 0;\n      const DIRECTION =\n        pointTransformer(data[0]).y < pointTransformer(data[data.length - 1]).y ? 'down' : 'up';\n      if (i === 0 && Object.hasOwn(markerOffsets, edge.arrowTypeStart)) {\n        const { angle, deltaY } = calculateDeltaAndAngle(data[0], data[1]);\n        offset =\n          markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets] *\n          Math.abs(Math.sin(angle)) *\n          (deltaY >= 0 ? 1 : -1);\n      } else if (i === data.length - 1 && Object.hasOwn(markerOffsets, edge.arrowTypeEnd)) {\n        const { angle, deltaY } = calculateDeltaAndAngle(\n          data[data.length - 1],\n          data[data.length - 2]\n        );\n        offset =\n          markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets] *\n          Math.abs(Math.sin(angle)) *\n          (deltaY >= 0 ? 1 : -1);\n      }\n\n      const differenceToEnd = Math.abs(\n        pointTransformer(d).y - pointTransformer(data[data.length - 1]).y\n      );\n      const differenceInXEnd = Math.abs(\n        pointTransformer(d).x - pointTransformer(data[data.length - 1]).x\n      );\n      const differenceToStart = Math.abs(pointTransformer(d).y - pointTransformer(data[0]).y);\n      const differenceInXStart = Math.abs(pointTransformer(d).x - pointTransformer(data[0]).x);\n      const startMarkerHeight = markerOffsets[edge.arrowTypeStart as keyof typeof markerOffsets];\n      const endMarkerHeight = markerOffsets[edge.arrowTypeEnd as keyof typeof markerOffsets];\n      const extraRoom = 1;\n\n      // Adjust the offset if the difference is smaller than the marker height\n      if (\n        differenceToEnd < endMarkerHeight &&\n        differenceToEnd > 0 &&\n        differenceInXEnd < endMarkerHeight\n      ) {\n        let adjustment = endMarkerHeight + extraRoom - differenceToEnd;\n        adjustment *= DIRECTION === 'up' ? -1 : 1;\n        // Adjust the offset by the amount needed to fit the marker\n        offset -= adjustment;\n      }\n\n      if (\n        differenceToStart < startMarkerHeight &&\n        differenceToStart > 0 &&\n        differenceInXStart < startMarkerHeight\n      ) {\n        let adjustment = startMarkerHeight + extraRoom - differenceToStart;\n        adjustment *= DIRECTION === 'up' ? -1 : 1;\n        offset += adjustment;\n      }\n      return pointTransformer(d).y + offset;\n    },\n  };\n};\n\nif (import.meta.vitest) {\n  const { it, expect, describe } = import.meta.vitest;\n  describe('calculateDeltaAndAngle', () => {\n    it('should calculate the angle and deltas between two points', () => {\n      expect(calculateDeltaAndAngle([0, 0], [0, 1])).toStrictEqual({\n        angle: 1.5707963267948966,\n        deltaX: 0,\n        deltaY: 1,\n      });\n      expect(calculateDeltaAndAngle([1, 0], [0, -1])).toStrictEqual({\n        angle: 0.7853981633974483,\n        deltaX: -1,\n        deltaY: -1,\n      });\n      expect(calculateDeltaAndAngle({ x: 1, y: 0 }, [0, -1])).toStrictEqual({\n        angle: 0.7853981633974483,\n        deltaX: -1,\n        deltaY: -1,\n      });\n      expect(calculateDeltaAndAngle({ x: 1, y: 0 }, { x: 1, y: 0 })).toStrictEqual({\n        angle: NaN,\n        deltaX: 0,\n        deltaY: 0,\n      });\n    });\n\n    it('should calculate the angle and deltas if one point in undefined', () => {\n      expect(calculateDeltaAndAngle(undefined, [0, 1])).toStrictEqual({\n        angle: 0,\n        deltaX: 0,\n        deltaY: 0,\n      });\n      expect(calculateDeltaAndAngle([0, 1], undefined)).toStrictEqual({\n        angle: 0,\n        deltaX: 0,\n        deltaY: 0,\n      });\n    });\n  });\n}\n", "import { select } from 'd3';\nimport type { Selection } from 'd3';\n// @ts-expect-error Incorrect khroma types\nimport { channel } from 'khroma';\nimport { EDGE_STEP_DURATION, getStepDuration, isStepEdge } from '../edgeStep.js';\nimport type { Edge } from '../types.js';\nimport type { SVGGroup } from '../../diagram-api/types.js';\nimport utils from '../../utils.js';\n\n/** Where along an edge the step badge may sit, as fractions of its length, in order of preference. */\nexport const STEP_BADGE_FRACTIONS = [0.25, 0.35, 0.15, 0.65, 0.75, 0.5, 0.85, 0.1, 0.9];\n\n/** Badge radius in diagram units; the badge keeps this size whatever the edge length. */\nexport const STEP_BADGE_RADIUS = 9;\n/** Badge text size in diagram units. */\nexport const STEP_BADGE_FONT_SIZE = 11;\n\nconst STEP_BADGE_GAP = 2;\nconst STEP_BADGE_FALLBACK_FILL = '#333333';\nconst STEP_ARROWHEAD_LENGTH = 12;\nconst STEP_ARROWHEAD_HALF_WIDTH = 6;\nconst STEP_BADGE_OFFSET = 14;\nconst STEP_TANGENT_STEP = 0.01;\nconst MIN_TEXT_CONTRAST = 4.5;\nconst TRANSLATE = /translate\\(\\s*(-?[\\d.e]+)[\\s,]+(-?[\\d.e]+)/i;\n\ninterface PathPoint {\n  x: number;\n  y: number;\n}\n\n/** Something on the diagram the badge must not cover: a box around a centre. */\nexport interface BadgeObstacle extends PathPoint {\n  halfWidth: number;\n  halfHeight: number;\n}\n\ninterface PathGeometry {\n  getTotalLength?: () => number;\n  getPointAtLength?: (distance: number) => PathPoint;\n}\n\nexport interface StepBadgeOptions {\n  points: PathPoint[];\n  pathNode?: PathGeometry | null;\n  color?: string;\n  textColors?: (string | undefined)[];\n}\n\n/** Stroke width of the highlight drawn over the edge while its step plays. */\nexport const STEP_HIGHLIGHT_STROKE_WIDTH = 4;\n/** Stroke opacity of the step highlight, so the edge line stays visible under it. */\nexport const STEP_HIGHLIGHT_STROKE_OPACITY = 0.6;\n/** Radius of the dot that travels along a step edge. */\nexport const STEP_DOT_RADIUS = 4;\n\nexport interface EdgeStepTiming {\n  begin: number;\n  dur: number;\n  gap: number;\n}\n\n/** When the dot for `step` starts, how long it runs, and how long it waits before the next loop. */\nexport const getEdgeStepTiming = (\n  step: number,\n  stepCount: number,\n  stepDuration = EDGE_STEP_DURATION\n): EdgeStepTiming => {\n  const count = Math.max(stepCount, step);\n  return {\n    begin: (step - 1) * stepDuration,\n    dur: stepDuration,\n    gap: (count - 1) * stepDuration,\n  };\n};\n\n/** A distinct id safe in animation `begin` references: starts with a letter, keeps letters and digits, encodes every other character as `_hex_`. */\nexport const toAnimationId = (value: string) =>\n  `step_${Array.from(value, (char) =>\n    /[\\dA-Za-z]/.test(char) ? char : `_${(char.codePointAt(0) ?? 0).toString(16)}_`\n  ).join('')}`;\n\nconst pathStartTranslate = (pathData: string) => {\n  const start = /^m\\s*(-?[\\d.e]+)[\\s,]+(-?[\\d.e]+)/i.exec(pathData.trim());\n  return start ? `translate(${start[1]},${start[2]}) ` : '';\n};\n\nconst escapeCssIdentifierFallback = (value: string) =>\n  Array.from(value, (char, index) => {\n    const code = char.codePointAt(0) ?? 0;\n    if (code === 0) {\n      return '\\uFFFD';\n    }\n    const isControl = code <= 0x1f || code === 0x7f;\n    const isLeadingDigit =\n      /\\d/.test(char) && (index === 0 || (index === 1 && value.startsWith('-')));\n    if (isControl || isLeadingDigit) {\n      return `\\\\${code.toString(16)} `;\n    }\n    if (value === '-') {\n      return '\\\\-';\n    }\n    return code >= 0x80 || /[\\w-]/.test(char) ? char : `\\\\${char}`;\n  }).join('');\n\n/** Escapes a string for use as a CSS identifier, using `CSS.escape` when the environment has it. */\nexport const escapeCssIdentifier = (value: string) =>\n  typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n    ? CSS.escape(value)\n    : escapeCssIdentifierFallback(value);\n\nconst ensureReducedMotionStyle = (elem: SVGGroup, diagramId: string) => {\n  const node = elem.node();\n  const svg = node?.ownerSVGElement ?? node?.closest?.('svg') ?? node;\n  const scopeId = diagramId || svg?.getAttribute('id');\n  // Never emit an unscoped rule: it would hide the dots of every other diagram on the page.\n  if (!svg || !scopeId || svg.querySelector('style.edge-step-style')) {\n    return;\n  }\n  const scope = `#${escapeCssIdentifier(scopeId)} `;\n  // Appended as a raw <style>, outside compileCSS/stylis, so it must carry the diagram id scope itself.\n  const style = svg.ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'style');\n  style.setAttribute('class', 'edge-step-style');\n  style.textContent = `@media (prefers-reduced-motion: reduce) { ${scope}.edge-step-dot, ${scope}.edge-step-highlight { display: none; } }`;\n  svg.appendChild(style);\n};\n\n/** The point `fraction` of the way along the polyline through `points`, by length. */\nexport const pointAlongPolyline = (\n  points: PathPoint[],\n  fraction: number\n): PathPoint | undefined => {\n  const valid = points.filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n  if (valid.length === 0) {\n    return undefined;\n  }\n  const lengths = valid\n    .slice(1)\n    .map((point, index) => Math.hypot(point.x - valid[index].x, point.y - valid[index].y));\n  let remaining = lengths.reduce((total, length) => total + length, 0) * fraction;\n  for (const [index, length] of lengths.entries()) {\n    if (remaining <= length && length > 0) {\n      const ratio = remaining / length;\n      const from = valid[index];\n      const to = valid[index + 1];\n      return { x: from.x + (to.x - from.x) * ratio, y: from.y + (to.y - from.y) * ratio };\n    }\n    remaining -= length;\n  }\n  return valid[valid.length - 1];\n};\n\n/** Samples the rendered path by length, falling back to the routed points when it has no geometry. */\nexport const createPathSampler = (points: PathPoint[], pathNode?: PathGeometry | null) => {\n  const length = typeof pathNode?.getTotalLength === 'function' ? pathNode.getTotalLength() : 0;\n  const getPoint = pathNode?.getPointAtLength?.bind(pathNode);\n  if (length > 0 && getPoint) {\n    return (fraction: number): PathPoint | undefined => {\n      const { x, y } = getPoint(length * fraction);\n      return { x, y };\n    };\n  }\n  return (fraction: number) => pointAlongPolyline(points, fraction);\n};\n\nconst roomAround = (point: PathPoint, obstacles: BadgeObstacle[]) =>\n  Math.min(\n    Number.POSITIVE_INFINITY,\n    ...obstacles.map((obstacle) => {\n      const dx = Math.max(Math.abs(point.x - obstacle.x) - obstacle.halfWidth, 0);\n      const dy = Math.max(Math.abs(point.y - obstacle.y) - obstacle.halfHeight, 0);\n      return Math.hypot(dx, dy) - STEP_BADGE_RADIUS;\n    })\n  );\n\nconst besideThePath = (\n  sample: (fraction: number) => PathPoint | undefined,\n  fraction: number\n): PathPoint[] => {\n  const point = sample(fraction);\n  const before = sample(Math.max(fraction - STEP_TANGENT_STEP, 0));\n  const after = sample(Math.min(fraction + STEP_TANGENT_STEP, 1));\n  if (!point || !before || !after) {\n    return [];\n  }\n  const length = Math.hypot(after.x - before.x, after.y - before.y);\n  if (length === 0) {\n    return [];\n  }\n  const normal = { x: -(after.y - before.y) / length, y: (after.x - before.x) / length };\n  return [1, -1].map((side) => ({\n    x: point.x + normal.x * STEP_BADGE_OFFSET * side,\n    y: point.y + normal.y * STEP_BADGE_OFFSET * side,\n  }));\n};\n\n/** The first preferred spot on the edge clear of every obstacle, then beside it, else the roomiest. */\nexport const chooseBadgePosition = (\n  sample: (fraction: number) => PathPoint | undefined,\n  obstacles: BadgeObstacle[]\n): PathPoint | undefined => {\n  const candidates = [\n    ...STEP_BADGE_FRACTIONS.map(sample),\n    ...STEP_BADGE_FRACTIONS.flatMap((fraction) => besideThePath(sample, fraction)),\n  ];\n  let best: PathPoint | undefined;\n  let bestRoom = Number.NEGATIVE_INFINITY;\n  for (const point of candidates) {\n    if (!point || !Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n      continue;\n    }\n    const room = roomAround(point, obstacles);\n    if (room >= STEP_BADGE_GAP) {\n      return point;\n    }\n    if (room > bestRoom) {\n      best = point;\n      bestRoom = room;\n    }\n  }\n  return best;\n};\n\nconst square = (point: PathPoint, half: number): BadgeObstacle => ({\n  ...point,\n  halfWidth: half,\n  halfHeight: half,\n});\n\nconst translationOf = (node: Element): PathPoint => {\n  const match = TRANSLATE.exec(node.getAttribute('transform') ?? '');\n  return match ? { x: Number(match[1]), y: Number(match[2]) } : { x: 0, y: 0 };\n};\n\n/** The summed `translate(...)` of `node` and its ancestors up to the SVG: its offset in SVG coordinates. */\nconst offsetInSvg = (node: Element | null | undefined): PathPoint => {\n  const offset = { x: 0, y: 0 };\n  for (\n    let current = node;\n    current && current.localName !== 'svg';\n    current = current.parentElement\n  ) {\n    const { x, y } = translationOf(current);\n    offset.x += x;\n    offset.y += y;\n  }\n  return offset;\n};\n\nconst boxedObstacle = (node: Element, origin: PathPoint): BadgeObstacle | undefined => {\n  if (!TRANSLATE.test(node.getAttribute('transform') ?? '')) {\n    return undefined;\n  }\n  const offset = offsetInSvg(node);\n  const x = offset.x - origin.x;\n  const y = offset.y - origin.y;\n  const box = (node as SVGGraphicsElement).getBBox?.();\n  if (!box) {\n    return undefined;\n  }\n  return {\n    x: x + box.x + box.width / 2,\n    y: y + box.y + box.height / 2,\n    halfWidth: box.width / 2,\n    halfHeight: box.height / 2,\n  };\n};\n\nconst readPoints = (path: Element): PathPoint[] => {\n  try {\n    const points: unknown = JSON.parse(atob(path.getAttribute('data-points') ?? ''));\n    return Array.isArray(points) ? (points as PathPoint[]) : [];\n  } catch {\n    return [];\n  }\n};\n\n/** The box an arrowhead covers: from `tip` back towards `from` for the arrowhead's length. */\nexport const arrowheadObstacle = (tip: PathPoint, from: PathPoint): BadgeObstacle => {\n  const length = Math.hypot(tip.x - from.x, tip.y - from.y);\n  if (length === 0) {\n    return square(tip, STEP_ARROWHEAD_LENGTH);\n  }\n  const along = { x: (tip.x - from.x) / length, y: (tip.y - from.y) / length };\n  const half = STEP_ARROWHEAD_LENGTH / 2;\n  return {\n    x: tip.x - along.x * half,\n    y: tip.y - along.y * half,\n    halfWidth: Math.abs(along.x) * half + Math.abs(along.y) * STEP_ARROWHEAD_HALF_WIDTH,\n    halfHeight: Math.abs(along.y) * half + Math.abs(along.x) * STEP_ARROWHEAD_HALF_WIDTH,\n  };\n};\n\nconst hasMarker = (path: Element, attribute: 'marker-start' | 'marker-end') => {\n  const value = path.getAttribute(attribute);\n  return !!value && value !== 'none';\n};\n\nconst arrowheadObstacles = (path: Element, origin: PathPoint): BadgeObstacle[] => {\n  const points = readPoints(path).filter(\n    (point) => Number.isFinite(point?.x) && Number.isFinite(point?.y)\n  );\n  if (points.length === 0) {\n    return [];\n  }\n  const offset = offsetInSvg(path);\n  const toSvg = (point: PathPoint) => ({\n    x: point.x + offset.x - origin.x,\n    y: point.y + offset.y - origin.y,\n  });\n  const last = points.length - 1;\n  const obstacles: BadgeObstacle[] = [];\n  if (hasMarker(path, 'marker-start')) {\n    obstacles.push(arrowheadObstacle(toSvg(points[0]), toSvg(points[Math.min(1, last)])));\n  }\n  if (hasMarker(path, 'marker-end')) {\n    obstacles.push(arrowheadObstacle(toSvg(points[last]), toSvg(points[Math.max(last - 1, 0)])));\n  }\n  return obstacles;\n};\n\n/** What no badge may cover, in SVG coordinates: labels, nodes and the arrowheads at every edge's marked ends. */\nexport const collectBadgeObstacles = (root: Element | null | undefined): BadgeObstacle[] => {\n  const origin = { x: 0, y: 0 };\n  const boxed = [...(root?.querySelectorAll('.edgeLabel, .node') ?? [])]\n    .map((obstacle) => boxedObstacle(obstacle, origin))\n    .filter((obstacle): obstacle is BadgeObstacle => obstacle !== undefined);\n  const arrowheads = [...(root?.querySelectorAll('path[data-edge=\"true\"]') ?? [])].flatMap((path) =>\n    arrowheadObstacles(path, origin)\n  );\n  return [...boxed, ...arrowheads];\n};\n\nconst edgeLabelObstacles = (edge: Edge, points: PathPoint[]): BadgeObstacle[] => {\n  if (!edge.label || points.length === 0) {\n    return [];\n  }\n  const { x, y } = utils.calcLabelPosition(points);\n  return [{ x, y, halfWidth: (edge.width ?? 0) / 2, halfHeight: (edge.height ?? 0) / 2 }];\n};\n\nconst linearChannel = (value: number) => {\n  const srgb = value / 255;\n  return srgb <= 0.03928 ? srgb / 12.92 : ((srgb + 0.055) / 1.055) ** 2.4;\n};\n\nconst relativeLuminance = (color: string): number | undefined => {\n  try {\n    const [r, g, b] = (['r', 'g', 'b'] as const).map((part) => linearChannel(channel(color, part)));\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n  } catch {\n    return undefined;\n  }\n};\n\n/** The WCAG contrast ratio of two colours, or 0 when either cannot be read. */\nexport const contrastRatio = (first: string, second: string): number => {\n  const a = relativeLuminance(first);\n  const b = relativeLuminance(second);\n  if (a === undefined || b === undefined) {\n    return 0;\n  }\n  return (Math.max(a, b) + 0.05) / (Math.min(a, b) + 0.05);\n};\n\n/** The first candidate readable on `fill` (4.5:1), else the one with the most contrast. */\nexport const pickBadgeTextColor = (fill: string, candidates: (string | undefined)[]): string => {\n  const options = [...candidates.filter((color): color is string => !!color), '#ffffff', '#000000'];\n  const scored = options.map((color) => ({ color, ratio: contrastRatio(fill, color) }));\n  const readable = scored.find(({ ratio }) => ratio >= MIN_TEXT_CONTRAST);\n  return (readable ?? scored.reduce((best, next) => (next.ratio > best.ratio ? next : best))).color;\n};\n\nconst bareColor = (color?: string) => {\n  const bare = color?.replace(/^stroke:\\s*/, '').trim();\n  return bare === '' ? undefined : bare;\n};\n\n/**\n * Appends a badge with the step number on a step edge when `flowchart.stepNumbers` is on, clear of\n * `obstacles` (SVG coordinates). Returns the badge's own box in SVG coordinates.\n */\nexport const insertEdgeStepBadge = (\n  elem: SVGGroup,\n  edge: Edge,\n  options: StepBadgeOptions,\n  obstacles: BadgeObstacle[] = collectBadgeObstacles(elem.node()?.closest('svg'))\n): BadgeObstacle | undefined => {\n  if (!isStepEdge(edge) || !edge.showStepNumber) {\n    return undefined;\n  }\n  const origin = offsetInSvg(elem.node());\n  const local = obstacles.map((obstacle) => ({\n    ...obstacle,\n    x: obstacle.x - origin.x,\n    y: obstacle.y - origin.y,\n  }));\n  const position = chooseBadgePosition(createPathSampler(options.points, options.pathNode), [\n    ...local,\n    ...edgeLabelObstacles(edge, options.points),\n  ]);\n  if (!position) {\n    return undefined;\n  }\n  // A resolved colour, not currentColor, so the text contrast check below can read it.\n  const fill = bareColor(options.color) ?? STEP_BADGE_FALLBACK_FILL;\n  const badge = elem\n    .append('g')\n    .attr('class', 'edge-step-badge')\n    .attr('transform', `translate(${position.x},${position.y})`)\n    .attr('pointer-events', 'none')\n    .attr('data-step', edge.step);\n  badge.append('circle').attr('r', STEP_BADGE_RADIUS).attr('fill', fill);\n  badge\n    .append('text')\n    .attr('text-anchor', 'middle')\n    .attr('dominant-baseline', 'central')\n    .attr('font-size', STEP_BADGE_FONT_SIZE)\n    .attr('fill', pickBadgeTextColor(fill, options.textColors ?? []))\n    .text(String(edge.step));\n  return square({ x: position.x + origin.x, y: position.y + origin.y }, STEP_BADGE_RADIUS);\n};\n\n/** Shows `target` only while the step's dot is moving, by lifting its parked `scale(0)`. */\nconst showWhileStepPlays = <E extends SVGElement>(\n  target: Selection<E, unknown, Element | null, unknown>,\n  motionId: string,\n  dur: number\n) => {\n  // The parked transform keeps the target (the dot or the highlight) hidden at the path start. While\n  // the step plays, this animateTransform replaces it with scale(1) (it is not additive), dropping\n  // the translate so the highlight lies on its own path and animateMotion alone positions the dot;\n  // fill=\"remove\" restores the parked transform after.\n  target\n    .append('animateTransform')\n    .attr('attributeName', 'transform')\n    .attr('type', 'scale')\n    .attr('values', '1;1')\n    .attr('dur', `${dur}s`)\n    .attr('begin', `${motionId}.begin`)\n    .attr('fill', 'remove');\n};\n\n/**\n * Appends the dot that travels along a step edge and a highlight stroke shown while it travels,\n * plus the reduced-motion rule once per SVG.\n */\nexport const insertEdgeStepDot = (\n  elem: SVGGroup,\n  edge: Edge,\n  pathData: string,\n  diagramId: string,\n  color?: string\n) => {\n  if (!isStepEdge(edge) || !pathData) {\n    return;\n  }\n  const { begin, dur, gap } = getEdgeStepTiming(\n    edge.step,\n    edge.stepCount ?? edge.step,\n    getStepDuration(edge.stepDuration)\n  );\n  const motionId = toAnimationId(`${diagramId}-${edge.id}-step`);\n  const parked = `${pathStartTranslate(pathData)}scale(0)`;\n  const fill = color?.replace(/^stroke:\\s*/, '');\n  const highlight = elem\n    .append('path')\n    .attr('class', 'edge-step-highlight')\n    .attr('aria-hidden', 'true')\n    .attr('d', pathData)\n    .attr('fill', 'none')\n    .attr('stroke', fill ?? 'currentColor')\n    .attr('stroke-width', STEP_HIGHLIGHT_STROKE_WIDTH)\n    .attr('stroke-linecap', 'round')\n    .attr('stroke-opacity', STEP_HIGHLIGHT_STROKE_OPACITY)\n    .attr('pointer-events', 'none')\n    .attr('transform', parked)\n    .attr('data-step', edge.step);\n  showWhileStepPlays(highlight, motionId, dur);\n  const dot = elem\n    .append('circle')\n    .attr('class', 'edge-step-dot')\n    .attr('r', STEP_DOT_RADIUS)\n    .attr('aria-hidden', 'true')\n    .attr('transform', parked)\n    .attr('data-step', edge.step);\n  if (fill) {\n    dot.attr('fill', fill).attr('stroke', 'none');\n  }\n  dot\n    .append('animateMotion')\n    .attr('id', motionId)\n    .attr('path', pathData)\n    .attr('dur', `${dur}s`)\n    .attr('begin', `${begin}s;${motionId}.end+${gap}s`)\n    .attr('fill', 'remove');\n  showWhileStepPlays(dot, motionId, dur);\n  ensureReducedMotionStyle(elem, diagramId);\n};\n\ninterface QueuedBadge {\n  elem: SVGGroup;\n  edge: Edge;\n  options: StepBadgeOptions;\n}\n\nconst queuedBadges = new WeakMap<Element, QueuedBadge[]>();\n\nconst badgeLayer = (root: Element) => {\n  const existing = root.querySelector(':scope > g.edge-step-badges');\n  if (existing) {\n    return existing;\n  }\n  const layer = root.ownerDocument.createElementNS('http://www.w3.org/2000/svg', 'g');\n  layer.setAttribute('class', 'edge-step-badges');\n  return root.appendChild(layer);\n};\n\n/** Draws the badges queued for `svg` in a layer above everything else, once the whole diagram is in place. */\nexport const placeQueuedStepBadges = (svg: Element | null | undefined) => {\n  const queued = svg ? queuedBadges.get(svg) : undefined;\n  if (!svg || !queued) {\n    return;\n  }\n  queuedBadges.delete(svg);\n  const obstacles = collectBadgeObstacles(svg);\n  for (const { elem, edge, options } of queued) {\n    const root = elem.node()?.parentElement;\n    if (!root) {\n      continue;\n    }\n    const layer = select(badgeLayer(root) as SVGGElement) as unknown as SVGGroup;\n    const placed = insertEdgeStepBadge(layer, edge, options, obstacles);\n    if (placed) {\n      obstacles.push(placed);\n    }\n  }\n};\n\n/** Draws a step edge's dot and highlight now and queues its badge for `placeQueuedStepBadges`. */\nexport const insertEdgeStepMarks = (\n  elem: SVGGroup,\n  edge: Edge,\n  pathData: string,\n  diagramId: string,\n  badge: StepBadgeOptions\n) => {\n  insertEdgeStepDot(elem, edge, pathData, diagramId, badge.color);\n  const node = elem.node();\n  const svg = node?.ownerSVGElement ?? node;\n  if (!svg || !isStepEdge(edge) || !edge.showStepNumber) {\n    return;\n  }\n  queuedBadges.set(svg, [...(queuedBadges.get(svg) ?? []), { elem, edge, options: badge }]);\n};\n", "import type { Edge } from './types.js';\n\n/** Seconds the travelling dot spends on one step when `flowchart.stepDuration` is not set. */\nexport const EDGE_STEP_DURATION = 1;\n\n/** The configured step length in seconds, or the default when it is not a positive number. */\nexport const getStepDuration = (value: unknown): number =>\n  typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : EDGE_STEP_DURATION;\n\n/** True when the edge takes part in the step animation (a positive integer `step`). */\nexport const isStepEdge = (\n  edge: Pick<Edge, 'step'>\n): edge is Pick<Edge, 'step'> & { step: number } =>\n  typeof edge.step === 'number' && Number.isInteger(edge.step) && edge.step > 0;\n", "import { getConfig } from '../../diagram-api/diagramAPI.js';\nimport { getEffectiveHtmlLabels } from '../../config.js';\nimport { log } from '../../logger.js';\nimport { createText } from '../createText.js';\nimport fastdom from '../fastdom.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 { insertEdgeStepMarks } from './edgeStepAnimation.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 hasEdgeLabel = (edge) =>\n  Boolean(\n    edge.label ||\n      edge.startLabelLeft ||\n      edge.startLabelRight ||\n      edge.endLabelLeft ||\n      edge.endLabelRight\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  /** @type {DOMRect} */\n  let bbox;\n  /** @type {DOMRect} */\n  let transformBbox;\n  if (useHtmlLabels) {\n    const div = labelElement.children[0];\n    const dv = select(labelElement);\n    bbox = await fastdom.measure(() => 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    await fastdom.measure(() => {\n      bbox = labelElement.getBBox();\n      if (textEl && typeof textEl.getBBox === 'function') {\n        transformBbox = textEl.getBBox();\n      } else {\n        transformBbox = bbox;\n      }\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, slBox);\n    recordTerminalLabelSize(edge, 'startLeft', slBox);\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, slBox);\n    recordTerminalLabelSize(edge, 'startRight', slBox);\n  }\n  if (edge.endLabelLeft) {\n    const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner');\n    const endLabelElement = await createLabel(\n      inner,\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, slBox);\n    recordTerminalLabelSize(edge, 'endLeft', slBox);\n  }\n  if (edge.endLabelRight) {\n    const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals');\n    const inner = endEdgeLabelRight.insert('g').attr('class', 'inner');\n    const endLabelElement = await createLabel(\n      inner,\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, slBox);\n    recordTerminalLabelSize(edge, 'endRight', slBox);\n  }\n  return labelElement;\n};\n\n/**\n * Record a terminal label's measured size so a layout can reserve room for it.\n * Every terminal label is centred on its group's origin.\n *\n * @param {any} edge\n * @param {import('../types.js').TerminalLabelKey} key\n * @param {{ width: number, height: number }} box\n */\nfunction recordTerminalLabelSize(edge, key, box) {\n  edge.terminalLabelSizes ??= {};\n  edge.terminalLabelSizes[key] = { width: box.width, height: box.height };\n}\n\n/**\n * @param {any} fo\n * @param {any} value\n * @param {{ width: number, height: number }} box - the measured label\n */\nexport function setTerminalWidth(fo, value, box) {\n  if (getEffectiveHtmlLabels(getConfig()) && fo) {\n    // Never smaller than the measured text; a fixed 12px height clipped it (#8329).\n    fo.style.width = Math.max(value.length * 9, box.width) + 'px';\n    fo.style.height = box.height + 'px';\n  }\n}\n\n/**\n * Where to put an edge's label along its drawn path.\n */\nexport const resolveEdgeLabelPosition = (edge, paths) => {\n  let x = edge.x;\n  let y = edge.y;\n  if (paths?.updatedPath) {\n    const updatedMid = utils.calcLabelPosition(paths.updatedPath);\n    if (paths.originalPath) {\n      const originalMid = utils.calcLabelPosition(paths.originalPath);\n      x = edge.x + (updatedMid.x - originalMid.x);\n      y = edge.y + (updatedMid.y - originalMid.y);\n    } else {\n      x = updatedMid.x;\n      y = updatedMid.y;\n    }\n  }\n  return { x, y };\n};\n\nexport const positionEdgeLabel = (edge, paths) => {\n  log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels.get(edge.id), paths);\n  const siteConfig = getConfig();\n  const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n  if (edge.label) {\n    const el = edgeLabels.get(edge.id);\n    const { x, y } = resolveEdgeLabelPosition(edge, paths);\n    log.debug(\n      'Moving label ' + edge.label + ' from (',\n      edge.x,\n      ',',\n      edge.y,\n      ') to (',\n      x,\n      ',',\n      y,\n      ') abc88'\n    );\n    el.attr('transform', `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n  }\n\n  // `path` is still needed below for the terminal-label branches, which only read from it\n  // (they do not themselves reposition the main label).\n  const path = paths.updatedPath ? paths.updatedPath : paths.originalPath;\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/** Distance below which two coordinates count as the same row or column. */\nconst AXIS_TOLERANCE = 0.5;\nconst sharesColumn = (a, b) => Math.abs(a.x - b.x) < AXIS_TOLERANCE;\nconst sharesRow = (a, b) => Math.abs(a.y - b.y) < AXIS_TOLERANCE;\nconst coincides = (a, b) => sharesColumn(a, b) && sharesRow(a, b);\n\n/** Whether the shape intersection stays on the axis the layout's final segment ran along. */\nfunction keepsArrivalAxis(originalLast, lastInner, candidate) {\n  if (sharesColumn(originalLast, lastInner) && !sharesRow(originalLast, lastInner)) {\n    return sharesColumn(candidate, lastInner);\n  }\n  if (sharesRow(originalLast, lastInner) && !sharesColumn(originalLast, lastInner)) {\n    return sharesRow(candidate, lastInner);\n  }\n  return sharesColumn(candidate, lastInner) || sharesRow(candidate, lastInner);\n}\n\n/** The last segment the layout drew into the node, as the point it heads for and where it left. */\nfunction arrivalSegment(originalLast, lastInner, before) {\n  return coincides(originalLast, lastInner)\n    ? { heading: lastInner, from: before }\n    : { heading: originalLast, from: lastInner };\n}\n\n/** Whether the segment to the candidate points against the direction the edge was travelling. */\nfunction runsAgainstHeading({ heading, from }, lastInner, candidate) {\n  return (\n    (heading.x - from.x) * (candidate.x - lastInner.x) +\n      (heading.y - from.y) * (candidate.y - lastInner.y) <\n    0\n  );\n}\n\n/** Moves the candidate onto the row or column the arriving segment ran along. */\nfunction snapToArrivalAxis({ heading, from }, lastInner, candidate) {\n  if (sharesRow(heading, from) && !sharesColumn(heading, from)) {\n    return { x: candidate.x, y: lastInner.y };\n  }\n  if (sharesColumn(heading, from) && !sharesRow(heading, from)) {\n    return { x: lastInner.x, y: candidate.y };\n  }\n  return candidate;\n}\n\n/** Picks the point where a swimlane edge docks on its head shape, on the axis it arrived on. */\nfunction dockFinalPoint(originalLast, lastInner, before, candidate) {\n  const wasOrthogonal = sharesColumn(originalLast, lastInner) || sharesRow(originalLast, lastInner);\n  if (wasOrthogonal && !keepsArrivalAxis(originalLast, lastInner, candidate)) {\n    return originalLast;\n  }\n  const arrival = arrivalSegment(originalLast, lastInner, before);\n  if (runsAgainstHeading(arrival, lastInner, candidate)) {\n    return lastInner;\n  }\n  return snapToArrivalAxis(arrival, lastInner, candidate);\n}\n\n/** The arrowhead's pull-back for a marker type; a type the table does not own pulls back nothing. */\nfunction markerPullBack(arrowType) {\n  const offset = Object.hasOwn(markerOffsets, arrowType) ? markerOffsets[arrowType] : 0;\n  return Number.isFinite(offset) ? offset : 0;\n}\n\n/**\n * The point a swimlane edge ends on after its last bend, or `undefined` when it ends on the bend.\n * A final segment that continues straight on and is shorter than the arrowhead's pull-back\n * would be drawn backwards, so it is dropped. A stub that turns into the node keeps the layout's\n * end, because the arrowhead must point at the node it enters.\n */\nfunction finalDockPoint({ originalLast, lastInner, newLast, minLength }) {\n  const turned = !coincides(originalLast, lastInner);\n  const length = Math.hypot(newLast.x - lastInner.x, newLast.y - lastInner.y);\n  if (length >= Math.max(AXIS_TOLERANCE, minLength)) {\n    return newLast;\n  }\n  return turned && length >= AXIS_TOLERANCE ? originalLast : undefined;\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  // Clamp to a non-negative, finite integer: a short edge (len < the combined\n  // marker offsets) makes this negative, and a degenerate path makes\n  // getTotalLength() return NaN \u2014 either would throw \"RangeError: Invalid array\n  // length\" from Array(numberOfPairs) below.\n  const rawPairs = Math.floor(middleLength / dashGapPairLength);\n  const numberOfPairs = Number.isFinite(rawPairs) ? Math.max(0, rawPairs) : 0;\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  layoutAlgorithm = undefined\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: configuredLayout } = getConfig();\n  const layout = layoutAlgorithm ?? configuredLayout;\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 (\n      !skipIntersect &&\n      head.intersect &&\n      tail.intersect &&\n      Array.isArray(points) &&\n      points.length >= 2\n    ) {\n      if (points.length === 2) {\n        // A straight edge clips each end against the shape it leaves or enters. An\n        // axis-aligned one is a port, possibly offset from the node centre: each shape is\n        // asked about its own end so sibling ports stay parallel. A slanted one has no\n        // port, so each shape is asked about the far end to pick the face it faces.\n        const [first, last] = points;\n        points =\n          sharesColumn(first, last) || sharesRow(first, last)\n            ? [tail.intersect(first), head.intersect(last)]\n            : [tail.intersect(last), head.intersect(first)];\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 newFirst = tail.intersect(firstInner);\n\n        const originalLast = points[points.length - 1];\n        const candidateLast = head.intersect(lastInner);\n        const before = innerPoints.at(-2) ?? points[0];\n        const newLast = dockFinalPoint(originalLast, lastInner, before, candidateLast);\n\n        const finalPoint = finalDockPoint({\n          originalLast,\n          lastInner,\n          newLast,\n          minLength: markerPullBack(edge.arrowTypeEnd),\n        });\n        const firstIsDuplicate =\n          Math.abs(newFirst.x - firstInner.x) < AXIS_TOLERANCE &&\n          Math.abs(newFirst.y - firstInner.y) < AXIS_TOLERANCE;\n\n        const startPoints = firstIsDuplicate ? [] : [newFirst];\n        const endPoints = finalPoint ? [finalPoint] : [];\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  if (edge.step !== undefined) {\n    const { themeVariables } = getConfig();\n    const stepColor = strokeColor ?? themeVariables?.lineColor;\n    insertEdgeStepMarks(elem, edge, linePath, diagramId, {\n      points: lineData,\n      pathNode: svgPath.node(),\n      color: stepColor,\n      textColors: [themeVariables?.background, themeVariables?.primaryTextColor],\n    });\n  }\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", "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  arrow_open_head: { type: 'openArrow', fill: false },\n  arrow_hollow_circle: { type: 'hollowCircle', fill: false },\n  arrow_hierarchy: { type: 'hierarchy', 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  // 'none' (and empty) are valid \"no arrowhead\" values, not unknown types. Flowchart\n  // edges without an arrow pass 'none', so warning here fires once per such edge \u2014\n  // thousands of times on large diagrams. Skip silently; only genuinely unknown types warn.\n  if (!arrowType || arrowType === 'none') {\n    return;\n  }\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", "/** 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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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    .attr('markerUnits', 'userSpaceOnUse')\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};\nconst hierarchy = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hierarchyEnd')\n    .attr('class', 'marker hierarchy ' + type)\n    .attr('viewBox', '0 0 12 10')\n    .attr('refX', 10)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 0 0 L 6 5 L 0 10 M 4 0 L 10 5 L 4 10')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hierarchyStart')\n    .attr('class', 'marker hierarchy ' + type)\n    .attr('viewBox', '0 0 12 10')\n    .attr('refX', 2)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 12 0 L 6 5 L 12 10 M 8 0 L 2 5 L 8 10')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n};\n\nconst openArrow = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-openArrowEnd')\n    .attr('class', 'marker openArrow ' + type)\n    .attr('viewBox', '0 0 12 12')\n    .attr('refX', 11)\n    .attr('refY', 6)\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 11 6 L 1 11')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-linecap', 'round')\n    .style('stroke-linejoin', 'round')\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-openArrowStart')\n    .attr('class', 'marker openArrow ' + type)\n    .attr('viewBox', '0 0 12 12')\n    .attr('refX', 1)\n    .attr('refY', 6)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 12)\n    .attr('markerHeight', 12)\n    .attr('orient', 'auto')\n    .append('path')\n    .attr('d', 'M 11 1 L 1 6 L 11 11')\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-linecap', 'round')\n    .style('stroke-linejoin', 'round')\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n};\n\nconst hollowCircle = (elem, type, id) => {\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hollowCircleStart')\n    .attr('class', 'marker hollowCircle ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 0)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 10)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', 5)\n    .attr('cy', 5)\n    .attr('r', 3.6)\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\n\n  elem\n    .append('marker')\n    .attr('id', id + '_' + type + '-hollowCircleEnd')\n    .attr('class', 'marker hollowCircle ' + type)\n    .attr('viewBox', '0 0 10 10')\n    .attr('refX', 10)\n    .attr('refY', 5)\n    .attr('markerUnits', 'userSpaceOnUse')\n    .attr('markerWidth', 10)\n    .attr('markerHeight', 10)\n    .attr('orient', 'auto')\n    .append('circle')\n    .attr('cx', 5)\n    .attr('cy', 5)\n    .attr('r', 3.6)\n    .attr('class', 'arrowMarkerPath')\n    .style('stroke-width', 1.4)\n    .style('stroke-dasharray', '1,0')\n    .style('fill', 'none');\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  hierarchy,\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  openArrow,\n  hollowCircle,\n};\nexport default insertMarkers;\n"],
  "mappings": "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",
  "names": ["point", "select", "getConfig", "select", "point", "calculateDeltaAndAngle"]
}
