GitHub Flavored Markdown in the transcript: alerts (> [!NOTE]), task lists, strikethrough and Mermaid diagrams

<img src="docs/hero.png" alt="claude-gfm-render: GitHub Flavored Markdown in Claude Code" width="100%">
Alerts, task lists, strikethrough and Mermaid diagrams, drawn inside Claude Code's replies.
Install · Before / after · What it handles · How it works
Claude writes GitHub Flavored Markdown all day: > [!WARNING] callouts, - [ ] checklists, `mermaid diagrams. The terminal shows them as raw text. This mod draws them, without touching the message itself (ctrl+o still shows the original).
git clone https://github.com/briangtn/claude-gfm-render.git ~/perso/claude-gfm-render
claude --plugin-dir ~/perso/claude-gfm-render
To load it in every session, terminal and desktop app alike, add it to ~/.claude/settings.json:
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "~/perso/claude-gfm-render"
}
}
[!NOTE] Mods (function hooks) are an early-access API of Claude Code and may change between releases. Built and tested on Claude Code 2.1.286 and 2.1.287. No build step: the mod is plain files, and the folder is watched, so an edit reloads it in the running session.
Drawing GFM is half the job: Claude also has to write it. The mod ships GFM.md, a short note on what the transcript can draw (alerts, task lists, strikethrough, the Mermaid types that render), which a SessionStart hook adds to Claude's context at startup, after /clear and after a compaction. No CLAUDE.md to edit.
To turn it off and keep only the rendering, in ~/.claude/settings.json:
{
"pluginConfigs": {
"gfm-render": { "options": { "promptHint": false } }
}
}
Real claude sessions (100 columns, captured with tmux); before is the same reply without the mod.
<table> <tr> <th width="50%">Before</th> <th width="50%">With claude-gfm-render</th> </tr> <tr> <td><img src="docs/screenshots/native-alerts.png" alt="Alerts as raw blockquotes"></td> <td><img src="docs/screenshots/terminal-alerts.png" alt="Alerts drawn as colored boxes"></td> </tr> <tr> <td><img src="docs/screenshots/native-tasks.png" alt="Task list as raw brackets"></td> <td><img src="docs/screenshots/terminal-tasks.png" alt="Task list with checkboxes and strikethrough"></td> </tr> <tr> <td><img src="docs/screenshots/native-flow.png" alt="Mermaid as a code block"></td> <td><img src="docs/screenshots/terminal-flow.png" alt="Mermaid flowchart drawn in Unicode"></td> </tr> </table>
<img src="docs/screenshots/terminal-sequence.png" alt="Mermaid sequence diagram drawn in Unicode">
Alerts get a little more room, captured in the Claude desktop app (dark theme):
<img src="docs/screenshots/desktop-alerts-dark.png" alt="Alerts in the Claude desktop app">
Mermaid becomes a real SVG that follows the light or dark scheme. Below, the mod's own output rendered by Chrome (not a capture of the app):
<img alt="Flowchart SVG" src="docs/screenshots/desktop-flow-light.png">
| Light | Dark |
|---|---|
![]() | ![]() |
| Markdown | Terminal | Desktop · VS Code · mobile | |
|---|---|---|---|
| 💬 | Alerts > [!NOTE] [!TIP] [!IMPORTANT] [!WARNING] [!CAUTION], any markdown inside | ✅ colored box | ✅ colored box |
| ☑️ | Task lists - [ ] / - [x] (also *, +, 1.) | ✅ ☐ / ☑ | ➖ native |
Strikethrough | ✅ | ➖ native | |
| 🔀 | Mermaid flowchart / graph | ✅ Unicode art | ✅ SVG |
| 🧭 | Mermaid sequence, state, class, ER, xychart | ✅ Unicode art | ✅ SVG |
| 🔒 | Code fences and inline code | never rewritten | never rewritten |
| 📝 | Everything else (headings, tables, links, emphasis…) | native | native |
| Case | What you get |
|---|---|
Mermaid gantt, pie, mindmap, gitGraph, journey, timeline, quadrantChart, sankey, C4… | the code block, as written |
| Mermaid with a syntax error, or wider than the terminal even with tighter spacing | the code block |
Mermaid on desktop without node on the session's PATH | the Unicode art in a code block |
Single-line Mermaid (graph TD; A-->B) | may fail to parse: write one statement per line |
An alert nested in a list item or in another blockquote (> > [!NOTE]) | a plain blockquote |
| A reply still streaming in | the native rendering until the alert or the closing ` arrives |
| A single reply block over 10,000 characters | the native rendering of that block |
Footnotes, emoji shortcodes, #123 / @user autolinks, $math$, raw HTML | left to the native renderer |
| Your own messages and tool output | untouched: only Claude's replies are drawn |
Known glitch: in the terminal, an edge label leaving a {decision} node can show a stray ├ (beautiful-mermaid's ASCII layout, visible in the flowchart above).
The mod hooks ui.render on AssistantMessage: every text block of a reply goes through it, gets split into markdown, alert and Mermaid segments, and comes back as a tree the surface draws. A block with nothing to draw goes to the native renderer untouched.
graph LR
A[Reply block] --> B{GFM inside?}
B -->|no| N[Native renderer]
B -->|alert| C[Colored box]
B -->|mermaid| D{Surface}
D -->|terminal| E[Unicode art, in process]
D -->|desktop| F[SVG via node]
Mermaid is rendered by beautiful-mermaid, split in two because a hooks module may not import a file over 1 MiB and has no eval, while the ELK layout engine the SVG needs weighs 1.6 MB:
hooks/vendor/mermaid-ascii.js, the ASCII renderer alone (84 KB), imported by the mod.renderer/svg.mjs run by node, once per diagram, then cached.npm test # claude plugin test .
npm run validate # claude plugin validate .
npm run build:vendor # rebuild both Mermaid bundles with bun
| File | Role |
|---|---|
hooks/register.tsx | the ui.render hook and the SVG process call |
hooks/gfm.ts | splits a reply into blocks; task-list and strikethrough rewrites |
hooks/mermaid.ts | Unicode art sized to the terminal, SVG theming |
hooks/gfm.test.tsx | tests, run on every surface |
renderer/svg.mjs | Mermaid on stdin, SVG on stdout |
GFM.md | what Claude is told it can write, loaded by the SessionStart hook in hooks/hooks.json |
Issues and PRs welcome, especially screenshots from other terminals and the desktop app's light theme.
MIT. Vendored bundles keep their own licenses: beautiful-mermaid (MIT) and elkjs (EPL-2.0), in renderer/.
hooks/register.tsx 154 lines1import { atom, memberOf, read, update } from 'claude-code'
2import type { EngineInterface, Register } from 'claude-code'
3
4import { ALERTS, rewriteInline, splitBlocks } from './gfm'
5import type { Segment } from './gfm'
6import { mermaidArt, remember, themeSvg } from './mermaid'
7
8// What a Markdown element takes at most.
9const MAX_MARKDOWN = 10000
10
11const svgs = new Map<string, Promise<string | undefined>>()
12
13/** Whether each diagram shows its source instead of its drawing, by message and position. */
14const showCode = atom({ plugin: 'gfm-render', key: 'showCode' } as const, false)
15
16/** The diagram as an SVG, rendered once per source by node running renderer/svg.mjs. */
17function mermaidSvg($: EngineInterface, source: string): Promise<string | undefined> {
18 return remember(svgs, source, async () => {
19 try {
20 const { exitCode, stdout } = await $.process.run(['node', `${$.plugin.root}/renderer/svg.mjs`], {
21 stdin: source,
22 timeoutMs: 10000,
23 })
24 return exitCode === 0 ? themeSvg(stdout) : undefined
25 } catch {
26 return undefined
27 }
28 })
29}
30
31export const register: Register = on => {
32 on('ui.render', { component: 'AssistantMessage' }, async ($, e, next) => {
33 // The desktop, VS Code and mobile renderers already draw task lists and
34 // strikethrough; the terminal's may not, so only it gets the rewrite.
35 const text = e.surface === 'terminal' ? rewriteInline(e.props.text) : e.props.text
36 const segments = splitBlocks(text)
37
38 if (!segments.some(s => s.kind !== 'markdown') || segments.some(s => s.text.length > MAX_MARKDOWN)) {
39 return text === e.props.text ? next(e) : next({ ...e, props: { ...e.props, text } })
40 }
41
42 const { Box, Text, Markdown } = $.ui.resolve(e)
43 // Room left beside the terminal's bullet and the alert border.
44 const columns = (e.viewport?.columns ?? 80) - 4
45
46 // Rendered before drawing: an SVG takes a node process (cached per source).
47 const svgs = new Map<number, string | undefined>()
48 const codes = new Map<number, boolean>()
49 if (e.surface !== 'terminal') {
50 await Promise.all(
51 segments.map(async (s, i) => {
52 if (s.kind === 'mermaid') {
53 svgs.set(i, await mermaidSvg($, s.text))
54 codes.set(i, await read($, memberOf(showCode, { requestId: `${e.requestId}:${i}` })))
55 }
56 }),
57 )
58 }
59
60 const diagram = (s: Extract<Segment, { kind: 'mermaid' }>, i: number) => {
61 const key = `mermaid-${i}`
62 if (e.surface === 'terminal') {
63 const art = mermaidArt(s.text, columns)
64 if (art === undefined) {
65 return <Markdown key={key} text={s.fence} />
66 }
67 return (
68 <Box key={key} flexDirection="column" marginTop={i === 0 ? 0 : 1} marginBottom={1}>
69 {art.split('\n').map((line, j) => (
70 <Text key={`${key}-${j}`} wrap="truncate-end">
71 {line === '' ? ' ' : line}
72 </Text>
73 ))}
74 </Box>
75 )
76 }
77 const svg = svgs.get(i)
78 if (svg === undefined) {
79 // No node to draw the SVG: the text art in a code block, which scrolls.
80 const art = mermaidArt(s.text, 200)
81 return <Markdown key={key} text={art === undefined ? s.fence : `\`\`\`\n${art}\n\`\`\``} />
82 }
83 const { Svg, Code, Button } = $.ui.resolve(e)
84 const isCode = codes.get(i) === true
85 return (
86 <Box key={key} flexDirection="column" marginTop={i === 0 ? 0 : 1} marginBottom={1}>
87 <Box justifyContent="flex-end">
88 <Button
89 key={`${key}-toggle`}
90 label={isCode ? 'Diagramme' : 'Code'}
91 dimColor
92 onPress={() => update($, memberOf(showCode, { requestId: `${e.requestId}:${i}` }), shown => !shown)}
93 />
94 </Box>
95 {isCode ? (
96 <Code source={s.text} language="mermaid" />
97 ) : (
98 // A row sizes the SVG to its own width; the column would stretch it.
99 <Box>
100 <Svg source={svg} alt="Diagramme Mermaid" />
101 </Box>
102 )}
103 </Box>
104 )
105 }
106
107 const body = (
108 <Box flexDirection="column" flexGrow={1} flexShrink={1}>
109 {segments.map((s, i) => {
110 if (s.kind === 'markdown') {
111 return <Markdown key={`md-${i}`} text={s.text} />
112 }
113 if (s.kind === 'mermaid') {
114 return diagram(s, i)
115 }
116 const alert = ALERTS[s.type]
117 return (
118 <Box
119 key={`alert-${i}`}
120 flexDirection="column"
121 borderStyle="round"
122 borderColor={alert.color}
123 paddingX={1}
124 // The desktop's proportional text packs boxes tighter than the
125 // terminal's cells, so it gets room around and inside each one.
126 marginY={e.surface === 'terminal' ? 0 : 1}
127 paddingY={e.surface === 'terminal' ? 0 : 1}
128 >
129 <Text bold color={alert.color}>
130 {`${alert.icon} ${alert.label}`}
131 </Text>
132 {s.text.trim() !== '' && <Markdown text={s.text} />}
133 </Box>
134 )
135 })}
136 </Box>
137 )
138
139 // The terminal opens a reply with a bullet; keep it, since this tree
140 // replaces the engine's whole drawing of the block.
141 if (e.surface === 'terminal' && e.props.isFirstOfReply) {
142 return (
143 <Box flexDirection="row">
144 <Box width={2} flexShrink={0}>
145 <Text>⏺</Text>
146 </Box>
147 {body}
148 </Box>
149 )
150 }
151 return body
152 })
153}
154hooks/gfm.ts 134 lines1// Pure GFM helpers: split a reply into markdown, alert and mermaid blocks,
2// and rewrite the GFM bits a renderer may not draw (task lists, ~~strike~~).
3
4export type AlertType = 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION'
5
6export type Segment =
7 | { kind: 'markdown'; text: string }
8 | { kind: 'alert'; type: AlertType; text: string }
9 | { kind: 'mermaid'; text: string; fence: string }
10
11export const ALERTS: Record<AlertType, { label: string; icon: string; color: string }> = {
12 NOTE: { label: 'Note', icon: 'ℹ', color: '#4493f8' },
13 TIP: { label: 'Tip', icon: '✦', color: '#3fb950' },
14 IMPORTANT: { label: 'Important', icon: '‼', color: '#ab7df8' },
15 WARNING: { label: 'Warning', icon: '▲', color: '#d29922' },
16 CAUTION: { label: 'Caution', icon: '✖', color: '#f85149' },
17}
18
19const FENCE = /^\s{0,3}(`{3,}|~{3,})\s*(\S*)/
20const ALERT_START = /^\s{0,3}>\s?\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i
21const QUOTED = /^\s{0,3}>/
22const UNQUOTE = /^\s{0,3}>\s?/
23
24function closes(line: string, fence: string): boolean {
25 const m = line.match(FENCE)
26 return m !== null && m[2] === '' && m[1][0] === fence[0] && m[1].length >= fence.length
27}
28
29/**
30 * Splits `text` into markdown, alert and closed ```mermaid segments; an alert
31 * is never looked for inside a code fence, and a fence still open (a reply
32 * streaming in) stays markdown.
33 */
34export function splitBlocks(text: string): Segment[] {
35 const segments: Segment[] = []
36 const lines = text.split('\n')
37 let plain: string[] = []
38 let fence: string | null = null
39
40 const flush = () => {
41 if (plain.join('\n').trim() !== '') {
42 segments.push({ kind: 'markdown', text: plain.join('\n') })
43 }
44 plain = []
45 }
46
47 for (let i = 0; i < lines.length; i++) {
48 const line = lines[i]
49 const fenceMatch = line.match(FENCE)
50
51 if (fence !== null) {
52 if (closes(line, fence)) {
53 fence = null
54 }
55 plain.push(line)
56 continue
57 }
58 if (fenceMatch && fenceMatch[2].toLowerCase() === 'mermaid') {
59 const end = lines.findIndex((l, j) => j > i && closes(l, fenceMatch[1]))
60 if (end !== -1) {
61 flush()
62 segments.push({
63 kind: 'mermaid',
64 text: lines.slice(i + 1, end).join('\n'),
65 fence: lines.slice(i, end + 1).join('\n'),
66 })
67 i = end
68 continue
69 }
70 }
71 if (fenceMatch) {
72 fence = fenceMatch[1]
73 plain.push(line)
74 continue
75 }
76
77 const alert = line.match(ALERT_START)
78 if (!alert) {
79 plain.push(line)
80 continue
81 }
82
83 const body: string[] = []
84 while (i + 1 < lines.length && QUOTED.test(lines[i + 1])) {
85 body.push(lines[++i].replace(UNQUOTE, ''))
86 }
87 flush()
88 segments.push({ kind: 'alert', type: alert[1].toUpperCase() as AlertType, text: body.join('\n') })
89 }
90 flush()
91
92 return segments
93}
94
95const TASK = /^(\s*(?:[-*+]|\d+[.)])\s+)\[([ xX])\](?=\s)/
96const STRIKE = /~~(?=\S)([^~\n]*?\S)~~/g
97const CODE_SPAN = /(`+)[^`]*?\1/g
98
99/** Draws a strike through each character with U+0336, for renderers without `del`. */
100function strike(text: string): string {
101 return Array.from(text).map(c => c + '̶').join('')
102}
103
104/** Rewrites task-list boxes as ☐/☑ and ~~text~~ as struck text, outside code. */
105export function rewriteInline(text: string): string {
106 let fence: string | null = null
107
108 return text
109 .split('\n')
110 .map(line => {
111 const fenceMatch = line.match(FENCE)
112 if (fence !== null) {
113 if (closes(line, fence)) {
114 fence = null
115 }
116 return line
117 }
118 if (fenceMatch) {
119 fence = fenceMatch[1]
120 return line
121 }
122
123 const tasked = line.replace(TASK, (_, lead: string, mark: string) => `${lead}${mark === ' ' ? '☐' : '☑'}`)
124 let out = ''
125 let last = 0
126 for (const m of tasked.matchAll(CODE_SPAN)) {
127 out += tasked.slice(last, m.index).replace(STRIKE, (_, inner: string) => strike(inner)) + m[0]
128 last = m.index! + m[0].length
129 }
130 return out + tasked.slice(last).replace(STRIKE, (_, inner: string) => strike(inner))
131 })
132 .join('\n')
133}
134hooks/mermaid.ts 60 lines1// Mermaid source to Unicode art (in process, vendored beautiful-mermaid ASCII
2// renderer) or to SVG (node running renderer/svg.mjs, since ELK's layout is
3// over the size a hooks module may import); undefined when it cannot draw.
4
5import { renderMermaidASCII } from './vendor/mermaid-ascii.js'
6
7// What a Svg element takes at most.
8const MAX_SVG = 131072
9
10// Light and dark backgrounds of the desktop transcript, so node fills blend in.
11const THEME = `<style>
12 svg { --bg: #FFFFFF; --fg: #27272A; }
13 @media (prefers-color-scheme: dark) { svg { --bg: #1F1F1E; --fg: #E4E4E7; } }
14</style>`
15
16const arts = new Map<string, string | undefined>()
17
18export function remember<T>(cache: Map<string, T>, key: string, make: () => T): T {
19 if (!cache.has(key)) {
20 if (cache.size > 100) {
21 cache.clear()
22 }
23 cache.set(key, make())
24 }
25 return cache.get(key)!
26}
27
28function width(art: string): number {
29 return Math.max(...art.split('\n').map(l => Array.from(l).length))
30}
31
32/** The diagram as text art at most `columns` wide, tightening the spacing to fit. */
33export function mermaidArt(source: string, columns: number): string | undefined {
34 for (const paddingX of [5, 3, 1]) {
35 const art = remember(arts, `${paddingX}:${source}`, () => {
36 try {
37 return renderMermaidASCII(source, { colorMode: 'none', paddingX }).replace(/\s+$/gm, '')
38 } catch {
39 return undefined
40 }
41 })
42 if (art === undefined) {
43 return undefined
44 }
45 if (width(art) <= columns) {
46 return art
47 }
48 }
49 return undefined
50}
51
52/** The SVG as drawn: no web font to fetch, colors that follow the light or dark scheme. */
53export function themeSvg(svg: string): string | undefined {
54 const themed = svg
55 .replace(/@import url\([^)]*\);?/, '')
56 .replace(/ style="--bg:[^"]*"/, '')
57 .replace(/^(<svg[^>]*>)/, `$1${THEME}`)
58 return themed.startsWith('<svg') && themed.length <= MAX_SVG ? themed : undefined
59}
60hooks/vendor/mermaid-ascii.js 14 lines1// beautiful-mermaid 1.1.3 ASCII renderer (MIT, lukilabs/Craft), bundled with bun build --minify.
2function FQ(Q){return(Q.startsWith('"')&&Q.endsWith('"')?Q.slice(1,-1):Q).replace(/<br\s*\/?>/gi,`
3`).replace(/\\n/g,`
4`).replace(/<\/?(?:sub|sup|small|mark)\s*>/gi,"").replace(/\*\*(.+?)\*\*/g,"<b>$1</b>").replace(/(?<!\*)\*([^\s*](?:[^*]*[^\s*])?)\*(?!\*)/g,"<i>$1</i>").replace(/~~(.+?)~~/g,"<s>$1</s>")}function A4(Q){let $=Q.split(`
5`).map((V)=>V.trim()).filter((V)=>V.length>0&&!V.startsWith("%%"));if($.length===0)throw new Error("Empty mermaid diagram");let Z=$[0];if(/^stateDiagram(-v2)?\s*$/i.test(Z))return d8($);return l8($)}function l8(Q){let $=Q[0].match(/^(?:graph|flowchart)\s+(TD|TB|LR|BT|RL)\s*$/i);if(!$)throw new Error(`Invalid mermaid header: "${Q[0]}". Expected "graph TD", "flowchart LR", "stateDiagram-v2", etc.`);let V={direction:$[1].toUpperCase(),nodes:new Map,edges:[],subgraphs:[],classDefs:new Map,classAssignments:new Map,nodeStyles:new Map,linkStyles:new Map},_=[];for(let K=1;K<Q.length;K++){let J=Q[K],G=J.match(/^classDef\s+(\w+)\s+(.+)$/);if(G){let O=G[1],B=G[2],W=tQ(B);V.classDefs.set(O,W);continue}let j=J.match(/^class\s+([\w,-]+)\s+(\w+)$/);if(j){let O=j[1].split(",").map((W)=>W.trim()),B=j[2];for(let W of O)V.classAssignments.set(W,B);continue}let F=J.match(/^style\s+([\w,-]+)\s+(.+)$/);if(F){let O=F[1].split(",").map((W)=>W.trim()),B=tQ(F[2]);for(let W of O)V.nodeStyles.set(W,{...V.nodeStyles.get(W),...B});continue}let z=J.match(/^linkStyle\s+(default|[\d,\s]+)\s+(.+)$/);if(z){let O=z[1].trim(),B=tQ(z[2]);if(O==="default")V.linkStyles.set("default",{...V.linkStyles.get("default"),...B});else{let W=O.split(",").map((H)=>parseInt(H.trim(),10));for(let H of W)if(!isNaN(H))V.linkStyles.set(H,{...V.linkStyles.get(H),...B})}continue}let U=J.match(/^direction\s+(TD|TB|LR|BT|RL)\s*$/i);if(U&&_.length>0){_[_.length-1].direction=U[1].toUpperCase();continue}let N=J.match(/^subgraph\s+(.+)$/);if(N){let O=N[1].trim(),B=O.match(/^([\w-]+)\s*\[(.+)\]$/),W,H;if(B)W=B[1],H=FQ(B[2]);else H=FQ(O),W=O.replace(/\s+/g,"_").replace(/[^\w]/g,"");let A={id:W,label:H,nodeIds:[],children:[]};_.push(A);continue}if(J==="end"){let O=_.pop();if(O)if(_.length>0)_[_.length-1].children.push(O);else V.subgraphs.push(O);continue}r8(J,V,_)}return V}function d8(Q){let $={direction:"TD",nodes:new Map,edges:[],subgraphs:[],classDefs:new Map,classAssignments:new Map,nodeStyles:new Map,linkStyles:new Map},Z=[],V=new Set,_=0,K=0;for(let J=1;J<Q.length;J++){let G=Q[J],j=G.match(/^direction\s+(TD|TB|LR|BT|RL)\s*$/i);if(j){if(Z.length>0)Z[Z.length-1].direction=j[1].toUpperCase();else $.direction=j[1].toUpperCase();continue}let F=G.match(/^linkStyle\s+(default|[\d,\s]+)\s+(.+)$/);if(F){let B=F[1].trim(),W=tQ(F[2]);if(B==="default")$.linkStyles.set("default",{...$.linkStyles.get("default"),...W});else{let H=B.split(",").map((A)=>parseInt(A.trim(),10));for(let A of H)if(!isNaN(A))$.linkStyles.set(A,{...$.linkStyles.get(A),...W})}continue}let z=G.match(/^state\s+(?:"([^"]+)"\s+as\s+)?([\w\p{L}]+)\s*\{$/u);if(z){let B=z[1]??z[2],W=z[2],H={id:W,label:B,nodeIds:[],children:[]};Z.push(H),V.add(W),$.nodes.delete(W);continue}if(G==="}"){let B=Z.pop();if(B)if(Z.length>0)Z[Z.length-1].children.push(B);else $.subgraphs.push(B);continue}let U=G.match(/^state\s+"([^"]+)"\s+as\s+([\w\p{L}]+)\s*$/u);if(U){let B=FQ(U[1]),W=U[2];dQ($,Z,{id:W,label:B,shape:"rounded"});continue}let N=G.match(/^(\[\*\]|[\w\p{L}-]+)\s*(-->)\s*(\[\*\]|[\w\p{L}-]+)(?:\s*:\s*(.+))?$/u);if(N){let B=N[1],W=N[3],H=N[4]?.trim(),A=H?FQ(H):void 0;if(B==="[*]")_++,B=`_start${_>1?_:""}`,dQ($,Z,{id:B,label:"",shape:"state-start"});else if(!V.has(B))I4($,Z,B);if(W==="[*]")K++,W=`_end${K>1?K:""}`,dQ($,Z,{id:W,label:"",shape:"state-end"});else if(!V.has(W))I4($,Z,W);$.edges.push({source:B,target:W,label:A,style:"solid",hasArrowStart:!1,hasArrowEnd:!0});continue}let O=G.match(/^([\w\p{L}-]+)\s*:\s*(.+)$/u);if(O){let B=O[1],W=FQ(O[2].trim());dQ($,Z,{id:B,label:W,shape:"rounded"});continue}}return $}function dQ(Q,$,Z){if(!Q.nodes.has(Z.id))Q.nodes.set(Z.id,Z);if($.length>0){let _=$[$.length-1];if(!_.nodeIds.includes(Z.id))_.nodeIds.push(Z.id)}}function I4(Q,$,Z){if(!Q.nodes.has(Z))dQ(Q,$,{id:Z,label:Z,shape:"rounded"});else if($.length>0){let V=$[$.length-1];if(!V.nodeIds.includes(Z))V.nodeIds.push(Z)}}function tQ(Q){let $=Q.replace(/;\s*$/,""),Z={};for(let V of $.split(",")){let _=V.indexOf(":");if(_>0){let K=V.slice(0,_).trim(),J=V.slice(_+1).trim();if(K&&J)Z[K]=J}}return Z}var n8=/^(<)?(-->|-.->|==>|---|-\.-|===)(?:\|([^|]*)\|)?/,s8=/^(<)?(--|-\.|==)\s+(.+?)\s+(-->|---|\.\->|-\.\-|==>|===)/,i8=[{regex:/^([\w-]+)\(\(\((.+?)\)\)\)/,shape:"doublecircle"},{regex:/^([\w-]+)\(\[(.+?)\]\)/,shape:"stadium"},{regex:/^([\w-]+)\(\((.+?)\)\)/,shape:"circle"},{regex:/^([\w-]+)\[\[(.+?)\]\]/,shape:"subroutine"},{regex:/^([\w-]+)\[\((.+?)\)\]/,shape:"cylinder"},{regex:/^([\w-]+)\[\/(.+?)\\\]/,shape:"trapezoid"},{regex:/^([\w-]+)\[\\(.+?)\/\]/,shape:"trapezoid-alt"},{regex:/^([\w-]+)>(.+?)\]/,shape:"asymmetric"},{regex:/^([\w-]+)\{\{(.+?)\}\}/,shape:"hexagon"},{regex:/^([\w-]+)\[(.+?)\]/,shape:"rectangle"},{regex:/^([\w-]+)\((.+?)\)/,shape:"rounded"},{regex:/^([\w-]+)\{(.+?)\}/,shape:"diamond"}],o8=/^([\w-]+)/,t8=/^:::([\w][\w-]*)/;function r8(Q,$,Z){let V=Q.trim(),_=T4(V,$,Z);if(!_||_.ids.length===0)return;V=_.remaining.trim();let K=_.ids;while(V.length>0){let J,G,j,F,z=V.match(n8);if(z){J=Boolean(z[1]);let N=z[2],O=z[3]?.trim();F=O?FQ(O):void 0,V=V.slice(z[0].length).trim(),G=e8(N),j=N.endsWith(">")}else{let N=V.match(s8);if(!N)break;J=Boolean(N[1]);let O=N[3].trim();F=O?FQ(O):void 0;let B=N[2],W=N[4];V=V.slice(N[0].length).trim(),G=Q9(B,W),j=W.endsWith(">")}let U=T4(V,$,Z);if(!U||U.ids.length===0)break;V=U.remaining.trim();for(let N of K)for(let O of U.ids)$.edges.push({source:N,target:O,label:F,style:G,hasArrowStart:J,hasArrowEnd:j});K=U.ids}}function T4(Q,$,Z){let V=k4(Q,$,Z);if(!V)return null;let _=[V.id],K=V.remaining.trim();while(K.startsWith("&")){K=K.slice(1).trim();let J=k4(K,$,Z);if(!J)break;_.push(J.id),K=J.remaining.trim()}return{ids:_,remaining:K}}function k4(Q,$,Z){let V=null,_=Q;for(let{regex:J,shape:G}of i8){let j=Q.match(J);if(j){V=j[1];let F=FQ(j[2]);Y4($,Z,{id:V,label:F,shape:G}),_=Q.slice(j[0].length);break}}if(V===null){let J=Q.match(o8);if(J){if(V=J[1],!$.nodes.has(V))Y4($,Z,{id:V,label:V,shape:"rectangle"});_=Q.slice(J[0].length)}}if(V===null)return null;let K=_.match(t8);if(K)$.classAssignments.set(V,K[1]),_=_.slice(K[0].length);return{id:V,remaining:_}}function Y4(Q,$,Z){if(!Q.nodes.has(Z.id))Q.nodes.set(Z.id,Z);a8($,Z.id)}function a8(Q,$){if(Q.length>0){let Z=Q[Q.length-1];if(!Z.nodeIds.includes($))Z.nodeIds.push($)}}function e8(Q){if(Q==="-.->")return"dotted";if(Q==="-.-")return"dotted";if(Q==="==>")return"thick";if(Q==="===")return"thick";return"solid"}function Q9(Q,$){if(Q==="-."||$===".->"||$==="-.-")return"dotted";if(Q==="=="||$==="==>"||$==="===")return"thick";return"solid"}var c={x:1,y:0},u={x:1,y:2},l={x:0,y:1},p={x:2,y:1},TQ={x:2,y:0},IQ={x:0,y:0},EQ={x:2,y:2},kQ={x:0,y:2},SQ={x:1,y:1};function G4(Q,$){return Q.x===$.x&&Q.y===$.y}function rQ(Q,$){return Q.x===$.x&&Q.y===$.y}function nQ(Q,$){return{x:Q.x+$.x,y:Q.y+$.y}}function wQ(Q){return`${Q.x},${Q.y}`}var M4={name:"",styles:{}};var eQ={fg:"#27272a",border:"#a1a1aa",line:"#71717a",arrow:"#52525b",corner:"#71717a",junction:"#a1a1aa"};function X4(){let Q=globalThis.process;if(Q){if(!Q.stdout?.isTTY)return"none";let $=Q.env?.COLORTERM?.toLowerCase()??"",Z=Q.env?.TERM?.toLowerCase()??"";if($==="truecolor"||$==="24bit")return"truecolor";if(Z.includes("256color")||Z.includes("256"))return"ansi256";if(Z&&Z!=="dumb")return"ansi16";return"none"}if(typeof document!=="undefined")return"html";return"none"}function F4(Q){let $=Q.replace("#","");if($.length===3)return{r:parseInt($[0]+$[0],16),g:parseInt($[1]+$[1],16),b:parseInt($[2]+$[2],16)};return{r:parseInt($.substring(0,2),16),g:parseInt($.substring(2,4),16),b:parseInt($.substring(4,6),16)}}var Q4="\x1B[",aQ=`${Q4}0m`;function E4(Q){let{r:$,g:Z,b:V}=F4(Q);return`${Q4}38;2;${$};${Z};${V}m`}function $9(Q,$,Z){let V=(Q+$+Z)/3;if(Math.max(Math.abs(Q-V),Math.abs($-V),Math.abs(Z-V))<10){let F=Math.round(V/255*23);return 232+Math.min(23,Math.max(0,F))}let K=(F)=>{if(F<48)return 0;if(F<115)return 1;return Math.min(5,Math.floor((F-35)/40))},J=K(Q),G=K($),j=K(Z);return 16+36*J+6*G+j}function R4(Q){let{r:$,g:Z,b:V}=F4(Q),_=$9($,Z,V);return`${Q4}38;5;${_}m`}function D4(Q){let{r:$,g:Z,b:V}=F4(Q),_=0.299*$+0.587*Z+0.114*V,K=_>100?0:60,J;if($>180&&Z<100&&V<100)J=31;else if(Z>180&&$<100&&V<100)J=32;else if($>150&&Z>150&&V<100)J=33;else if(V>180&&$<100&&Z<100)J=34;else if($>150&&V>150&&Z<100)J=35;else if(Z>150&&V>150&&$<100)J=36;else if(_>200)J=37;else if(_<50)J=30;else J=37;return`${Q4}${J+K}m`}function L4(Q){return Q.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function S4(Q,$){return`<span style="color:${Q}">${L4($)}</span>`}function w4(Q,$){switch(Q){case"text":return $.fg;case"border":return $.border;case"line":return $.line;case"arrow":return $.arrow;case"corner":return $.corner??$.line;case"junction":return $.junction??$.border;default:return $.fg}}function j4(Q,$,Z){if(Z==="none")return"";let V=w4(Q,$);switch(Z){case"truecolor":return E4(V);case"ansi256":return R4(V);case"ansi16":return D4(V);default:return""}}function y4(Q,$,Z,V){if(V==="none")return Q.join("");if(V==="html")return Z9(Q,$,Z);let _="",K=null,J="";for(let G=0;G<Q.length;G++){let j=Q[G],F=$[G]??null;if(j===" "){if(J.length>0){if(K!==null)_+=j4(K,Z,V)+J+aQ;else _+=J;J="",K=null}_+=j;continue}if(F===K){J+=j;continue}if(J.length>0)if(K!==null)_+=j4(K,Z,V)+J+aQ;else _+=J;J=j,K=F}if(J.length>0&&K!==null)_+=j4(K,Z,V)+J+aQ;else if(J.length>0)_+=J;return _}function Z9(Q,$,Z){let V="",_=null,K="",J=()=>{if(K.length===0)return;if(_!==null)V+=S4(w4(_,Z),K);else V+=L4(K);K="",_=null};for(let G=0;G<Q.length;G++){let j=Q[G],F=$[G]??null;if(j===" "){J(),V+=" ";continue}if(F===_){K+=j;continue}J(),K=j,_=F}return J(),V}function $4(Q,$,Z){if(Z==="none"||Q.length===0)return Q;if(Z==="html")return S4($,Q);let V;switch(Z){case"truecolor":V=E4($);break;case"ansi256":V=R4($);break;case"ansi16":V=D4($);break;default:return Q}return`${V}${Q}${aQ}`}function _Q(Q,$){let Z=[];for(let V=0;V<=Q;V++){let _=[];for(let K=0;K<=$;K++)_.push(" ");Z.push(_)}return Z}function OQ(Q){let[$,Z]=sQ(Q);return _Q($,Z)}function CQ(Q,$){let Z=[];for(let V=0;V<=Q;V++){let _=[];for(let K=0;K<=$;K++)_.push(null);Z.push(_)}return Z}function yQ(Q,$,Z){let V=Q.length-1,_=(Q[0]?.length??1)-1,K=Math.max($,V),J=Math.max(Z,_),G=CQ(K,J);for(let j=0;j<G.length;j++)for(let F=0;F<G[0].length;F++)if(j<Q.length&&F<Q[0].length)G[j][F]=Q[j][F];return Q.length=0,Q.push(...G),Q}function fQ(Q,$,Z,V){if($>=Q.length||Z>=(Q[0]?.length??0))yQ(Q,$,Z);Q[$][Z]=V}function sQ(Q){return[Q.length-1,(Q[0]?.length??1)-1]}function RQ(Q,$,Z){let[V,_]=sQ(Q),K=Math.max($,V),J=Math.max(Z,_),G=_Q(K,J);for(let j=0;j<G.length;j++)for(let F=0;F<G[0].length;F++)if(j<Q.length&&F<Q[0].length)G[j][F]=Q[j][F];return Q.length=0,Q.push(...G),Q}var K9=new Set(["─","│","┌","┐","└","┘","├","┤","┬","┴","┼","╴","╵","╶","╷"]);function v4(Q){return K9.has(Q)}function C4(Q){return/^[a-zA-Z0-9]$/.test(Q)}var J9={"─":{"│":"┼","┌":"┬","┐":"┬","└":"┴","┘":"┴","├":"┼","┤":"┼","┬":"┬","┴":"┴"},"│":{"─":"┼","┌":"├","┐":"┤","└":"├","┘":"┤","├":"├","┤":"┤","┬":"┼","┴":"┼"},"┌":{"─":"┬","│":"├","┐":"┬","└":"├","┘":"┼","├":"├","┤":"┼","┬":"┬","┴":"┼"},"┐":{"─":"┬","│":"┤","┌":"┬","└":"┼","┘":"┤","├":"┼","┤":"┤","┬":"┬","┴":"┼"},"└":{"─":"┴","│":"├","┌":"├","┐":"┼","┘":"┴","├":"├","┤":"┼","┬":"┼","┴":"┴"},"┘":{"─":"┴","│":"┤","┌":"┼","┐":"┤","└":"┴","├":"┼","┤":"┤","┬":"┼","┴":"┴"},"├":{"─":"┼","│":"├","┌":"├","┐":"┼","└":"├","┘":"┼","┤":"┼","┬":"┼","┴":"┼"},"┤":{"─":"┼","│":"┤","┌":"┼","┐":"┤","└":"┼","┘":"┤","├":"┼","┬":"┼","┴":"┼"},"┬":{"─":"┬","│":"┼","┌":"┬","┐":"┬","└":"┼","┘":"┼","├":"┼","┤":"┼","┴":"┼"},"┴":{"─":"┴","│":"┼","┌":"┼","┐":"┼","└":"┴","┘":"┴","├":"┼","┤":"┼","┬":"┼"}};function V9(Q,$){return J9[Q]?.[$]??Q}function DQ(Q,$,Z,...V){let[_,K]=sQ(Q);for(let G of V){let[j,F]=sQ(G);_=Math.max(_,j+$.x),K=Math.max(K,F+$.y)}let J=_Q(_,K);for(let G=0;G<=_;G++)for(let j=0;j<=K;j++)if(G<Q.length&&j<Q[0].length)J[G][j]=Q[G][j];for(let G of V)for(let j=0;j<G.length;j++)for(let F=0;F<G[0].length;F++){let z=G[j][F];if(z!==" "){let U=j+$.x,N=F+$.y,O=J[U][N];if(!Z&&v4(z)&&v4(O))J[U][N]=V9(O,z);else if(C4(O)&&C4(z));else J[U][N]=z}}return J}function xQ(Q,$){let[Z,V]=sQ(Q),_=[],K=$?.roleCanvas,J=$?.colorMode??"none",G=$?.theme??eQ;for(let j=0;j<=V;j++)if(J==="none"||!K){let F="";for(let z=0;z<=Z;z++)F+=Q[z][j];_.push(F)}else{let F=[],z=[];for(let U=0;U<=Z;U++)F.push(Q[U][j]),z.push(K[U]?.[j]??null);_.push(y4(F,z,G,J))}return _.join(`
6`)}var _9={"▲":"▼","▼":"▲","◤":"◣","◣":"◤","◥":"◢","◢":"◥","^":"v",v:"^","┌":"└","└":"┌","┐":"┘","┘":"┐","┬":"┴","┴":"┬","╵":"╷","╷":"╵"};function f4(Q){for(let $ of Q)$.reverse();for(let $ of Q)for(let Z=0;Z<$.length;Z++){let V=_9[$[Z]];if(V)$[Z]=V}return Q}function b4(Q){for(let $ of Q)$.reverse();return Q}function z4(Q,$,Z,V=!1){RQ(Q,$.x+Z.length,$.y);for(let _=0;_<Z.length;_++){let K=$.x+_,J=Q[K][$.y];if(V||J===" ")Q[K][$.y]=Z[_]}}function u4(Q,$,Z){let V=0,_=0;for(let K of $.values())V+=K;for(let K of Z.values())_+=K;RQ(Q,V-1,_-1)}function x4(Q,$,Z){let V=0,_=0;for(let K of $.values())V+=K;for(let K of Z.values())_+=K;yQ(Q,V-1,_-1)}function m4(Q,$){let Z=new Map,V=0;for(let[G,j]of Q.nodes){let F={name:G,displayLabel:j.label,shape:j.shape,index:V,gridCoord:null,drawingCoord:null,drawing:null,drawn:!1,styleClassName:"",styleClass:M4};Z.set(G,F),V++}let _=[...Z.values()],K=[];for(let G of Q.edges){let j=Z.get(G.source),F=Z.get(G.target);if(!j||!F)continue;K.push({from:j,to:F,text:G.label??"",path:[],labelLine:[],startDir:{x:0,y:0},endDir:{x:0,y:0},style:G.style,hasArrowStart:G.hasArrowStart,hasArrowEnd:G.hasArrowEnd})}let J=[];for(let G of Q.subgraphs)p4(G,null,Z,J);G9(Q.subgraphs,J,Z,Q);for(let[G,j]of Q.classAssignments){let F=Z.get(G),z=Q.classDefs.get(j);if(F&&z)F.styleClassName=j,F.styleClass={name:j,styles:z}}return{nodes:_,edges:K,canvas:_Q(0,0),roleCanvas:CQ(0,0),grid:new Map,columnWidth:new Map,rowHeight:new Map,subgraphs:J,config:$,offsetX:0,offsetY:0,bundles:[]}}function p4(Q,$,Z,V){let _;if(Q.direction)_=Q.direction==="LR"||Q.direction==="RL"?"LR":"TD";let K={name:Q.label,nodes:[],parent:$,children:[],minX:0,minY:0,maxX:0,maxY:0,direction:_};for(let J of Q.nodeIds){let G=Z.get(J);if(G)K.nodes.push(G)}V.push(K);for(let J of Q.children){let G=p4(J,K,Z,V);K.children.push(G);for(let j of G.nodes)if(!K.nodes.includes(j))K.nodes.push(j)}return K}function G9(Q,$,Z,V){let _=new Map;F9(Q,$,_);let K=new Map;function J(G){let j=_.get(G);if(!j)return;for(let F of G.children)J(F);for(let F of G.nodeIds)if(!K.has(F))K.set(F,j)}for(let G of Q)J(G);for(let G of $)G.nodes=G.nodes.filter((j)=>{let F;for(let[U,N]of Z)if(N===j){F=U;break}if(!F)return!1;let z=K.get(F);if(!z)return!0;return j9(G,z)})}function j9(Q,$){let Z=$;while(Z!==null){if(Z===Q)return!0;Z=Z.parent}return!1}function F9(Q,$,Z){let V=[];function _(K){for(let J of K)V.push(J),_(J.children)}_(Q);for(let K=0;K<V.length&&K<$.length;K++)Z.set(V[K],$[K])}class g4{items=[];get length(){return this.items.length}push(Q){this.items.push(Q),this.bubbleUp(this.items.length-1)}pop(){if(this.items.length===0)return;let Q=this.items[0],$=this.items.pop();if(this.items.length>0)this.items[0]=$,this.sinkDown(0);return Q}bubbleUp(Q){while(Q>0){let $=Q-1>>1;if(this.items[Q].priority<this.items[$].priority)[this.items[Q],this.items[$]]=[this.items[$],this.items[Q]],Q=$;else break}}sinkDown(Q){let $=this.items.length;while(!0){let Z=Q,V=2*Q+1,_=2*Q+2;if(V<$&&this.items[V].priority<this.items[Z].priority)Z=V;if(_<$&&this.items[_].priority<this.items[Z].priority)Z=_;if(Z!==Q)[this.items[Q],this.items[Z]]=[this.items[Z],this.items[Q]],Q=Z;else break}}}function z9(Q,$){let Z=Math.abs(Q.x-$.x),V=Math.abs(Q.y-$.y);if(Z===0||V===0)return Z+V;return Z+V+1}var N9=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}];function O9(Q,$){if($.x<0||$.y<0)return!1;return!Q.has(wQ($))}function mQ(Q,$,Z){let V=new g4;V.push({coord:$,priority:0});let _=new Map;_.set(wQ($),0);let K=new Map;K.set(wQ($),null);while(V.length>0){let J=V.pop().coord;if(G4(J,Z)){let j=[],F=J;while(F!==null)j.unshift(F),F=K.get(wQ(F))??null;return j}let G=_.get(wQ(J));for(let j of N9){let F={x:J.x+j.x,y:J.y+j.y};if(!O9(Q,F)&&!G4(F,Z))continue;let z=G+1,U=wQ(F),N=_.get(U);if(N===void 0||z<N){_.set(U,z);let O=z+z9(F,Z);V.push({coord:F,priority:O}),K.set(U,J)}}}return null}function vQ(Q){if(Q.length<=2)return Q;let $=new Set,Z=Q[0],V=Q[1];for(let _=2;_<Q.length;_++){let K=Q[_],J=V.x-Z.x,G=V.y-Z.y,j=K.x-V.x,F=K.y-V.y;if(J===j&&G===F)$.add(_-1);Z=V,V=K}return Q.filter((_,K)=>!$.has(K))}function Z4(Q){if(Q===c)return u;if(Q===u)return c;if(Q===l)return p;if(Q===p)return l;if(Q===TQ)return kQ;if(Q===IQ)return EQ;if(Q===EQ)return IQ;if(Q===kQ)return TQ;return SQ}function P(Q,$){return Q.x===$.x&&Q.y===$.y}function WQ(Q,$){if(Q.x===$.x)return Q.y<$.y?u:c;else if(Q.y===$.y)return Q.x<$.x?p:l;else if(Q.x<$.x)return Q.y<$.y?EQ:TQ;else return Q.y<$.y?kQ:IQ}function U9(Q){if(Q==="LR")return[p,u,u,p];return[u,p,p,u]}function B9(Q,$){if(Q.from===Q.to)return U9($);let Z=WQ(Q.from.gridCoord,Q.to.gridCoord),V,_,K,J,G=$==="LR"?P(Z,l)||P(Z,IQ)||P(Z,kQ):P(Z,c)||P(Z,IQ)||P(Z,TQ);if(P(Z,EQ))if($==="LR")V=u,_=l,K=p,J=c;else V=p,_=c,K=u,J=l;else if(P(Z,TQ))if($==="LR")V=c,_=l,K=p,J=u;else V=p,_=u,K=c,J=l;else if(P(Z,kQ))if($==="LR")V=u,_=u,K=l,J=c;else V=l,_=c,K=u,J=p;else if(P(Z,IQ))if($==="LR")V=u,_=u,K=l,J=u;else V=p,_=p,K=c,J=p;else if(G)if($==="LR"&&P(Z,l))V=u,_=u,K=l,J=p;else if($==="TD"&&P(Z,c))V=p,_=p,K=c,J=u;else V=Z,_=Z4(Z),K=Z,J=Z4(Z);else V=Z,_=Z4(Z),K=Z,J=Z4(Z);return[V,_,K,J]}function h4(Q,$){let Z=HQ(Q,$.from),V=HQ(Q,$.to),_=Z&&Z===V&&Z.direction?Z.direction:Q.config.graphDirection,[K,J,G,j]=B9($,_),F=nQ($.from.gridCoord,K),z=nQ($.to.gridCoord,J),U=mQ(Q.grid,F,z),N=nQ($.from.gridCoord,G),O=nQ($.to.gridCoord,j),B=mQ(Q.grid,N,O);if(U!==null&&B!==null){if(U=vQ(U),B=vQ(B),U.length<=B.length)$.startDir=K,$.endDir=J,$.path=U;else $.startDir=G,$.endDir=j,$.path=B;return}if(U!==null){$.startDir=K,$.endDir=J,$.path=vQ(U);return}if(B!==null){$.startDir=G,$.endDir=j,$.path=vQ(B);return}$.startDir=K,$.endDir=J,$.path=[F,z]}function N4(Q,$){if($.text.length===0)return;let Z=$.text.length,V=$.path.length,_=Q.config.graphDirection==="TD",K=[];for(let N=1;N<V;N++){let O=$.path[N-1],B=$.path[N],W=[O,B],H=W9(Q,W),A=O.x===B.x;K.push({line:W,width:H,index:N,isVertical:A})}let J=K.filter((N)=>N.width>=Z&&N.index>1),G;if(J.length>0)J.sort((N,O)=>O.index-N.index),G=J[0].line;else{let N=K.filter((O)=>O.width>=Z);if(N.length>0)N.sort((O,B)=>B.index-O.index),G=N[0].line;else K.sort((O,B)=>B.width-O.width),G=K[0]?.line??[$.path[0],$.path[1]]}let j=Math.min(G[0].x,G[1].x),F=Math.max(G[0].x,G[1].x),z=j+Math.floor((F-j)/2),U=Q.columnWidth.get(z)??0;Q.columnWidth.set(z,Math.max(U,Z+2)),$.labelLine=[G[0],G[1]]}function W9(Q,$){let Z=0,V=Math.min($[0].x,$[1].x),_=Math.max($[0].x,$[1].x);for(let K=V;K<=_;K++)Z+=Q.columnWidth.get(K)??0;return Z}function l4(Q){if(Q.config.graphDirection!=="TD")return[];let $=[],Z=new Set,V=new Map;for(let K of Q.edges){if(K.from===K.to)continue;let J=V.get(K.to)??[];J.push(K),V.set(K.to,J)}for(let[K,J]of V){if(J.length<2)continue;if(!c4(J,Q))continue;if(J.some((j)=>Z.has(j)))continue;let G={type:"fan-in",edges:[...J],sharedNode:K,otherNodes:J.map((j)=>j.from),junctionPoint:null,sharedPath:[],junctionDir:SQ,sharedNodeDir:SQ};for(let j of J)j.bundle=G,Z.add(j);$.push(G)}let _=new Map;for(let K of Q.edges){if(K.from===K.to)continue;if(Z.has(K))continue;let J=_.get(K.from)??[];J.push(K),_.set(K.from,J)}for(let[K,J]of _){if(J.length<2)continue;if(!c4(J,Q))continue;let G={type:"fan-out",edges:[...J],sharedNode:K,otherNodes:J.map((j)=>j.to),junctionPoint:null,sharedPath:[],junctionDir:SQ,sharedNodeDir:SQ};for(let j of J)j.bundle=G,Z.add(j);$.push(G)}return $}function c4(Q,$){if(Q.length<2)return!1;let Z=Q[0].style,V=HQ($,Q[0].from),_=HQ($,Q[0].to);for(let K of Q){if(K.style!==Z)return!1;if(K.text.length>0)return!1;let J=HQ($,K.from),G=HQ($,K.to);if(J!==V||G!==_)return!1;if(J!==G)return!1}return!0}function P9(Q,$){let Z=Q.config.graphDirection,V=$.sharedNode.gridCoord,_=$.otherNodes.map((K)=>K.gridCoord);if($.type==="fan-in"){let K=Math.min(..._.map((F)=>F.x)),J=Math.max(..._.map((F)=>F.x)),G=Math.min(..._.map((F)=>F.y)),j=Math.max(..._.map((F)=>F.y));if(Z==="TD"){let F=V.y-1,z=Math.floor((K+J)/2)+1;return{x:V.x+1,y:F}}else{let F=V.x-1,z=V.y+1;return{x:F,y:z}}}else{let K=Math.min(..._.map((F)=>F.x)),J=Math.max(..._.map((F)=>F.x)),G=Math.min(..._.map((F)=>F.y)),j=Math.max(..._.map((F)=>F.y));if(Z==="TD"){let F=V.y+3;return{x:V.x+1,y:F}}else{let F=V.x+3,z=V.y+1;return{x:F,y:z}}}}function q9(Q,$){let Z=Q.config.graphDirection;$.junctionPoint=P9(Q,$);let V=$.junctionPoint;if($.type==="fan-in"){$.junctionDir=Z==="TD"?c:l,$.sharedNodeDir=Z==="TD"?u:p;let _=$.sharedNode.gridCoord,K=Z==="TD"?{x:_.x+1,y:_.y}:{x:_.x,y:_.y+1},J=mQ(Q.grid,V,K);$.sharedPath=J?vQ(J):[V,K];for(let G of $.edges){let j=G.from.gridCoord,F=Z==="TD"?{x:j.x+1,y:j.y+2}:{x:j.x+2,y:j.y+1},z=mQ(Q.grid,F,V);G.pathToJunction=z?vQ(z):[F,V],G.startDir=Z==="TD"?u:p,G.endDir=Z==="TD"?c:l,G.path=[...G.pathToJunction,...$.sharedPath.slice(1)]}}else{$.junctionDir=Z==="TD"?u:p,$.sharedNodeDir=Z==="TD"?c:l;let _=$.sharedNode.gridCoord,K=Z==="TD"?{x:_.x+1,y:_.y+2}:{x:_.x+2,y:_.y+1},J=mQ(Q.grid,K,V);$.sharedPath=J?vQ(J):[K,V];for(let G of $.edges){let j=G.to.gridCoord,F=Z==="TD"?{x:j.x+1,y:j.y}:{x:j.x,y:j.y+1},z=mQ(Q.grid,V,F);G.pathToJunction=z?vQ(z):[V,F],G.startDir=Z==="TD"?u:p,G.endDir=Z==="TD"?c:l,G.path=[...$.sharedPath,...G.pathToJunction.slice(1)]}}}function d4(Q){for(let $ of Q.bundles)q9(Q,$)}function VQ(Q){return Q.split(`
7`)}function K4(Q){let $=VQ(Q);return Math.max(...$.map((Z)=>Z.length),0)}function O4(Q){return VQ(Q).length}var n4={rectangle:{unicode:{tl:"┌",tr:"┐",bl:"└",br:"┘"},ascii:{tl:"+",tr:"+",bl:"+",br:"+"}},rounded:{unicode:{tl:"╭",tr:"╮",bl:"╰",br:"╯"},ascii:{tl:".",tr:".",bl:"'",br:"'"}},circle:{unicode:{tl:"◯",tr:"◯",bl:"◯",br:"◯"},ascii:{tl:"o",tr:"o",bl:"o",br:"o"}},doublecircle:{unicode:{tl:"◎",tr:"◎",bl:"◎",br:"◎"},ascii:{tl:"@",tr:"@",bl:"@",br:"@"}},diamond:{unicode:{tl:"◇",tr:"◇",bl:"◇",br:"◇"},ascii:{tl:"<",tr:">",bl:"<",br:">"}},hexagon:{unicode:{tl:"⌜",tr:"⌝",bl:"⌞",br:"⌟"},ascii:{tl:"*",tr:"*",bl:"*",br:"*"}},stadium:{unicode:{tl:"(",tr:")",bl:"(",br:")"},ascii:{tl:"(",tr:")",bl:"(",br:")"}},subroutine:{unicode:{tl:"╟",tr:"╢",bl:"╟",br:"╢"},ascii:{tl:"|",tr:"|",bl:"|",br:"|"}},cylinder:{unicode:{tl:"╭",tr:"╮",bl:"╰",br:"╯"},ascii:{tl:".",tr:".",bl:"'",br:"'"}},asymmetric:{unicode:{tl:"▷",tr:"┐",bl:"▷",br:"┘"},ascii:{tl:">",tr:"+",bl:">",br:"+"}},trapezoid:{unicode:{tl:"/",tr:"\\",bl:"└",br:"┘"},ascii:{tl:"/",tr:"\\",bl:"+",br:"+"}},"trapezoid-alt":{unicode:{tl:"┌",tr:"┐",bl:"\\",br:"/"},ascii:{tl:"+",tr:"+",bl:"\\",br:"/"}},"state-start":{unicode:{tl:"●",tr:"●",bl:"●",br:"●"},ascii:{tl:"*",tr:"*",bl:"*",br:"*"}},"state-end":{unicode:{tl:"◉",tr:"◉",bl:"◉",br:"◉"},ascii:{tl:"@",tr:"@",bl:"@",br:"@"}}};function PQ(Q,$){let Z=n4[Q]??n4.rectangle;return $?Z.ascii:Z.unicode}function YQ(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((z)=>z.length),0),_=Z.length,K=2*$.padding+V,J=K+2,G=_+2*$.padding,j=G%2===0?G+1:G,F=j+2;return{width:J,height:F,labelArea:{x:1+$.padding,y:1+$.padding,width:V,height:_},gridColumns:[1,K,1],gridRows:[1,j,1]}}function AQ(Q,$,Z,V){let{width:_,height:K}=$,J=_Q(_-1,K-1),G={x:0,y:0},j={x:_-1,y:K-1},F=V?"-":"─",z=V?"|":"│";for(let H=G.x+1;H<j.x;H++)J[H][G.y]=F,J[H][j.y]=F;for(let H=G.y+1;H<j.y;H++)J[G.x][H]=z,J[j.x][H]=z;J[G.x][G.y]=Z.tl,J[j.x][G.y]=Z.tr,J[G.x][j.y]=Z.bl,J[j.x][j.y]=Z.br;let U=VQ(Q),N=_-1,O=K-1,W=Math.floor(O/2)-Math.floor((U.length-1)/2);for(let H=0;H<U.length;H++){let A=U[H],b=Math.floor(N/2)-Math.ceil(A.length/2)+1;for(let M=0;M<A.length;M++){let g=b+M,D=W+H;if(g>=0&&g<J.length&&D>=0&&D<J[0].length)J[g][D]=A[M]}}return J}function BQ(Q,$,Z){let{width:V,height:_}=$,K=Z.x+Math.floor(V/2),J=Z.y+Math.floor(_/2);if(P(Q,c))return{x:K,y:Z.y};if(P(Q,u))return{x:K,y:Z.y+_-1};if(P(Q,l))return{x:Z.x,y:J};if(P(Q,p))return{x:Z.x+V-1,y:J};if(P(Q,IQ))return{x:Z.x,y:Z.y};if(P(Q,TQ))return{x:Z.x+V-1,y:Z.y};if(P(Q,kQ))return{x:Z.x,y:Z.y+_-1};if(P(Q,EQ))return{x:Z.x+V-1,y:Z.y+_-1};return{x:K,y:J}}var U4={getDimensions:YQ,render(Q,$,Z){let V=PQ("rectangle",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var s4={getDimensions:YQ,render(Q,$,Z){let V=PQ("diamond",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var i4={getDimensions:YQ,render(Q,$,Z){let V=PQ("circle",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var o4={getDimensions(Q,$){return{width:5,height:3,labelArea:{x:2,y:1,width:1,height:1},gridColumns:[1,3,1],gridRows:[1,1,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Math.floor(V/2);if(!Z.useAscii)K[0][0]="╭",K[1][0]="─",K[2][0]="─",K[3][0]="─",K[4][0]="╮",K[0][1]="│",K[J][1]="●",K[4][1]="│",K[0][2]="╰",K[1][2]="─",K[2][2]="─",K[3][2]="─",K[4][2]="╯";else K[0][0]=".",K[1][0]="-",K[2][0]="-",K[3][0]="-",K[4][0]=".",K[0][1]="|",K[J][1]="*",K[4][1]="|",K[0][2]="'",K[1][2]="-",K[2][2]="-",K[3][2]="-",K[4][2]="'";return K},getAttachmentPoint(Q,$,Z){let{width:V,height:_}=$,K=Z.x+Math.floor(V/2),J=Z.y+Math.floor(_/2);if(P(Q,c))return{x:K,y:Z.y};if(P(Q,u))return{x:K,y:Z.y+_-1};if(P(Q,l))return{x:Z.x,y:J};if(P(Q,p))return{x:Z.x+V-1,y:J};return{x:K,y:J}}},t4={getDimensions(Q,$){return{width:5,height:3,labelArea:{x:2,y:1,width:1,height:1},gridColumns:[1,3,1],gridRows:[1,1,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Math.floor(V/2);if(!Z.useAscii)K[0][0]="╔",K[1][0]="═",K[2][0]="═",K[3][0]="═",K[4][0]="╗",K[0][1]="║",K[J][1]="◎",K[4][1]="║",K[0][2]="╚",K[1][2]="═",K[2][2]="═",K[3][2]="═",K[4][2]="╝";else K[0][0]="#",K[1][0]="=",K[2][0]="=",K[3][0]="=",K[4][0]="#",K[0][1]="#",K[J][1]="*",K[4][1]="#",K[0][2]="#",K[1][2]="=",K[2][2]="=",K[3][2]="=",K[4][2]="#";return K},getAttachmentPoint(Q,$,Z){let{width:V,height:_}=$,K=Z.x+Math.floor(V/2),J=Z.y+Math.floor(_/2);if(P(Q,c))return{x:K,y:Z.y};if(P(Q,u))return{x:K,y:Z.y+_-1};if(P(Q,l))return{x:Z.x,y:J};if(P(Q,p))return{x:Z.x+V-1,y:J};return{x:K,y:J}}};var r4={getDimensions:YQ,render(Q,$,Z){let V=PQ("rounded",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var a4={getDimensions(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((F)=>F.length),0),_=Z.length,K=2*$.padding+V,J=K+4,G=_+2*$.padding,j=Math.max(G+2,3);return{width:J,height:j,labelArea:{x:2+$.padding,y:1+$.padding,width:V,height:_},gridColumns:[2,K,2],gridRows:[1,G,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Math.floor(_/2),G=Z.useAscii?"-":"─";if(_===3)K[0][J]="(",K[V-1][J]=")";else if(!Z.useAscii){K[0][0]="╭";for(let z=1;z<V-1;z++)K[z][0]=G;K[V-1][0]="╮";for(let z=1;z<_-1;z++)K[0][z]="│",K[V-1][z]="│";K[0][_-1]="╰";for(let z=1;z<V-1;z++)K[z][_-1]=G;K[V-1][_-1]="╯"}else{for(let z=0;z<_;z++)K[0][z]="(",K[V-1][z]=")";for(let z=1;z<V-1;z++)K[z][0]=G,K[z][_-1]=G}let j=VQ(Q),F=J-Math.floor((j.length-1)/2);for(let z=0;z<j.length;z++){let U=j[z],N=Math.floor(V/2)-Math.floor(U.length/2);for(let O=0;O<U.length;O++){let B=N+O,W=F+z;if(B>0&&B<V-1&&W>=0&&W<_)K[B][W]=U[O]}}return K},getAttachmentPoint:BQ};var e4={getDimensions:YQ,render(Q,$,Z){let V=PQ("hexagon",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var Q8={getDimensions(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((F)=>F.length),0),_=Z.length,K=2*$.padding+V,J=K+4,G=_+2*$.padding,j=G+2;return{width:J,height:j,labelArea:{x:2+$.padding,y:1+$.padding,width:V,height:_},gridColumns:[2,K,2],gridRows:[1,G,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Z.useAscii?"-":"─",G=Z.useAscii?"|":"│";K[0][0]=Z.useAscii?"+":"┌",K[1][0]=Z.useAscii?"+":"┬";for(let U=2;U<V-2;U++)K[U][0]=J;K[V-2][0]=Z.useAscii?"+":"┬",K[V-1][0]=Z.useAscii?"+":"┐";for(let U=1;U<_-1;U++)K[0][U]=G,K[1][U]=G,K[V-2][U]=G,K[V-1][U]=G;K[0][_-1]=Z.useAscii?"+":"└",K[1][_-1]=Z.useAscii?"+":"┴";for(let U=2;U<V-2;U++)K[U][_-1]=J;K[V-2][_-1]=Z.useAscii?"+":"┴",K[V-1][_-1]=Z.useAscii?"+":"┘";let j=VQ(Q),z=Math.floor(_/2)-Math.floor((j.length-1)/2);for(let U=0;U<j.length;U++){let N=j[U],O=Math.floor(V/2)-Math.floor(N.length/2);for(let B=0;B<N.length;B++){let W=O+B,H=z+U;if(W>1&&W<V-2&&H>0&&H<_-1)K[W][H]=N[B]}}return K},getAttachmentPoint:BQ},$8={getDimensions:YQ,render(Q,$,Z){let V=PQ("doublecircle",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ},Z8={getDimensions(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((F)=>F.length),0),_=Z.length,K=2*$.padding+V,J=K+2,G=_+2*$.padding+2,j=G+2;return{width:J,height:j,labelArea:{x:1+$.padding,y:2+$.padding,width:V,height:_},gridColumns:[1,K,1],gridRows:[2,G-2,2]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Z.useAscii?"-":"─",G=Z.useAscii?"|":"│";K[0][0]=Z.useAscii?".":"╭";for(let U=1;U<V-1;U++)K[U][0]=J;K[V-1][0]=Z.useAscii?".":"╮",K[0][1]=G;for(let U=1;U<V-1;U++)K[U][1]=J;K[V-1][1]=G;for(let U=2;U<_-2;U++)K[0][U]=G,K[V-1][U]=G;K[0][_-2]=G;for(let U=1;U<V-1;U++)K[U][_-2]=J;K[V-1][_-2]=G,K[0][_-1]=Z.useAscii?"'":"╰";for(let U=1;U<V-1;U++)K[U][_-1]=J;K[V-1][_-1]=Z.useAscii?"'":"╯";let j=VQ(Q),z=Math.floor(_/2)-Math.floor((j.length-1)/2);for(let U=0;U<j.length;U++){let N=j[U],O=Math.floor(V/2)-Math.floor(N.length/2);for(let B=0;B<N.length;B++){let W=O+B,H=z+U;if(W>0&&W<V-1&&H>1&&H<_-2)K[W][H]=N[B]}}return K},getAttachmentPoint:BQ},K8={getDimensions:YQ,render(Q,$,Z){let V=PQ("asymmetric",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ},J8={getDimensions:YQ,render(Q,$,Z){let V=PQ("trapezoid",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ},V8={getDimensions:YQ,render(Q,$,Z){let V=PQ("trapezoid-alt",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var H9=new Map([["rectangle",U4],["rounded",r4],["diamond",s4],["stadium",a4],["circle",i4],["subroutine",Q8],["doublecircle",$8],["hexagon",e4],["cylinder",Z8],["asymmetric",K8],["trapezoid",J8],["trapezoid-alt",V8],["state-start",o4],["state-end",t4]]);function _8(Q){return H9.get(Q)??U4}function G8(Q,$,Z){return _8(Q).getDimensions($,Z)}function j8(Q,$,Z,V){return _8(Q).getAttachmentPoint($,Z,V)}function I9(Q,$){return T9(Q,$)}function T9(Q,$){let Z=Q.gridCoord,V=$.config.useAscii,_=0;for(let M=0;M<2;M++)_+=$.columnWidth.get(Z.x+M)??0;let K=0;for(let M=0;M<2;M++)K+=$.rowHeight.get(Z.y+M)??0;let J={x:0,y:0},G={x:_,y:K},j=_Q(Math.max(J.x,G.x),Math.max(J.y,G.y)),F=PQ(Q.shape,V),z=Q.shape==="state-end",U=V?z?"=":"-":z?"═":"─",N=V?z?"‖":"|":z?"║":"│",B=z?V?{tl:"#",tr:"#",bl:"#",br:"#"}:{tl:"╔",tr:"╗",bl:"╚",br:"╝"}:F;for(let M=J.x+1;M<G.x;M++)j[M][J.y]=U;for(let M=J.x+1;M<G.x;M++)j[M][G.y]=U;for(let M=J.y+1;M<G.y;M++)j[J.x][M]=N;for(let M=J.y+1;M<G.y;M++)j[G.x][M]=N;j[J.x][J.y]=B.tl,j[G.x][J.y]=B.tr,j[J.x][G.y]=B.bl,j[G.x][G.y]=B.br;let W=Q.displayLabel,H=VQ(W),b=J.y+Math.floor(K/2)-Math.floor((H.length-1)/2);for(let M=0;M<H.length;M++){let g=H[M],D=J.x+Math.floor(_/2)-Math.ceil(g.length/2)+1;for(let i=0;i<g.length;i++)if(D+i>=0&&D+i<j.length&&b+M>=0&&b+M<j[0].length)j[D+i][b+M]=g[i]}return j}function z8(Q,$){return I9(Q,$)}function J4(Q,$,Z=1){let V=0;for(let M of Q)for(let g of M)V=Math.max(V,g.length);let K=V+2*Z+2,J=0;for(let M of Q)J+=Math.max(M.length,1);let G=Q.length-1,j=J+G+2,F=$?"-":"─",z=$?"|":"│",U=$?"+":"┌",N=$?"+":"┐",O=$?"+":"└",B=$?"+":"┘",W=$?"+":"├",H=$?"+":"┤",A=_Q(K-1,j-1);A[0][0]=U;for(let M=1;M<K-1;M++)A[M][0]=F;A[K-1][0]=N,A[0][j-1]=O;for(let M=1;M<K-1;M++)A[M][j-1]=F;A[K-1][j-1]=B;for(let M=1;M<j-1;M++)A[0][M]=z,A[K-1][M]=z;let b=1;for(let M=0;M<Q.length;M++){let g=Q[M],D=g.length>0?g:[""];for(let i of D){let UQ=1+Z;for(let x=0;x<i.length;x++)A[UQ+x][b]=i[x];b++}if(M<Q.length-1){A[0][b]=W;for(let i=1;i<K-1;i++)A[i][b]=F;A[K-1][b]=H,b++}}return A}var k9={solid:{h:{unicode:"─",ascii:"-"},v:{unicode:"│",ascii:"|"}},dotted:{h:{unicode:"┄",ascii:"."},v:{unicode:"┆",ascii:":"}},thick:{h:{unicode:"━",ascii:"="},v:{unicode:"┃",ascii:"‖"}}};function W4(Q,$,Z,V,_,K,J="solid"){let G=WQ($,Z),j=[],F=k9[J],z=K?F.h.ascii:F.h.unicode,U=K?F.v.ascii:F.v.unicode;if(P(G,c))for(let N=$.y-V;N>=Z.y-_;N--)j.push({x:$.x,y:N}),Q[$.x][N]=U;else if(P(G,u))for(let N=$.y+V;N<=Z.y+_;N++)j.push({x:$.x,y:N}),Q[$.x][N]=U;else if(P(G,l))for(let N=$.x-V;N>=Z.x-_;N--)j.push({x:N,y:$.y}),Q[N][$.y]=z;else if(P(G,p))for(let N=$.x+V;N<=Z.x+_;N++)j.push({x:N,y:$.y}),Q[N][$.y]=z;else if(P(G,IQ)){for(let N=$.x-V;N>=Z.x;N--)j.push({x:N,y:$.y}),Q[N][$.y]=z;for(let N=$.y-1;N>=Z.y-_;N--)j.push({x:Z.x,y:N}),Q[Z.x][N]=U}else if(P(G,TQ)){for(let N=$.x+V;N<=Z.x;N++)j.push({x:N,y:$.y}),Q[N][$.y]=z;for(let N=$.y-1;N>=Z.y-_;N--)j.push({x:Z.x,y:N}),Q[Z.x][N]=U}else if(P(G,kQ)){for(let N=$.x-V;N>=Z.x;N--)j.push({x:N,y:$.y}),Q[N][$.y]=z;for(let N=$.y+1;N<=Z.y+_;N++)j.push({x:Z.x,y:N}),Q[Z.x][N]=U}else if(P(G,EQ))if(Z.x-$.x<=1)for(let O=$.y+V;O<=Z.y+_;O++)j.push({x:$.x,y:O}),Q[$.x][O]=U;else{for(let O=$.x+V;O<=Z.x;O++)j.push({x:O,y:$.y}),Q[O][$.y]=z;for(let O=$.y+1;O<=Z.y+_;O++)j.push({x:Z.x,y:O}),Q[Z.x][O]=U}return j}function Y9(Q,$){if($.path.length===0){let z=OQ(Q.canvas);return[z,z,z,z,z,z]}let Z=R9(Q,$),[V,_,K]=M9(Q,$.path,$.style),J=X9(Q,$.path,_[0],$.from.shape),G;if($.hasArrowEnd)G=F8(Q,_[_.length-1],K[K.length-1]);else G=OQ(Q.canvas);let j;if($.hasArrowStart&&_.length>0){let U=_[0][0],N=A9(K[0]),O={x:U.x,y:U.y};if(P(K[0],p))O.x=U.x-1;else if(P(K[0],l))O.x=U.x+1;else if(P(K[0],u))O.y=U.y-1;else if(P(K[0],c))O.y=U.y+1;j=F8(Q,[U,O],N)}else j=OQ(Q.canvas);let F=E9(Q,$.path);return[V,J,G,j,F,Z]}function A9(Q){if(P(Q,c))return u;if(P(Q,u))return c;if(P(Q,l))return p;if(P(Q,p))return l;if(P(Q,IQ))return EQ;if(P(Q,TQ))return kQ;if(P(Q,kQ))return TQ;if(P(Q,EQ))return IQ;return SQ}function M9(Q,$,Z="solid"){let V=OQ(Q.canvas),_=$[0],K=[],J=[];for(let G=1;G<$.length;G++){let j=$[G],F=LQ(Q,_),z=LQ(Q,j);if(rQ(F,z)){_=j;continue}let U=WQ(_,j),N=W4(V,F,z,1,-1,Q.config.useAscii,Z);if(N.length===0)N.push(F);K.push(N),J.push(U),_=j}return[V,K,J]}function X9(Q,$,Z,V){let _=OQ(Q.canvas);if(Q.config.useAscii)return _;if(V==="state-start"||V==="state-end")return _;let K=Z[0],J=WQ($[0],$[1]);if(P(J,c))_[K.x][K.y+1]="┴";else if(P(J,u))_[K.x][K.y-1]="┬";else if(P(J,l))_[K.x+1][K.y]="┤";else if(P(J,p))_[K.x-1][K.y]="├";return _}function F8(Q,$,Z){let V=OQ(Q.canvas);if($.length===0)return V;let _=$[0],K=$[$.length-1],J=WQ(_,K);if($.length===1||P(J,SQ))J=Z;let G;if(!Q.config.useAscii)if(P(J,c))G="▲";else if(P(J,u))G="▼";else if(P(J,l))G="◄";else if(P(J,p))G="►";else if(P(J,TQ))G="◥";else if(P(J,IQ))G="◤";else if(P(J,EQ))G="◢";else if(P(J,kQ))G="◣";else if(P(Z,c))G="▲";else if(P(Z,u))G="▼";else if(P(Z,l))G="◄";else if(P(Z,p))G="►";else if(P(Z,TQ))G="◥";else if(P(Z,IQ))G="◤";else if(P(Z,EQ))G="◢";else if(P(Z,kQ))G="◣";else G="●";else if(P(J,c))G="^";else if(P(J,u))G="v";else if(P(J,l))G="<";else if(P(J,p))G=">";else if(P(Z,c))G="^";else if(P(Z,u))G="v";else if(P(Z,l))G="<";else if(P(Z,p))G=">";else G="*";return V[K.x][K.y]=G,V}function E9(Q,$){let Z=OQ(Q.canvas);for(let V=1;V<$.length-1;V++){let _=$[V],K=LQ(Q,_),J=WQ($[V-1],_),G=WQ(_,$[V+1]),j;if(!Q.config.useAscii)if(P(J,p)&&P(G,u)||P(J,c)&&P(G,l))j="┐";else if(P(J,p)&&P(G,c)||P(J,u)&&P(G,l))j="┘";else if(P(J,l)&&P(G,u)||P(J,c)&&P(G,p))j="┌";else if(P(J,l)&&P(G,c)||P(J,u)&&P(G,p))j="└";else j="+";else j="+";Z[K.x][K.y]=j}return Z}function R9(Q,$){let Z=OQ(Q.canvas);if($.text.length===0)return Z;let V=O8(Q,$.labelLine),_;if($.path.length>=2){let K=$.path[0].y,J=$.path[$.path.length-1].y;if(J<K)_=!0;else if(J>K)_=!1}return D9(Z,V,$.text,_),Z}function D9(Q,$,Z,V){if($.length<2)return;let _=Math.min($[0].x,$[1].x),K=Math.max($[0].x,$[1].x),J=Math.min($[0].y,$[1].y),G=Math.max($[0].y,$[1].y),j=_+Math.floor((K-_)/2),F=J+Math.floor((G-J)/2);if(V!==void 0&&_===K){let N=G-J,O=Math.max(1,Math.floor(N/4));if(V)F=F+O;else F=F-O}let z=VQ(Z),U=F-Math.floor((z.length-1)/2);for(let N=0;N<z.length;N++){let O=z[N],B=j-Math.floor(O.length/2);z4(Q,{x:B,y:U+N},O)}}function cQ(Q,$,Z){let V=$.gridCoord,_=0;for(let j=0;j<2;j++)_+=Q.columnWidth.get(V.x+j)??0;let K=0;for(let j=0;j<2;j++)K+=Q.rowHeight.get(V.y+j)??0;let J={width:_+1,height:K+1,labelArea:{x:0,y:0,width:0,height:0},gridColumns:[0,0,0],gridRows:[0,0,0]},G=$.drawingCoord;return j8($.shape,Z,J,G)}function L9(Q,$,Z){let V=OQ(Q.canvas);if(!$.pathToJunction||$.pathToJunction.length===0)return[V,V,V,V,V,V];let _=OQ(Q.canvas),K=Q.config.useAscii,J=$.pathToJunction.map((z,U)=>{if(Z.type==="fan-in"&&U===0)return cQ(Q,$.from,$.startDir);if(Z.type==="fan-out"&&U===$.pathToJunction.length-1)return cQ(Q,$.to,$.endDir);return LQ(Q,z)});for(let z=1;z<J.length;z++){let U=J[z-1],N=J[z];if(!rQ(U,N))W4(_,U,N,1,-1,K,$.style)}let G=OQ(Q.canvas);for(let z=1;z<$.pathToJunction.length-1;z++){let U=$.pathToJunction[z],N=LQ(Q,U),O=WQ($.pathToJunction[z-1],U),B=WQ(U,$.pathToJunction[z+1]),W;if(!K)if(P(O,p)&&P(B,u)||P(O,c)&&P(B,l))W="┐";else if(P(O,p)&&P(B,c)||P(O,u)&&P(B,l))W="┘";else if(P(O,l)&&P(B,u)||P(O,c)&&P(B,p))W="┌";else if(P(O,l)&&P(B,c)||P(O,u)&&P(B,p))W="└";else W="+";else W="+";G[N.x][N.y]=W}let j=OQ(Q.canvas);if(Z.type==="fan-in"&&$.pathToJunction.length>=2){let z=J[0],U=WQ($.pathToJunction[0],$.pathToJunction[1]);if(!K){if(P(U,c))j[z.x][z.y]="┴";else if(P(U,u))j[z.x][z.y]="┬";else if(P(U,l))j[z.x][z.y]="┤";else if(P(U,p))j[z.x][z.y]="├"}}let F=OQ(Q.canvas);return[_,j,V,V,G,F]}function S9(Q,$){let Z=OQ(Q.canvas),V=OQ(Q.canvas);if($.sharedPath.length<2)return[Z,V];let _=Q.config.useAscii,K=$.edges[0]?.style??"solid",J=Q.config.graphDirection,G=$.sharedPath.map((j,F)=>{if($.type==="fan-in"&&F===$.sharedPath.length-1){let z=J==="TD"?c:l;return cQ(Q,$.sharedNode,z)}if($.type==="fan-out"&&F===0){let z=J==="TD"?u:p;return cQ(Q,$.sharedNode,z)}return LQ(Q,j)});for(let j=1;j<G.length;j++){let F=G[j-1],z=G[j];if(!rQ(F,z))W4(Z,F,z,1,-1,_,K)}for(let j=1;j<$.sharedPath.length-1;j++){let F=$.sharedPath[j],z=LQ(Q,F),U=WQ($.sharedPath[j-1],F),N=WQ(F,$.sharedPath[j+1]),O;if(!_)if(P(U,p)&&P(N,u)||P(U,c)&&P(N,l))O="┐";else if(P(U,p)&&P(N,c)||P(U,u)&&P(N,l))O="┘";else if(P(U,l)&&P(N,u)||P(U,c)&&P(N,p))O="┌";else if(P(U,l)&&P(N,c)||P(U,u)&&P(N,p))O="└";else O="+";else O="+";V[z.x][z.y]=O}return[Z,V]}function w9(Q,$){let Z=OQ(Q.canvas);if($.sharedPath.length<2)return Z;let V=$.sharedPath.length-1,_=$.sharedPath[V-1],K=$.sharedPath[V],J=WQ(_,K),G=Q.config.graphDirection,j=G==="TD"?c:l,F=cQ(Q,$.sharedNode,j);if(G==="TD")F.y-=1;else F.x-=1;let z;if(!Q.config.useAscii)if(P(J,c))z="▲";else if(P(J,u))z="▼";else if(P(J,l))z="◄";else if(P(J,p))z="►";else z="▼";else if(P(J,c))z="^";else if(P(J,u))z="v";else if(P(J,l))z="<";else if(P(J,p))z=">";else z="v";return Z[F.x][F.y]=z,Z}function y9(Q,$){let Z=OQ(Q.canvas);if(!$.pathToJunction||$.pathToJunction.length<2)return Z;let V=$.pathToJunction.length-1,_=$.pathToJunction[V-1],K=$.pathToJunction[V],J=WQ(_,K),G=Q.config.graphDirection,j=G==="TD"?c:l,F=cQ(Q,$.to,j);if(G==="TD")F.y-=1;else F.x-=1;let z;if(!Q.config.useAscii)if(P(J,c))z="▲";else if(P(J,u))z="▼";else if(P(J,l))z="◄";else if(P(J,p))z="►";else z="▼";else if(P(J,c))z="^";else if(P(J,u))z="v";else if(P(J,l))z="<";else if(P(J,p))z=">";else z="v";return Z[F.x][F.y]=z,Z}function v9(Q,$){let Z=OQ(Q.canvas);if(!$.junctionPoint)return Z;let V=LQ(Q,$.junctionPoint),_=Q.config.useAscii,K=!1,J=!1,G=!1,j=!1;if($.sharedPath.length>=2){let z=$.type==="fan-in"?0:$.sharedPath.length-1,U=$.type==="fan-in"?1:$.sharedPath.length-2,N=WQ($.sharedPath[z],$.sharedPath[U]);if(P(N,u))J=!0;else if(P(N,c))K=!0;else if(P(N,p))j=!0;else if(P(N,l))G=!0}for(let z of $.edges)if(z.pathToJunction&&z.pathToJunction.length>=2){let U=$.type==="fan-in"?z.pathToJunction.length-1:0,N=$.type==="fan-in"?z.pathToJunction.length-2:1,O=WQ(z.pathToJunction[N],z.pathToJunction[U]);if(P(O,u))K=!0;else if(P(O,c))J=!0;else if(P(O,p))G=!0;else if(P(O,l))j=!0}let F;if(!_)if(K&&J&&G&&j)F="┼";else if(J&&G&&j&&!K)F="┬";else if(K&&G&&j&&!J)F="┴";else if(K&&J&&j&&!G)F="├";else if(K&&J&&G&&!j)F="┤";else if(G&&j)F="─";else if(K&&J)F="│";else if(J&&j)F="┌";else if(J&&G)F="┐";else if(K&&j)F="└";else if(K&&G)F="┘";else F="┼";else F="+";return Z[V.x][V.y]=F,Z}function C9(Q,$){let Z=Q.maxX-Q.minX,V=Q.maxY-Q.minY;if(Z<=0||V<=0)return _Q(0,0);let _={x:0,y:0},K={x:Z,y:V},J=_Q(Z,V);if(!$.config.useAscii){for(let G=_.x+1;G<K.x;G++)J[G][_.y]="─";for(let G=_.x+1;G<K.x;G++)J[G][K.y]="─";for(let G=_.y+1;G<K.y;G++)J[_.x][G]="│";for(let G=_.y+1;G<K.y;G++)J[K.x][G]="│";J[_.x][_.y]="┌",J[K.x][_.y]="┐",J[_.x][K.y]="└",J[K.x][K.y]="┘"}else{for(let G=_.x+1;G<K.x;G++)J[G][_.y]="-";for(let G=_.x+1;G<K.x;G++)J[G][K.y]="-";for(let G=_.y+1;G<K.y;G++)J[_.x][G]="|";for(let G=_.y+1;G<K.y;G++)J[K.x][G]="|";J[_.x][_.y]="+",J[K.x][_.y]="+",J[_.x][K.y]="+",J[K.x][K.y]="+"}return J}function f9(Q,$){let Z=Q.maxX-Q.minX,V=Q.maxY-Q.minY;if(Z<=0||V<=0)return[_Q(0,0),{x:0,y:0}];let _=_Q(Z,V),K=VQ(Q.name);for(let J=0;J<K.length;J++){let G=K[J],j=1+J,F=Math.floor(Z/2)-Math.floor(G.length/2);if(F<1)F=1;for(let z=0;z<G.length;z++)if(F+z<Z&&j<V)_[F+z][j]=G[z]}return[_,{x:Q.minX,y:Q.minY}]}function b9(Q){function $(V){return V.parent===null?0:1+$(V.parent)}let Z=[...Q];return Z.sort((V,_)=>$(V)-$(_)),Z}function B4(Q,$,Z,V){for(let _=0;_<$.length;_++)for(let K=0;K<($[0]?.length??0);K++){let J=$[_]?.[K];if(J&&J!==" "){let G=_+Z.x,j=K+Z.y;if(G>=0&&j>=0)fQ(Q,G,j,V)}}}function gQ(Q,$,Z,V){for(let _ of $)B4(Q,_,Z,V)}function u9(Q,$,Z){let V=(_)=>/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|.':]$/.test(_);for(let _=0;_<$.length;_++)for(let K=0;K<($[0]?.length??0);K++){let J=$[_]?.[K];if(J&&J!==" "){let G=_+Z.x,j=K+Z.y;if(G>=0&&j>=0)fQ(Q,G,j,V(J)?"border":"text")}}}function N8(Q){let $=Q.config.useAscii,Z={x:0,y:0},V=b9(Q.subgraphs);for(let N of V){let O=C9(N,Q),B={x:N.minX,y:N.minY};Q.canvas=DQ(Q.canvas,B,$,O),B4(Q.roleCanvas,O,B,"border")}for(let N of Q.nodes)if(!N.drawn&&N.drawingCoord&&N.drawing)Q.canvas=DQ(Q.canvas,N.drawingCoord,$,N.drawing),u9(Q.roleCanvas,N.drawing,N.drawingCoord),N.drawn=!0;let _=[],K=[],J=[],G=[],j=[],F=[],z=[],U=new Set;for(let N of Q.edges)if(N.bundle&&N.pathToJunction){let O=N.bundle,[B,W,,,H,A]=L9(Q,N,O);if(_.push(B),K.push(H),j.push(W),F.push(A),!U.has(O)){U.add(O);let[b,M]=S9(Q,O);if(_.push(b),K.push(M),O.type==="fan-in"){let D=w9(Q,O);J.push(D)}let g=v9(Q,O);z.push(g)}if(O.type==="fan-out"&&N.hasArrowEnd){let b=y9(Q,N);J.push(b)}}else{let[O,B,W,H,A,b]=Y9(Q,N);_.push(O),K.push(A),J.push(W),G.push(H),j.push(B),F.push(b)}Q.canvas=DQ(Q.canvas,Z,$,..._),gQ(Q.roleCanvas,_,Z,"line"),Q.canvas=DQ(Q.canvas,Z,$,...K),gQ(Q.roleCanvas,K,Z,"corner"),Q.canvas=DQ(Q.canvas,Z,$,...z),gQ(Q.roleCanvas,z,Z,"junction"),Q.canvas=DQ(Q.canvas,Z,$,...J),gQ(Q.roleCanvas,J,Z,"arrow"),Q.canvas=DQ(Q.canvas,Z,$,...j),gQ(Q.roleCanvas,j,Z,"junction"),Q.canvas=DQ(Q.canvas,Z,$,...G),gQ(Q.roleCanvas,G,Z,"arrow"),Q.canvas=DQ(Q.canvas,Z,$,...F),gQ(Q.roleCanvas,F,Z,"text");for(let N of Q.subgraphs){if(N.nodes.length===0)continue;let[O,B]=f9(N,Q);Q.canvas=DQ(Q.canvas,B,$,O),B4(Q.roleCanvas,O,B,"text")}return Q.canvas}function LQ(Q,$,Z){let V=Z?{x:$.x+Z.x,y:$.y+Z.y}:$,_=0;for(let j=0;j<V.x;j++)_+=Q.columnWidth.get(j)??0;let K=0;for(let j=0;j<V.y;j++)K+=Q.rowHeight.get(j)??0;let J=Q.columnWidth.get(V.x)??0,G=Q.rowHeight.get(V.y)??0;return{x:_+Math.floor(J/2)+Q.offsetX,y:K+Math.floor(G/2)+Q.offsetY}}function O8(Q,$){return $.map((Z)=>LQ(Q,Z))}function iQ(Q,$,Z,V){let _=V??p9(Q,$);if(Q.grid.has(wQ(Z)))if(_==="LR")return iQ(Q,$,{x:Z.x,y:Z.y+4},_);else return iQ(Q,$,{x:Z.x+4,y:Z.y},_);for(let K=0;K<3;K++)for(let J=0;J<3;J++){let G={x:Z.x+K,y:Z.y+J};Q.grid.set(wQ(G),$)}return $.gridCoord=Z,Z}function x9(Q,$){let Z=$.gridCoord,V=Q.config.boxBorderPadding,_=G8($.shape,$.displayLabel,{useAscii:Q.config.useAscii,padding:V}),K=_.gridColumns,J=_.gridRows;for(let G=0;G<K.length;G++){let j=Z.x+G,F=Q.columnWidth.get(j)??0;Q.columnWidth.set(j,Math.max(F,K[G]))}for(let G=0;G<J.length;G++){let j=Z.y+G,F=Q.rowHeight.get(j)??0;Q.rowHeight.set(j,Math.max(F,J[G]))}if(Z.x>0){let G=Q.columnWidth.get(Z.x-1)??0;Q.columnWidth.set(Z.x-1,Math.max(G,Q.config.paddingX))}if(Z.y>0){let G=Q.config.paddingY;if(g9(Q,$))G+=4;let j=Q.rowHeight.get(Z.y-1)??0;Q.rowHeight.set(Z.y-1,Math.max(j,G))}}function U8(Q,$){for(let Z of $){if(!Q.columnWidth.has(Z.x))Q.columnWidth.set(Z.x,Math.floor(Q.config.paddingX/2));if(!Q.rowHeight.has(Z.y))Q.rowHeight.set(Z.y,Math.floor(Q.config.paddingY/2))}}function P4(Q,$){return Q.subgraphs.some((Z)=>Z.nodes.includes($))}function HQ(Q,$){let Z=null;for(let V of Q.subgraphs)if(V.nodes.includes($)){if(!Z||m9(Z,V))Z=V}return Z}function m9(Q,$){let Z=$;while(Z!==null){if(Z===Q)return!0;Z=Z.parent}return!1}function p9(Q,$){let Z=HQ(Q,$);if(Z?.direction)return Z.direction;return Q.config.graphDirection}function g9(Q,$){let Z=HQ(Q,$);if(!Z)return!1;let V=!1;for(let _ of Q.edges)if(_.to===$){if(HQ(Q,_.from)!==Z){V=!0;break}}if(!V)return!1;for(let _ of Z.nodes){if(_===$||!_.gridCoord)continue;let K=!1;for(let J of Q.edges)if(J.to===_){if(HQ(Q,J.from)!==Z){K=!0;break}}if(K&&_.gridCoord.y<$.gridCoord.y)return!1}return!0}function B8(Q,$){if($.nodes.length===0)return;let Z=1e6,V=1e6,_=-1e6,K=-1e6;for(let j of $.children)if(B8(Q,j),j.nodes.length>0)Z=Math.min(Z,j.minX),V=Math.min(V,j.minY),_=Math.max(_,j.maxX),K=Math.max(K,j.maxY);for(let j of $.nodes){if(!j.drawingCoord||!j.drawing)continue;let F=j.drawingCoord.x,z=j.drawingCoord.y,U=F+j.drawing.length-1,N=z+j.drawing[0].length-1;Z=Math.min(Z,F),V=Math.min(V,z),_=Math.max(_,U),K=Math.max(K,N)}let J=2,G=2;$.minX=Z-J,$.minY=V-J-G,$.maxX=_+J,$.maxY=K+J}function h9(Q){let Z=Q.subgraphs.filter((V)=>V.parent===null&&V.nodes.length>0);for(let V=0;V<Z.length;V++)for(let _=V+1;_<Z.length;_++){let K=Z[V],J=Z[_];if(K.minX<J.maxX&&K.maxX>J.minX){if(K.maxY>=J.minY-1&&K.minY<J.minY)J.minY=K.maxY+1+1;else if(J.maxY>=K.minY-1&&J.minY<K.minY)K.minY=J.maxY+1+1}if(K.minY<J.maxY&&K.maxY>J.minY){if(K.maxX>=J.minX-1&&K.minX<J.minX)J.minX=K.maxX+1+1;else if(J.maxX>=K.minX-1&&J.minX<K.minX)K.minX=J.maxX+1+1}}}function c9(Q){for(let $ of Q.subgraphs)B8(Q,$);h9(Q)}function l9(Q){if(Q.subgraphs.length===0)return;let $=0,Z=0;for(let K of Q.subgraphs)$=Math.min($,K.minX),Z=Math.min(Z,K.minY);let V=-$,_=-Z;if(V===0&&_===0)return;Q.offsetX=V,Q.offsetY=_;for(let K of Q.subgraphs)K.minX+=V,K.minY+=_,K.maxX+=V,K.maxY+=_;for(let K of Q.nodes)if(K.drawingCoord)K.drawingCoord.x+=V,K.drawingCoord.y+=_}function W8(Q){let $=Q.config.graphDirection,Z=new Array(100).fill(0),V=new Set,_=[];for(let N of Q.nodes){if(!V.has(N.name))_.push(N);V.add(N.name);for(let O of q4(Q,N))V.add(O.name)}let K=_.filter((N)=>{let O=HQ(Q,N);if(!O)return!0;for(let B of Q.edges)if(B.to===N){if(HQ(Q,B.from)!==O)return!1}return!0}),J=!1,G=!1;for(let N of K)if(P4(Q,N)){if(q4(Q,N).length>0)G=!0}else J=!0;let j=$==="LR"&&J&&G,F,z=[];if(j)F=K.filter((N)=>!P4(Q,N)),z=K.filter((N)=>P4(Q,N));else F=K;for(let N of F){let O=$==="LR"?{x:0,y:Z[0]}:{x:Z[0],y:0};iQ(Q,Q.nodes[N.index],O),Z[0]=Z[0]+4}if(j&&z.length>0)for(let O of z){let B=$==="LR"?{x:4,y:Z[4]}:{x:Z[4],y:4};iQ(Q,Q.nodes[O.index],B),Z[4]=Z[4]+4}let U=F.length+z.length;while(U<Q.nodes.length){let N=U;for(let O of Q.nodes){if(O.gridCoord===null)continue;let B=O.gridCoord;for(let W of q4(Q,O)){if(W.gridCoord!==null)continue;let H=HQ(Q,O),A=HQ(Q,W),b=H&&H===A&&H.direction?H.direction:Q.config.graphDirection,M=b==="LR"?B.x+4:B.y+4,g;if(b!==Q.config.graphDirection)g=b==="LR"?B.y:B.x;else g=Z[M];let D=b==="LR"?{x:M,y:g}:{x:g,y:M};if(iQ(Q,Q.nodes[W.index],D,b),b===Q.config.graphDirection)Z[M]=g+4;U++}}if(U===N)break}for(let N of Q.nodes)x9(Q,N);Q.bundles=l4(Q),d4(Q);for(let N of Q.edges){if(N.bundle&&N.path.length>0){U8(Q,N.path),N4(Q,N);continue}h4(Q,N),U8(Q,N.path),N4(Q,N)}for(let N of Q.nodes)N.drawingCoord=LQ(Q,N.gridCoord),N.drawing=z8(N,Q);u4(Q.canvas,Q.columnWidth,Q.rowHeight),x4(Q.roleCanvas,Q.columnWidth,Q.rowHeight),c9(Q),l9(Q)}function d9(Q,$){return Q.edges.filter((Z)=>Z.from.name===$.name)}function q4(Q,$){return d9(Q,$).map((Z)=>Z.to)}function P8(Q){let $={actors:[],messages:[],blocks:[],notes:[]},Z=new Set,V=[];for(let _=1;_<Q.length;_++){let K=Q[_],J=K.match(/^(participant|actor)\s+(\S+?)(?:\s+as\s+(.+))?$/);if(J){let N=J[1],O=J[2],B=J[3]?.trim()??O,W=FQ(B);if(!Z.has(O))Z.add(O),$.actors.push({id:O,label:W,type:N});continue}let G=K.match(/^Note\s+(left of|right of|over)\s+([^:]+):\s*(.+)$/i);if(G){let N=G[1].toLowerCase(),O=G[2].trim(),B=FQ(G[3].trim()),W=O.split(",").map((A)=>A.trim());for(let A of W)oQ($,Z,A);let H="over";if(N==="left of")H="left";else if(N==="right of")H="right";$.notes.push({actorIds:W,text:B,position:H,afterIndex:$.messages.length-1});continue}let j=K.match(/^(loop|alt|opt|par|critical|break|rect)\s*(.*)$/);if(j){let N=j[1],O=j[2]?.trim()??"",B=FQ(O);V.push({type:N,label:B,startIndex:$.messages.length,dividers:[]});continue}let F=K.match(/^(else|and)\s*(.*)$/);if(F&&V.length>0){let N=F[2]?.trim()??"",O=FQ(N);V[V.length-1].dividers.push({index:$.messages.length,label:O});continue}if(K==="end"&&V.length>0){let N=V.pop();$.blocks.push({type:N.type,label:N.label,startIndex:N.startIndex,endIndex:Math.max($.messages.length-1,N.startIndex),dividers:N.dividers});continue}let z=K.match(/^(\S+?)\s*(--?>?>|--?[)x]|--?>>|--?>)\s*([+-]?)(\S+?)\s*:\s*(.+)$/);if(z){let N=z[1],O=z[2],B=z[3],W=z[4],H=FQ(z[5].trim());oQ($,Z,N),oQ($,Z,W);let A=O.startsWith("--")?"dashed":"solid",b=O.includes(">>")||O.includes("x")?"filled":"open",M={from:N,to:W,label:H,lineStyle:A,arrowHead:b};if(B==="+")M.activate=!0;if(B==="-")M.deactivate=!0;$.messages.push(M);continue}let U=K.match(/^(\S+?)\s*(->>|-->>|-\)|--\)|-x|--x|->|-->)\s*([+-]?)(\S+?)\s*:\s*(.+)$/);if(U){let N=U[1],O=U[2],B=U[3],W=U[4],H=FQ(U[5].trim());oQ($,Z,N),oQ($,Z,W);let A=O.startsWith("--")?"dashed":"solid",b=O.includes(">>")||O.includes("x")?"filled":"open",M={from:N,to:W,label:H,lineStyle:A,arrowHead:b};if(B==="+")M.activate=!0;if(B==="-")M.deactivate=!0;$.messages.push(M);continue}}return $}function oQ(Q,$,Z){if(!$.has(Z))$.add(Z),Q.actors.push({id:Z,label:Z,type:"participant"})}function q8(Q,$,Z,V){let _=Q.split(`
8`).map((q)=>q.trim()).filter((q)=>q.length>0&&!q.startsWith("%%")),K=P8(_);if(K.actors.length===0)return"";let J=$.useAscii,G=J?"-":"─",j=J?"|":"│",F=J?"+":"┌",z=J?"+":"┐",U=J?"+":"└",N=J?"+":"┘",O=J?"+":"┬",B=J?"+":"┴",W=J?"+":"├",H=J?"+":"┤",A=new Map;K.actors.forEach((q,T)=>A.set(q.id,T));let b=1,g=K.actors.map((q)=>K4(q.label)+2*b+2).map((q)=>Math.ceil(q/2)),D=K.actors.map((q)=>O4(q.label)+2),i=Math.max(...D,3),UQ=new Array(Math.max(K.actors.length-1,0)).fill(0);for(let q of K.messages){let T=A.get(q.from),S=A.get(q.to);if(T===S)continue;let L=Math.min(T,S),f=Math.max(T,S),E=K4(q.label)+4,s=f-L,v=Math.ceil(E/s);for(let X=L;X<f;X++)UQ[X]=Math.max(UQ[X],v)}let x=[g[0]];for(let q=1;q<K.actors.length;q++){let T=Math.max(g[q-1]+g[q]+2,UQ[q-1]+2,10);x[q]=x[q-1]+T}let ZQ=[],y=[],t=new Map,I=new Map,a=new Map,o=[],r=i;for(let q=0;q<K.messages.length;q++){for(let f=0;f<K.blocks.length;f++)if(K.blocks[f].startIndex===q)r+=2,t.set(f,r-1);for(let f=0;f<K.blocks.length;f++)for(let E=0;E<K.blocks[f].dividers.length;E++)if(K.blocks[f].dividers[E].index===q)r+=1,a.set(`${f}:${E}`,r),r+=1;r+=1;let T=K.messages[q],S=T.from===T.to,L=O4(T.label);if(S)y[q]=r+1,ZQ[q]=r,r+=2+L;else y[q]=r,ZQ[q]=r+L,r+=L+1;for(let f=0;f<K.notes.length;f++)if(K.notes[f].afterIndex===q){r+=1;let E=K.notes[f],s=VQ(E.text),v=Math.max(...s.map((h)=>h.length))+4,X=s.length+2,n=A.get(E.actorIds[0])??0,R;if(E.position==="left")R=x[n]-v-1;else if(E.position==="right")R=x[n]+2;else if(E.actorIds.length>=2){let h=A.get(E.actorIds[1])??n;R=Math.floor((x[n]+x[h])/2)-Math.floor(v/2)}else R=x[n]-Math.floor(v/2);R=Math.max(0,R),o.push({x:R,y:r,width:v,height:X,lines:s}),r+=X}for(let f=0;f<K.blocks.length;f++)if(K.blocks[f].endIndex===q)r+=1,I.set(f,r),r+=1}r+=1;let w=r,e=w+i,GQ=x[x.length-1]??0,jQ=g[g.length-1]??0,k=GQ+jQ+2;for(let q=0;q<K.messages.length;q++){let T=K.messages[q];if(T.from===T.to){let S=A.get(T.from),L=x[S]+6+2+T.label.length;k=Math.max(k,L+1)}}for(let q of o)k=Math.max(k,q.x+q.width+1);let m=_Q(k,e-1),C=CQ(k,e-1);function Y(q,T,S,L){if(q>=0&&q<m.length&&T>=0&&T<(m[0]?.length??0))m[q][T]=S,fQ(C,q,T,L)}function d(q,T,S){let L=VQ(S),f=K4(S),E=f+2*b+2,s=L.length+2,v=q-Math.floor(E/2);Y(v,T,F,"border");for(let n=1;n<E-1;n++)Y(v+n,T,G,"border");Y(v+E-1,T,z,"border");for(let n=0;n<L.length;n++){let R=T+1+n;Y(v,R,j,"border"),Y(v+E-1,R,j,"border");let h=L[n],JQ=v+1+b+Math.floor((f-h.length)/2);for(let $Q=0;$Q<h.length;$Q++)Y(JQ+$Q,R,h[$Q],"text")}let X=T+s-1;Y(v,X,U,"border");for(let n=1;n<E-1;n++)Y(v+n,X,G,"border");Y(v+E-1,X,N,"border")}for(let q=0;q<K.actors.length;q++){let T=x[q];for(let S=i;S<=w;S++)Y(T,S,j,"line")}for(let q=0;q<K.actors.length;q++){let T=K.actors[q];if(d(x[q],0,T.label),d(x[q],w,T.label),!J)Y(x[q],i-1,O,"junction"),Y(x[q],w,B,"junction")}for(let q=0;q<K.messages.length;q++){let T=K.messages[q],S=A.get(T.from),L=A.get(T.to),f=x[S],E=x[L],s=S===L,v=T.lineStyle==="dashed",X=T.arrowHead==="filled",n=v?J?".":"╌":G;if(s){let R=ZQ[q],h=Math.max(4,4);Y(f,R,W,"junction");for(let KQ=f+1;KQ<f+h;KQ++)Y(KQ,R,n,"line");Y(f+h,R,J?"+":"┐","corner"),Y(f+h,R+1,j,"line");let JQ=f+h+2;for(let KQ=0;KQ<T.label.length;KQ++)if(JQ+KQ<k)Y(JQ+KQ,R+1,T.label[KQ],"text");let $Q=X?J?"<":"◀":J?"<":"◁";Y(f,R+2,$Q,"arrow");for(let KQ=f+1;KQ<f+h;KQ++)Y(KQ,R+2,n,"line");Y(f+h,R+2,J?"+":"┘","corner")}else{let R=y[q],h=ZQ[q],JQ=f<E,$Q=Math.floor((f+E)/2),KQ=VQ(T.label);for(let zQ=0;zQ<KQ.length;zQ++){let NQ=KQ[zQ],MQ=$Q-Math.floor(NQ.length/2),uQ=R+zQ;for(let XQ=0;XQ<NQ.length;XQ++){let hQ=MQ+XQ;if(hQ>=0&&hQ<k)Y(hQ,uQ,NQ[XQ],"text")}}if(JQ){for(let NQ=f+1;NQ<E;NQ++)Y(NQ,h,n,"line");Y(E,h,X?J?">":"▶":J?">":"▷","arrow")}else{for(let NQ=E+1;NQ<f;NQ++)Y(NQ,h,n,"line");Y(E,h,X?J?"<":"◀":J?"<":"◁","arrow")}}}for(let q=0;q<K.blocks.length;q++){let T=K.blocks[q],S=t.get(q),L=I.get(q);if(S===void 0||L===void 0)continue;let f=k,E=0;for(let R=T.startIndex;R<=T.endIndex;R++){if(R>=K.messages.length)break;let h=K.messages[R],JQ=A.get(h.from)??0,$Q=A.get(h.to)??0;f=Math.min(f,x[Math.min(JQ,$Q)]),E=Math.max(E,x[Math.max(JQ,$Q)])}let s=Math.max(0,f-4),v=Math.min(k-1,E+4);Y(s,S,F,"border");for(let R=s+1;R<v;R++)Y(R,S,G,"border");Y(v,S,z,"border");let X=T.label?`${T.type} [${T.label}]`:T.type,n=VQ(X);for(let R=0;R<n.length&&S+R<L;R++){let h=n[R];for(let JQ=0;JQ<h.length&&s+1+JQ<v;JQ++)Y(s+1+JQ,S+R,h[JQ],"text")}Y(s,L,U,"border");for(let R=s+1;R<v;R++)Y(R,L,G,"border");Y(v,L,N,"border");for(let R=S+1;R<L;R++)Y(s,R,j,"border"),Y(v,R,j,"border");for(let R=0;R<T.dividers.length;R++){let h=a.get(`${q}:${R}`);if(h===void 0)continue;let JQ=QQ();Y(s,h,W,"junction");for(let KQ=s+1;KQ<v;KQ++)Y(KQ,h,JQ,"line");Y(v,h,H,"junction");let $Q=T.dividers[R].label;if($Q){let KQ=`[${$Q}]`;for(let zQ=0;zQ<KQ.length&&s+1+zQ<v;zQ++)Y(s+1+zQ,h,KQ[zQ],"text")}}}for(let q of o){RQ(m,q.x+q.width,q.y+q.height),yQ(C,q.x+q.width,q.y+q.height),Y(q.x,q.y,F,"border");for(let S=1;S<q.width-1;S++)Y(q.x+S,q.y,G,"border");Y(q.x+q.width-1,q.y,z,"border");for(let S=0;S<q.lines.length;S++){let L=q.y+1+S;Y(q.x,L,j,"border"),Y(q.x+q.width-1,L,j,"border");for(let f=0;f<q.lines[S].length;f++)Y(q.x+2+f,L,q.lines[S][f],"text")}let T=q.y+q.height-1;Y(q.x,T,U,"border");for(let S=1;S<q.width-1;S++)Y(q.x+S,T,G,"border");Y(q.x+q.width-1,T,N,"border")}return xQ(m,{roleCanvas:C,colorMode:Z,theme:V});function QQ(){return J?"-":"╌"}}function I8(Q){let $={classes:[],relationships:[],namespaces:[]},Z=new Map,V=null,_=null,K=0;for(let J=1;J<Q.length;J++){let G=Q[J];if(_&&K>0){if(G==="}"){if(K--,K===0)_=null;continue}let B=G.match(/^<<(\w+)>>$/);if(B){_.annotation=B[1];continue}let W=H8(G);if(W)if(W.isMethod)_.methods.push(W.member);else _.attributes.push(W.member);continue}let j=G.match(/^namespace\s+(\S+)\s*\{$/);if(j){V={name:j[1],classIds:[]};continue}if(G==="}"&&V){$.namespaces.push(V),V=null;continue}let F=G.match(/^class\s+(\S+?)(?:\s*~(\w+)~)?\s*\{$/);if(F){let B=F[1],W=F[2],H=lQ(Z,B);if(W)H.label=`${B}<${W}>`;if(_=H,K=1,V)V.classIds.push(B);continue}let z=G.match(/^class\s+(\S+?)(?:\s*~(\w+)~)?\s*$/);if(z){let B=z[1],W=z[2],H=lQ(Z,B);if(W)H.label=`${B}<${W}>`;if(V)V.classIds.push(B);continue}let U=G.match(/^class\s+(\S+?)\s*\{\s*<<(\w+)>>\s*\}$/);if(U){let B=lQ(Z,U[1]);B.annotation=U[2];continue}let N=G.match(/^(\S+?)\s*:\s*(.+)$/);if(N){let B=N[2];if(!B.match(/<\|--|--|\*--|o--|-->|\.\.>|\.\.\|>/)){let W=lQ(Z,N[1]),H=H8(B);if(H)if(H.isMethod)W.methods.push(H.member);else W.attributes.push(H.member);continue}}let O=n9(G);if(O){lQ(Z,O.from),lQ(Z,O.to),$.relationships.push(O);continue}}return $.classes=[...Z.values()],$}function lQ(Q,$){let Z=Q.get($);if(!Z)Z={id:$,label:$,attributes:[],methods:[]},Q.set($,Z);return Z}function H8(Q){let $=Q.trim().replace(/;$/,"");if(!$)return null;let Z="",V=$;if(/^[+\-#~]/.test(V))Z=V[0],V=V.slice(1).trim();let _=V.match(/^(.+?)\(([^)]*)\)(?:\s*(.+))?$/);if(_){let z=_[1].trim(),U=_[2]?.trim()||void 0,N=_[3]?.trim(),O=z.endsWith("$")||V.includes("$"),B=z.endsWith("*")||V.includes("*");return{member:{visibility:Z,name:z.replace(/[$*]$/,""),type:N||void 0,isStatic:O,isAbstract:B,isMethod:!0,params:U},isMethod:!0}}let K=V.split(/\s+/),J,G;if(K.length>=2)G=K[0],J=K.slice(1).join(" ");else J=K[0]??V;let j=J.endsWith("$"),F=J.endsWith("*");return{member:{visibility:Z,name:J.replace(/[$*]$/,""),type:G||void 0,isStatic:j,isAbstract:F,isMethod:!1},isMethod:!1}}function n9(Q){let $=Q.match(/^(\S+?)\s+(?:"([^"]*?)"\s+)?(<\|--|<\|\.\.|\*--|o--|-->|--\*|--o|--\|>|\.\.>|\.\.\|>|<--|<\.\.?|--)\s+(?:"([^"]*?)"\s+)?(\S+?)(?:\s*:\s*(.+))?$/);if(!$)return null;let Z=$[1],V=$[2],_=V?FQ(V):void 0,K=$[3].trim(),J=$[4],G=J?FQ(J):void 0,j=$[5],F=$[6]?.trim(),z=F?FQ(F):void 0,U=s9(K);if(!U)return null;return{from:Z,to:j,type:U.type,markerAt:U.markerAt,label:z,fromCardinality:_,toCardinality:G}}function s9(Q){switch(Q.trim()){case"<|--":return{type:"inheritance",markerAt:"from"};case"--|>":return{type:"inheritance",markerAt:"to"};case"<|..":return{type:"realization",markerAt:"from"};case"..|>":return{type:"realization",markerAt:"to"};case"*--":return{type:"composition",markerAt:"from"};case"--*":return{type:"composition",markerAt:"to"};case"o--":return{type:"aggregation",markerAt:"from"};case"--o":return{type:"aggregation",markerAt:"to"};case"-->":return{type:"association",markerAt:"to"};case"<--":return{type:"association",markerAt:"from"};case"..>":return{type:"dependency",markerAt:"to"};case"<..":return{type:"dependency",markerAt:"from"};case"--":return{type:"association",markerAt:"to"};default:return null}}function i9(Q){if(/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|]$/.test(Q))return"border";return"text"}function T8(Q){let $=Q.visibility||"",Z=Q.type?`: ${Q.type}`:"";return`${$}${Q.name}${Z}`}function o9(Q){let $=[];if(Q.annotation)$.push(`<<${Q.annotation}>>`);let Z=VQ(Q.label);$.push(...Z);let V=Q.attributes.map(T8),_=Q.methods.map(T8);if(V.length===0&&_.length===0)return[$];if(_.length===0)return[$,V];return[$,V,_]}function t9(Q,$){return{type:Q,markerAt:$,dashed:Q==="dependency"||Q==="realization"}}function pQ(Q,$,Z){switch(Q){case"inheritance":case"realization":if(Z==="down")return $?"^":"△";else if(Z==="up")return $?"v":"▽";else if(Z==="left")return $?">":"◁";else return $?"<":"▷";case"composition":return $?"*":"◆";case"aggregation":return $?"o":"◇";case"association":case"dependency":if(Z==="down")return $?"v":"▼";else if(Z==="up")return $?"^":"▲";else if(Z==="left")return $?"<":"◀";else return $?">":"▶"}}function k8(Q,$,Z,V){let _=Q.split(`
9`).map((k)=>k.trim()).filter((k)=>k.length>0&&!k.startsWith("%%")),K=I8(_);if(K.classes.length===0)return"";let J=$.useAscii,G=4,j=3,F=new Map,z=new Map,U=new Map;for(let k of K.classes){let m=o9(k);F.set(k.id,m);let C=0;for(let q of m)for(let T of q)C=Math.max(C,T.length);let Y=C+4,d=0;for(let q of m)d+=Math.max(q.length,1);let QQ=d+(m.length-1)+2;z.set(k.id,Y),U.set(k.id,QQ)}let N=new Map;for(let k of K.classes)N.set(k.id,k);let O=new Map,B=new Map;for(let k of K.relationships){let m=k.type==="inheritance"||k.type==="realization",C=m&&k.markerAt==="to"?k.to:k.from,Y=m&&k.markerAt==="to"?k.from:k.to;if(!O.has(Y))O.set(Y,new Set);if(O.get(Y).add(C),!B.has(C))B.set(C,new Set);B.get(C).add(Y)}let W=new Map,A=K.classes.filter((k)=>!O.has(k.id)||O.get(k.id).size===0).map((k)=>k.id);for(let k of A)W.set(k,0);let b=K.classes.length-1,M=0;while(M<A.length){let k=A[M++],m=B.get(k);if(!m)continue;for(let C of m){let Y=(W.get(k)??0)+1;if(Y>b)continue;if(!W.has(C)||W.get(C)<Y)W.set(C,Y),A.push(C)}}for(let k of K.classes)if(!W.has(k.id))W.set(k.id,0);let g=Math.max(...[...W.values()],0),D=Array.from({length:g+1},()=>[]);for(let k of K.classes)D[W.get(k.id)].push(k.id);let i=new Map,UQ=0;for(let k=0;k<=g;k++){let m=D[k];if(m.length===0)continue;let C=0,Y=0;for(let d of m){let QQ=N.get(d),q=z.get(d),T=U.get(d);i.set(d,{cls:QQ,sections:F.get(d),x:C,y:UQ,width:q,height:T}),C+=q+G,Y=Math.max(Y,T)}UQ+=Y+j}let x=0,ZQ=0;for(let k of i.values())x=Math.max(x,k.x+k.width),ZQ=Math.max(ZQ,k.y+k.height);x+=4,ZQ+=2;let y=_Q(x-1,ZQ-1),t=CQ(x-1,ZQ-1);function I(k,m,C,Y){if(k>=0&&k<y.length&&m>=0&&m<(y[0]?.length??0))y[k][m]=C,fQ(t,k,m,Y)}for(let k of i.values()){let m=J4(k.sections,J);for(let C=0;C<m.length;C++)for(let Y=0;Y<m[0].length;Y++){let d=m[C][Y];if(d!==" "){let QQ=k.x+C,q=k.y+Y;if(QQ<x&&q<ZQ)I(QQ,q,d,i9(d))}}}let a=[];for(let k of i.values())a.push({x1:k.x,x2:k.x+k.width-1,y1:k.y,y2:k.y+k.height-1});function o(k,m,C){for(let[Y,d]of i.entries()){if(C?.has(Y))continue;if(k>=d.x&&k<=d.x+d.width-1&&m>=d.y&&m<=d.y+d.height-1)return!0}return!1}function r(k,m,C,Y){let d=!0;for(let QQ=Math.min(m,C);QQ<=Math.max(m,C);QQ++)if(o(k,QQ,Y)){d=!1;break}if(d)return k;for(let QQ=1;QQ<x+10;QQ++){let q=k+QQ;d=!0;for(let S=Math.min(m,C);S<=Math.max(m,C);S++)if(o(q,S,Y)){d=!1;break}if(d)return q;let T=k-QQ;if(T>=0){d=!0;for(let S=Math.min(m,C);S<=Math.max(m,C);S++)if(o(T,S,Y)){d=!1;break}if(d)return T}}return x+2}let w=J?"-":"─",e=J?"|":"│",GQ=J?".":"╌",jQ=J?":":"┊";for(let k of K.relationships){let m=i.get(k.from),C=i.get(k.to);if(!m||!C)continue;let Y=t9(k.type,k.markerAt),d=Y.dashed?GQ:w,QQ=Y.dashed?jQ:e,q=new Set([k.from,k.to]),T=m.x+Math.floor(m.width/2),S=m.y+m.height-1,L=C.x+Math.floor(C.width/2),f=C.y;if(S<f){let E=r(T,S+1,f-1,q),s=E!==T;if(E>=x)RQ(y,E+2,ZQ);if(s){let v=S+1,X=f-1,n=Math.min(T,E),R=Math.max(T,E);for(let h=n;h<=R;h++)I(h,v,d,"line");if(!J&&v<(y[0]?.length??0))if(T<E)I(T,v,"└","corner"),I(E,v,"┐","corner");else I(T,v,"┘","corner"),I(E,v,"┌","corner");for(let h=v+1;h<=X;h++)I(E,h,QQ,"line");if(E!==L){let h=Math.min(E,L),JQ=Math.max(E,L);for(let $Q=h;$Q<=JQ;$Q++)I($Q,X,d,"line");if(!J&&X<(y[0]?.length??0))if(E<L)I(E,X,"└","corner"),I(L,X,"┐","corner");else I(E,X,"┘","corner"),I(L,X,"┌","corner")}if(Y.markerAt==="to"){let h=pQ(Y.type,J,"down");I(L,X,h,"arrow")}if(Y.markerAt==="from"){let h=pQ(Y.type,J,"down");I(T,S+1,h,"arrow")}}else{let v=S+Math.floor((f-S)/2);for(let X=S+1;X<=v;X++)I(T,X,QQ,"line");if(T!==L&&v<(y[0]?.length??0)){let X=Math.min(T,L),n=Math.max(T,L);for(let R=X;R<=n;R++)I(R,v,d,"line");if(!J)I(T,v,T<L?"└":"┘","corner"),I(L,v,T<L?"┐":"┌","corner")}for(let X=v+1;X<f;X++)I(L,X,QQ,"line");if(Y.markerAt==="to")I(L,f-1,pQ(Y.type,J,"down"),"arrow");if(Y.markerAt==="from")I(T,S+1,pQ(Y.type,J,"down"),"arrow")}}else if(C.y+C.height-1<m.y){let E=m.y,s=C.y+C.height-1,v=s+Math.floor((E-s)/2);for(let X=E-1;X>=v;X--)I(T,X,QQ,"line");if(T!==L){let X=Math.min(T,L),n=Math.max(T,L);for(let R=X;R<=n;R++)I(R,v,d,"line");if(!J&&v>=0&&v<ZQ)I(T,v,T<L?"┌":"┐","corner"),I(L,v,T<L?"┘":"└","corner")}for(let X=v-1;X>s;X--)I(L,X,QQ,"line");if(Y.markerAt==="from"){let X=pQ(Y.type,J,"up"),n=E-1;for(let R=0;R<X.length;R++)I(T-Math.floor(X.length/2)+R,n,X[R],"arrow")}if(Y.markerAt==="to"){let n=Y.type==="inheritance"||Y.type==="realization"?"down":"up",R=pQ(Y.type,J,n),h=s+1;for(let JQ=0;JQ<R.length;JQ++)I(L-Math.floor(R.length/2)+JQ,h,R[JQ],"arrow")}}else{let E=Math.max(S,C.y+C.height-1)+2;RQ(y,x,E+1),yQ(t,x,E+1);for(let X=S+1;X<=E;X++)I(T,X,QQ,"line");let s=Math.min(T,L),v=Math.max(T,L);for(let X=s;X<=v;X++)I(X,E,d,"line");for(let X=E-1;X>=C.y+C.height;X--)I(L,X,QQ,"line");if(Y.markerAt==="from"){let X=pQ(Y.type,J,"down"),n=S+1;for(let R=0;R<X.length;R++)I(T-Math.floor(X.length/2)+R,n,X[R],"arrow")}if(Y.markerAt==="to"){let X=pQ(Y.type,J,"up"),n=C.y+C.height;for(let R=0;R<X.length;R++)I(L-Math.floor(X.length/2)+R,n,X[R],"arrow")}}if(k.label){let E=VQ(k.label),s=Math.max(...E.map(($Q)=>$Q.length))+2,v,X;if(S<f)v=Math.floor((S+1+f-1)/2),X=Math.floor((T+L)/2);else if(C.y+C.height-1<m.y){let $Q=C.y+C.height-1;v=Math.floor(($Q+1+m.y-1)/2),X=Math.floor((T+L)/2)}else v=Math.max(S,C.y+C.height-1)+2,X=Math.floor((T+L)/2);let n=v,R=Math.floor(E.length/2),h=!1;for(let $Q=0;$Q<E.length;$Q++){let KQ=n-R+$Q,zQ=X-Math.floor(s/2),NQ=Math.max(0,zQ);for(let MQ=NQ;MQ<NQ+s;MQ++)if(o(MQ,KQ,q)){h=!0;break}if(h)break}if(h){let $Q=S+1,KQ=f-1;for(let zQ=$Q;zQ<=KQ;zQ++){let NQ=!0,MQ=X-Math.floor(s/2),uQ=Math.max(0,MQ);for(let XQ=uQ;XQ<uQ+s;XQ++)if(o(XQ,zQ,q)){NQ=!1;break}if(NQ){n=zQ;break}}}let JQ=n-R;for(let $Q=0;$Q<E.length;$Q++){let KQ=` ${E[$Q]} `,zQ=X-Math.floor(KQ.length/2),NQ=Math.max(0,zQ),MQ=JQ+$Q,uQ=NQ+KQ.length;if(uQ>0&&MQ>=0)RQ(y,Math.max(uQ,1),Math.max(MQ+1,1)),yQ(t,Math.max(uQ,1),Math.max(MQ+1,1));for(let XQ=0;XQ<KQ.length;XQ++){let hQ=NQ+XQ;if(hQ>=0&&MQ>=0)I(hQ,MQ,KQ[XQ],"text")}}}}return xQ(y,{roleCanvas:t,colorMode:Z,theme:V})}function A8(Q){let $={entities:[],relationships:[]},Z=new Map,V=null;for(let _=1;_<Q.length;_++){let K=Q[_];if(V){if(K==="}"){V=null;continue}let j=r9(K);if(j)V.attributes.push(j);continue}let J=K.match(/^(\S+)\s*\{$/);if(J){let j=J[1];V=H4(Z,j);continue}let G=a9(K);if(G){H4(Z,G.entity1),H4(Z,G.entity2),$.relationships.push(G);continue}}return $.entities=[...Z.values()],$}function H4(Q,$){let Z=Q.get($);if(!Z)Z={id:$,label:$,attributes:[]},Q.set($,Z);return Z}function r9(Q){let $=Q.match(/^(\S+)\s+(\S+)(?:\s+(.+))?$/);if(!$)return null;let Z=$[1],V=$[2],_=$[3]?.trim()??"",K=[],J,G=_.match(/"([^"]*)"/);if(G)J=FQ(G[1]);let j=_.replace(/"[^"]*"/,"").trim();for(let F of j.split(/\s+/)){let z=F.toUpperCase();if(z==="PK"||z==="FK"||z==="UK")K.push(z)}return{type:Z,name:V,keys:K,comment:J}}function a9(Q){let $=Q.match(/^(\S+)\s+([|o}{]+(?:--|\.\.)[|o}{]+)\s+(\S+)\s*:\s*(.+)$/);if(!$)return null;let Z=$[1],V=$[2],_=$[3],K=$[4].trim().replace(/^["']|["']$/g,""),J=FQ(K),G=V.match(/^([|o}{]+)(--|\.\.?)([|o}{]+)$/);if(!G)return null;let j=G[1],F=G[2],z=G[3],U=Y8(j),N=Y8(z),O=F==="--";if(!U||!N)return null;return{entity1:Z,entity2:_,cardinality1:U,cardinality2:N,label:J,identifying:O}}function Y8(Q){let $=Q.split("").sort().join("");if($==="||")return"one";if($==="o|")return"zero-one";if($==="|}"||$==="{|")return"many";if($==="{o"||$==="o{")return"zero-many";return null}function e9(Q){if(/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|]$/.test(Q))return"border";return"text"}function Q$(Q){return`${Q.keys.length>0?Q.keys.join(",")+" ":" "}${Q.type} ${Q.name}`}function $$(Q){let $=VQ(Q.label),Z=Q.attributes.map(Q$);if(Z.length===0)return[$];return[$,Z]}function V4(Q,$,Z=!1){if($)switch(Q){case"one":return"|";case"zero-one":return"o|";case"many":return Z?"<":">";case"zero-many":return Z?"o<":">o"}else switch(Q){case"one":return"│";case"zero-one":return"○│";case"many":return Z?"╟":"╢";case"zero-many":return Z?"○╟":"╢○"}}function Z$(Q){let $=new Set,Z=[],V=new Map;for(let K of Q.entities)V.set(K.id,new Set);for(let K of Q.relationships)V.get(K.entity1)?.add(K.entity2),V.get(K.entity2)?.add(K.entity1);function _(K,J){let G=[K];while(G.length>0){let j=G.pop();if($.has(j))continue;$.add(j),J.add(j);for(let F of V.get(j)??[])if(!$.has(F))G.push(F)}}for(let K of Q.entities)if(!$.has(K.id)){let J=new Set;if(_(K.id,J),J.size>0)Z.push(J)}return Z}function M8(Q,$,Z,V){let _=Q.split(`
10`).map((y)=>y.trim()).filter((y)=>y.length>0&&!y.startsWith("%%")),K=A8(_);if(K.entities.length===0)return"";let J=$.useAscii,G=6,j=4,F=6,z=new Map,U=new Map,N=new Map,O=new Map;for(let y of K.entities){O.set(y.id,y);let t=$$(y);z.set(y.id,t);let I=0;for(let w of t)for(let e of w)I=Math.max(I,e.length);let a=I+4,o=0;for(let w of t)o+=Math.max(w.length,1);let r=o+(t.length-1)+2;U.set(y.id,a),N.set(y.id,r)}let B=Z$(K),W=new Map,H=0;for(let y of B){let t=K.entities.filter((e)=>y.has(e.id)),I=Math.max(2,Math.ceil(Math.sqrt(t.length))),a=0,o=0,r=0,w=H;for(let e of t){let GQ=U.get(e.id),jQ=N.get(e.id);if(r>=I)H+=o+j,a=0,o=0,r=0;W.set(e.id,{entity:e,sections:z.get(e.id),x:a,y:H,width:GQ,height:jQ}),a+=GQ+G,o=Math.max(o,jQ),r++}H+=o+F}let A=0,b=0;for(let y of W.values())A=Math.max(A,y.x+y.width),b=Math.max(b,y.y+y.height);A+=4,b+=2;let M=_Q(A-1,b-1),g=CQ(A-1,b-1);function D(y,t,I,a){if(y>=0&&y<M.length&&t>=0&&t<(M[0]?.length??0))M[y][t]=I,fQ(g,y,t,a)}for(let y of W.values()){let t=J4(y.sections,J);for(let I=0;I<t.length;I++)for(let a=0;a<t[0].length;a++){let o=t[I][a];if(o!==" "){let r=y.x+I,w=y.y+a;if(r<A&&w<b)D(r,w,o,e9(o))}}}let i=J?"-":"─",UQ=J?"|":"│",x=J?".":"╌",ZQ=J?":":"┊";for(let y of K.relationships){let t=W.get(y.entity1),I=W.get(y.entity2);if(!t||!I)continue;let a=y.identifying?i:x,o=y.identifying?UQ:ZQ,r=t.x+Math.floor(t.width/2),w=t.y+Math.floor(t.height/2),e=I.x+Math.floor(I.width/2),GQ=I.y+Math.floor(I.height/2);if(Math.abs(w-GQ)<Math.max(t.height,I.height)){let[k,m]=r<e?[t,I]:[I,t],[C,Y]=r<e?[y.cardinality1,y.cardinality2]:[y.cardinality2,y.cardinality1],d=k.x+k.width,QQ=m.x-1,q=k.y+Math.floor(k.height/2);for(let L=d;L<=QQ;L++)D(L,q,a,"line");let T=V4(C,J,!1);for(let L=0;L<T.length;L++)D(d+L,q,T[L],"arrow");let S=V4(Y,J,!0);for(let L=0;L<S.length;L++)D(QQ-S.length+1+L,q,S[L],"arrow");if(y.label){let L=VQ(y.label),f=Math.floor((d+QQ)/2);for(let E=0;E<L.length;E++){let s=L[E],v=Math.max(d,f-Math.floor(s.length/2)),X=q+1+E;RQ(M,Math.max(v+s.length,1),Math.max(X+1,1)),yQ(g,Math.max(v+s.length,1),Math.max(X+1,1));for(let n=0;n<s.length;n++){let R=v+n;if(R>=d&&R<=QQ)D(R,X,s[n],"text")}}}}else{let[k,m]=w<GQ?[t,I]:[I,t],[C,Y]=w<GQ?[y.cardinality1,y.cardinality2]:[y.cardinality2,y.cardinality1],d=k.y+k.height,QQ=m.y-1,q=k.x+Math.floor(k.width/2);for(let E=d;E<=QQ;E++)D(q,E,o,"line");let T=m.x+Math.floor(m.width/2);if(q!==T){let E=Math.floor((d+QQ)/2),s=Math.min(q,T),v=Math.max(q,T);for(let X=s;X<=v;X++)D(X,E,a,"line");for(let X=E+1;X<=QQ;X++)D(T,X,o,"line")}let S=V4(C,J,!1);for(let E=0;E<S.length;E++)D(q-Math.floor(S.length/2)+E,d,S[E],"arrow");let L=q!==T?T:q,f=V4(Y,J,!0);for(let E=0;E<f.length;E++)D(L-Math.floor(f.length/2)+E,QQ,f[E],"arrow");if(y.label){let E=VQ(y.label),v=Math.floor((d+QQ)/2)-Math.floor((E.length-1)/2);for(let X=0;X<E.length;X++){let n=E[X],R=q+2,h=v+X;if(h>=0)for(let JQ=0;JQ<n.length;JQ++){let $Q=R+JQ;if($Q>=0)RQ(M,$Q+1,h+1),yQ(g,$Q+1,h+1),D($Q,h,n[JQ],"text")}}}}}return xQ(M,{roleCanvas:g,colorMode:Z,theme:V})}function E8(Q){let $={},Z={},V=[],_,K=!1;for(let J of Q){if(/^xychart(-beta)?\b/i.test(J)){if(/\bhorizontal\b/i.test(J))K=!0;continue}let G=J.match(/^title\s+"([^"]+)"/);if(G){_=G[1];continue}let j=J.match(/^x-axis\s+(?:"([^"]*)"\s*)?\[([^\]]+)\]/);if(j){if(j[1])$.title=j[1];$.categories=j[2].split(",").map((B)=>B.trim());continue}let F=J.match(/^x-axis\s+(?:"([^"]*)"\s+)?(-?\d+(?:\.\d+)?)\s*-->\s*(-?\d+(?:\.\d+)?)/);if(F){if(F[1])$.title=F[1];$.range={min:parseFloat(F[2]),max:parseFloat(F[3])};continue}let z=J.match(/^y-axis\s+(?:"([^"]*)"\s+)?(-?\d+(?:\.\d+)?)\s*-->\s*(-?\d+(?:\.\d+)?)/);if(z){if(z[1])Z.title=z[1];Z.range={min:parseFloat(z[2]),max:parseFloat(z[3])};continue}let U=J.match(/^y-axis\s+"([^"]+)"\s*$/);if(U){Z.title=U[1];continue}let N=J.match(/^bar\s+\[([^\]]+)\]/);if(N){V.push({type:"bar",data:X8(N[1])});continue}let O=J.match(/^line\s+\[([^\]]+)\]/);if(O){V.push({type:"line",data:X8(O[1])});continue}}if(!Z.range&&V.length>0){let J=V.flatMap((z)=>z.data),G=Math.min(...J),j=Math.max(...J),F=j-G||1;if(G=G-F*0.1,j=j+F*0.1,G>0&&G<F*0.5)G=0;Z.range={min:G,max:j}}if(!Z.range)Z.range={min:0,max:100};return{title:_,horizontal:K,xAxis:$,yAxis:Z,series:V}}function X8(Q){return Q.split(",").map(($)=>parseFloat($.trim()))}var D8="#3b82f6";function L8(Q){let $=Q.replace("#",""),Z=parseInt($.substring(0,2),16)/255,V=parseInt($.substring(2,4),16)/255,_=parseInt($.substring(4,6),16)/255,K=Math.max(Z,V,_),J=Math.min(Z,V,_),G=(K+J)/2;if(K===J)return[0,0,G*100];let j=K-J,F=G>0.5?j/(2-K-J):j/(K+J),z;if(K===Z)z=((V-_)/j+(V<_?6:0))/6;else if(K===V)z=((_-Z)/j+2)/6;else z=((Z-V)/j+4)/6;return[z*360,F*100,G*100]}function K$(Q,$,Z){let V=$/100,_=Z/100,K=(1-Math.abs(2*_-1))*V,J=K*(1-Math.abs(Q/60%2-1)),G=_-K/2,j,F,z;if(Q<60)j=K,F=J,z=0;else if(Q<120)j=J,F=K,z=0;else if(Q<180)j=0,F=K,z=J;else if(Q<240)j=0,F=J,z=K;else if(Q<300)j=J,F=0,z=K;else j=K,F=0,z=J;let U=(N)=>Math.round((N+G)*255).toString(16).padStart(2,"0");return`#${U(j)}${U(F)}${U(z)}`}function R8(Q){return/^#[0-9a-fA-F]{6}$/.test(Q)}function J$(Q){return L8(Q)[2]<50}function S8(Q,$,Z){if(Q===0)return $;let V=R8($)?$:"#3b82f6",_=Z&&R8(Z)?Z:void 0,[K,J]=L8(V),G=Math.max(55,Math.min(85,J)),j=Math.ceil(Q/2),F=Q%2===1,z=_&&J$(_)?!F:F,U=z?Math.max(25,48-j*13):Math.min(78,55+j*11),N=(z?-8:12)*j,O=((K+N)%360+360)%360;return K$(O,G,U)}var w8=60,y8=20,V$={hLine:"─",vLine:"│",origin:"┼",yTick:"┤",xTick:"┬",bar:"█",grid:"·",cornerTL:"╭",cornerTR:"╮",cornerBL:"╰",cornerBR:"╯"},_$={hLine:"-",vLine:"|",origin:"+",yTick:"+",xTick:"+",bar:"#",grid:".",cornerTL:"+",cornerTR:"+",cornerBL:"+",cornerBR:"+"};function v8(Q,$){let Z=$.accent??D8;if(Q<=1)return[Z];return Array.from({length:Q},(V,_)=>S8(_,Z,$.bg))}function G$(Q,$){switch(Q){case"text":return $.fg;case"border":return $.border;case"line":return $.line;case"arrow":return $.arrow;case"corner":return $.corner??$.line;case"junction":return $.junction??$.border;default:return $.fg}}function C8(Q,$,Z,V){let _=Q.split(`
11`).map((G)=>G.trim()).filter((G)=>G.length>0&&!G.startsWith("%%")),K=E8(_),J=$.useAscii?_$:V$;if(K.horizontal)return F$(K,J,Z,V);return j$(K,J,Z,V)}function j$(Q,$,Z,V){let _=g8(Q);if(_===0)return"";let K=Q.yAxis.range,J=c8(K.min,K.max),G=J.map((w)=>_4(w)),j=Math.max(...G.map((w)=>w.length))+1,F=Math.max(w8,_*6),z=y8,U=Math.floor(F/_),N=h8(Q,_),O=!!Q.title,B=!!Q.xAxis.title,W=Q.series.length>1,H=O?0:-1,A=(O?2:0)+(W?1:0),b=j+1,M=b+U*_+2,g=A+z,D=g+1,i=B?D+1:-1,UQ=D+1+(B?1:0)+(W&&!O?0:0),x=b8(M,UQ),ZQ=u8(M,UQ),y=x8(M,UQ),t=v8(Q.series.length,V),I=(w)=>{let e=(w-K.min)/(K.max-K.min||1);return Math.round(e*(z-1))},a=(w)=>b+Math.floor(U*(w+0.5));if(O&&H>=0)bQ(x,ZQ,H,Math.floor(M/2-Q.title.length/2),Q.title,"text");if(W)f8(x,ZQ,y,Q,O?1:0,M,$,t);for(let w=0;w<z;w++){let e=A+(z-1-w);qQ(x,ZQ,e,b-1,$.vLine,"border")}qQ(x,ZQ,g,b-1,$.origin,"border");for(let w of J){let e=I(w);if(e<0||e>=z)continue;let GQ=A+(z-1-e),jQ=_4(w);qQ(x,ZQ,GQ,b-1,e===0?$.origin:$.yTick,"border");let k=j-jQ.length;bQ(x,ZQ,GQ,Math.max(0,k),jQ,"text")}for(let w=b;w<b+U*_;w++)qQ(x,ZQ,g,w,$.hLine,"border");for(let w=0;w<_;w++){let e=a(w);qQ(x,ZQ,g,e,$.xTick,"border");let GQ=N[w],jQ=e-Math.floor(GQ.length/2);bQ(x,ZQ,D,Math.max(0,jQ),GQ,"text")}if(B&&i>=0){let w=Q.xAxis.title;bQ(x,ZQ,i,Math.floor(M/2-w.length/2),w,"text")}for(let w of J){let e=I(w);if(e<0||e>=z)continue;let GQ=A+(z-1-e);for(let jQ=b;jQ<b+U*_;jQ++)if(m8(x,GQ,jQ)===" ")qQ(x,ZQ,GQ,jQ,$.grid,"line")}let o=[];for(let w=0;w<Q.series.length;w++)if(Q.series[w].type==="bar")o.push({data:Q.series[w].data,globalIdx:w});if(o.length>0){let w=o.length,e=Math.max(1,U-2),GQ=Math.max(1,Math.min(Math.floor(e/w),8)),jQ=GQ*w+(w-1),k=I(Math.max(0,K.min));for(let m=0;m<o.length;m++){let C=o[m],Y=t[C.globalIdx];for(let d=0;d<C.data.length;d++){let T=a(d)-Math.floor(jQ/2)+m*(GQ+1),S=I(C.data[d]),L=Math.min(k,S),f=Math.max(k,S);for(let E=L;E<=f;E++){let s=A+(z-1-E);for(let v=T;v<T+GQ;v++)qQ(x,ZQ,s,v,$.bar,"arrow",y,Y)}}}}let r=[];for(let w=0;w<Q.series.length;w++)if(Q.series[w].type==="line")r.push({data:Q.series[w].data,globalIdx:w});for(let w of r){if(w.data.length===0)continue;let e=t[w.globalIdx];z$(x,ZQ,w.data,a,I,A,z,b,U*_,$,y,e)}return p8(x,ZQ,y,Z,V)}function F$(Q,$,Z,V){let _=g8(Q);if(_===0)return"";let K=Q.yAxis.range,J=c8(K.min,K.max),G=h8(Q,_),j=Math.max(...G.map((I)=>I.length))+1,F=Math.max(w8,40),z=Math.max(2,Math.floor(y8/_)),U=z*_,N=!!Q.title,O=!!Q.yAxis.title,B=Q.series.length>1,W=(N?2:0)+(B?1:0),H=j+1,A=H+F+2,b=W+U+2+(O?1:0),M=W+U,g=b8(A,b),D=u8(A,b),i=x8(A,b),UQ=v8(Q.series.length,V),x=(I)=>{let a=(I-K.min)/(K.max-K.min||1);return H+Math.round(a*(F-1))},ZQ=(I)=>W+Math.floor(z*(I+0.5));if(N)bQ(g,D,0,Math.floor(A/2-Q.title.length/2),Q.title,"text");if(B)f8(g,D,i,Q,N?1:0,A,$,UQ);for(let I=W;I<W+U;I++)qQ(g,D,I,H-1,$.vLine,"border");qQ(g,D,M,H-1,$.origin,"border");for(let I=0;I<_;I++){let a=ZQ(I),o=G[I],r=j-o.length;bQ(g,D,a,Math.max(0,r),o,"text")}for(let I=H;I<H+F;I++)qQ(g,D,M,I,$.hLine,"border");for(let I of J){let a=x(I);if(a<H||a>=H+F)continue;qQ(g,D,M,a,$.xTick,"border");let o=_4(I);bQ(g,D,M+1,a-Math.floor(o.length/2),o,"text")}if(O){let I=Q.yAxis.title;bQ(g,D,b-1,Math.floor(A/2-I.length/2),I,"text")}for(let I of J){let a=x(I);if(a<H||a>=H+F)continue;for(let o=W;o<W+U;o++)if(m8(g,o,a)===" ")qQ(g,D,o,a,$.grid,"line")}let y=[];for(let I=0;I<Q.series.length;I++)if(Q.series[I].type==="bar")y.push({data:Q.series[I].data,globalIdx:I});if(y.length>0){let I=y.length,a=1,o=1*I+(I-1),r=x(Math.max(0,K.min));for(let w=0;w<y.length;w++){let e=y[w],GQ=UQ[e.globalIdx];for(let jQ=0;jQ<e.data.length;jQ++){let C=ZQ(jQ)-Math.floor(o/2)+w*2,Y=x(e.data[jQ]),d=Math.min(r,Y),QQ=Math.max(r,Y);for(let q=C;q<C+1;q++)for(let T=d;T<=QQ;T++)qQ(g,D,q,T,$.bar,"arrow",i,GQ)}}}let t=[];for(let I=0;I<Q.series.length;I++)if(Q.series[I].type==="line")t.push({data:Q.series[I].data,globalIdx:I});for(let I of t){if(I.data.length===0)continue;let a=UQ[I.globalIdx];N$(g,D,I.data,ZQ,x,W,U,H,F,$,i,a)}return p8(g,D,i,Z,V)}function z$(Q,$,Z,V,_,K,J,G,j,F,z,U){if(Z.length===0)return;let N=Z.map((B,W)=>({col:V(W),row:_(B)})),O=(B,W,H)=>{let A=K+(J-1-W);if(A>=0&&B>=G&&B<G+j)qQ(Q,$,A,B,H,"arrow",z,U)};if(N.length===1){O(N[0].col,N[0].row,F.hLine);return}for(let B=0;B<N.length-1;B++){let W=N[B],H=N[B+1];if(W.row===H.row){for(let D=W.col;D<=H.col;D++)O(D,W.row,F.hLine);continue}let A=Math.round((W.col+H.col)/2),b=H.row>W.row;for(let D=W.col;D<A;D++)O(D,W.row,F.hLine);if(b)O(A,W.row,F.cornerBR);else O(A,W.row,F.cornerTR);let M=Math.min(W.row,H.row),g=Math.max(W.row,H.row);for(let D=M+1;D<g;D++)O(A,D,F.vLine);if(b)O(A,H.row,F.cornerTL);else O(A,H.row,F.cornerBL);for(let D=A+1;D<=H.col;D++)O(D,H.row,F.hLine);if(B===0){let D=Math.max(G,W.col-Math.floor((H.col-W.col)/4));for(let i=D;i<W.col;i++)O(i,W.row,F.hLine)}if(B===N.length-2){let D=Math.min(G+j-1,H.col+Math.floor((H.col-W.col)/4));for(let i=H.col+1;i<=D;i++)O(i,H.row,F.hLine)}}}function N$(Q,$,Z,V,_,K,J,G,j,F,z,U){if(Z.length===0)return;let N=Z.map((B,W)=>({row:V(W),col:_(B)})),O=(B,W,H)=>{if(B>=K&&B<K+J&&W>=G&&W<G+j)qQ(Q,$,B,W,H,"arrow",z,U)};if(N.length===1){O(N[0].row,N[0].col,F.vLine);return}for(let B=0;B<N.length-1;B++){let W=N[B],H=N[B+1];if(W.col===H.col){for(let D=W.row;D<=H.row;D++)O(D,W.col,F.vLine);continue}let A=Math.round((W.row+H.row)/2),b=H.col>W.col;for(let D=W.row;D<A;D++)O(D,W.col,F.vLine);if(b)O(A,W.col,F.cornerBL);else O(A,W.col,F.cornerBR);let M=Math.min(W.col,H.col),g=Math.max(W.col,H.col);for(let D=M+1;D<g;D++)O(A,D,F.hLine);if(b)O(A,H.col,F.cornerTR);else O(A,H.col,F.cornerTL);for(let D=A+1;D<=H.row;D++)O(D,H.col,F.vLine)}}function f8(Q,$,Z,V,_,K,J,G){let j=[],F=0,z=0;for(let B=0;B<V.series.length;B++)if(V.series[B].type==="bar")j.push({symbol:J.bar,label:`Bar ${F+1}`,globalIdx:B}),F++;else j.push({symbol:J.hLine,label:`Line ${z+1}`,globalIdx:B}),z++;let U=0;for(let B=0;B<j.length;B++){if(B>0)U+=2;U+=2+j[B].label.length}let O=Math.max(0,Math.floor(K/2-U/2));for(let B=0;B<j.length;B++){if(B>0)O+=2;let W=j[B];qQ(Q,$,_,O,W.symbol,"arrow",Z,G[W.globalIdx]),O+=1,O+=1,bQ(Q,$,_,O,W.label,"text"),O+=W.label.length}}function b8(Q,$){return Array.from({length:Q},()=>Array.from({length:$},()=>" "))}function u8(Q,$){return Array.from({length:Q},()=>Array.from({length:$}).fill(null))}function x8(Q,$){return Array.from({length:Q},()=>Array.from({length:$}).fill(null))}function qQ(Q,$,Z,V,_,K,J,G){if(V>=0&&V<Q.length&&Z>=0&&Z<Q[0].length){if(Q[V][Z]=_,$[V][Z]=K,J&&G)J[V][Z]=G}}function m8(Q,$,Z){if(Z>=0&&Z<Q.length&&$>=0&&$<Q[0].length)return Q[Z][$];return" "}function bQ(Q,$,Z,V,_,K){for(let J=0;J<_.length;J++)qQ(Q,$,Z,V+J,_[J],K)}function p8(Q,$,Z,V,_){if(Q.length===0)return"";let K=Q[0].length,J=Q.length,G=[];for(let j=0;j<K;j++){let F=[],z=[],U=[];for(let O=0;O<J;O++)F.push(Q[O][j]),z.push($[O][j]),U.push(Z[O][j]);let N=F.length-1;while(N>=0&&F[N]===" ")N--;if(N<0)G.push("");else G.push(O$(F.slice(0,N+1),z.slice(0,N+1),U.slice(0,N+1),_,V))}while(G.length>0&&G[G.length-1]==="")G.pop();return G.join(`
12`)}function O$(Q,$,Z,V,_){if(_==="none")return Q.join("");let K="",J=null,G="";for(let j=0;j<Q.length;j++){let F=Q[j];if(F===" "){if(G.length>0)K+=J?$4(G,J,_):G,G="",J=null;K+=" ";continue}let z=Z[j]??null,U=$[j]??null,N=z??(U?G$(U,V):null);if(N===J)G+=F;else{if(G.length>0)K+=J?$4(G,J,_):G;G=F,J=N}}if(G.length>0)K+=J?$4(G,J,_):G;return K}function g8(Q){if(Q.xAxis.categories)return Q.xAxis.categories.length;for(let $ of Q.series)if($.data.length>0)return $.data.length;return 0}function h8(Q,$){if(Q.xAxis.categories)return Q.xAxis.categories;if(Q.xAxis.range){let{min:Z,max:V}=Q.xAxis.range,_=$>1?(V-Z)/($-1):0;return Array.from({length:$},(K,J)=>_4(Z+_*J))}return Array.from({length:$},(Z,V)=>String(V+1))}function c8(Q,$){let Z=$-Q;if(Z<=0)return[Q];let V=Z/6,_=Math.pow(10,Math.floor(Math.log10(V))),K=V/_,J;if(K<=1.5)J=_;else if(K<=3)J=2*_;else if(K<=7)J=5*_;else J=10*_;let G=Math.ceil(Q/J)*J,j=[];for(let F=G;F<=$+J*0.001;F+=J)j.push(Math.round(F*10000000000)/10000000000);return j}function _4(Q){if(Number.isInteger(Q))return String(Q);return Q.toFixed(Math.abs(Q)<10?1:0)}function U$(Q){let $=Q.trim().split(`
13`)[0]?.trim().toLowerCase()??"";if(/^xychart(-beta)?\b/.test($))return"xychart";if(/^sequencediagram\s*$/.test($))return"sequence";if(/^classdiagram\s*$/.test($))return"class";if(/^erdiagram\s*$/.test($))return"er";return"flowchart"}function B$(Q,$={}){let Z={useAscii:$.useAscii??!1,paddingX:$.paddingX??5,paddingY:$.paddingY??5,boxBorderPadding:$.boxBorderPadding??1,graphDirection:"TD"},V=$.colorMode==="auto"||$.colorMode===void 0?X4():$.colorMode,_={...eQ,...$.theme};switch(U$(Q)){case"xychart":return C8(Q,Z,V,_);case"sequence":return q8(Q,Z,V,_);case"class":return k8(Q,Z,V,_);case"er":return M8(Q,Z,V,_);case"flowchart":default:{let J=A4(Q);if(J.direction==="LR"||J.direction==="RL")Z.graphDirection="LR";else Z.graphDirection="TD";let G=m4(J,Z);if(W8(G),N8(G),J.direction==="BT")f4(G.canvas),b4(G.roleCanvas);return xQ(G.canvas,{roleCanvas:G.roleCanvas,colorMode:V,theme:_})}}}export{B$ as renderMermaidASCII};
14types/index.d.ts 12 lines1/** Whether a diagram shows its source instead of its drawing. */
2export type ShowCode = boolean
3
4declare module 'claude-code' {
5 interface PluginState {
6 'gfm-render': {
7 /** Per message and position of the diagram in it. */
8 showCode: StateFamily<ShowCode>
9 }
10 }
11}
12