@likec4/mcp 1.50.0 → 1.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/THIRD-PARTY-LICENSES.md +131 -226
- package/dist/_chunks/libs/@hono/mcp.mjs +9 -9
- package/dist/_chunks/libs/@hono/node-server.mjs +1 -1
- package/dist/_chunks/libs/@logtape/logtape.mjs +1 -1
- package/dist/_chunks/libs/chokidar.mjs +2 -2
- package/dist/_chunks/libs/langium.mjs +1 -1
- package/dist/_chunks/libs/mdast-util-from-markdown.mjs +1 -1
- package/dist/_chunks/libs/merge-error-cause.mjs +1 -1
- package/dist/_chunks/libs/nano-spawn.mjs +2 -2
- package/dist/_chunks/libs/pathe.mjs +1 -0
- package/dist/_chunks/libs/remeda.mjs +2 -2
- package/dist/_chunks/libs/tinyrainbow.mjs +1 -0
- package/dist/_chunks/libs/unified.mjs +1 -1
- package/dist/index.mjs +89 -76
- package/package.json +12 -10
- package/dist/_chunks/libs/@msgpack/msgpack.mjs +0 -1
- package/dist/_chunks/libs/@smithy/is-array-buffer.mjs +0 -1
- package/dist/_chunks/libs/@smithy/util-base64.mjs +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,27 +1,45 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{i as n,n as r,r as i,t as a}from"./_chunks/libs/@logtape/logtape.mjs";import{n as o,t as s}from"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import"./_chunks/libs/is-plain-obj.mjs";import{t as c}from"./_chunks/libs/safe-stringify.mjs";import{t as l}from"./_chunks/libs/defu.mjs";import{$ as u,A as d,B as f,C as p,D as m,E as h,F as g,G as ee,H as te,I as ne,J as re,K as ie,L as ae,M as oe,N as se,O as ce,P as le,Q as ue,R as de,S as fe,T as pe,U as me,V as he,W as ge,X as _e,Y as ve,Z as ye,_ as be,a as xe,at as Se,b as Ce,c as we,ct as Te,d as Ee,dt as De,et as Oe,f as ke,ft as Ae,g as je,h as Me,i as Ne,it as Pe,j as Fe,k as _,l as Ie,lt as Le,m as Re,n as ze,nt as v,o as Be,ot as Ve,p as He,q as Ue,r as We,rt as Ge,s as Ke,st as qe,t as Je,tt as Ye,u as Xe,ut as Ze,v as Qe,w as $e,x as et,y as tt,z as nt}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as rt}from"./_chunks/libs/json5.mjs";import{J as y,i as it,n as at,r as ot,t as st}from"./_chunks/libs/@hono/mcp.mjs";import{a as ct,c as lt,d as ut,f as dt,h as ft,i as pt,l as mt,m as ht,n as gt,o as _t,p as vt,r as yt,s as bt,t as xt,u as St}from"./_chunks/libs/@radix-ui/colors.mjs";import{$ as Ct,A as b,B as wt,C as Tt,D as x,E as Et,F as S,G as Dt,H as Ot,I as kt,J as At,K as jt,L as Mt,M as Nt,N as Pt,O as Ft,P as It,Q as C,R as Lt,S as Rt,T as zt,U as Bt,V as Vt,W as Ht,X as Ut,Y as Wt,Z as Gt,_ as Kt,a as qt,at as Jt,b as Yt,c as Xt,ct as w,d as Zt,dt as Qt,et as $t,f as en,ft as tn,g as T,h as nn,ht as rn,i as an,it as on,j as sn,k as cn,l as ln,lt as un,m as dn,mt as fn,n as pn,nt as mn,o as hn,ot as E,p as gn,pt as _n,q as vn,r as yn,rt as D,s as bn,st as xn,t as Sn,tt as Cn,u as wn,ut as Tn,v as En,w as Dn,x as On,y as kn,z as An}from"./_chunks/libs/remeda.mjs";import{t as jn}from"./_chunks/libs/natural-compare-lite.mjs";import{n as Mn,t as Nn}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as Pn,t as Fn}from"./_chunks/libs/graphology-dag.mjs";import{a as In,i as Ln,n as Rn,o as zn,r as Bn,s as Vn,t as Hn}from"./_chunks/libs/mnemonist.mjs";import{t as Un}from"./_chunks/libs/ohash.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import{n as Wn}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as Gn}from"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import{t as Kn}from"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import{l as qn,t as Jn}from"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import{t as Yn}from"./_chunks/libs/remark-gfm.mjs";import{t as Xn}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Zn}from"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import{t as Qn}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/trough.mjs";import{t as $n}from"./_chunks/libs/unified.mjs";import{n as er,t as tr}from"./_chunks/libs/immer.mjs";import{n as nr,t as rr}from"./_chunks/libs/fdir.mjs";import{t as ir}from"./_chunks/libs/chokidar.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as ar}from"./_chunks/libs/p-queue.mjs";import{a as or,c as O,d as k,f as sr,i as cr,l as A,n as lr,o as ur,p as dr,r as j,s as fr,t as pr,u as mr}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{a as hr,c as gr,d as _r,i as vr,l as yr,n as br,o as xr,r as Sr,s as Cr,t as wr,u as Tr}from"./_chunks/libs/ufo.mjs";import{t as Er}from"./_chunks/libs/@hono/node-server.mjs";import{t as Dr}from"./_chunks/libs/fast-equals.mjs";import{a as Or,i as kr,n as Ar,r as jr,t as Mr}from"./_chunks/libs/@lume/kiwi.mjs";import{n as Nr,r as Pr,t as M}from"./_chunks/libs/ts-graphviz.mjs";import{t as Fr}from"./_chunks/libs/word-wrap.mjs";import{n as Ir,r as Lr,t as Rr}from"./_chunks/libs/khroma.mjs";import{t as zr}from"./_chunks/libs/graphology.mjs";import{t as Br}from"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/parse-ms.mjs";import{t as Vr}from"./_chunks/libs/pretty-ms.mjs";import{t as Hr}from"./_chunks/libs/@msgpack/msgpack.mjs";import"./_chunks/libs/@smithy/is-array-buffer.mjs";import{t as Ur}from"./_chunks/libs/@smithy/util-base64.mjs";import{t as Wr}from"./_chunks/libs/strip-indent.mjs";import"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import{t as Gr}from"./_chunks/libs/which.mjs";import{n as Kr,t as qr}from"./_chunks/libs/citty.mjs";import{isColorSupported as Jr}from"std-env";import{basename as Yr,dirname as Xr,resolve as Zr}from"node:path";import{bundleRequire as Qr}from"bundle-require";import{formatMessagesSync as $r}from"esbuild";import*as ei from"node:fs/promises";import{unlink as ti,writeFile as ni}from"node:fs/promises";import{mkdirSync as ri,statSync as ii}from"node:fs";import"node:os";import{Graphviz as ai}from"@hpcc-js/wasm-graphviz";const oi=e=>e.split(`
|
|
3
|
-
`).map(e=>e.trim().replace(`file://`,``));function
|
|
2
|
+
import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{a as n,c as r,d as i,f as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g}from"./_chunks/libs/@radix-ui/colors.mjs";import{$ as _,A as ee,B as te,C as ne,D as re,E as ie,F as ae,G as oe,H as se,I as v,J as ce,K as le,L as ue,M as de,N as fe,O as y,P as pe,Q as me,R as he,S as ge,T as _e,U as ve,V as b,W as ye,X as be,Y as xe,Z as Se,_ as x,a as Ce,at as we,b as Te,c as Ee,ct as De,d as Oe,dt as ke,et as Ae,f as je,ft as Me,g as Ne,gt as Pe,h as Fe,ht as Ie,i as Le,it as S,j as C,k as Re,l as ze,lt as w,m as Be,mt as Ve,n as He,nt as Ue,o as We,ot as Ge,p as Ke,pt as qe,q as Je,r as Ye,rt as Xe,s as Ze,st as T,t as Qe,tt as $e,u as et,ut as tt,v as nt,w as rt,x as it,y as at,z as ot}from"./_chunks/libs/remeda.mjs";import{t as st}from"./_chunks/libs/natural-compare-lite.mjs";import{n as ct,t as lt}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as ut,t as dt}from"./_chunks/libs/graphology-dag.mjs";import{a as ft,i as pt,n as mt,o as ht,r as gt,s as _t,t as vt}from"./_chunks/libs/mnemonist.mjs";import{t as yt}from"./_chunks/libs/ohash.mjs";import{t as bt}from"./_chunks/libs/defu.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import{n as xt}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as St}from"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import{t as Ct}from"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import{l as wt,t as Tt}from"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import{t as Et}from"./_chunks/libs/remark-gfm.mjs";import{t as Dt}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Ot}from"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import{t as kt}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/is-plain-obj.mjs";import"./_chunks/libs/trough.mjs";import{t as At}from"./_chunks/libs/unified.mjs";import{n as jt,t as Mt}from"./_chunks/libs/immer.mjs";import{a as Nt,i as Pt,n as Ft,r as It,t as Lt}from"./_chunks/libs/@logtape/logtape.mjs";import{n as Rt,t as zt}from"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import{t as Bt}from"./_chunks/libs/safe-stringify.mjs";import{a as Vt,i as Ht,n as Ut,r as Wt,t as Gt}from"./_chunks/libs/@lume/kiwi.mjs";import{n as Kt,r as qt,t as E}from"./_chunks/libs/ts-graphviz.mjs";import{t as Jt}from"./_chunks/libs/word-wrap.mjs";import{n as Yt,r as Xt,t as Zt}from"./_chunks/libs/khroma.mjs";import{t as Qt}from"./_chunks/libs/graphology.mjs";import{t as $t}from"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as en}from"./_chunks/libs/p-queue.mjs";import{n as tn,t as nn}from"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import{t as rn}from"./_chunks/libs/which.mjs";import{$ as an,A as on,B as sn,C as cn,D as ln,E as un,F as dn,G as fn,H as pn,I as mn,J as hn,K as gn,L as _n,M as vn,N as yn,O as bn,P as xn,Q as Sn,R as Cn,S as wn,T as Tn,U as En,V as Dn,W as On,X as kn,Y as An,Z as jn,_ as Mn,a as Nn,at as Pn,b as Fn,c as In,ct as Ln,d as Rn,dt as zn,et as Bn,f as Vn,ft as Hn,g as Un,h as Wn,i as Gn,it as Kn,j as qn,k as Jn,l as Yn,lt as Xn,m as Zn,n as Qn,nt as $n,o as er,ot as tr,p as nr,pt as rr,q as ir,r as ar,rt as or,s as sr,st as cr,t as lr,tt as ur,u as dr,ut as fr,v as pr,w as mr,x as hr,y as gr,z as _r}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as vr}from"./_chunks/libs/json5.mjs";import{J as D,i as yr,n as br,r as xr,t as Sr}from"./_chunks/libs/@hono/mcp.mjs";import{n as Cr,t as wr}from"./_chunks/libs/fdir.mjs";import{t as Tr}from"./_chunks/libs/chokidar.mjs";import{a as Er,c as O,d as k,f as Dr,i as Or,l as A,n as kr,o as Ar,p as jr,r as j,s as Mr,t as Nr,u as Pr}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{a as Fr,c as Ir,d as Lr,i as Rr,l as zr,n as Br,o as Vr,r as Hr,s as Ur,t as Wr,u as Gr}from"./_chunks/libs/ufo.mjs";import"./_chunks/libs/parse-ms.mjs";import{t as Kr}from"./_chunks/libs/pretty-ms.mjs";import{t as qr}from"./_chunks/libs/@hono/node-server.mjs";import{t as Jr}from"./_chunks/libs/fast-equals.mjs";import{t as Yr}from"./_chunks/libs/strip-indent.mjs";import{n as Xr,t as Zr}from"./_chunks/libs/pathe.mjs";import{t as Qr}from"./_chunks/libs/tinyrainbow.mjs";import{n as $r,t as ei}from"./_chunks/libs/citty.mjs";import{basename as ti,dirname as ni,resolve as ri}from"node:path";import{Graphviz as ii}from"@hpcc-js/wasm-graphviz";import*as ai from"node:fs/promises";import{unlink as oi,writeFile as si}from"node:fs/promises";import ci from"node:os";import{pathToFileURL as li}from"url";import{isColorSupported as ui,isDevelopment as di}from"std-env";import{bundleRequire as fi}from"bundle-require";import{formatMessagesSync as pi}from"esbuild";import{mkdirSync as mi,statSync as hi}from"node:fs";const gi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},_i={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},vi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},yi={primary:gi,blue:gi,secondary:_i,sky:_i,muted:vi,slate:vi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},bi={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},xi={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},Si={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},Ci={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},wi={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:Si,gray:bi,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:xi,primary:Si,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:Ci,sky:Ci,slate:xi},Ti={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Ei=[`xs`,`sm`,`md`,`lg`,`xl`],Di=[`left`,`right`,`top`,`bottom`],Oi=[`solid`,`dashed`,`dotted`,`none`],ki=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Ai=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],ji=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Mi={tomato:f.tomato9,grass:s.grass9,blue:u.blue9,ruby:i.ruby9,orange:m.orange9,indigo:n.indigo9,pink:r.pink9,teal:a.teal9,purple:c.purple9,amber:h.amber9,crimson:p.crimson9,red:g.red9,lime:d.lime9,yellow:o.yellow9,violet:l.violet9};function Ni(e){return e in Mi}const Pi={colors:Ai.reduce((e,t)=>(e[t]={elements:yi[t],relationships:wi[t]},e),{}),...Ti};var Fi=t(st(),1);function Ii(e,t){return e===t?0:de(e)?de(t)?(0,Fi.default)(e,t):1:de(t)?-1:0}function Li(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Fi.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function M(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function N(e,t){if(!e)throw Error(t??`Invariant failed`)}function P(e){throw Error(`NonExhaustive value: ${e}`)}function Ri(e){let t=[],n=[];for(let[r,i]of we(e))C(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return w(n,Oe(Ii),y((e,t)=>({tag:e,spec:{color:M(ji[t%ji.length])}})),ke(t),Oe((e,t)=>Ii(e.tag,t.tag)),Ne(x(`tag`),x(`spec`)))}function zi(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,w(Qe(e,t),Ze(([e,t])=>n(e,t)),y(([e,t])=>e)))}function Bi(e){return e!=null&&typeof e==`string`}function Vi(e){return!!e&&Array.isArray(e)&&e.length>0}function Hi(...e){return(t=>e.some(e=>e(t)))}function Ui(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function Wi(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const Gi=e=>Bi(e)?e:e.id;function F(e,t){let n=Gi(e);return t?Gi(t).startsWith(n+`.`):e=>{let t=Gi(e);return n.startsWith(t+`.`)}}function Ki(e,t){if(!t)return t=>Ki(e,t);let n=Gi(e),r=Gi(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function qi(e,t){return t?F(t,e):t=>F(e,t)}function Ji(e){return(Bi(e)?e:e.id).split(`.`).length}function Yi(e,t){let n=Bi(e)?e:e.id,r=Bi(t)?t:t.id;if(n===r)return 0;let i=Ji(n),a=Ji(r);if(Ki(n,r))return Math.abs(i-a);let o=Xi(n,r),s=o?Ji(o):0;return i+a-(2*s+1)}function Xi(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function Zi(e){let t=e.split(`.`);if(t.pop(),!T(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function Qi(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function $i(e,t){return Qi(e.id,t.id)}function ea(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function ta(e,t){let n=t;for(let t of e)t!==n&&F(t,n)&&(n=t);return n===t?null:n}function na(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=ta(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function ra(e,t){if(!e||Bi(e)){let t=e??`asc`;return e=>ra(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=Ii(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function ia(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function aa(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function oa(e,t){let n=t??e;N(ot(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function sa(e,t){let n=t??e;N(ot(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function ca(e){return e?la(e):la}function*la(e){for(let t of e)yield*t}function ua(e){return e?da(e):da}function da(e){let{value:t}=e[Symbol.iterator]().next();return t}function fa(e,t){let n=t??e;N(ot(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function pa(e,t){let n=t??e;N(ot(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function I(e){return e?Array.from(e):e=>Array.from(e)}function ma(e){return e?new Set(e):e=>new Set(e)}function ha(e){return e?ga(e):ga}function*ga(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function L(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function _a(...e){let t=100;return e.length===2?t=Fe(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function va(){return Promise.resolve().then(()=>void 0)}function ya(e){Promise.resolve().then(e)}const ba=(e,t)=>{let n=Xi(e.source.id,e.target.id),r=Xi(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?Qi(n,r):0;if(i!==0)return i;let a=Qi(e.source.id,t.source.id);return a===0?Qi(e.target.id,t.target.id):a};function xa(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function Sa(e,...t){let n=new Set;if(e.size===0)return n;let r=T(t,2)?(0,ht.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function R(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function Ca(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function wa(e,t){return(0,ht.symmetricDifference)(e,t)}function Ta(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function Ea(e){return N(typeof e==`object`&&he(e),`objectHash: value must be an object`),yt(e)}function Da(e){let t=5381,n=e.length;N(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function Oa(){return At().use(Ot).use(Et).use(Dt).use(kt,{allowDangerousHtml:!0}).use(St,bt({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},xt)).use(Ct,{allowDangerousHtml:!0})}function ka(e){return(``+Oa().processSync(e)).trim()}function Aa(e){return wt(Tt(e),{includeHtml:!1,includeImageAlt:!1})}function ja(e){N(ct.valid(e),`Invalid color: ${e}`);let t=lt(e),n=t[6],r=Ma(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Ma(e){let t=ct(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=ct.contrastAPCA(t,n),s=ct.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!Je(n,i)||!Je(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const Na={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},Pa=Pi,Fa=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function z(e){return rt(e,e=>e===void 0)}function Ia(e){return e.summary??e.description}function La(e){return e.description??e.summary}function Ra(e,t){return e[za]===t}const za=`_stage`,Ba=`_type`,Va=`_layout`;function Ha(e){return e}function Ua(e){return typeof e==`string`?{txt:e}:e}function Wa(e){if(te(e))return null;let t=de(e)?e:e.txt??e.md;return C(t?.trim())?t:null}function Ga(e,t){return t?t+`.`+e:e}const Ka=`@group`;function qa(e){return e.kind===Ka}function Ja(e){return e}function Ya(e,t){return N(typeof e==`string`&&e!=``),`@`+e+`.`+t}function Xa(e){return e.startsWith(`@`)}function Za(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function Qa(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function $a(e){return e.startsWith(`step-`)}function eo(e){if(!$a(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let B;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(de(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return Ya(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(B||={});let V;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&B.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(V||={});let to;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(to||={});let no;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return to.isWhere(e)}e.isRelationWhere=n;function r(e){return V.isWhere(e)}e.isFqnExprWhere=r;function i(e){return V.is(e)||V.isWhere(e)||V.isCustom(e)}e.isFqnExpr=i;function a(e){return to.is(e)||to.isWhere(e)||to.isCustom(e)}e.isRelation=a})(no||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(H||={});let ro;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(ro||={});let io;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return ro.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return ro.is(e)||ro.isWhere(e)||ro.isCustom(e)}e.isRelationExpr=a})(io||={});function ao(e){return C(e.kind)&&!C(e.element)}function oo({size:e,padding:t,textSize:n,iconSize:r,...i},a=Po.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function so(e){return`tag`in e}function co(e){return`kind`in e}function lo(e){return`participant`in e}function uo(e){return`not`in e}function fo(e){return`and`in e}function po(e){return`or`in e}function mo(e){switch(!0){case lo(e):{let t=e.participant;return ho(t,mo(e.operator))}case so(e):{if(de(e.tag)||`eq`in e.tag){let t=de(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case co(e):{if(de(e.kind)||`eq`in e.kind){let t=de(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>v(e.kind)||e.kind!==t}case uo(e):return ue(mo(e.not));case fo(e):return Ie(e.and.map(mo));case po(e):return Ve(e.or.map(mo));default:P(e)}}function ho(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function go(e){return`include`in e||`exclude`in e}function _o(e){return`targets`in e&&`style`in e}function vo(e){return e._type===`element`}function yo(e){return vo(e)&&C(e.extends)}function bo(e){return e._type===`deployment`}function xo(e){return e._type===`dynamic`}function So(e){return`styleId`in e}function Co(e){return`predicateId`in e}function wo(e){return`direction`in e}function To(e){return $a(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function Eo(e){return!!e&&`__parallel`in e&&ye(e.__parallel)}function Do(e){return!!e&&`__series`in e&&ye(e.__series)}function Oo(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function ko(e){return`rank`in e&&Array.isArray(e.targets)}const Ao=Symbol.for(`text`),jo=Symbol.for(`html`);var Mo=class e{static mdcache=new pt.default(500);static txtcache=new pt.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return L(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:L(this,Ao,()=>Aa(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;P(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:L(this,jo,()=>ka(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function No(e,t){let n=t??6,r=ct(e.fill),i=ct(e.stroke),a=r.luminance()>.8,o=w(Qe(ct.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),ct.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),y(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return N(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Po={theme:Pa,defaults:Na};var Fo=class e{theme;defaults;static DEFAULT=new e(Po);static from(t,n){if(!t&&!n)return this.DEFAULT;let{customCss:r,theme:i,defaults:a}={...t},o=bt({theme:i},{defaults:{...a}},{theme:{colors:{...n}}},Po);return te(r?.content)&&Je(o,Po)?this.DEFAULT:new e(o,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;if(!e)return this.elementColors;if(!this.isThemeColor(e))throw Error(`Default group color not found in theme: ${e}`);return L(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements}))}isDefaultColor(e){return e===this.defaults.color}colors(e){return this.computeFrom(e??=this.defaults.color)}compoundColorsCache=new mt.default(e=>new vt.default(t=>No(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=oo(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){if(this.isThemeColor(e))return this.theme.colors[e];if(!ct.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return ja(e)}equals(e){return e===this?!0:this.constructor===e.constructor?Je(this.config,e.config)&&Je(this.customCss??null,e.customCss??null):!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:Ni(e)?this.computeFrom(Mi[e]).elements:this.computeFrom(e).elements}};function Io(e){return w(e,S(e=>!!e.notation),xe(x(`notation`)),ie(nt(xe(x(`shape`)),ie(nt(xe(x(`color`)),ie(nt(y(x(`kind`)),Ce())),we(),y(([e,t])=>({kinds:t,color:e})))),we(),_(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),we(),_(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),et(x(`shape`),x(`title`),[e=>e.kinds.length,`desc`]))}const Lo=(e,t)=>e===t||v(e)&&v(t)?!1:!Je(e,t);function Ro(e,t){e.color=t.color,e.kind=t.kind,e.navigateTo=t.navigateTo??null,e.links=t.links?[...t.links]:null,e.tags=[...t.tags],v(t.style.border)?delete e.style.border:e.style.border=t.style.border,ae(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,v(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function zo(e,t,n){if(Lo(t.icon??`none`,e.icon??`none`)){let r=C(e.icon)&&e.icon!==`none`;switch(!0){case r&&C(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(v(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&C(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function Bo(e,t,n){let r=!0;return Lo(e.style.iconColor,t.style.iconColor)&&(v(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),Lo(e.style.iconSize,t.style.iconSize)&&(n?v(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),Lo(e.style.iconPosition,t.style.iconPosition)&&(n?v(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}function Vo(e,t){return e?`md`in t?(e.md=t.md,delete e.txt,e):(`txt`in t&&(e.txt=t.txt,delete e.md),e):t}function Ho(e,t,n){let r=!0;return Lo(e.title,t.title)&&(n?e.title=t.title:r=!1),Lo(e.description,t.description)&&(v(t.description)?delete e.description:n?e.description=Vo(e.description,t.description):r=!1),Lo(e.technology,t.technology)&&(v(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function Uo(e,t,n){return e.title=t.title,v(t.description)?delete e.description:e.description=Vo(e.description,t.description),v(t.technology)?delete e.technology:e.technology=t.technology,!0}function Wo(e,t){N(e.id===t.id,`applyManualLayout: view ids do not match`),N(e._stage===`layouted`,`applyManualLayout: expected layouted view`),N(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),N(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=Go(t.nodes,e.nodes,n),i=Ko(t.edges,e.edges,n),a=Io(r);return jt(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[Va]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=Mt(r),o.edges=Mt(i),xo(e)&&o._type===`dynamic`&&(o.variant=e.variant),vo(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];T(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function Go(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),jt(e,r=>{Ro(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(Lo(r.modelRef,t.modelRef)||Lo(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),Lo(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;Lo(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),Bo(r,t,s)||i.add(`label-changed`),zo(r,t,s&&o===a)||i.add(`label-changed`),(a?Uo:Ho)(r,t,s)||i.add(`label-changed`),Lo(r.notes,t.notes)&&(v(t.notes)?delete r.notes:r.notes=Vo(r.notes,t.notes)),Lo(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&wa(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];T(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function Ko(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??w(r.values(),oa(t=>t.source===e.source&&t.target===e.target),ua());return t&&r.delete(t.id),jt(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:Lo(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default:N(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),N(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),N(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),Lo(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,Lo(e.notes,t.notes)&&(v(e.notes)!==v(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,Lo(Te(e,[`label`,`description`,`technology`,`labelBBox`]),Te(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),Lo(e.label,t.label)&&(v(t.label)!==v(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),Lo(e.description,t.description)&&(v(t.description)!==v(e.description)&&i.add(`label-changed`),t.description&&(r.description=Vo(e.description,t.description))),Lo(e.technology,t.technology)&&(v(t.technology)!==v(e.technology)&&i.add(`label-changed`),r.technology=t.technology??e.technology??null);break;default:N(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),N(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let o=[...i];T(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function qo(e,t){let{drifts:n,...r}=Wo(e,t);if(!n||n.length===0)return jt(e,e=>{delete e.drifts,e[Va]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),jt(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??w(o.values(),oa(t=>t.source===e.source&&t.target===e.target),ua());return t&&o.delete(t.id),jt(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return jt(e,e=>{T(l,1)?e.drifts=l:delete e.drifts,e.nodes=Mt(s),e.edges=Mt(c),e[Va]=`auto`})}const Jo=e=>e.split(`
|
|
3
|
+
`).map(e=>e.trim().replace(`file://`,``));function Yo(e,t=2){e=Array.isArray(e)?e:e.split(`
|
|
4
4
|
`);let n=` `.repeat(t);return e.map(e=>`${n}${e}`).join(`
|
|
5
|
-
`)}function
|
|
6
|
-
`+
|
|
7
|
-
`),[e]}return e===`error`||e===`err`?[Error(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
`)}),maxDepth:y.number().int().min(1).max(20).default(3).meta({description:[`Maximum directory depth to scan when searching for .c4 files in include paths.`,`Prevents excessive scanning of deeply nested directories.`,`Default: 3`].join(`
|
|
12
|
-
`)}),fileThreshold:y.number().int().min(1).max(1e4).default(30).meta({description:[`Maximum number of files to load from include paths before warning.`,`Helps identify performance issues from accidentally including large directories.`,`Default: 30`].join(`
|
|
5
|
+
`)}function U(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=zt(e);if(t.stack){let e=Jo(t.stack);return t.message+`
|
|
6
|
+
`+Yo(e.slice(1))}return t.message}return Bt(e,{indentation:` `})}function Xo(e,t){return Rt(e,t)}function Zo(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=zt(t);return e.stack&&=Jo(e.stack).join(`
|
|
7
|
+
`),[e]}return e===`error`||e===`err`?[Error(U(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function Qo(e){let t=Zo(e);return t&&typeof e.rawMessage==`string`?Rt(t,e.rawMessage+`
|
|
8
|
+
`):t}function $o(e,t=!1){let n=Zo(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
|
|
9
|
+
`+Yo(n.stack.split(`
|
|
10
|
+
`).slice(1))),t&&(r=`${as.red}${r}${is}`),{...e,message:e.message+`
|
|
11
|
+
`+Yo(r)}}return e}const es={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function ts(){return rs({format:({message:e})=>e})}const ns=e=>es[e];function rs(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return Pt({timestamp:`time`,level:ns,category:`.`,...e,format:e=>t($o(e))})}const is=`\x1B[0m`,as={red:`\x1B[31m`};function os(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return It({timestamp:`time`,level:ns,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t($o(e,!0))})}function ss(e){let t=e?.messageFormatter;return t?e=>{let{properties:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function cs(e){return Ft({formatter:ss(),...e})}function ls(e){let t=e?.formatter??ss();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const us=Nt(`likec4`);function ds(e){return us.getChild(e)}function fs(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:cs(),...t};Lt({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}function ps(e){return w(e,xe(e=>e.parallelPrefix??void 0),ie((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),Ye())}function ms(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>M(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new _t.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=_t.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(F(s.id,o.id)||s.id===o.id){n.pop();continue}if(!F(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var hs=class{#e=new Gt;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,Ht.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of ps(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,Ht.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,Ht.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,Ht.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Re(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=M(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=M(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),N(e>=0,`actor ${t} not found`)}return M(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return y(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,Ht.strong).before(i),this.put(s,Ht.strong).before(r),this.put(c,Ht.strong).after(a.right),this.put(l,Ht.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];N(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=ge(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=M(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Vt;return this.#e.addEditVariable(t,Ht.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,Ht.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,Ht.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,Ht.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,Ht.weak);break}}constraint(e,t,n=void 0,r=Ht.medium){let i;switch(t){case`==`:i=Wt.Eq;break;case`>=`:i=Wt.Ge;break;case`<=`:i=Wt.Le;break;case`== 0`:i=Wt.Eq,n=0;break;case`>= 0`:i=Wt.Ge,n=0;break;case`<= 0`:i=Wt.Le,n=0;break;default:P(t)}this.#e.addConstraint(new Ut(e,i,n??0,r))}put(e,t=Ht.required){let n=t===Ht.required?Ht.medium:Ht.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function gs(e){let t=new Set,n=t=>M(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>$a(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));N(T(i,1),`actors array must not be empty`);let a=new vt.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=To(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new hs({actors:i,steps:o,compounds:ms(i,e.nodes)}),l=c.getViewBounds(),u=w(c.getCompoundBoxes(),y(({node:e,...t})=>({...t,id:e.id,origin:e.id})),ce(`id`),ie((e,t)=>T(e,2)?y(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),Ye(),Ae());return{actors:i.map(e=>_s({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:y(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function _s({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var vs=t(Jt(),1);function ys(e){return e.children.length>0}function bs(e){switch(e){case`open`:return`vee`;default:return e}}function xs(e){return Array.isArray(e)?[xs(e[0]),xs(e[1])]:(N(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const Ss=e=>(N(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),W=e=>Math.ceil(e/72*1e3)/1e3,Cs=e=>Math.ceil(e);Cs(40).toString();function ws(e,t){return Xt(Zt(e,{l:-35-5*t,s:-15-5*t}))}function Ts(e){return Xt(Yt(e,.3))}function Es(e){return e.trim().replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`)}function Ds(e,{maxchars:t,maxLines:n,sanitize:r=le()}){let i=(0,vs.default)(e,{width:t,indent:``,escape:r}).split(`
|
|
12
|
+
`);return se(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function Os({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Ds(e,{maxchars:t,maxLines:r,sanitize:Es}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${Cs(n)}"${s}>${o}</FONT>`}function ks(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:P(e)}}function As(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=C(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[Os({text:e.title,fontsize:r.textSize,maxchars:ks(n),maxLines:a?1:3})];if(n!==`xs`){C(e.technology?.trim())&&l.push(Os({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Mo.from(e.description).text;t&&l.push(Os({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function js(e,t){let n=Os({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const Ms=`BGCOLOR="${Fo.DEFAULT.relationshipColors.labelBg}A0"`;function Ns({label:e,technology:t}){let n=[];return C(e?.trim())&&n.push(Os({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),C(t?.trim())&&n.push(Os({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Ms}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function Ps(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Ms}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${Cs(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return C(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Ms} CELLPADDING="3">`,Os({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const Fs=`dashed`,Is=`Arial`,Ls=ds(`dot`),Rs=50.1;var zs=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new Qt({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(ys).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=Yi(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(ys(e))t(e,i);else{let t=M(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(ys(t))v(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return qt(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=Kt({[E.likec4_viewId]:this.view.id,[E.bgcolor]:`transparent`,[E.layout]:`dot`,[E.compound]:!0,[E.rankdir]:e.direction,[E.TBbalance]:`min`,[E.splines]:`spline`,[E.outputorder]:`nodesfirst`,[E.nodesep]:W(e.nodeSep??110),[E.ranksep]:W(e.rankSep??120),[E.pad]:W(15),[E.fontname]:Is});return t.attributes.graph.apply({[E.fontsize]:Cs(this.styles.fontSize()),[E.labeljust]:e.direction===`RL`?`r`:`l`,[E.labelloc]:e.direction===`BT`?`b`:`t`,[E.margin]:Rs}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[E.fontname]:Is,[E.shape]:`rect`,[E.fillcolor]:t.fill,[E.fontcolor]:t.hiContrast,[E.color]:t.stroke,[E.style]:`filled`,[E.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[E.arrowsize]:.75,[E.fontname]:Is,[E.fontsize]:Cs(14),[E.penwidth]:Cs(2),[E.color]:t.line,[E.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=ys(e),n=Wi(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=Wi(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){N(ys(e),`node should be compound`),N(ae(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=Ts(n.loContrast);return t.apply({[E.likec4_id]:e.id,[E.likec4_level]:e.level,[E.likec4_depth]:e.depth,[E.fillcolor]:ws(n.fill,e.depth),[E.color]:ws(n.stroke,e.depth),[E.style]:`filled`,[E.margin]:Cs(e.children.length>1?40:32)}),b(e.title.trim())||t.set(E.label,js(e,r)),t}elementToNode(e,t){N(!ys(e),`node should not be compound`);let n=C(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[E.likec4_id]:e.id,[E.likec4_level]:e.level,[E.label]:As(e,this.styles),[E.margin]:`${W(s)},${W(i)}`}),t.attributes.set(E.width,W(a)),t.attributes.set(E.height,W(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[E.fillcolor]:r.fill,[E.fontcolor]:r.hiContrast,[E.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[E.margin]:`${W(s)},${W(0)}`,[E.penwidth]:Cs(2),[E.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[E.margin]:`${W(n?s:s+4)},${W(i+6)}`});break;case`mobile`:t.attributes.apply({[E.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`queue`:t.attributes.apply({[E.width]:W(a),[E.height]:W(o-8),[E.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`component`:t.attributes.apply({[E.width]:W(a+10),[E.margin]:`${W(s+20)},${W(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!ys(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return ys(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return M(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(N(ys(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,N(i,`subgraph ${e} not found`),n=M(t(this.leafElements(e)),`leaf element in ${e} not found`),r=M(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return w(this.descendants(e),_(e=>ke(e.inEdges,e.outEdges)),Ce(),De(ke(t.inEdges,t.outEdges)),y(e=>this.view.edges.find(t=>t.id===e)),S(C))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=w(this.view.nodes,S(ys),y(e=>e.id),Oe(Qi),je(),y(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),S(({edges:e})=>e.length>1&&e.length<8),Ee(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=M(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=M(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(E.group,n.id),i.attributes.set(E.group,n.id)}catch(e){Ls.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=W(i.center.x)+n,o=W(e-i.center.y);i.fixedsize?t.attributes.apply({[E.pos]:`${a},${o}!`,[E.pin]:!0,[E.width]:W(i.fixedsize.width),[E.height]:W(i.fixedsize.height),[E.fixedsize]:!0}):t.attributes.set(E.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(E.weight),e.attributes.delete(E.minlen),e.attributes.delete(E.constraint);return this.graphvizModel.apply({[E.layout]:`fdp`,[E.overlap]:`vpsc`,[E.sep]:`+50,50`,[E.esep]:`+10,10`,[E.start]:`random2`,[E.splines]:`compound`,[E.K]:10}),this.graphvizModel.delete(E.compound),this.graphvizModel.delete(E.rankdir),this.graphvizModel.delete(E.nodesep),this.graphvizModel.delete(E.ranksep),this.graphvizModel.delete(E.pack),this.graphvizModel.delete(E.pad),this.graphvizModel.delete(E.packmode),this.graphvizModel.attributes.graph.delete(E.margin),this}},Bs=class extends zs{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(E.TBbalance),e.apply({[E.nodesep]:W(t.nodeSep??130),[E.ranksep]:W(t.rankSep??130)}),e}postBuild(e){w(this.view.nodes,y(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),xe(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Ye(),y(e=>e),me(t=>{t.length<2||e.subgraph({[E.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(M(n).id)})}),We(()=>{e.set(E.newrank,!0),e.set(E.clusterrank,`global`),e.delete(E.pack),e.delete(E.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(E.margin,Cs(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,$e),u=he(l)||he(o),d=t.edge([a,c],{[E.likec4_id]:e.id,[E.style]:e.line??Fs});l&&d.attributes.set(E.lhead,l),o&&d.attributes.set(E.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(E.weight,f);let p=Ns(e);if(p&&d.attributes.set(u?E.xlabel:E.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[E.arrowtail]:`none`,[E.arrowhead]:`none`,[E.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[E.arrowhead]:bs(m),[E.arrowtail]:bs(e.tail??m),[E.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(E.constraint,!1),d):(m&&d.attributes.set(E.arrowhead,bs(m)),h!==`none`&&d.attributes.set(E.arrowtail,bs(h)),d)}},Vs=class extends zs{postBuild(e){e.delete(E.TBbalance),e.set(E.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Re(e)),[c,l,u]=this.edgeEndpoint(i,$e),d=t.edge([o,l],{[E.likec4_id]:e.id,[E.style]:e.line??Fs});if(u&&d.attributes.set(E.lhead,u),s&&d.attributes.set(E.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(C).join(`
|
|
13
|
+
`),p=Ps(eo(e.id),f);d.attributes.set(E.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[E.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[E.arrowtail]:bs(h),[E.dir]:`back`}),g!==`none`&&d.attributes.apply({[E.arrowhead]:bs(g),[E.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[E.arrowhead]:bs(h),[E.arrowtail]:bs(g),[E.dir]:`both`}),d):h===`none`?(d.attributes.delete(E.arrowhead),d.attributes.apply({[E.arrowtail]:bs(g),[E.minlen]:0,[E.dir]:`back`}),d):(d.attributes.set(E.arrowhead,bs(h)),d)}};const Hs=ds(`dot.rank`);var Us=class extends zs{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(ys(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=w(e.children,S(e=>!this.compoundIds.has(e)),y(e=>this.computedNode(e)),S(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=M(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;qe(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[E.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[E.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(E.newrank,!0),e.set(E.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[E.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,Hs.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,$e),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[E.likec4_id]:e.id,[E.style]:e.line??Fs});l&&f.attributes.set(E.lhead,l),o&&f.attributes.set(E.ltail,o);let p=he(l)||he(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(E.weight,d.weight);let m=Ns(e);if(m&&f.attributes.set(p?E.xlabel:E.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[E.arrowtail]:bs(h),[E.dir]:`back`}),g!==`none`&&f.attributes.apply({[E.arrowhead]:bs(g),[E.dir]:`both`,[E.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[E.arrowtail]:`none`,[E.arrowhead]:`none`,[E.dir]:`none`,[E.minlen]:0,[E.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[E.arrowhead]:bs(h),[E.arrowtail]:bs(g),[E.dir]:`both`}),f;if(f.attributes.set(E.arrowhead,bs(h)),g!==`none`&&f.attributes.set(E.arrowtail,bs(g)),this.view.edges.length===1)return f;let _;return _=u===null&&i.parent==null&&s.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let n=this.computedNode(t.source),r=this.computedNode(t.target);return ys(n)||ys(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),_.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(E.minlen,0),f}};function Ws(e){let[t,n,r,i]=e?e.split(`,`).map(e=>xs(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function Gs(e){try{let[t,n]=e.split(`,`);return{x:xs(parseFloat(t)),y:xs(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function Ks(e){let{x:t,y:n}=Gs(e.pos),r=Ss(parseFloat(e.width)),i=Ss(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function qs(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=xs(c.size);continue}if(c.op===`T`){let e=xs(c.pt[0])-t,l=xs(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=xs(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return us.warn(`Failed on parsing label draw ops:
|
|
14
|
+
{labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function Js({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);N(T(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&us.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>xs(e));return N(T(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function Ys(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=qs(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Ds(a,{maxchars:40,maxLines:5}).join(`
|
|
15
|
+
`):null,{id:t,source:n,target:r,label:a,...C(o)&&{description:o},points:Js(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function Xs(e,t){let n=Ws(e.bb),{nodes:r,edges:i,hasManualLayout:a,...o}=t,s=[],c=[],l;if(l=o._type===`dynamic`?{...o,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[za]:`layouted`,bounds:n,nodes:s,edges:c}:{...o,[za]:`layouted`,bounds:n,nodes:s,edges:c},a){let e=l;e[Va]=`auto`}let u=e.objects??[];for(let e of r){let t=u.find(t=>t.likec4_id===e.id);N(t,`View ${o.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?Ws(t.bb):Ks(t),o=[n,r];s.push({...e,x:n,y:r,width:i,height:a,labelBBox:qs(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let d=e.edges??[];for(let e of i){let t=d.find(t=>t.likec4_id===e.id);if(!t){us.warn`View ${o.id} edge ${e.id} not found in graphviz output, skipping`;continue}c.push(Ys(t,e,o.id))}return l}function Zs(e,t){return Xs(e,t)}var Qs=class e extends zs{static toDot(t){return new e(t).print()}constructor(e){super(e,Fo.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[E.nodesep]:W(100),[E.ranksep]:W(100)}),e.delete(E.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[E.likec4_id]:e.id,[E.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=M(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=M(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[E.likec4_id]:e.id,[E.likec4_project]:e.projectId,[E.style]:e.line??Fs});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(E.weight,i.weight);let o=Ns(e);if(o&&a.attributes.set(E.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}return a}};const $s=$t(1);var ec=class e{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ii.unload()}[Symbol.dispose](){this.dispose()}async attempt(t,n,r){return await $s(async()=>{let i=us.getChild([`graphviz`,`wasm`,t,Be(4)]);try{i.trace`execute`;let t=await r();return++e.opsCount>=20&&(e.opsCount=0,i.trace`reached 20 operations, unloading wasm`,ii.unload()),t}catch(t){i.debug(`FAILED DOT`,{dot:n}),i.error(U(t)),e.opsCount=0,ii.unload()}i.warn(`Retrying...`);try{return await _a(30,300),await r()}catch(e){return i.error(U(e)),Promise.reject(e)}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ii.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await ii.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ii.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ii.load()).layout(e,`svg`))}};const tc=({view:e,styles:t})=>{switch(!0){case xo(e):return new Vs(e,t);case bo(e):return new Bs(e,t);case vo(e):return new Us(e,t);default:P(e)}},nc=us.getChild(`layouter`);var rc=class{graphviz;constructor(e){this.graphviz=e??new ec,nc.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,nc.trace`change port to ${this.graphviz.name}`}async dotToJson(e){let t=nc.getChild([`dotToJson`,Be(3)]),n;try{n=await this.graphviz.layoutJson(e)}catch(n){throw t.error(U(n)),t.error`Failed to convert DOT to JSON:\n${e}`,n}try{return JSON.parse(n)}catch(r){throw t.error(U(r)),t.error`Failed to parse JSON:\n${n}\n. Generated from DOT:\n${e}`,r}}async layout(e){let t=nc.getChild([`layout`,Be(3)]);try{t.debug`layouting view ${e.view.id}...`;let n=await this.dot(e),{view:r}=e,i=Xs(await this.dotToJson(n),r);return xo(i)&&Object.assign(i,{sequenceLayout:gs(i)}),n=n.split(`
|
|
16
|
+
`).filter(e=>!(e.includes(`margin`)&&e.includes(`${Rs}`))).join(`
|
|
17
|
+
`),t.debug`layouting view ${e.view.id} done`,{dot:n,diagram:i}}catch(n){throw t.warn(U(n)),Xo(n,`Error during layout: ${e.view.id}`)}}async svg(e){let t=await this.dot(e);return t=t.split(`
|
|
18
|
+
`).filter(e=>!(e.includes(`margin`)&&e.includes(`${Rs}`))).join(`
|
|
19
|
+
`),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=nc.getChild([`dot`,Be(3)]);t.trace`generating dot for view ${e.view.id}`;let n=tc(e).print();if(!vo(e.view))return n;try{return t.trace`unflattening dot`,await this.graphviz.unflatten(n)}catch(r){return t.warn(`Error during unflatten: ${e.view.id}`,{error:r}),n}}async layoutProjectsView(e){let t=nc.getChild([`layoutProjectsView`,Be(3)]);t.debug`layouting projects overview...`;let n=new Qs(e).print();try{n=await this.graphviz.unflatten(n)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let r=await this.dotToJson(n);return t.debug`layouting projects overview done`,Zs(r,e)}};const ic=us.getChild([`layouter-queue`]);var ac=class extends rc{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new en({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=ic.getChild([`run`,Be(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await va(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),ic.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,ic.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=ic.getChild([`batch`,Be(3)]);if(this.isProcessingBatch)return t.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await va(),e.cancelToken?.isCancellationRequested?(t.debug`cancellation requested`,[]):(t.debug`retry`,await this.batchLayout(e));let n=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${n}`,this.isProcessingBatch=!0;let r=[];try{for(let i of e.batch)if(t.debug`add task for view ${i.view.id}`,this.queue.add(async()=>(n<=2&&await va(),await super.layout(i))).then(t=>{if(!t){e.onError?.(i,Error(`Layout queue returned null for view ${i.view.id}`));return}r.push(t),e.onSuccess?.(i,t)}).catch(n=>{t.error(`Fail layout view ${i.view.id}`,{err:n}),e.onError?.(i,n)}),await this.waitForQueueToShrink(n,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}}finally{let e=this.queue.pending+this.queue.size;e>0&&(t.trace`waiting ${e} tasks to finish`,await this.queue.onIdle()),t.debug`batch layout done`,this.isProcessingBatch=!1}return r}async waitForQueueToShrink(e=this.queue.concurrency,t=ic){this.queue.size>e+2&&(t.debug`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},oc=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=Za(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=Ji(r)):(this.imported=null,this.hierarchyLevel=Ji(this.id))}get name(){return Wi(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return L(this,Symbol.for(`tags`),()=>Ce([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!fe(this.$element.summary,this.$element.description)}get summary(){return Mo.memoize(this,`summary`,Ia(this.$element))}get description(){return Mo.memoize(this,`description`,La(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return L(this,Symbol.for(`defaultView`),()=>ua(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return L(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return F(this,e)}isDescendantOf(e){return F(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Xi(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?ra([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return L(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return L(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return L(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return L(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return C(ua(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!b(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},sc=class{Aux;get style(){return L(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$node.style}))}get name(){return Wi(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Mo.memoize(this,`summary`,Ia(this.$node))}get description(){return Mo.memoize(this,`description`,La(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Xi(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return L(this,Symbol.for(`allOutgoing`),()=>fc.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return L(this,Symbol.for(`allIncoming`),()=>fc.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!b(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},cc=class extends sc{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=Ji(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get tags(){return L(this,Symbol.for(`tags`),()=>Ce([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=ua(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return Sa(t,e)}},lc=class extends sc{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=Ji(t.id)}get $node(){return this.$instance}get parent(){return M(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return L(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.element.$element.style,...this.$instance.style}))}get tags(){return L(this,Symbol.for(`tags`),()=>Ce([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get summary(){return Mo.memoize(this,`summary`,Ia(this.$instance)??Ia(this.element.$element))}get description(){return Mo.memoize(this,`description`,La(this.$instance)??La(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},uc=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return L(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},dc=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=Xi(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return C(this.$relationship.title)?this.$relationship.title:null}get technology(){return te(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Mo.memoize(this,`summary`,Ia(this.$relationship))}get description(){return Mo.memoize(this,`description`,La(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!b(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},fc=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(Sa(this.model,t.model),Sa(this.deployment,t.deployment))}difference(t){return e.from(R(this.model,t.model),R(this.deployment,t.deployment))}union(t){return e.from(xa(this.model,t.model),xa(this.deployment,t.deployment))}};const G=e=>typeof e==`string`?e:e.id,pc=e=>{if(N(!e.includes(`
|
|
20
|
+
`),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return T(t,1)?t:[``]}return[e.trim()]},mc=e=>pc(e).join(`/`),hc=e=>{let t=pc(e);return T(t,2)?t.slice(0,-1).join(`/`):null},gc=e=>e.includes(`/`)?pc(e).pop()??e:e.trim();var _c=class{#e=new Map;#t=new Map;#n=new vt.default(()=>new Set);#r=new vt.default(()=>new Set);#i=new Set;#a=new Map;#o=new vt.default(()=>new Set);#s=new vt.default(()=>new Set);#c=new vt.default(()=>new Set);#l=new vt.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=Ye(t.elements);for(let e of na(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of Ye(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof cc||e instanceof lc)return e;let t=G(e);return M(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return N(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(N(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return N(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(N(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=G(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(B.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return ia(this.#u,`${t}@${n}`,()=>new uc(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=G(e);return M(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=G(e);return this.#t.get(t)||null}children(e){let t=G(e);return this.#n.get(t)}*siblings(e){let t=G(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=G(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=ao(e)?new cc(this,Object.freeze(e)):new lc(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=Ui(t.id);return n?(N(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(N(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new dc(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...Zi(n)])this.#c.get(e).add(t);for(let e of Zi(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of Zi(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},vc=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(B.flatten(t.source)),this.target=e.element(B.flatten(t.target));let n=Xi(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return te(this.$relationship.title)?null:this.$relationship.title}get technology(){return te(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Mo.memoize(this,`summary`,Ia(this.$relationship))}get description(){return Mo.memoize(this,`description`,La(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!b(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},yc=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Mo.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?eo(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return $a(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},bc=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Mo.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Mo.memoize(this,`notes`,this.$node.notes)}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return L(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return C(this.$node.modelRef)}hasDeployment(){return C(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return qa(this.$node)}isTagged(e){return this.tags.includes(e)}},xc=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new vt.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new bc(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new yc(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?gc(n.title):null,this.viewPath=n.title?mc(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Ba]}get stage(){return this.#e[za]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return L(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Mo.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?L(this,`withDriftReasons`,()=>qo(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?L(this,`snapshotWithManualLayout`,()=>Wo(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=G(e);return M(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(G(e))??null}findNodeWithElement(e){let t=G(e);return this.#i.has(t)?sa(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=G(e);return M(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(G(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(G(e))}includesDeployment(e){return this.#a.has(G(e))}includesRelation(e){return this.#o.has(G(e))}isComputed(){return this.#e[za]===`computed`}isLayouted(){return this.#e[za]===`layouted`}isDiagram(){return this.#e[za]===`layouted`}isElementView(){return this.#e[Ba]===`element`}isScopedElementView(){return this.#e[Ba]===`element`&&C(this.#e.viewOf)}isDeploymentView(){return this.#e[Ba]===`deployment`}isDynamicView(){return this.#e[Ba]===`dynamic`}},Sc=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Re(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return N(!this.isRoot,`Root view folder has no breadcrumbs`),L(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return N(!this.isRoot,`Root view folder has no parent`),te(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return L(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return L(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof xc&&e.push(t);return e})}},Cc=class e{Aux;_elements=new Map;_parents=new Map;_children=new vt.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new vt.default(()=>new Set);_outgoing=new vt.default(()=>new Set);_internal=new vt.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new vt.default(()=>new Set);_allTags=new vt.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[za]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of we(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of we(e.imports??{}))for(let e of na(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of Ye(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new _c(this),Ra(e,`computed`)||Ra(e,`layouted`)){let t=Li(`/`),n=w(Ye(e.views),y(e=>({view:e,path:mc(e.title??e.id),folderPath:e.title&&hc(e.title)||``})),Oe((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=ze(e,`/`);N(T(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new Sc(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||ze(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(b(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new xc(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new Sc(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return L(this,`styles`,()=>Fo.from(this.project.styles,this.specification.customColors))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[za]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??L(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return L(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof oc)return e;let t=G(e);return M(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(G(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=G(e),r=this._relations.get(n)??null;return r||t===`model`?M(r,`Model relation ${n} not found`):M(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(G(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=G(e);return M(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return M(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return N(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=G(e);return this._parents.get(t)||null}children(e){let t=G(e);return this._children.get(t)}*siblings(e){let t=G(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=G(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return L(this,`tags`,()=>Oe([...this._allTags.keys()],Ii))}get tagsSortedByUsage(){return L(this,`tagsSortedByUsage`,()=>w([...this._allTags.entries()],y(([e,t])=>({tag:e,count:t.size,tagged:t})),Oe((e,t)=>Ii(e.tag,t.tag)),et([x(`count`),`desc`])))}findByTag(e,t){return oa(this._allTags.get(e),e=>t===`elements`?e instanceof oc:t===`views`?e instanceof xc:t===`relationships`?e instanceof vc:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=mo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=mo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new oc(this,Object.freeze(e));this._elements.set(t.id,t);let n=Ui(t.id);return n?(N(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){N(!Xa(t.id),`Imported element already has global FQN`);let n=Ya(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new oc(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=Ui(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=Ui(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new vc(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=Xi(n.id,r.id);if(i)for(let e of[i,...Zi(i)])this._internal.get(e).add(t);for(let e of Zi(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of Zi(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Cc.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Cc||={});let wc;(function(e){e.isInside=e=>t=>F(e,t.source.id)&&F(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||F(e,n.source.id))&&(n.target.id===t||F(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||F(e,t.target.id))&&!F(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||F(e,t.source.id))&&!F(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(wc||={});const Tc=Symbol.for(`nodejs.util.inspect.custom`);var Ec=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Da(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[Tc](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
|
|
21
|
+
`)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(N(this.source.id===t.source.id,`Cannot merge connections with different sources`),N(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return N(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&Ca(this.relations.model,t.relations.model)&&Ca(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new fc(t.model??new Set,t.deployment??new Set):this.relations)}};function Dc(e,t){if(!t){let t=e;return e=>Dc(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=F(t.source.id,e.source.id),a=F(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function Oc(e,t){let n=t;for(let t of e)Dc(t,n)&&(n=t);return n===t?null:n}function kc(e){return e.boundary?.id?`.${e.boundary.id}`:``}function Ac(e,t){if(!e||Bi(e)){let t=e??`asc`;return e=>jc(e,t)}return jc(e,t??`asc`)}function jc(e,t){return w(e,y(e=>({id:kc(e),conn:e})),ra(t),y(e=>e.conn))}function Mc(e,t){return e.filter(e=>Dc(t,e))}function Nc(e,t){return e.filter(Dc(t))}function Pc(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Fc(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function Ic(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Lc(e,t){if(!t){let t=e;return e=>Lc(e,t)}let n=e;return qi(n.source,t)&&!qi(n.target,t)}function Rc(e,t){if(!t){let t=e;return e=>Rc(e,t)}let n=e;return qi(n.target,t)&&!qi(n.source,t)}function zc(e,t){if(!t){let t=e;return e=>zc(e,t)}let n=e;return qi(n.source,t)!==qi(n.target,t)}var Bc=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Da(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&pa(this.relations,ue(Ic(this)))}get directRelations(){return new Set(oa(this.relations,Ic(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return N(this.source.id===t.source.id,`Cannot merge connections with different sources`),N(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,xa(this.relations,t.relations))}difference(t){return new e(this.source,this.target,R(this.relations,t.relations))}intersect(t){return N(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,Sa(this.relations,t.relations))}equals(t){N(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&Ca(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[Tc](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
|
|
22
|
+
`)}reversed(){return new e(this.target,this.source)}},Vc=e({findConnection:()=>Hc,findConnectionsBetween:()=>Uc,findConnectionsWithin:()=>Wc});function Hc(e,t,n=`directed`){if(e===t||Ki(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new Ec(e,t,r)]:[];return n===`directed`?i:[...i,...Hc(t,e,`directed`)]}function Uc(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Hc(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Wc(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Uc(t,r.slice(n+1),`both`)),e),[])}var Gc=e({findConnection:()=>Kc,findConnectionsBetween:()=>qc,findConnectionsWithin:()=>Jc});function Kc(e,t,n=`directed`){if(e===t||Ki(e,t))return[];let r=Sa(e.allOutgoing,t.allIncoming),i=r.size>0?new Bc(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=Sa(e.allIncoming,t.allOutgoing),o=a.size>0?new Bc(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function qc(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Kc(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Jc(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...qc(t,r.slice(n+1),`both`)),e),[])}function Yc(e){return e instanceof cc}function Xc(e){return e instanceof lc}function Zc(e){return Yc(e)||Xc(e)}function Qc(e){return e instanceof uc}function $c(e){return e instanceof oc}var el=t(rn(),1);const tl=us.getChild([`graphviz`,`binary`]);var nl=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,ci.availableParallelism()-2)}get dotpath(){return this._dotpath??L(this,`_dotpath`,()=>{let e=el.default.sync(`dot`);return tl.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??L(this,`_unflattenpath`,()=>{let e=el.default.sync(`unflatten`);return tl.debug`Found ${e}`,e})}async unflatten(e){let t,n=tl.getChild([`unflatten`,Be(4)]);try{let r=await nn(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=r.stdout,b(r.stderr)?n.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):n.warn(`{command} has stderr:
|
|
23
|
+
`+r.stderr,{command:r.command})}catch(r){n.debug(`FAILED DOT`,{dot:e}),n.error(U(r)),r instanceof tn&&!b(r.stdout)&&(n.warn(`{command} returned result but failed with exitcode {exitCode}:
|
|
24
|
+
{stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),t=r.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=tl.getChild([`layoutJson`,Be(4)]),n;try{let r=await nn(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,b(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
|
|
25
|
+
`+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof tn&&!b(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
|
|
26
|
+
{stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=tl.getChild([`svg`,Be(4)]),n;try{let r=await nn(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,b(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
|
|
27
|
+
`+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof tn&&!b(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
|
|
28
|
+
{stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}};const K=us.getChild(`server`);function q(e){K.warn(U(e))}function rl(e){let t=ts();return n=>{try{switch(n.level){case`error`:case`fatal`:{let r=n.category.join(`.`);if(r===`likec4.config`)break;let i=Qo(n);i?e.telemetry.logEvent({eventName:`error`,message:`${i.name}: ${i.message}`,category:r,...i.stack&&{stack:i.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(n),category:r});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function il({lspConnection:e,enableTelemetry:t=!!e,useStdErr:n=!1,logLevel:r=di?`debug`:`warning`,nonBlocking:i=!1,colors:a=!1}={}){let o=!!e&&t&&!di;fs({reset:!0,sinks:{console:n?ls({formatter:rs()}):cs({formatter:a?os():rs(),nonBlocking:i}),...o&&{telemetry:rl(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...o?[`telemetry`]:[]],lowestLevel:r}]}),K.trace(`logger configured`)}const al=/^@[A-Za-z0-9_-]*$/,ol=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,sl=D.string().min(1,`Image alias key cannot be empty`).regex(al,`Image alias key must match /^@\\w+$/`),cl=D.string().min(1,`Image alias value cannot be empty`).regex(ol,`Image alias value must be a relative path (no leading slash or protocol)`),ll=D.record(sl,cl).meta({id:`ImageAliases`,description:`Map of image alias prefixes to relative paths (keys must match /^@\\w+$/; values must be relative paths without protocol or leading slash).`}),ul=D.string().min(1,`Include path cannot be empty`).regex(/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,`Include path must be a relative path (no leading slash, drive letter, or protocol)`),dl=D.strictObject({paths:D.array(ul).meta({description:[`Additional relative directory paths to include LikeC4 source files from, searched recursively.`,`Paths are relative to the project folder (the folder containing this config file).`,`Example: ["../shared", "../common/specs"]`].join(`
|
|
29
|
+
`)}),maxDepth:D.number().int().min(1).max(20).default(3).meta({description:[`Maximum directory depth to scan when searching for .c4 files in include paths.`,`Prevents excessive scanning of deeply nested directories.`,`Default: 3`].join(`
|
|
30
|
+
`)}),fileThreshold:D.number().int().min(1).max(1e4).default(30).meta({description:[`Maximum number of files to load from include paths before warning.`,`Helps identify performance issues from accidentally including large directories.`,`Default: 30`].join(`
|
|
13
31
|
`)})}).meta({id:`include-config`,description:[`Configuration for including additional LikeC4 source files from other directories.`,`Example: { "paths": ["../shared", "../common/specs"], "maxDepth": 5, "fileThreshold": 50 }`].join(`
|
|
14
|
-
`)}),Ai={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},ji={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},Mi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},Ni={primary:Ai,blue:Ai,secondary:ji,sky:ji,muted:Mi,slate:Mi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},Pi={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},Fi={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},Ii={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},Li={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},Ri={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:Ii,gray:Pi,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:Fi,primary:Ii,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:Li,sky:Li,slate:Fi},zi={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Bi=[`xs`,`sm`,`md`,`lg`,`xl`],Vi=[`left`,`right`,`top`,`bottom`],Hi=[`solid`,`dashed`,`dotted`,`none`],Ui=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Wi=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Gi=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Ki={tomato:vt.tomato9,grass:pt.grass9,blue:gt.blue9,ruby:ut.ruby9,orange:bt.orange9,indigo:ct.indigo9,pink:lt.pink9,teal:dt.teal9,purple:mt.purple9,amber:xt.amber9,crimson:yt.crimson9,red:St.red9,lime:_t.lime9,yellow:ft.yellow9,violet:ht.violet9};function qi(e){return e in Ki}const Ji={colors:Wi.reduce((e,t)=>(e[t]={elements:Ni[t],relationships:Ri[t]},e),{}),...zi};var Yi=t(jn(),1);function Xi(e,t){return e===t?0:sn(e)?sn(t)?(0,Yi.default)(e,t):1:sn(t)?-1:0}function Zi(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Yi.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function N(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function P(e,t){if(!e)throw Error(t??`Invariant failed`)}function F(e){throw Error(`NonExhaustive value: ${e}`)}function Qi(e){let t=[],n=[];for(let[r,i]of on(e))b(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return w(n,Zt(Xi),x((e,t)=>({tag:e,spec:{color:N(Gi[t%Gi.length])}})),Tn(t),Zt((e,t)=>Xi(e.tag,t.tag)),nn(T(`tag`),T(`spec`)))}function $i(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,w(Sn(e,t),bn(([e,t])=>n(e,t)),x(([e,t])=>e)))}function ea(e){return e!=null&&typeof e==`string`}function ta(e){return!!e&&Array.isArray(e)&&e.length>0}function na(...e){return(t=>e.some(e=>e(t)))}function ra(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function ia(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const aa=e=>ea(e)?e:e.id;function I(e,t){let n=aa(e);return t?aa(t).startsWith(n+`.`):e=>{let t=aa(e);return n.startsWith(t+`.`)}}function oa(e,t){if(!t)return t=>oa(e,t);let n=aa(e),r=aa(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function sa(e,t){return t?I(t,e):t=>I(e,t)}function ca(e){return(ea(e)?e:e.id).split(`.`).length}function la(e,t){let n=ea(e)?e:e.id,r=ea(t)?t:t.id;if(n===r)return 0;let i=ca(n),a=ca(r);if(oa(n,r))return Math.abs(i-a);let o=ua(n,r),s=o?ca(o):0;return i+a-(2*s+1)}function ua(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function da(e){let t=e.split(`.`);if(t.pop(),!E(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function fa(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function pa(e,t){return fa(e.id,t.id)}function ma(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function ha(e,t){let n=t;for(let t of e)t!==n&&I(t,n)&&(n=t);return n===t?null:n}function ga(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=ha(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function _a(e,t){if(!e||ea(e)){let t=e??`asc`;return e=>_a(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=Xi(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function va(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function ya(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ba(e,t){let n=t??e;P(Lt(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function xa(e,t){let n=t??e;P(Lt(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function Sa(e){return e?Ca(e):Ca}function*Ca(e){for(let t of e)yield*t}function wa(e){return e?Ta(e):Ta}function Ta(e){let{value:t}=e[Symbol.iterator]().next();return t}function Ea(e,t){let n=t??e;P(Lt(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function Da(e,t){let n=t??e;P(Lt(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function L(e){return e?Array.from(e):e=>Array.from(e)}function Oa(e){return e?new Set(e):e=>new Set(e)}function ka(e){return e?Aa(e):Aa}function*Aa(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function R(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function ja(...e){let t=100;return e.length===2?t=dn(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function Ma(){return Promise.resolve().then(()=>void 0)}function Na(e){Promise.resolve().then(e)}const Pa=(e,t)=>{let n=ua(e.source.id,e.target.id),r=ua(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?fa(n,r):0;if(i!==0)return i;let a=fa(e.source.id,t.source.id);return a===0?fa(e.target.id,t.target.id):a};function Fa(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function Ia(e,...t){let n=new Set;if(e.size===0)return n;let r=E(t,2)?(0,zn.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function z(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function La(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function Ra(e,t){return(0,zn.symmetricDifference)(e,t)}function za(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function Ba(e){return P(typeof e==`object`&&Mt(e),`objectHash: value must be an object`),Un(e)}function Va(e){let t=5381,n=e.length;P(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function Ha(){return $n().use(Zn).use(Yn).use(Xn).use(Qn,{allowDangerousHtml:!0}).use(Gn,l({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},Wn)).use(Kn,{allowDangerousHtml:!0})}function Ua(e){return(``+Ha().processSync(e)).trim()}function Wa(e){return qn(Jn(e),{includeHtml:!1,includeImageAlt:!1})}function Ga(e){P(Mn.valid(e),`Invalid color: ${e}`);let t=Nn(e),n=t[6],r=Ka(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Ka(e){let t=Mn(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=Mn.contrastAPCA(t,n),s=Mn.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!jt(n,i)||!jt(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const qa={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},Ja=Ji,Ya=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function B(e){return Tt(e,e=>e===void 0)}function Xa(e){return e.summary??e.description}function Za(e){return e.description??e.summary}const Qa={center({x:e,y:t,width:n,height:r}){return{x:e+n/2,y:t+r/2}},toPoints({x:e,y:t,width:n,height:r}){return[{x:e,y:t},{x:e+n,y:t},{x:e+n,y:t+r},{x:e,y:t+r}]},fromPoints(e){let{x1:t,y1:n,x2:r,y2:i}=$a.fromPoints(e);return{x:t,y:n,width:r-t,height:i-n}},merge(...e){if(P(E(e,1),`No boxes provided`),e.length===1)return e[0];let t=e[0].x,n=e[0].y,r=e[0].x+e[0].width,i=e[0].y+e[0].height;for(let a=1;a<e.length;a++){let o=e[a];t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x+o.width),i=Math.max(i,o.y+o.height)}return{x:Math.floor(t),y:Math.floor(n),width:Math.round(r-t),height:Math.round(i-n)}},fromRectBox(e){return{x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x2-e.x1),height:Math.abs(e.y2-e.y1)}},toRectBox(e){return{x1:e.x,y1:e.y,x2:e.x+e.width,y2:e.y+e.height}},expand(e,t){return t===0?e:{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}},shrink(e,t){return t===0?e:{x:e.x+t,y:e.y+t,width:e.width-t*2,height:e.height-t*2}},includes(e,t){return e===t?!0:e.x<=t.x&&e.y<=t.y&&e.x+e.width>=t.x+t.width&&e.y+e.height>=t.y+t.height}},$a={center({x1:e,y1:t,x2:n,y2:r}){return{x:(e+n)/2,y:(t+r)/2}},fromPoints(e){P(e.length>0,`At least one point is required`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let[a,o]of e)t=Math.min(t,a),n=Math.min(n,o),r=Math.max(r,a),i=Math.max(i,o);return{x1:t,y1:n,x2:r,y2:i}},merge(...e){P(e.length>0,`No boxes provided`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x1),n=Math.min(n,a.y1),r=Math.max(r,a.x2),i=Math.max(i,a.y2);return{x1:t,y1:n,x2:r,y2:i}},toBBox(e){return{x:e.x1,y:e.y1,width:e.x2-e.x1,height:e.y2-e.y1}},includes(e,t){return e===t?!0:e.x1<=t.x1&&e.y1<=t.y1&&e.x2>=t.x2&&e.y2>=t.y2}};var eo=class e{constructor(e,t){this.x=e,this.y=t,P(typeof e==`number`&&!isNaN(e)&&isFinite(e)&&typeof t==`number`&&!isNaN(t)&&isFinite(t),`Invalid arguments for Vector: (${e}, ${t})`)}static create(...t){return t.length===2?new e(t[0],t[1]):new e(t[0].x,t[0].y)}static add(e,t){return{x:e.x+t.x,y:e.y+t.y}}static subtract(e,t){return{x:e.x-t.x,y:e.y-t.y}}static multiply(e,t){return{x:e.x*t,y:e.y*t}}static divide(e,t){return{x:e.x/t,y:e.y/t}}static dot(e,t){return e.x*t.x+e.y*t.y}add(t){return new e(this.x+t.x,this.y+t.y)}subtract(t){return new e(this.x-t.x,this.y-t.y)}multiply(t){return new e(this.x*t,this.y*t)}divide(t){return new e(this.x/t,this.y/t)}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}length(){return this.x===0&&this.y===0?0:Math.sqrt(this.x**2+this.y**2)}normalize(){let t=this.length();return t===0?new e(0,0):new e(this.x/t,this.y/t)}round(){return new e(Math.round(this.x),Math.round(this.y))}trunc(){return new e(Math.trunc(this.x),Math.trunc(this.y))}toObject(){return{x:this.x,y:this.y}}};function to(e,t){return e[no]===t}const no=`_stage`,ro=`_type`,io=`_layout`;function ao(e){return e}function oo(e){return typeof e==`string`?{txt:e}:e}function so(e){if(An(e))return null;let t=sn(e)?e:e.txt??e.md;return b(t?.trim())?t:null}function co(e,t){return t?t+`.`+e:e}const lo=`@group`;function uo(e){return e.kind===lo}function fo(e){return e}function po(e,t){return P(typeof e==`string`&&e!=``),`@`+e+`.`+t}function mo(e){return e.startsWith(`@`)}function ho(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function go(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function _o(e){return e.startsWith(`step-`)}function vo(e){if(!_o(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let V;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(sn(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return po(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(V||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&V.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(H||={});let yo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(yo||={});let bo;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return yo.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return yo.is(e)||yo.isWhere(e)||yo.isCustom(e)}e.isRelation=a})(bo||={});let U;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&V.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(U||={});let xo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(xo||={});let So;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return xo.isWhere(e)}e.isRelationWhere=n;function r(e){return U.isWhere(e)}e.isFqnExprWhere=r;function i(e){return U.is(e)||U.isWhere(e)||U.isCustom(e)}e.isFqnExpr=i;function a(e){return xo.is(e)||xo.isWhere(e)||xo.isCustom(e)}e.isRelationExpr=a})(So||={});function Co(e){return b(e.kind)&&!b(e.element)}function wo({size:e,padding:t,textSize:n,iconSize:r,...i},a=Qo.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function To(e){return`tag`in e}function Eo(e){return`kind`in e}function Do(e){return`participant`in e}function Oo(e){return`not`in e}function ko(e){return`and`in e}function Ao(e){return`or`in e}function jo(e){switch(!0){case Do(e):{let t=e.participant;return Mo(t,jo(e.operator))}case To(e):{if(sn(e.tag)||`eq`in e.tag){let t=sn(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case Eo(e):{if(sn(e.kind)||`eq`in e.kind){let t=sn(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>S(e.kind)||e.kind!==t}case Oo(e):return kt(jo(e.not));case ko(e):return fn(e.and.map(jo));case Ao(e):return _n(e.or.map(jo));default:F(e)}}function Mo(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function No(e){return`include`in e||`exclude`in e}function Po(e){return`targets`in e&&`style`in e}function Fo(e){return e._type===`element`}function Io(e){return Fo(e)&&b(e.extends)}function Lo(e){return e._type===`deployment`}function Ro(e){return e._type===`dynamic`}function zo(e){return`styleId`in e}function Bo(e){return`predicateId`in e}function Vo(e){return e===`TB`||e===`BT`||e===`LR`||e===`RL`}function Ho(e){return`direction`in e}function Uo(e){return _o(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function Wo(e){return!!e&&`__parallel`in e&&Bt(e.__parallel)}function Go(e){return!!e&&`__series`in e&&Bt(e.__series)}function Ko(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function qo(e){return`rank`in e&&Array.isArray(e.targets)}const Jo=Symbol.for(`text`),Yo=Symbol.for(`html`);var Xo=class e{static mdcache=new Ln.default(500);static txtcache=new Ln.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return R(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Jo,()=>Wa(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;F(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Yo,()=>Ua(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function Zo(e,t){let n=t??6,r=Mn(e.fill),i=Mn(e.stroke),a=r.luminance()>.8,o=w(Sn(Mn.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),Mn.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),x(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return P(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Qo={theme:Ja,defaults:qa};var $o=class e{theme;defaults;static DEFAULT=new e(Qo);static from(t,n){if(!t&&!n)return this.DEFAULT;let{customCss:r,theme:i,defaults:a}={...t},o=l({theme:i},{defaults:{...a}},{theme:{colors:{...n}}},Qo);return An(r?.content)&&jt(o,Qo)?this.DEFAULT:new e(o,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;if(!e)return this.elementColors;if(!this.isThemeColor(e))throw Error(`Default group color not found in theme: ${e}`);return R(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements}))}isDefaultColor(e){return e===this.defaults.color}colors(e){return this.computeFrom(e??=this.defaults.color)}compoundColorsCache=new Rn.default(e=>new Hn.default(t=>Zo(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=wo(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){if(this.isThemeColor(e))return this.theme.colors[e];if(!Mn.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return Ga(e)}equals(e){return e===this?!0:this.constructor===e.constructor?jt(this.config,e.config)&&jt(this.customCss??null,e.customCss??null):!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:qi(e)?this.computeFrom(Ki[e]).elements:this.computeFrom(e).elements}};const es=y.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),ts=y.enum(Ui).meta({id:`ElementShape`}),ns=y.enum(Hi).meta({id:`BorderStyle`}),rs=y.enum(Bi).meta({id:`ElementSize`}),is=y.enum(Vi).meta({id:`IconPosition`}),as=y.enum(Ya).meta({id:`ArrowType`}),os=y.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),ss=y.enum(Wi).meta({id:`ThemeColorName`}),cs=y.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),ls=ss.or(cs).transform(e=>e).meta({id:`ColorName`}),us=y.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),ds=y.strictObject({fill:us.meta({description:`Background color`}),stroke:us.meta({description:`Stroke color (border, paths above background)`}),hiContrast:us.meta({description:`High contrast text color (title)`}),loContrast:us.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),fs=y.strictObject({line:us.meta({description:`Line color`}),label:us.meta({description:`Label text color`}),labelBg:us.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),ps=y.strictObject({elements:ds.or(us.transform(e=>Ga(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:fs.or(us.transform(e=>Ga(e).relationships)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`})}).transform(e=>e).meta({id:`StrictThemeColorValues`,description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color value`}).or(us.transform(e=>Ga(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),ms=y.partialRecord(ls,ps).transform(e=>e),hs=y.strictObject({width:y.number().min(50),height:y.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),gs=y.partialRecord(rs,hs),_s=y.strictObject({colors:ms.optional().meta({description:`Override theme colors`}),sizes:gs.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>B({colors:e?B(e):void 0,sizes:t?B(t):void 0})),vs=y.strictObject({color:ls.optional().meta({description:`Default color for groups
|
|
15
|
-
(must be a valid color name from the theme)`}),opacity:
|
|
16
|
-
(must be a valid color name from the theme)`}),line:
|
|
17
|
-
These values will be used if such property is not defined`}),
|
|
18
|
-
(must be a valid color name from the theme)`}),opacity:
|
|
19
|
-
These values will be used if such property is not defined`}),relationship:
|
|
20
|
-
These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),
|
|
21
|
-
These values will be used if such property is not defined`}),customCss:
|
|
22
|
-
`)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),
|
|
23
|
-
`)}),implicitViews:
|
|
24
|
-
`+
|
|
32
|
+
`)}),fl=D.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),pl=D.enum(ki).meta({id:`ElementShape`}),ml=D.enum(Oi).meta({id:`BorderStyle`}),hl=D.enum(Ei).meta({id:`ElementSize`}),gl=D.enum(Di).meta({id:`IconPosition`}),_l=D.enum(Fa).meta({id:`ArrowType`}),vl=D.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),yl=D.enum(Ai).meta({id:`ThemeColorName`}),bl=D.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),xl=yl.or(bl).transform(e=>e).meta({id:`ColorName`}),Sl=D.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),Cl=D.strictObject({fill:Sl.meta({description:`Background color`}),stroke:Sl.meta({description:`Stroke color (border, paths above background)`}),hiContrast:Sl.meta({description:`High contrast text color (title)`}),loContrast:Sl.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),wl=D.strictObject({line:Sl.meta({description:`Line color`}),label:Sl.meta({description:`Label text color`}),labelBg:Sl.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),Tl=D.strictObject({elements:Cl.or(Sl.transform(e=>ja(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:wl.or(Sl.transform(e=>ja(e).relationships)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`})}).transform(e=>e).meta({id:`StrictThemeColorValues`,description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color value`}).or(Sl.transform(e=>ja(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),El=D.partialRecord(xl,Tl).transform(e=>e),Dl=D.strictObject({width:D.number().min(50),height:D.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),Ol=D.partialRecord(hl,Dl),kl=D.strictObject({colors:El.optional().meta({description:`Override theme colors`}),sizes:Ol.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>z({colors:e?z(e):void 0,sizes:t?z(t):void 0})),Al=D.strictObject({color:xl.optional().meta({description:`Default color for groups
|
|
33
|
+
(must be a valid color name from the theme)`}),opacity:fl.optional().meta({description:`Default opacity for groups`}),border:ml.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),jl=D.strictObject({color:xl.optional().meta({description:`Default color for relationships
|
|
34
|
+
(must be a valid color name from the theme)`}),line:vl.optional().meta({description:`Default line style for relationships`}),arrow:_l.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
|
|
35
|
+
These values will be used if such property is not defined`}),Ml=D.strictObject({color:xl.optional().meta({description:`Default color for elements
|
|
36
|
+
(must be a valid color name from the theme)`}),opacity:fl.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:ml.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:hl.optional().meta({description:`Default size for elements`}),shape:pl.optional().meta({description:`Default shape for elements`}),iconPosition:gl.optional().meta({description:`Default icon position for elements`}),group:Al.optional().meta({description:`Override default values for group style properties
|
|
37
|
+
These values will be used if such property is not defined`}),relationship:jl.optional().meta({description:`Override default values for relationship style properties
|
|
38
|
+
These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),Nl=D.union([D.string().min(1,`Custom CSS file path cannot be empty`),D.array(D.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),Pl=D.strictObject({theme:kl.optional().meta({description:`Project theme customization`}),defaults:Ml.optional().meta({description:`Override default values for style properties
|
|
39
|
+
These values will be used if such property is not defined`}),customCss:Nl.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:n})=>z({defaults:Fl(t),customCss:Il(n),theme:e}));function Fl(e){if(!e)return;let{relationship:t,group:n,...r}=e;return z({...r,relationship:t&&z(t),group:n&&z(n)})}function Il(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const Ll=D.strictObject({outDir:D.string().default(`.likec4`).meta({description:[`Path to the directory where manual layouts will be stored,`,`relative to the folder containing the project config. `,``,`Defaults to '.likec4'.`].join(`
|
|
40
|
+
`)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),Rl=D.object({name:D.string().nonempty(`Project name cannot be empty`).refine(e=>e!==`default`,{abort:!0,error:`Project name cannot be "default"`}).refine(e=>!e.includes(`.`)&&!e.includes(`@`)&&!e.includes(`#`),{abort:!0,error:`Project name cannot contain ".", "@" or "#", try to use A-z, 0-9, _ and -`}).meta({description:`Project name, must be unique in the workspace`}),extends:D.union([D.string().min(1,`Extend path cannot be empty`),D.array(D.string().min(1,`Extend path cannot be empty`)).min(1,`Extend list cannot be empty`)]).optional().meta({description:`Extend styles from other config files`}),title:D.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:D.string().nonempty(`Contact person cannot be empty if specified`).optional().meta({description:`A person who has been involved in creating or maintaining this project`}),metadata:D.record(D.string(),D.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:Pl.optional().meta({description:`Project styles customization`}),imageAliases:ll.optional(),include:dl.optional(),exclude:D.array(D.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:Ll.optional(),inferTechnologyFromIcon:D.boolean().optional().meta({description:[`Automatically derive element technology from icon name when technology is not set explicitly.`,`Applies to aws:, azure:, gcp:, and tech: icons. Bootstrap icons are excluded.`,`Defaults to true.`].join(`
|
|
41
|
+
`)}),implicitViews:D.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to false.`})}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),zl=D.instanceof(Function),Bl=D.record(D.string(),zl),Vl=Rl.extend({generators:Bl.optional()});function Hl(e){let t=Vl.safeParse(e);if(t.success)return t.data;throw Error(`Config validation failed:
|
|
42
|
+
`+D.prettifyError(t.error))}function Ul(e){return Hl(vr.parse(e.trim()||`{}`))}const Wl={parse:Ul,validate:Hl,normalizeInclude:e=>{let t=dl.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function Gl(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function Kl(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function ql(e){let t=Gl(e),n=Kl(t);return n[n.length-1]||t}const Jl=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],Yl=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...Jl,...Yl];function Xl(e){return Jl.includes(ql(e))}function Zl(e){return Yl.includes(ql(e))}function Ql(e){return Xl(e)||Zl(e)}const $l=Rl.pick({extends:!0,styles:!0}).loose(),eu=e=>e?Array.isArray(e)?e:[e]:[],tu=async e=>{let t=await ai.readFile(e,`utf-8`),n;try{n=vr.parse(t.trim()||`{}`)}catch(t){throw Xo(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=$l.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+D.prettifyError(r.error));return r.data},nu=async(e,t)=>{if(t.includes(e)){let n=t.indexOf(e),r=[...t.slice(n),e].join(` -> `);throw Error(`Config extends cycle detected: ${r}`)}let n=await tu(e),r=eu(n.extends),i=[...t,e],a=[];for(let t of r){let n=ri(ni(e),t);a.push(...await nu(n,i))}return[...a,n]};async function ru(e){e=typeof e==`string`?e:e.fsPath,us.getChild(`config`).debug`Loading config: ${e}`;let t=ni(e),n=ti(e),r={name:ti(t)};if(Xl(n)){let t=await nu(ri(e),[]);N(T(t,1),`Expect at least one config`);let n=_e(Re(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(he),a=i.length>0?bt({},...i.reverse()):void 0;return Hl({...r,...n,...a?{styles:a}:{}})}N(Zl(n),`Invalid name for config file: ${e}`);let{mod:i}=await fi({filepath:e,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onEnd(e=>{let t=pi(e.errors,{kind:`error`});for(let e of t)us.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
|
|
25
43
|
// Mock implementation to allow loading config files without bundling @likec4/config
|
|
26
44
|
function mock(x) { return x }
|
|
27
45
|
export {
|
|
@@ -30,10 +48,10 @@ export {
|
|
|
30
48
|
mock as defineStyle,
|
|
31
49
|
mock as defineTheme,
|
|
32
50
|
mock as defineThemeColor,
|
|
33
|
-
}`,loader:`js`}))}}]}});return As(Object.assign(r,i?.default??i))}var ic=rr();const ac=[`likec4lib {`,` icons {`,...[...Object.entries({aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
|
|
34
|
-
`),
|
|
51
|
+
}`,loader:`js`}))}}]}});return Hl(Object.assign(r,i?.default??i))}var iu=wr();const au=[`likec4lib {`,` icons {`,...[...Object.entries({aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
|
|
52
|
+
`),ou=`likec4builtin`,su=`${ou}:///likec4/lib/icons.c4`;function cu(e){return(`uri`in e?e.uri:e).scheme===ou}function lu(e){return!cu(e)}Hn();const uu=K.getChild(`manual-layouts`),du=e=>e.endsWith(`.likec4.snap`);function fu(e){return`${e}.likec4.snap`}function pu(e){return dn.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const mu={manualLayouts:e=>new gu(e)},hu=`file://./`;var gu=class{cache;constructor(e){this.services=e,this.cache=new gr,ya(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async read(e){return await this.cache.get(e.id,async()=>{let t=uu.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=pu(e),i=[];try{let a=await n.scanDirectory(r,du);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=vr.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.debug`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let a=oe(i,x(`id`));return{hash:Ea(a),views:a}})}async write(e,t){this.cache.delete(e.id);let n=uu.getChild(e.id),r=pu(e),i=dn.joinPath(r,fu(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=vr.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:cr.create(tr.create(0,0),tr.create(a.split(`
|
|
35
53
|
`).length-1,1))};n.debug`write snapshot of ${t.id} in project ${e.id} to ${i.fsPath}`;let s=this.services.workspace.FileSystemProvider;try{await s.writeFile(i,a+`
|
|
36
|
-
`)}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return this.cache.delete(e.id),o}async remove(e,t){let n=uc.getChild(e.id),r=pc(e),i=le.joinPath(r,fc(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:Ve.create(0,0,0,0)};this.cache.delete(e.id);try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){uc.trace`clear caches`,this.cache.clear()}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=g.parse(e.icon),r=le.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${hc}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(hc)){let n=e.icon.substring(9),r=le.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const _c=`AnyProperty`;function vc(e){return K.isInstance(e,_c)}const yc=`ColorLiteral`;function bc(e){return K.isInstance(e,yc)}const xc=`DeploymentElement`;function Sc(e){return K.isInstance(e,xc)}const Cc=`DeploymentNodeOrElementKind`,wc=`DeploymentViewRule`;function Tc(e){return K.isInstance(e,wc)}const Ec=`DynamicViewProperty`,Dc=`DynamicViewRule`;function Oc(e){return K.isInstance(e,Dc)}const kc=`DynamicViewStep`;function Ac(e){return K.isInstance(e,kc)}const jc=`ElementProperty`;function Mc(e){return K.isInstance(e,jc)}const Nc=`ExpressionV2`;function Pc(e){return K.isInstance(e,Nc)}const Fc=`ExtendElementProperty`,Ic=`ExtendRelationProperty`,Lc=`FqnExpr`;function Rc(e){return K.isInstance(e,Lc)}const zc=`FqnExprOrWhere`;function Bc(e){return K.isInstance(e,zc)}const Vc=`FqnExprOrWith`;function Hc(e){return K.isInstance(e,Vc)}const Uc=`FqnReferenceable`,Wc=`LikeC4View`;function Gc(e){return K.isInstance(e,Wc)}const Kc=`MetadataProperty`;function qc(e){return K.isInstance(e,Kc)}const Jc=`MetadataValue`,Yc=`ModelReferenceable`,Xc=`Referenceable`,Zc=`RelationExpr`;function Qc(e){return K.isInstance(e,Zc)}const $c=`RelationExprOrWhere`;function el(e){return K.isInstance(e,$c)}const tl=`RelationExprOrWith`;function nl(e){return K.isInstance(e,tl)}const rl=`RelationProperty`,il=`RelationshipStyleProperty`;function al(e){return K.isInstance(e,il)}const ol=`SizeProperty`;function sl(e){return K.isInstance(e,ol)}const cl=`StringProperty`;function ll(e){return K.isInstance(e,cl)}const ul=`StyleProperty`;function dl(e){return K.isInstance(e,ul)}const fl=`ViewProperty`;function pl(e){return K.isInstance(e,fl)}const ml=`ViewRule`;function hl(e){return K.isInstance(e,ml)}const gl=`ViewRuleStyleOrGlobalRef`;function _l(e){return K.isInstance(e,gl)}const vl=`WhereElement`;function yl(e){return K.isInstance(e,vl)}const bl=`WhereElementExpression`;function xl(e){return K.isInstance(e,bl)}const Sl=`WhereExpression`,Cl=`WhereKindEqual`;function wl(e){return K.isInstance(e,Cl)}const Tl=`WhereRelation`;function El(e){return K.isInstance(e,Tl)}const Dl=`WhereRelationExpression`;function Ol(e){return K.isInstance(e,Dl)}const kl=`WhereTagEqual`;function Al(e){return K.isInstance(e,kl)}const jl=`AbstractDynamicStep`,Ml=`ArrowProperty`;function Nl(e){return K.isInstance(e,Ml)}const Pl=`BorderProperty`;function Fl(e){return K.isInstance(e,Pl)}const Il=`ColorProperty`;function Ll(e){return K.isInstance(e,Il)}const Rl=`CustomColor`,zl=`CustomElementProperties`;function Bl(e){return K.isInstance(e,zl)}const Vl=`CustomRelationProperties`;function Hl(e){return K.isInstance(e,Vl)}const Ul=`DeployedInstance`;function Wl(e){return K.isInstance(e,Ul)}const Gl=`DeployedInstanceBody`;function Kl(e){return K.isInstance(e,Gl)}const ql=`DeploymentNode`;function Jl(e){return K.isInstance(e,ql)}const Yl=`DeploymentNodeBody`;function Xl(e){return K.isInstance(e,Yl)}const Zl=`DeploymentNodeKind`;function Ql(e){return K.isInstance(e,Zl)}const $l=`DeploymentRelation`;function eu(e){return K.isInstance(e,$l)}const tu=`DeploymentRelationBody`;function nu(e){return K.isInstance(e,tu)}const ru=`DeploymentView`;function iu(e){return K.isInstance(e,ru)}const au=`DeploymentViewBody`;function ou(e){return K.isInstance(e,au)}const su=`DeploymentViewRulePredicate`;function cu(e){return K.isInstance(e,su)}const lu=`DeploymentViewRuleStyle`;function uu(e){return K.isInstance(e,lu)}const du=`DirectedRelationExpr`;function fu(e){return K.isInstance(e,du)}const pu=`DynamicView`;function mu(e){return K.isInstance(e,pu)}const hu=`DynamicViewBody`;function gu(e){return K.isInstance(e,hu)}const _u=`DynamicViewDisplayVariantProperty`;function vu(e){return K.isInstance(e,_u)}const yu=`DynamicViewGlobalPredicateRef`;function bu(e){return K.isInstance(e,yu)}const xu=`DynamicViewIncludePredicate`;function Su(e){return K.isInstance(e,xu)}const Cu=`DynamicViewParallelSteps`;function wu(e){return K.isInstance(e,Cu)}const Tu=`DynamicViewRef`,Eu=`Element`;function Du(e){return K.isInstance(e,Eu)}const Ou=`ElementBody`;function ku(e){return K.isInstance(e,Ou)}const Au=`ElementKind`;function ju(e){return K.isInstance(e,Au)}const Mu=`ElementKindExpression`;function Nu(e){return K.isInstance(e,Mu)}const Pu=`ElementRef`;function Fu(e){return K.isInstance(e,Pu)}const Iu=`ElementStringProperty`;function Lu(e){return K.isInstance(e,Iu)}const Ru=`ElementStyleProperty`;function zu(e){return K.isInstance(e,Ru)}const Bu=`ElementTagExpression`;function Vu(e){return K.isInstance(e,Bu)}const Hu=`ElementView`;function Uu(e){return K.isInstance(e,Hu)}const Wu=`ElementViewBody`;function Gu(e){return K.isInstance(e,Wu)}const Ku=`ElementViewRef`,qu=`Expressions`;function Ju(e){return K.isInstance(e,qu)}const Yu=`ExtendDeployment`;function Xu(e){return K.isInstance(e,Yu)}const Zu=`ExtendDeploymentBody`;function Qu(e){return K.isInstance(e,Zu)}const $u=`ExtendElement`;function ed(e){return K.isInstance(e,$u)}const td=`ExtendElementBody`;function nd(e){return K.isInstance(e,td)}const rd=`ExtendRelation`;function id(e){return K.isInstance(e,rd)}const ad=`ExtendRelationBody`;function od(e){return K.isInstance(e,ad)}const sd=`FqnExpressions`;function cd(e){return K.isInstance(e,sd)}const ld=`FqnExprWhere`;function ud(e){return K.isInstance(e,ld)}const dd=`FqnExprWith`;function fd(e){return K.isInstance(e,dd)}const pd=`FqnRef`;function md(e){return K.isInstance(e,pd)}const hd=`FqnRefExpr`;function gd(e){return K.isInstance(e,hd)}const _d=`GlobalDynamicPredicateGroup`;function vd(e){return K.isInstance(e,_d)}const yd=`GlobalPredicateGroup`;function bd(e){return K.isInstance(e,yd)}const xd=`Globals`;function Sd(e){return K.isInstance(e,xd)}const Cd=`GlobalStyle`;function wd(e){return K.isInstance(e,Cd)}const Td=`GlobalStyleGroup`;function Ed(e){return K.isInstance(e,Td)}const Dd=`GlobalStyleId`,Od=`HexColor`;function kd(e){return K.isInstance(e,Od)}const Ad=`IconColorProperty`;function jd(e){return K.isInstance(e,Ad)}const Md=`IconPositionProperty`;function Nd(e){return K.isInstance(e,Md)}const Pd=`IconProperty`;function Fd(e){return K.isInstance(e,Pd)}const Id=`IconSizeProperty`;function Ld(e){return K.isInstance(e,Id)}const Rd=`Imported`;function zd(e){return K.isInstance(e,Rd)}const Bd=`ImportsFromPoject`;function Vd(e){return K.isInstance(e,Bd)}const Hd=`IncomingRelationExpr`;function Ud(e){return K.isInstance(e,Hd)}const Wd=`InOutRelationExpr`;function Gd(e){return K.isInstance(e,Wd)}const Kd=`LibIcon`;function qd(e){return K.isInstance(e,Kd)}const Jd=`LikeC4Grammar`;function Yd(e){return K.isInstance(e,Jd)}const Xd=`LikeC4Lib`;function Zd(e){return K.isInstance(e,Xd)}const Qd=`LineProperty`;function $d(e){return K.isInstance(e,Qd)}const ef=`LinkProperty`;function tf(e){return K.isInstance(e,ef)}const nf=`MarkdownOrString`;function rf(e){return K.isInstance(e,nf)}const af=`MetadataArray`;function of(e){return K.isInstance(e,af)}const sf=`MetadataAttribute`;function cf(e){return K.isInstance(e,sf)}const lf=`MetadataBody`;function uf(e){return K.isInstance(e,lf)}const df=`Model`;function ff(e){return K.isInstance(e,df)}const pf=`ModelDeployments`;function mf(e){return K.isInstance(e,pf)}const hf=`ModelViews`;function gf(e){return K.isInstance(e,hf)}const _f=`MultipleProperty`;function vf(e){return K.isInstance(e,_f)}const yf=`NavigateToProperty`;function bf(e){return K.isInstance(e,yf)}const xf=`NotationProperty`;function Sf(e){return K.isInstance(e,xf)}const Cf=`NotesProperty`;function wf(e){return K.isInstance(e,Cf)}const Tf=`OpacityProperty`;function Ef(e){return K.isInstance(e,Tf)}const Df=`OutgoingRelationExpr`;function Of(e){return K.isInstance(e,Df)}const kf=`PaddingSizeProperty`;function Af(e){return K.isInstance(e,kf)}const jf=`Relation`;function Mf(e){return K.isInstance(e,jf)}const Nf=`RelationBody`;function Pf(e){return K.isInstance(e,Nf)}const Ff=`RelationExprWhere`;function If(e){return K.isInstance(e,Ff)}const Lf=`RelationExprWith`;function Rf(e){return K.isInstance(e,Lf)}const zf=`RelationKindDotRef`;function Bf(e){return K.isInstance(e,zf)}const Vf=`RelationNavigateToProperty`;function Hf(e){return K.isInstance(e,Vf)}const Uf=`RelationshipKind`;function Wf(e){return K.isInstance(e,Uf)}const Gf=`RelationStringProperty`;function Kf(e){return K.isInstance(e,Gf)}const qf=`RelationStyleProperty`;function Jf(e){return K.isInstance(e,qf)}const Yf=`RGBAColor`;function Xf(e){return K.isInstance(e,Yf)}const Zf=`ShapeProperty`;function Qf(e){return K.isInstance(e,Zf)}const $f=`ShapeSizeProperty`;function ep(e){return K.isInstance(e,$f)}const tp=`SpecificationColor`;function np(e){return K.isInstance(e,tp)}const rp=`SpecificationDeploymentNodeKind`;function ip(e){return K.isInstance(e,rp)}const ap=`SpecificationElementKind`;function op(e){return K.isInstance(e,ap)}const sp=`SpecificationElementStringProperty`;function cp(e){return K.isInstance(e,sp)}const lp=`SpecificationRelationshipKind`;function up(e){return K.isInstance(e,lp)}const dp=`SpecificationRelationshipStringProperty`;function fp(e){return K.isInstance(e,dp)}const pp=`SpecificationRule`;function mp(e){return K.isInstance(e,pp)}const hp=`SpecificationTag`;function gp(e){return K.isInstance(e,hp)}const _p=`StrictFqnElementRef`;function vp(e){return K.isInstance(e,_p)}const yp=`StrictFqnRef`;function bp(e){return K.isInstance(e,yp)}function xp(e){return K.isInstance(e,`Tag`)}const Sp=`TagRef`;function Cp(e){return K.isInstance(e,Sp)}const wp=`Tags`;function Tp(e){return K.isInstance(e,wp)}const Ep=`TextSizeProperty`;function Dp(e){return K.isInstance(e,Ep)}const Op=`ViewRef`,kp=`ViewRuleAutoLayout`;function Ap(e){return K.isInstance(e,kp)}const jp=`ViewRuleGlobalPredicateRef`;function Mp(e){return K.isInstance(e,jp)}const Np=`ViewRuleGlobalStyle`;function Pp(e){return K.isInstance(e,Np)}const Fp=`ViewRuleGroup`;function Ip(e){return K.isInstance(e,Fp)}const Lp=`ViewRulePredicate`;function Rp(e){return K.isInstance(e,Lp)}const zp=`ViewRuleRank`;function Bp(e){return K.isInstance(e,zp)}const Vp=`ViewRuleStyle`;function Hp(e){return K.isInstance(e,Vp)}const Up=`ViewStringProperty`;function Wp(e){return K.isInstance(e,Up)}const Gp=`WhereBinaryExpression`;function Kp(e){return K.isInstance(e,Gp)}const qp=`WhereElementKind`;function Jp(e){return K.isInstance(e,qp)}const Yp=`WhereElementNegation`;function Xp(e){return K.isInstance(e,Yp)}const Zp=`WhereElementTag`;function Qp(e){return K.isInstance(e,Zp)}const $p=`WhereRelationKind`;function em(e){return K.isInstance(e,$p)}const tm=`WhereRelationNegation`;function nm(e){return K.isInstance(e,tm)}const rm=`WhereRelationParticipantKind`;function im(e){return K.isInstance(e,rm)}const am=`WhereRelationParticipantTag`;function om(e){return K.isInstance(e,am)}const sm=`WhereRelationTag`;function cm(e){return K.isInstance(e,sm)}const lm=`WildcardExpression`;function um(e){return K.isInstance(e,lm)}const dm=`DynamicStepChain`;function fm(e){return K.isInstance(e,dm)}const pm=`DynamicStepSingle`;function mm(e){return K.isInstance(e,pm)}var hm=class extends ue{getAllTypes(){return[jl,_c,Ml,Pl,yc,Il,Rl,zl,Vl,Ul,Gl,xc,ql,Yl,Zl,Cc,$l,tu,ru,au,wc,su,lu,du,dm,pm,pu,hu,_u,yu,xu,Cu,Ec,Tu,Dc,kc,Eu,Ou,Au,Mu,jc,Pu,Iu,Ru,Bu,Hu,Wu,Ku,Nc,qu,Yu,Zu,$u,td,Fc,rd,ad,Ic,Lc,zc,Vc,ld,dd,sd,pd,hd,Uc,_d,yd,Cd,Td,Dd,xd,Od,Ad,Md,Pd,Id,Rd,Bd,Wd,Hd,Kd,Jd,Xd,Wc,Qd,ef,nf,af,sf,lf,Kc,Jc,df,pf,Yc,hf,_f,yf,xf,Cf,Tf,Df,kf,Yf,Xc,jf,Nf,Zc,$c,tl,Ff,Lf,zf,Vf,rl,Gf,qf,Uf,il,Zf,$f,ol,tp,rp,ap,sp,lp,dp,pp,hp,_p,yp,cl,ul,`Tag`,Sp,wp,Ep,fl,Op,ml,kp,jp,Np,Fp,Lp,zp,Vp,gl,Up,Gp,vl,bl,qp,Yp,Zp,Sl,Cl,Tl,Dl,$p,tm,rm,am,sm,kl,lm]}computeIsSubtype(e,t){switch(e){case Ml:case Qd:return this.isSubtype(il,t);case Pl:case Ad:case Md:case _f:case Tf:case Zf:return this.isSubtype(ul,t);case Il:return this.isSubtype(il,t)||this.isSubtype(ul,t);case Ul:case ql:return this.isSubtype(xc,t)||this.isSubtype(Xc,t);case Zl:case Au:return this.isSubtype(Cc,t);case ru:case pu:case Hu:return this.isSubtype(Wc,t);case su:case lu:return this.isSubtype(wc,t);case du:case Hd:case Wd:case Df:return this.isSubtype(Zc,t);case dm:case pm:return this.isSubtype(jl,t)||this.isSubtype(kc,t);case _u:return this.isSubtype(Ec,t);case yu:case xu:return this.isSubtype(Dc,t);case Ec:case jc:case rl:case cl:return this.isSubtype(_c,t);case Eu:return this.isSubtype(Uc,t)||this.isSubtype(Yc,t)||this.isSubtype(Xc,t);case Mu:case Bu:case hd:case lm:return this.isSubtype(Lc,t);case Iu:return this.isSubtype(jc,t)||this.isSubtype(cl,t);case Ru:return this.isSubtype(jc,t);case Yu:case $u:case Xc:return this.isSubtype(Uc,t);case Lc:case ld:return this.isSubtype(zc,t);case zc:case dd:return this.isSubtype(Vc,t);case Vc:case tl:return this.isSubtype(Nc,t);case Od:case Yf:return this.isSubtype(yc,t);case Pd:return this.isSubtype(jc,t)||this.isSubtype(ul,t);case Id:case kf:case $f:case Ep:return this.isSubtype(ol,t)||this.isSubtype(ul,t);case Rd:return this.isSubtype(Yc,t)||this.isSubtype(Xc,t);case ef:return this.isSubtype(jc,t)||this.isSubtype(Fc,t)||this.isSubtype(Ic,t)||this.isSubtype(rl,t)||this.isSubtype(fl,t);case nf:case af:return this.isSubtype(Jc,t);case sf:case xf:case Cf:case sp:case dp:return this.isSubtype(cl,t);case lf:return this.isSubtype(Kc,t);case Kc:return this.isSubtype(jc,t)||this.isSubtype(Fc,t)||this.isSubtype(Ic,t)||this.isSubtype(rl,t);case Zc:case Ff:return this.isSubtype($c,t);case $c:case Lf:return this.isSubtype(tl,t);case Vf:case qf:return this.isSubtype(rl,t);case Gf:return this.isSubtype(rl,t)||this.isSubtype(cl,t);case fl:return this.isSubtype(_c,t)||this.isSubtype(Ec,t);case kp:return this.isSubtype(wc,t)||this.isSubtype(Dc,t)||this.isSubtype(ml,t);case jp:case Fp:case Lp:case zp:return this.isSubtype(ml,t);case Np:case Vp:return this.isSubtype(gl,t);case gl:return this.isSubtype(Dc,t)||this.isSubtype(ml,t);case Up:return this.isSubtype(cl,t)||this.isSubtype(fl,t);case Gp:return this.isSubtype(bl,t)||this.isSubtype(Dl,t);case vl:case Yp:return this.isSubtype(bl,t);case bl:case Dl:return this.isSubtype(Sl,t);case qp:return this.isSubtype(vl,t)||this.isSubtype(Cl,t);case Zp:return this.isSubtype(vl,t)||this.isSubtype(kl,t);case Tl:case tm:return this.isSubtype(Dl,t);case $p:case rm:return this.isSubtype(Cl,t)||this.isSubtype(Tl,t);case am:case sm:return this.isSubtype(Tl,t)||this.isSubtype(kl,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return Uf;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Rl;case`DeploymentNode:kind`:return Zl;case`DynamicViewGlobalPredicateRef:predicate`:return _d;case`DynamicViewRef:view`:return pu;case`Element:kind`:case`ElementKindExpression:kind`:return Au;case`ElementViewRef:view`:return Hu;case`FqnRef:value`:case`StrictFqnRef:value`:return Xc;case`IconProperty:libicon`:return Kd;case`Imported:imported`:case`StrictFqnElementRef:el`:return Eu;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Wc;case`ViewRuleGlobalPredicateRef:predicate`:return yd;case`ViewRuleGlobalStyle:style`:return Dd;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Cc;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case jl:return{name:jl,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Ml:return{name:Ml,properties:[{name:`key`},{name:`value`}]};case Pl:return{name:Pl,properties:[{name:`key`},{name:`value`}]};case Il:return{name:Il,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Rl:return{name:Rl,properties:[{name:`name`}]};case zl:return{name:zl,properties:[{name:`props`,defaultValue:[]}]};case Vl:return{name:Vl,properties:[{name:`props`,defaultValue:[]}]};case Ul:return{name:Ul,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Gl:return{name:Gl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ql:return{name:ql,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Yl:return{name:Yl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Zl:return{name:Zl,properties:[{name:`name`}]};case $l:return{name:$l,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case tu:return{name:tu,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ru:return{name:ru,properties:[{name:`body`},{name:`name`}]};case au:return{name:au,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case su:return{name:su,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case lu:return{name:lu,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case du:return{name:du,properties:[{name:`source`},{name:`target`}]};case pu:return{name:pu,properties:[{name:`body`},{name:`name`}]};case hu:return{name:hu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case _u:return{name:_u,properties:[{name:`key`},{name:`value`}]};case yu:return{name:yu,properties:[{name:`predicate`}]};case xu:return{name:xu,properties:[{name:`exprs`}]};case Cu:return{name:Cu,properties:[{name:`steps`,defaultValue:[]}]};case Tu:return{name:Tu,properties:[{name:`view`}]};case Eu:return{name:Eu,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Ou:return{name:Ou,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Au:return{name:Au,properties:[{name:`name`}]};case Mu:return{name:Mu,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Pu:return{name:Pu,properties:[{name:`modelElement`}]};case Iu:return{name:Iu,properties:[{name:`key`},{name:`value`}]};case Ru:return{name:Ru,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Bu:return{name:Bu,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Hu:return{name:Hu,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Wu:return{name:Wu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Ku:return{name:Ku,properties:[{name:`view`}]};case qu:return{name:qu,properties:[{name:`prev`},{name:`value`}]};case Yu:return{name:Yu,properties:[{name:`body`},{name:`deploymentNode`}]};case Zu:return{name:Zu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case $u:return{name:$u,properties:[{name:`body`},{name:`element`}]};case td:return{name:td,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case rd:return{name:rd,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case ad:return{name:ad,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case sd:return{name:sd,properties:[{name:`prev`},{name:`value`}]};case ld:return{name:ld,properties:[{name:`subject`},{name:`where`}]};case dd:return{name:dd,properties:[{name:`custom`},{name:`subject`}]};case pd:return{name:pd,properties:[{name:`parent`},{name:`value`}]};case hd:return{name:hd,properties:[{name:`ref`},{name:`selector`}]};case _d:return{name:_d,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case yd:return{name:yd,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case xd:return{name:xd,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Cd:return{name:Cd,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Td:return{name:Td,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Dd:return{name:Dd,properties:[{name:`name`}]};case Od:return{name:Od,properties:[{name:`hex`}]};case Ad:return{name:Ad,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Md:return{name:Md,properties:[{name:`key`},{name:`value`}]};case Pd:return{name:Pd,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Id:return{name:Id,properties:[{name:`key`},{name:`value`}]};case Rd:return{name:Rd,properties:[{name:`imported`},{name:`prev`}]};case Bd:return{name:Bd,properties:[{name:`imports`},{name:`project`}]};case Hd:return{name:Hd,properties:[{name:`to`}]};case Wd:return{name:Wd,properties:[{name:`inout`}]};case Kd:return{name:Kd,properties:[{name:`name`}]};case Jd:return{name:Jd,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Xd:return{name:Xd,properties:[{name:`icons`,defaultValue:[]}]};case Qd:return{name:Qd,properties:[{name:`key`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`key`},{name:`title`},{name:`value`}]};case nf:return{name:nf,properties:[{name:`markdown`},{name:`text`}]};case af:return{name:af,properties:[{name:`values`,defaultValue:[]}]};case sf:return{name:sf,properties:[{name:`key`},{name:`value`}]};case lf:return{name:lf,properties:[{name:`props`,defaultValue:[]}]};case df:return{name:df,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case pf:return{name:pf,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case hf:return{name:hf,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case _f:return{name:_f,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case yf:return{name:yf,properties:[{name:`key`},{name:`value`}]};case xf:return{name:xf,properties:[{name:`key`},{name:`value`}]};case Cf:return{name:Cf,properties:[{name:`key`},{name:`value`}]};case Tf:return{name:Tf,properties:[{name:`key`},{name:`value`}]};case Df:return{name:Df,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case kf:return{name:kf,properties:[{name:`key`},{name:`value`}]};case jf:return{name:jf,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Nf:return{name:Nf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Ff:return{name:Ff,properties:[{name:`subject`},{name:`where`}]};case Lf:return{name:Lf,properties:[{name:`custom`},{name:`subject`}]};case zf:return{name:zf,properties:[{name:`kind`}]};case Vf:return{name:Vf,properties:[{name:`key`},{name:`value`}]};case Uf:return{name:Uf,properties:[{name:`name`}]};case Gf:return{name:Gf,properties:[{name:`key`},{name:`value`}]};case qf:return{name:qf,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Yf:return{name:Yf,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case Zf:return{name:Zf,properties:[{name:`key`},{name:`value`}]};case $f:return{name:$f,properties:[{name:`key`},{name:`value`}]};case tp:return{name:tp,properties:[{name:`color`},{name:`name`}]};case rp:return{name:rp,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case ap:return{name:ap,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case sp:return{name:sp,properties:[{name:`key`},{name:`value`}]};case lp:return{name:lp,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case dp:return{name:dp,properties:[{name:`key`},{name:`value`}]};case pp:return{name:pp,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case hp:return{name:hp,properties:[{name:`color`},{name:`tag`}]};case _p:return{name:_p,properties:[{name:`el`},{name:`parent`}]};case yp:return{name:yp,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Sp:return{name:Sp,properties:[{name:`tag`}]};case wp:return{name:wp,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Ep:return{name:Ep,properties:[{name:`key`},{name:`value`}]};case Op:return{name:Op,properties:[{name:`view`}]};case kp:return{name:kp,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case jp:return{name:jp,properties:[{name:`predicate`}]};case Np:return{name:Np,properties:[{name:`style`}]};case Fp:return{name:Fp,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Lp:return{name:Lp,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case zp:return{name:zp,properties:[{name:`targets`},{name:`value`}]};case Vp:return{name:Vp,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Up:return{name:Up,properties:[{name:`key`},{name:`value`}]};case Gp:return{name:Gp,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case qp:return{name:qp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Yp:return{name:Yp,properties:[{name:`value`}]};case Zp:return{name:Zp,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case $p:return{name:$p,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case tm:return{name:tm,properties:[{name:`value`}]};case rm:return{name:rm,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case am:return{name:am,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case sm:return{name:sm,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case lm:return{name:lm,properties:[{name:`isWildcard`,defaultValue:!1}]};case dm:return{name:dm,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case pm:return{name:pm,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const K=new hm;let gm;const _m=()=>gm??=Re(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@46"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@123"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@124"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@125"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/[_]*[a-zA-Z][-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@117"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@150"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),vm={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},ym={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},bm={AstReflection:()=>new hm},xm={Grammar:()=>_m(),LanguageMetaData:()=>vm,parser:{ParserConfig:()=>ym}};function Sm(e){return vm.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function Cm(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const wm=Zi(`/`);function Tm(e,t){return wm(e.uri.path,t.uri.path)}const Em=W.getChild(`chokidar`),Dm={fileSystemWatcher:e=>new km(e)},Om=e=>{let t=Yr(e);return Sm(t)||Bs(t)||dc(t)};var km=class{watcher;queue=new ar({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){Em.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0,await e.close()}}createWatcher(e){Em.debug`create watcher for folder: ${e}`;let t=ir.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!Om(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Em.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Em.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=Yr(e),r=g.file(e);switch(!0){case Bs(n):Em.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case Sm(n):Em.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case dc(n):{Em.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches();let n=t.ProjectsManager.ownerProjectId(r);await t.ProjectsManager.rebuildProject(n);break}default:Em.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=Yr(e),r=g.file(e);switch(!0){case Bs(n):Em.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case Sm(n):Em.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case dc(n):{Em.debug`manual layout file removed: ${e}`;let n=t.ProjectsManager.ownerProjectId(r);t.ManualLayouts.clearCaches(),await t.ProjectsManager.rebuildProject(n);break}default:Em.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Em.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},Am=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(cc(e))return Promise.resolve(ac);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},jm=class{watch(){}dispose(){return Promise.resolve()}},Mm=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const Nm={fileSystemWatcher:()=>new jm},Pm={fileSystemProvider:()=>new Am,...Nm},Fm={manualLayouts:()=>new Mm},Im=W.getChild(`filesystem`);function Lm(e,t=!1){return!t&&Bs(Yr(e))}function Rm(e,t=!1){return!t&&Sm(Yr(e))}const zm=(e=!0)=>({fileSystemProvider:()=>new Bm,...e?Dm:Nm});var Bm=class extends Je{async readFile(e){if(cc(e))return Promise.resolve(ac);try{return await super.readFile(e)}catch(t){return Im.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new ic.fdir().withSymlinks({resolvePaths:!1}).exclude(Cm).withFullPaths().filter(Rm);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:g.file(e)})}catch(t){Im.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(Tm)}async scanProjectFiles(e){return await this.scanDirectory(e,Lm)}async scanDirectory(e,t){let n=[];try{let r=await new ic.fdir().withSymlinks({resolvePaths:!1}).exclude(Cm).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:g.file(e)})}catch(t){Im.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await rc(e)}async writeFile(e,t){let n=Xr(e.fsPath),r=ii(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(Im.debug(`creating directory {path}`,{path:n}),ri(n,{recursive:!0})),Im.debug(`writing file {path}`,{path:e.fsPath}),await ni(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=ii(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await ti(t),Im.debug(`deleted file {path}`,{path:t}),!0):(Im.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){Im.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const Vm={mcpServer:()=>new Hm,mcpServerFactory:()=>new Um};var Hm=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},Um=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const Wm=W.getChild(`mcp`);function Gm(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},Km(n,e,t)]}function Km(e,t,n){let r=n.bind(null,t);return(async function(t,n){Wm.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return Wm.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:ci(t)}],isError:!0}}})}var qm=`1.50.0`,Jm=class extends He{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=me(e);let r=super.createDescription(e,t,n);return cc(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},Ym=class extends ke{constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,n){let r=this.services.workspace.ProjectsManager;return re(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const Xm=Symbol.for(`idattr`),Zm={writeId(e,t){return e[Xm]=t,e},readId(e){return e[Xm]}},Qm={writeId(e,t){return S(t)?e[Xm]=void 0:e[Xm]=t,e},readId(e){return e[Xm]}};function $m(e){return e?.textDocument.languageId===vm.languageId}function eh(e){return e?.markdown||e?.text}function th(e){let t=parseFloat(e);return isNaN(t)?100:Qt(t,{min:0,max:100})}function nh({value:e}){return th(e)}function rh({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:F(e)}}function ih({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:F(e)}}function ah(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case Ll(r):{let e=oh(r);b(e)&&(n.color=e);break}case $d(r):n.line=r.value;break;case Nl(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:F(r)}break;default:F(r)}return n}function oh(e){return e?.themeColor??e?.customColor?.$refText}function sh(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:F(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function ch(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:F(e)}}function lh(e){return te(e,e=>Rp(e)||cu(e)||Su(e))}const uh=e=>ff(e)||ku(e)||nd(e)||Gu(e)||gu(e)||Fu(e),dh=e=>mf(e)||ou(e)||Xl(e)||Qu(e)||Kl(e);function fh(e){for(;;){if(dh(e)||uh(e))return!1;if(Sd(e)||gf(e))return!0;if(e.$container)e=e.$container;else return!1}}function ph(e){for(;;){if(dh(e))return!1;if(uh(e))return!0;if(e.$container)e=e.$container;else return!1}}function mh(e){for(;;){if(uh(e))return!1;if(dh(e))return!0;if(e.$container)e=e.$container;else return!1}}const hh=Zi(`/`),gh=(e,t)=>hh(e.uri.path,t.uri.path),_h=e=>$m(e)&&lc(e);var vh=class extends ce{constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);let n=[...this.documentMap.values(),e].sort(gh);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);_h(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return _h(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return re(this.documentMap.values()).filter(e=>_h(e)&&!this.projectsManager.isExcluded(e))}get all(){return re(this.documentMap.values()).map(e=>(_h(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return re(this.documentMap.values()).filter(n=>_h(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return w(this.userDocuments.toArray(),x(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),At(T(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,_h(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},yh=t(nr(),1);const q=W.getChild(`projects`);function bh(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function xh(e){return bh(e)?e.uri.toString():typeof e==`string`?Sr(e)?e:g.file(e).toString():e.toString()}const Sh=Zi(`/`,!0),Ch=(e,t)=>Sh(_r(e.path),_r(t.path));function wh(e){return t=>e.startsWith(ea(t)?t:t.folder)}function Th(e,t){let n=ea(e)?e:e.folder,r=ea(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function Eh(...e){return rn(Th,e)}function Dh(e,t){return t.startsWith(e.folder)||e.includePaths?.some(wh(t))?!Oh(e,t):!1}function Oh(e,t){return e.exclude?.(Tr(t))??!1}function kh(...e){return rn(Dh,e)}function Ah(...e){return rn(Oh,e)}function jh(e){return e=xh(e),Cr(e)}const Mh={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,yh.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function Nh(e){return Mh.exclude(Tr(e))}function Ph(e){if(`configUri`in e){P(!An(e.configUri),`configUri is emptyish`);let t=g.isUri(e.configUri)?e.configUri:g.parse(xh(e.configUri)),n=jh(le.dirname(t));return{configUri:t,folder:n,folderUri:g.parse(n)}}P(!An(e.folderUri),`folderUri is emptyish`);let t=jh(e.folderUri),n=g.parse(t);return{configUri:le.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var Fh=class e{static DefaultProjectId=Mh.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new Hn.default(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=le.joinPath(e,`.likec4rc`),r=jh(e);return{id:t,config:Mh.config,folder:r,folderUri:g.parse(r),configUri:n,exclude:Mh.exclude,includeConfig:Mh.includeConfig}}return N(this.#r.find(e=>e.id===t),`Project ${t} not found`)});#a=new Hn.default(e=>{let t=xh(e),n=this.#o.get(t);return n?Ah(n,t)?!this.#r.some(kh(t)):!1:Nh(t)});#o=new Hn.default(e=>{let t=wh(e);return this.#r.find(t)??this.#r.find(kh(e))??null});constructor(e){this.services=e,q.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return E(this.#r,1)?this.#r[0].id:e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#n=void 0,!t||t===e.DefaultProjectId){q.debug`reset default project ID`,this.#t=void 0;return}P(this.#r.find(e=>e.id===t),`Project "${t}" not found`),q.debug`set default project ID to ${t}`,this.#t=t}}get default(){if(!this.#n){let t=this.defaultProjectId??e.DefaultProjectId;this.#n=this.#i.get(t)}return this.#n}get all(){if(E(this.#r,1)){let e=[...x(this.#r,T(`id`)),Mh.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[Mh.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId||this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){let t=Eh(jh(e));return this.#r.filter(e=>t(e)||!!e.includePaths&&!!mn(e.includePaths,t))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(P(this.#r.some(e=>t===e.id),`Project ID ${t} is not registered`),t):N(this.defaultProjectId,()=>`Specify exact project, known: [${x(this.#r,T(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return bh(t)&&cc(t)?!0:e.length===1?this.#a.get(xh(t)):Ah(this.#i.get(e[0]),xh(t))}isIncluded(t,n){let r=xh(n);return E(this.#r,1)?t===e.DefaultProjectId?!this.#o.get(r)&&!Nh(r):kh(this.#i.get(t),xh(n)):!Nh(r)}async registerConfigFile(e,t){if(Nh(xh(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${Mh.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!Fe(t))throw li(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Ms.validate(e.config),{configUri:r,folder:i,folderUri:a}=Ph(e),o=Ms.normalizeInclude(n.include),s=this.#r.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(s.id=this.uniqueProjectId(n.name),q.info`re-register ${s.id}`),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#r=w([...this.#r,s],Zt((e,t)=>Ch(e.folderUri,t.folderUri))),q.info`register ${s.id}`),this.updateIncludesExcludes(s),this.resetCaches(),this.#s?s:(this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>Fe(e)?Promise.reject(e):(q.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#o.get(xh(t))?.id??this.#t??e.DefaultProjectId}#s=null;async reloadProjects(e){return this.#s?(q.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(q.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(Fe(e)||q.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null,this.notifyListeners()}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){q.warn(`Failed to reloadProjects, no workspace folders found`);return}q.debug`start reload projects`;let n=[];for(let e of t){let t=g.parse(e.uri);q.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)q.debug`found config ${le.relative(t,r.uri)}`,n.push(r.uri)}catch(e){q.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#r.length===0){q.warning(`No config files found`);return}q.warning(`No config files found, but {count} projects were registered before`,{count:this.#r.length})}n.sort(Ch);let r=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){q.warn(ci(t));let n=r.get(e.toString());n&&(q.debug`Update failed, restore project ${n.id}`,await this.registerProject(n))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(x(this.#r,T(`id`))),n=e;if(!t.has(n))return n;q.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){q.trace(`resetCaches`),this.#n=void 0,this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(t,n){let r=this.#r.find(e=>e.id===t);if(!r)return t===e.DefaultProjectId?q.info`Rebuilding all documents `:q.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=q.getChild(r.id),a=this.services.workspace.LangiumDocuments.resetProjectIds().filter(e=>kh(r,xh(e)));a.length!==0&&(i.info(`rebuild project documents: {docs}`,{docs:a.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(a,[],n).catch(e=>{i.warn(`Failed to rebuild project`,{error:e})}))}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Me.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return q.warn(`Failed to get workspace URI, using default folder`,{error:e}),g.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){q.warn(ci(e))}}updateIncludesExcludes(e){let t=e.config;switch(!0){case S(t.exclude):e.exclude=Mh.exclude;break;case t.exclude&&E(t.exclude,1):e.exclude=(0,yh.default)(x(t.exclude,t=>(!vr(t)&&!t.startsWith(`**`)&&(t=xr(`**`,t)),wr(hr(e.folderUri.path,t)))),{contains:!0,dot:!0});break;default:delete e.exclude}let n=e.includeConfig.paths;if(!E(n,1))return delete e.includePaths,e;e.includePaths=x(n,t=>{let n=le.resolvePath(e.folderUri,t);return{uri:n,folder:jh(n)}}),q.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#r)n.id!==e.id&&(Eh(t,n)&&q.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id}),n.includePaths?.forEach(r=>{Eh(t,r)&&q.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id,otherIncludePath:r.folder})}));return e}},Ih=class extends Ee{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=g.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){G(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){G(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(ac,g.parse(sc)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{W.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),n.length===0&&W.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){W.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of an(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){W.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?W.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):W.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=le.basename(t.uri);return t.isDirectory?!Cm(r):t.isFile?(n.fileExtensions.includes(le.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&E(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();W.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return P(e,`Workspace not initialized`),g.parse(e.uri)}get workspaceURL(){let e=this.workspace();return P(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of this.#e)e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#e.push(e),Me.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};const Lh=A({name:k().describe(`Project identifier`),title:k().optional().describe(`Human-readable project title`),contactPerson:k().optional().describe(`Maintainer contact information`),metadata:mr(k(),dr()).optional().describe(`Custom project metadata as key-value pairs`),extends:sr([k(),j(k())]).optional().describe(`Style inheritance paths`),exclude:j(k()).optional().describe(`File exclusion patterns`),include:A({paths:j(k()).describe(`Include paths`),maxDepth:O().describe(`Maximum directory depth`),fileThreshold:O().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:A({outDir:k().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:A({hasTheme:cr().describe(`Whether theme customization is defined`),hasDefaults:cr().describe(`Whether default style values are defined`),hasCustomCss:cr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function Rh(e){let t={name:e.name};return e.title!=null&&(t.title=e.title),e.contactPerson!=null&&(t.contactPerson=e.contactPerson),e.metadata&&(t.metadata=e.metadata),e.extends&&(t.extends=e.extends),e.exclude&&(t.exclude=e.exclude),e.include&&(t.include={paths:e.include.paths||[],maxDepth:e.include.maxDepth??3,fileThreshold:e.include.fileThreshold??30}),e.manualLayouts&&(t.manualLayouts={outDir:e.manualLayouts.outDir??`.likec4`}),e.styles&&(t.styles={hasTheme:!!e.styles.theme,hasDefaults:!!e.styles.defaults,hasCustomCss:!!e.styles.customCss}),t}const zh=A({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k(),tags:j(k()),metadata:mr(sr([k(),j(k())])),includedInViews:j(A({id:k().describe(`View id`),title:k().describe(`View title`),type:ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function Bh(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:Gh(e.views())}}function Vh(e,t,n,r,i,a){P(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...Bh(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const Hh=A({path:k().describe(`Path to the file`),range:A({start:A({line:O(),character:O()}),end:A({line:O(),character:O()})}).describe(`Range in the file`)}).nullable(),Uh=k().refine(e=>!0).optional().default(Fh.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),Wh=j(A({id:k().describe(`View id`),title:k().describe(`View title`),type:ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})),Gh=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),Kh=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:g.parse(r.uri).fsPath,range:r.range}:null}catch(e){return Wm.debug(`Failed to locate {params}`,{error:e,params:n}),null}},qh=zh.extend({description:k().nullable().describe(`Element description`),technology:k().nullable().describe(`Element technology`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),children:j(k()).describe(`Direct child element ids`),incomingCount:O().describe(`Number of incoming relationships`),outgoingCount:O().describe(`Number of outgoing relationships`)}),Jh=Gm({name:`batch-read-elements`,description:`
|
|
54
|
+
`)}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return o}async remove(e,t){this.cache.delete(e.id);let n=uu.getChild(e.id),r=pu(e),i=dn.joinPath(r,fu(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:cr.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){uu.trace`clear caches`,this.cache.clear()}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=mn.parse(e.icon),r=dn.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${hu}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(hu)){let n=e.icon.substring(9),r=dn.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const _u=`AnyProperty`;function vu(e){return J.isInstance(e,_u)}const yu=`ColorLiteral`;function bu(e){return J.isInstance(e,yu)}const xu=`DeploymentElement`;function Su(e){return J.isInstance(e,xu)}const Cu=`DeploymentNodeOrElementKind`,wu=`DeploymentViewRule`;function Tu(e){return J.isInstance(e,wu)}const Eu=`DynamicViewProperty`,Du=`DynamicViewRule`;function Ou(e){return J.isInstance(e,Du)}const ku=`DynamicViewStep`;function Au(e){return J.isInstance(e,ku)}const ju=`ElementProperty`;function Mu(e){return J.isInstance(e,ju)}const Nu=`ExpressionV2`;function Pu(e){return J.isInstance(e,Nu)}const Fu=`ExtendElementProperty`,Iu=`ExtendRelationProperty`,Lu=`FqnExpr`;function Ru(e){return J.isInstance(e,Lu)}const zu=`FqnExprOrWhere`;function Bu(e){return J.isInstance(e,zu)}const Vu=`FqnExprOrWith`;function Hu(e){return J.isInstance(e,Vu)}const Uu=`FqnReferenceable`,Wu=`LikeC4View`;function Gu(e){return J.isInstance(e,Wu)}const Ku=`MetadataProperty`;function qu(e){return J.isInstance(e,Ku)}const Ju=`MetadataValue`,Yu=`ModelReferenceable`,Xu=`Referenceable`,Zu=`RelationExpr`;function Qu(e){return J.isInstance(e,Zu)}const $u=`RelationExprOrWhere`;function ed(e){return J.isInstance(e,$u)}const td=`RelationExprOrWith`;function nd(e){return J.isInstance(e,td)}const rd=`RelationProperty`,id=`RelationshipStyleProperty`;function ad(e){return J.isInstance(e,id)}const od=`SizeProperty`;function sd(e){return J.isInstance(e,od)}const cd=`StringProperty`;function ld(e){return J.isInstance(e,cd)}const ud=`StyleProperty`;function dd(e){return J.isInstance(e,ud)}const fd=`ViewProperty`;function pd(e){return J.isInstance(e,fd)}const md=`ViewRule`;function hd(e){return J.isInstance(e,md)}const gd=`ViewRuleStyleOrGlobalRef`;function _d(e){return J.isInstance(e,gd)}const vd=`WhereElement`;function yd(e){return J.isInstance(e,vd)}const bd=`WhereElementExpression`;function xd(e){return J.isInstance(e,bd)}const Sd=`WhereExpression`,Cd=`WhereKindEqual`;function wd(e){return J.isInstance(e,Cd)}const Td=`WhereRelation`;function Ed(e){return J.isInstance(e,Td)}const Dd=`WhereRelationExpression`;function Od(e){return J.isInstance(e,Dd)}const kd=`WhereTagEqual`;function Ad(e){return J.isInstance(e,kd)}const jd=`AbstractDynamicStep`,Md=`ArrowProperty`;function Nd(e){return J.isInstance(e,Md)}const Pd=`BorderProperty`;function Fd(e){return J.isInstance(e,Pd)}const Id=`ColorProperty`;function Ld(e){return J.isInstance(e,Id)}const Rd=`CustomColor`,zd=`CustomElementProperties`;function Bd(e){return J.isInstance(e,zd)}const Vd=`CustomRelationProperties`;function Hd(e){return J.isInstance(e,Vd)}const Ud=`DeployedInstance`;function Wd(e){return J.isInstance(e,Ud)}const Gd=`DeployedInstanceBody`;function Kd(e){return J.isInstance(e,Gd)}const qd=`DeploymentNode`;function Jd(e){return J.isInstance(e,qd)}const Yd=`DeploymentNodeBody`;function Xd(e){return J.isInstance(e,Yd)}const Zd=`DeploymentNodeKind`;function Qd(e){return J.isInstance(e,Zd)}const $d=`DeploymentRelation`;function ef(e){return J.isInstance(e,$d)}const tf=`DeploymentRelationBody`;function nf(e){return J.isInstance(e,tf)}const rf=`DeploymentView`;function af(e){return J.isInstance(e,rf)}const of=`DeploymentViewBody`;function sf(e){return J.isInstance(e,of)}const cf=`DeploymentViewRulePredicate`;function lf(e){return J.isInstance(e,cf)}const uf=`DeploymentViewRuleStyle`;function df(e){return J.isInstance(e,uf)}const ff=`DirectedRelationExpr`;function pf(e){return J.isInstance(e,ff)}const mf=`DynamicView`;function hf(e){return J.isInstance(e,mf)}const gf=`DynamicViewBody`;function _f(e){return J.isInstance(e,gf)}const vf=`DynamicViewDisplayVariantProperty`;function yf(e){return J.isInstance(e,vf)}const bf=`DynamicViewGlobalPredicateRef`;function xf(e){return J.isInstance(e,bf)}const Sf=`DynamicViewIncludePredicate`;function Cf(e){return J.isInstance(e,Sf)}const wf=`DynamicViewParallelSteps`;function Tf(e){return J.isInstance(e,wf)}const Ef=`DynamicViewRef`,Df=`Element`;function Of(e){return J.isInstance(e,Df)}const kf=`ElementBody`;function Af(e){return J.isInstance(e,kf)}const jf=`ElementKind`;function Mf(e){return J.isInstance(e,jf)}const Nf=`ElementKindExpression`;function Pf(e){return J.isInstance(e,Nf)}const Ff=`ElementRef`;function If(e){return J.isInstance(e,Ff)}const Lf=`ElementStringProperty`;function Rf(e){return J.isInstance(e,Lf)}const zf=`ElementStyleProperty`;function Bf(e){return J.isInstance(e,zf)}const Vf=`ElementTagExpression`;function Hf(e){return J.isInstance(e,Vf)}const Uf=`ElementView`;function Wf(e){return J.isInstance(e,Uf)}const Gf=`ElementViewBody`;function Kf(e){return J.isInstance(e,Gf)}const qf=`ElementViewRef`,Jf=`Expressions`;function Yf(e){return J.isInstance(e,Jf)}const Xf=`ExtendDeployment`;function Zf(e){return J.isInstance(e,Xf)}const Qf=`ExtendDeploymentBody`;function $f(e){return J.isInstance(e,Qf)}const ep=`ExtendElement`;function tp(e){return J.isInstance(e,ep)}const np=`ExtendElementBody`;function rp(e){return J.isInstance(e,np)}const ip=`ExtendRelation`;function ap(e){return J.isInstance(e,ip)}const op=`ExtendRelationBody`;function sp(e){return J.isInstance(e,op)}const cp=`FqnExpressions`;function lp(e){return J.isInstance(e,cp)}const up=`FqnExprWhere`;function dp(e){return J.isInstance(e,up)}const fp=`FqnExprWith`;function pp(e){return J.isInstance(e,fp)}const mp=`FqnRef`;function hp(e){return J.isInstance(e,mp)}const gp=`FqnRefExpr`;function _p(e){return J.isInstance(e,gp)}const vp=`GlobalDynamicPredicateGroup`;function yp(e){return J.isInstance(e,vp)}const bp=`GlobalPredicateGroup`;function xp(e){return J.isInstance(e,bp)}const Sp=`Globals`;function Cp(e){return J.isInstance(e,Sp)}const wp=`GlobalStyle`;function Tp(e){return J.isInstance(e,wp)}const Ep=`GlobalStyleGroup`;function Dp(e){return J.isInstance(e,Ep)}const Op=`GlobalStyleId`,kp=`HexColor`;function Ap(e){return J.isInstance(e,kp)}const jp=`IconColorProperty`;function Mp(e){return J.isInstance(e,jp)}const Np=`IconPositionProperty`;function Pp(e){return J.isInstance(e,Np)}const Fp=`IconProperty`;function Ip(e){return J.isInstance(e,Fp)}const Lp=`IconSizeProperty`;function Rp(e){return J.isInstance(e,Lp)}const zp=`Imported`;function Bp(e){return J.isInstance(e,zp)}const Vp=`ImportsFromPoject`;function Hp(e){return J.isInstance(e,Vp)}const Up=`IncomingRelationExpr`;function Wp(e){return J.isInstance(e,Up)}const Gp=`InOutRelationExpr`;function Kp(e){return J.isInstance(e,Gp)}const qp=`LibIcon`;function Jp(e){return J.isInstance(e,qp)}const Yp=`LikeC4Grammar`;function Xp(e){return J.isInstance(e,Yp)}const Zp=`LikeC4Lib`;function Qp(e){return J.isInstance(e,Zp)}const $p=`LineProperty`;function em(e){return J.isInstance(e,$p)}const tm=`LinkProperty`;function nm(e){return J.isInstance(e,tm)}const rm=`MarkdownOrString`;function im(e){return J.isInstance(e,rm)}const am=`MetadataArray`;function om(e){return J.isInstance(e,am)}const sm=`MetadataAttribute`;function cm(e){return J.isInstance(e,sm)}const lm=`MetadataBody`;function um(e){return J.isInstance(e,lm)}const dm=`Model`;function fm(e){return J.isInstance(e,dm)}const pm=`ModelDeployments`;function mm(e){return J.isInstance(e,pm)}const hm=`ModelViews`;function gm(e){return J.isInstance(e,hm)}const _m=`MultipleProperty`;function vm(e){return J.isInstance(e,_m)}const ym=`NavigateToProperty`;function bm(e){return J.isInstance(e,ym)}const xm=`NotationProperty`;function Sm(e){return J.isInstance(e,xm)}const Cm=`NotesProperty`;function wm(e){return J.isInstance(e,Cm)}const Tm=`OpacityProperty`;function Em(e){return J.isInstance(e,Tm)}const Dm=`OutgoingRelationExpr`;function Om(e){return J.isInstance(e,Dm)}const km=`PaddingSizeProperty`;function Am(e){return J.isInstance(e,km)}const jm=`Relation`;function Mm(e){return J.isInstance(e,jm)}const Nm=`RelationBody`;function Pm(e){return J.isInstance(e,Nm)}const Fm=`RelationExprWhere`;function Im(e){return J.isInstance(e,Fm)}const Lm=`RelationExprWith`;function Rm(e){return J.isInstance(e,Lm)}const zm=`RelationKindDotRef`;function Bm(e){return J.isInstance(e,zm)}const Vm=`RelationNavigateToProperty`;function Hm(e){return J.isInstance(e,Vm)}const Um=`RelationshipKind`;function Wm(e){return J.isInstance(e,Um)}const Gm=`RelationStringProperty`;function Km(e){return J.isInstance(e,Gm)}const qm=`RelationStyleProperty`;function Jm(e){return J.isInstance(e,qm)}const Ym=`RGBAColor`;function Xm(e){return J.isInstance(e,Ym)}const Zm=`ShapeProperty`;function Qm(e){return J.isInstance(e,Zm)}const $m=`ShapeSizeProperty`;function eh(e){return J.isInstance(e,$m)}const th=`SpecificationColor`;function nh(e){return J.isInstance(e,th)}const rh=`SpecificationDeploymentNodeKind`;function ih(e){return J.isInstance(e,rh)}const ah=`SpecificationElementKind`;function oh(e){return J.isInstance(e,ah)}const sh=`SpecificationElementStringProperty`;function ch(e){return J.isInstance(e,sh)}const lh=`SpecificationRelationshipKind`;function uh(e){return J.isInstance(e,lh)}const dh=`SpecificationRelationshipStringProperty`;function fh(e){return J.isInstance(e,dh)}const ph=`SpecificationRule`;function mh(e){return J.isInstance(e,ph)}const hh=`SpecificationTag`;function gh(e){return J.isInstance(e,hh)}const _h=`StrictFqnElementRef`;function vh(e){return J.isInstance(e,_h)}const yh=`StrictFqnRef`;function bh(e){return J.isInstance(e,yh)}function xh(e){return J.isInstance(e,`Tag`)}const Sh=`TagRef`;function Ch(e){return J.isInstance(e,Sh)}const wh=`Tags`;function Th(e){return J.isInstance(e,wh)}const Eh=`TextSizeProperty`;function Dh(e){return J.isInstance(e,Eh)}const Oh=`ViewRef`,kh=`ViewRuleAutoLayout`;function Ah(e){return J.isInstance(e,kh)}const jh=`ViewRuleGlobalPredicateRef`;function Mh(e){return J.isInstance(e,jh)}const Nh=`ViewRuleGlobalStyle`;function Ph(e){return J.isInstance(e,Nh)}const Fh=`ViewRuleGroup`;function Ih(e){return J.isInstance(e,Fh)}const Lh=`ViewRulePredicate`;function Rh(e){return J.isInstance(e,Lh)}const zh=`ViewRuleRank`;function Bh(e){return J.isInstance(e,zh)}const Vh=`ViewRuleStyle`;function Hh(e){return J.isInstance(e,Vh)}const Uh=`ViewStringProperty`;function Wh(e){return J.isInstance(e,Uh)}const Gh=`WhereBinaryExpression`;function Kh(e){return J.isInstance(e,Gh)}const qh=`WhereElementKind`;function Jh(e){return J.isInstance(e,qh)}const Yh=`WhereElementNegation`;function Xh(e){return J.isInstance(e,Yh)}const Zh=`WhereElementTag`;function Qh(e){return J.isInstance(e,Zh)}const $h=`WhereRelationKind`;function eg(e){return J.isInstance(e,$h)}const tg=`WhereRelationNegation`;function ng(e){return J.isInstance(e,tg)}const rg=`WhereRelationParticipantKind`;function ig(e){return J.isInstance(e,rg)}const ag=`WhereRelationParticipantTag`;function og(e){return J.isInstance(e,ag)}const sg=`WhereRelationTag`;function cg(e){return J.isInstance(e,sg)}const lg=`WildcardExpression`;function ug(e){return J.isInstance(e,lg)}const dg=`DynamicStepChain`;function fg(e){return J.isInstance(e,dg)}const pg=`DynamicStepSingle`;function mg(e){return J.isInstance(e,pg)}var hg=class extends an{getAllTypes(){return[jd,_u,Md,Pd,yu,Id,Rd,zd,Vd,Ud,Gd,xu,qd,Yd,Zd,Cu,$d,tf,rf,of,wu,cf,uf,ff,dg,pg,mf,gf,vf,bf,Sf,wf,Eu,Ef,Du,ku,Df,kf,jf,Nf,ju,Ff,Lf,zf,Vf,Uf,Gf,qf,Nu,Jf,Xf,Qf,ep,np,Fu,ip,op,Iu,Lu,zu,Vu,up,fp,cp,mp,gp,Uu,vp,bp,wp,Ep,Op,Sp,kp,jp,Np,Fp,Lp,zp,Vp,Gp,Up,qp,Yp,Zp,Wu,$p,tm,rm,am,sm,lm,Ku,Ju,dm,pm,Yu,hm,_m,ym,xm,Cm,Tm,Dm,km,Ym,Xu,jm,Nm,Zu,$u,td,Fm,Lm,zm,Vm,rd,Gm,qm,Um,id,Zm,$m,od,th,rh,ah,sh,lh,dh,ph,hh,_h,yh,cd,ud,`Tag`,Sh,wh,Eh,fd,Oh,md,kh,jh,Nh,Fh,Lh,zh,Vh,gd,Uh,Gh,vd,bd,qh,Yh,Zh,Sd,Cd,Td,Dd,$h,tg,rg,ag,sg,kd,lg]}computeIsSubtype(e,t){switch(e){case Md:case $p:return this.isSubtype(id,t);case Pd:case jp:case Np:case _m:case Tm:case Zm:return this.isSubtype(ud,t);case Id:return this.isSubtype(id,t)||this.isSubtype(ud,t);case Ud:case qd:return this.isSubtype(xu,t)||this.isSubtype(Xu,t);case Zd:case jf:return this.isSubtype(Cu,t);case rf:case mf:case Uf:return this.isSubtype(Wu,t);case cf:case uf:return this.isSubtype(wu,t);case ff:case Up:case Gp:case Dm:return this.isSubtype(Zu,t);case dg:case pg:return this.isSubtype(jd,t)||this.isSubtype(ku,t);case vf:return this.isSubtype(Eu,t);case bf:case Sf:return this.isSubtype(Du,t);case Eu:case ju:case ym:case rd:case id:case cd:case ud:return this.isSubtype(_u,t);case Df:return this.isSubtype(Uu,t)||this.isSubtype(Yu,t)||this.isSubtype(Xu,t);case Nf:case Vf:case gp:case lg:return this.isSubtype(Lu,t);case Lf:return this.isSubtype(ju,t)||this.isSubtype(cd,t);case zf:return this.isSubtype(ju,t);case Xf:case ep:case Xu:return this.isSubtype(Uu,t);case Lu:case up:return this.isSubtype(zu,t);case zu:case fp:return this.isSubtype(Vu,t);case Vu:case td:return this.isSubtype(Nu,t);case kp:case Ym:return this.isSubtype(yu,t);case Fp:return this.isSubtype(ju,t)||this.isSubtype(ud,t);case Lp:case km:case $m:case Eh:return this.isSubtype(od,t)||this.isSubtype(ud,t);case zp:return this.isSubtype(Yu,t)||this.isSubtype(Xu,t);case tm:return this.isSubtype(ju,t)||this.isSubtype(Fu,t)||this.isSubtype(Iu,t)||this.isSubtype(rd,t)||this.isSubtype(fd,t);case rm:case am:return this.isSubtype(Ju,t);case sm:case sh:case dh:return this.isSubtype(cd,t);case lm:return this.isSubtype(Ku,t);case Ku:return this.isSubtype(ju,t)||this.isSubtype(Fu,t)||this.isSubtype(Iu,t)||this.isSubtype(rd,t);case xm:case Cm:return this.isSubtype(_u,t)||this.isSubtype(cd,t);case Zu:case Fm:return this.isSubtype($u,t);case $u:case Lm:return this.isSubtype(td,t);case Vm:case qm:return this.isSubtype(rd,t);case Gm:return this.isSubtype(rd,t)||this.isSubtype(cd,t);case fd:return this.isSubtype(_u,t)||this.isSubtype(Eu,t);case kh:return this.isSubtype(wu,t)||this.isSubtype(Du,t)||this.isSubtype(md,t);case jh:case Fh:case Lh:case zh:return this.isSubtype(md,t);case Nh:case Vh:return this.isSubtype(gd,t);case gd:return this.isSubtype(Du,t)||this.isSubtype(md,t);case Uh:return this.isSubtype(cd,t)||this.isSubtype(fd,t);case Gh:return this.isSubtype(bd,t)||this.isSubtype(Dd,t);case vd:case Yh:return this.isSubtype(bd,t);case bd:case Dd:return this.isSubtype(Sd,t);case qh:return this.isSubtype(vd,t)||this.isSubtype(Cd,t);case Zh:return this.isSubtype(vd,t)||this.isSubtype(kd,t);case Td:case tg:return this.isSubtype(Dd,t);case $h:case rg:return this.isSubtype(Cd,t)||this.isSubtype(Td,t);case ag:case sg:return this.isSubtype(Td,t)||this.isSubtype(kd,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return Um;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Rd;case`DeploymentNode:kind`:return Zd;case`DynamicViewGlobalPredicateRef:predicate`:return vp;case`DynamicViewRef:view`:return mf;case`Element:kind`:case`ElementKindExpression:kind`:return jf;case`ElementViewRef:view`:return Uf;case`FqnRef:value`:case`StrictFqnRef:value`:return Xu;case`IconProperty:libicon`:return qp;case`Imported:imported`:case`StrictFqnElementRef:el`:return Df;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Wu;case`ViewRuleGlobalPredicateRef:predicate`:return bp;case`ViewRuleGlobalStyle:style`:return Op;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Cu;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case jd:return{name:jd,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Md:return{name:Md,properties:[{name:`key`},{name:`value`}]};case Pd:return{name:Pd,properties:[{name:`key`},{name:`value`}]};case Id:return{name:Id,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Rd:return{name:Rd,properties:[{name:`name`}]};case zd:return{name:zd,properties:[{name:`props`,defaultValue:[]}]};case Vd:return{name:Vd,properties:[{name:`props`,defaultValue:[]}]};case Ud:return{name:Ud,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Gd:return{name:Gd,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case qd:return{name:qd,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Yd:return{name:Yd,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Zd:return{name:Zd,properties:[{name:`name`}]};case $d:return{name:$d,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case tf:return{name:tf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case rf:return{name:rf,properties:[{name:`body`},{name:`name`}]};case of:return{name:of,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case cf:return{name:cf,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case uf:return{name:uf,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case ff:return{name:ff,properties:[{name:`source`},{name:`target`}]};case mf:return{name:mf,properties:[{name:`body`},{name:`name`}]};case gf:return{name:gf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case vf:return{name:vf,properties:[{name:`key`},{name:`value`}]};case bf:return{name:bf,properties:[{name:`predicate`}]};case Sf:return{name:Sf,properties:[{name:`exprs`}]};case wf:return{name:wf,properties:[{name:`steps`,defaultValue:[]}]};case Ef:return{name:Ef,properties:[{name:`view`}]};case Df:return{name:Df,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case kf:return{name:kf,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case jf:return{name:jf,properties:[{name:`name`}]};case Nf:return{name:Nf,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Ff:return{name:Ff,properties:[{name:`modelElement`}]};case Lf:return{name:Lf,properties:[{name:`key`},{name:`value`}]};case zf:return{name:zf,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Vf:return{name:Vf,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Uf:return{name:Uf,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Gf:return{name:Gf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case qf:return{name:qf,properties:[{name:`view`}]};case Jf:return{name:Jf,properties:[{name:`prev`},{name:`value`}]};case Xf:return{name:Xf,properties:[{name:`body`},{name:`deploymentNode`}]};case Qf:return{name:Qf,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ep:return{name:ep,properties:[{name:`body`},{name:`element`}]};case np:return{name:np,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ip:return{name:ip,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case op:return{name:op,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case cp:return{name:cp,properties:[{name:`prev`},{name:`value`}]};case up:return{name:up,properties:[{name:`subject`},{name:`where`}]};case fp:return{name:fp,properties:[{name:`custom`},{name:`subject`}]};case mp:return{name:mp,properties:[{name:`parent`},{name:`value`}]};case gp:return{name:gp,properties:[{name:`ref`},{name:`selector`}]};case vp:return{name:vp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case bp:return{name:bp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Sp:return{name:Sp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case wp:return{name:wp,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Ep:return{name:Ep,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Op:return{name:Op,properties:[{name:`name`}]};case kp:return{name:kp,properties:[{name:`hex`}]};case jp:return{name:jp,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Np:return{name:Np,properties:[{name:`key`},{name:`value`}]};case Fp:return{name:Fp,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Lp:return{name:Lp,properties:[{name:`key`},{name:`value`}]};case zp:return{name:zp,properties:[{name:`imported`},{name:`prev`}]};case Vp:return{name:Vp,properties:[{name:`imports`},{name:`project`}]};case Up:return{name:Up,properties:[{name:`to`}]};case Gp:return{name:Gp,properties:[{name:`inout`}]};case qp:return{name:qp,properties:[{name:`name`}]};case Yp:return{name:Yp,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Zp:return{name:Zp,properties:[{name:`icons`,defaultValue:[]}]};case $p:return{name:$p,properties:[{name:`key`},{name:`value`}]};case tm:return{name:tm,properties:[{name:`key`},{name:`title`},{name:`value`}]};case rm:return{name:rm,properties:[{name:`markdown`},{name:`text`}]};case am:return{name:am,properties:[{name:`values`,defaultValue:[]}]};case sm:return{name:sm,properties:[{name:`key`},{name:`value`}]};case lm:return{name:lm,properties:[{name:`props`,defaultValue:[]}]};case dm:return{name:dm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case pm:return{name:pm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case hm:return{name:hm,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case _m:return{name:_m,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case ym:return{name:ym,properties:[{name:`key`},{name:`value`}]};case xm:return{name:xm,properties:[{name:`key`},{name:`value`}]};case Cm:return{name:Cm,properties:[{name:`key`},{name:`value`}]};case Tm:return{name:Tm,properties:[{name:`key`},{name:`value`}]};case Dm:return{name:Dm,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case km:return{name:km,properties:[{name:`key`},{name:`value`}]};case jm:return{name:jm,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Nm:return{name:Nm,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Fm:return{name:Fm,properties:[{name:`subject`},{name:`where`}]};case Lm:return{name:Lm,properties:[{name:`custom`},{name:`subject`}]};case zm:return{name:zm,properties:[{name:`kind`}]};case Vm:return{name:Vm,properties:[{name:`key`},{name:`value`}]};case Um:return{name:Um,properties:[{name:`name`}]};case Gm:return{name:Gm,properties:[{name:`key`},{name:`value`}]};case qm:return{name:qm,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Ym:return{name:Ym,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case Zm:return{name:Zm,properties:[{name:`key`},{name:`value`}]};case $m:return{name:$m,properties:[{name:`key`},{name:`value`}]};case th:return{name:th,properties:[{name:`color`},{name:`name`}]};case rh:return{name:rh,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case ah:return{name:ah,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case sh:return{name:sh,properties:[{name:`key`},{name:`value`}]};case lh:return{name:lh,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case dh:return{name:dh,properties:[{name:`key`},{name:`value`}]};case ph:return{name:ph,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case hh:return{name:hh,properties:[{name:`color`},{name:`tag`}]};case _h:return{name:_h,properties:[{name:`el`},{name:`parent`}]};case yh:return{name:yh,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Sh:return{name:Sh,properties:[{name:`tag`}]};case wh:return{name:wh,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Eh:return{name:Eh,properties:[{name:`key`},{name:`value`}]};case Oh:return{name:Oh,properties:[{name:`view`}]};case kh:return{name:kh,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case jh:return{name:jh,properties:[{name:`predicate`}]};case Nh:return{name:Nh,properties:[{name:`style`}]};case Fh:return{name:Fh,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Lh:return{name:Lh,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case zh:return{name:zh,properties:[{name:`targets`},{name:`value`}]};case Vh:return{name:Vh,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Uh:return{name:Uh,properties:[{name:`key`},{name:`value`}]};case Gh:return{name:Gh,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case qh:return{name:qh,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Yh:return{name:Yh,properties:[{name:`value`}]};case Zh:return{name:Zh,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case $h:return{name:$h,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case tg:return{name:tg,properties:[{name:`value`}]};case rg:return{name:rg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case ag:return{name:ag,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case sg:return{name:sg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case lg:return{name:lg,properties:[{name:`isWildcard`,defaultValue:!1}]};case dg:return{name:dg,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case pg:return{name:pg,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const J=new hg;let gg;const _g=()=>gg??=Zn(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@46"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@123"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@124"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@125"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/[_]*[a-zA-Z][-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@117"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@148"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@150"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),vg={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},yg={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},bg={AstReflection:()=>new hg},xg={Grammar:()=>_g(),LanguageMetaData:()=>vg,parser:{ParserConfig:()=>yg}};function Sg(e){return vg.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function Cg(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const wg=Li(`/`);function Tg(e,t){return wg(e.uri.path,t.uri.path)}const Eg=K.getChild(`chokidar`),Dg={fileSystemWatcher:e=>new kg(e)},Og=e=>{let t=ti(e);return Sg(t)||Ql(t)||du(t)};var kg=class{watcher;queue=new en({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){Eg.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0,await e.close()}}createWatcher(e){Eg.debug`create watcher for folder: ${e}`;let t=Tr.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!Og(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Eg.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Eg.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=ti(e),r=mn.file(e);switch(!0){case Ql(n):Eg.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case Sg(n):Eg.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case du(n):{Eg.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches();let n=t.ProjectsManager.ownerProjectId(r);await t.ProjectsManager.rebuildProject(n);break}default:Eg.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=ti(e),r=mn.file(e);switch(!0){case Ql(n):Eg.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case Sg(n):Eg.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case du(n):{Eg.debug`manual layout file removed: ${e}`;let n=t.ProjectsManager.ownerProjectId(r);t.ManualLayouts.clearCaches(),await t.ProjectsManager.rebuildProject(n);break}default:Eg.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Eg.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},Ag=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(cu(e))return Promise.resolve(au);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},jg=class{watch(){}dispose(){return Promise.resolve()}},Mg=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const Ng={fileSystemWatcher:()=>new jg},Pg={fileSystemProvider:()=>new Ag,...Ng},Fg={manualLayouts:()=>new Mg},Ig=K.getChild(`filesystem`);function Lg(e,t=!1){return!t&&Ql(ti(e))}function Rg(e,t=!1){return!t&&Sg(ti(e))}const zg=(e=!0)=>({fileSystemProvider:()=>new Bg,...e?Dg:Ng});var Bg=class extends lr{async readFile(e){if(cu(e))return Promise.resolve(au);try{return await super.readFile(e)}catch(t){return Ig.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new iu.fdir().withSymlinks({resolvePaths:!1}).exclude(Cg).withFullPaths().filter(Rg);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:mn.file(e)})}catch(t){Ig.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(Tg)}async scanProjectFiles(e){return await this.scanDirectory(e,Lg)}async scanDirectory(e,t){let n=[];try{let r=await new iu.fdir().withSymlinks({resolvePaths:!1}).exclude(Cg).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:mn.file(e)})}catch(t){Ig.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await ru(e)}async writeFile(e,t){let n=ni(e.fsPath),r=hi(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(Ig.debug(`creating directory {path}`,{path:n}),mi(n,{recursive:!0})),Ig.debug(`writing file {path}`,{path:e.fsPath}),await si(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=hi(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await oi(t),Ig.debug(`deleted file {path}`,{path:t}),!0):(Ig.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){Ig.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const Vg={mcpServer:()=>new Hg,mcpServerFactory:()=>new Ug};var Hg=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},Ug=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const Wg=K.getChild(`mcp`);function Gg(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},Kg(n,e,t)]}function Kg(e,t,n){let r=n.bind(null,t);return(async function(t,n){Wg.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return Wg.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:U(t)}],isError:!0}}})}var qg=`1.52.0`,Jg=class extends nr{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=On(e);let r=super.createDescription(e,t,n);return cu(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},Yg=class extends Vn{constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,n){let r=this.services.workspace.ProjectsManager;return An(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const Xg=Symbol.for(`idattr`),Zg={writeId(e,t){return e[Xg]=t,e},readId(e){return e[Xg]}},Qg={writeId(e,t){return v(t)?e[Xg]=void 0:e[Xg]=t,e},readId(e){return e[Xg]}};function $g(e){return e?.textDocument.languageId===vg.languageId}function e_(e){return e?.markdown||e?.text}function t_(e){let t=parseFloat(e);return isNaN(t)?100:Me(t,{min:0,max:100})}function n_({value:e}){return t_(e)}function r_({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:P(e)}}function i_({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:P(e)}}function a_(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case Ld(r):{let e=o_(r);C(e)&&(n.color=e);break}case em(r):n.line=r.value;break;case Nd(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:P(r)}break;default:P(r)}return n}function o_(e){return e?.themeColor??e?.customColor?.$refText}function s_(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:P(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function c_(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:P(e)}}function l_(e){return En(e,e=>Rh(e)||lf(e)||Cf(e))}const u_=e=>fm(e)||Af(e)||rp(e)||Kf(e)||_f(e)||If(e),d_=e=>mm(e)||sf(e)||Xd(e)||$f(e)||Kd(e);function f_(e){for(;;){if(d_(e)||u_(e))return!1;if(Cp(e)||gm(e))return!0;if(e.$container)e=e.$container;else return!1}}function p_(e){for(;;){if(d_(e))return!1;if(u_(e))return!0;if(e.$container)e=e.$container;else return!1}}function m_(e){for(;;){if(u_(e))return!1;if(d_(e))return!0;if(e.$container)e=e.$container;else return!1}}const h_=Li(`/`),g_=(e,t)=>h_(e.uri.path,t.uri.path),__=e=>$g(e)&&lu(e);var v_=class extends bn{constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);let n=[...this.documentMap.values(),e].sort(g_);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);__(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return __(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return An(this.documentMap.values()).filter(e=>__(e)&&!this.projectsManager.isExcluded(e))}get all(){return An(this.documentMap.values()).map(e=>(__(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return An(this.documentMap.values()).filter(n=>__(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return w(this.userDocuments.toArray(),y(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),xe(x(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,__(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},y_=t(Cr(),1),b_=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){q(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function x_(e){try{let t=vh(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function S_(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function C_(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function w_(e){let t;for(;t=e.value?.ref;){if(Jd(t))return null;if(Wd(t))return t;if(v(e.parent))return null;e=e.parent}return null}function T_(e){let t=C_(e);return t?.$type===`Imported`?t:null}function E_(e){let t;for(;t=e.value?.ref;){if(Su(t))return!0;if(v(e.parent))return!1;e=e.parent}return!1}function D_(e){if(Bp(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;N(Hp(e))}if(Hp(e))return e.project;let t=Bn(e)?On(e):e;return t.likec4ProjectId?t.likec4ProjectId:(K.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Y_.DefaultProjectId)}function O_(...e){return Da(e.length>1?e.join(`:::`):e[0])}function k_(e){try{return e()}catch(e){K.trace(`Safe call failed`,{error:e});return}}function A_(){try{return globalThis.performance.now()}catch{return Date.now()}}function j_(){let e=A_();return{get ms(){return A_()-e},get pretty(){return Kr(A_()-e)}}}const Y=K.getChild(`projects`);function M_(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function N_(e){return M_(e)?e.uri.toString():typeof e==`string`?Hr(e,{acceptRelative:!1,strict:!0})?e:mn.file(e).toString():e.toString()}const P_=Li(`/`,!0),F_=(e,t)=>P_(Lr(e.path),Lr(t.path));function I_(e){return t=>e.startsWith(Bi(t)?t:t.folder)}function L_(e,t){let n=Bi(e)?e:e.folder,r=Bi(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function R_(...e){return Pe(L_,e)}function z_(e,t){return t.startsWith(e.folder)||e.includePaths?.some(I_(t))?!B_(e,t):!1}function B_(e,t){return e.exclude?.(Gr(t))??!1}function V_(...e){return Pe(z_,e)}function H_(...e){return Pe(B_,e)}function U_(e){return e=N_(e),Ur(e)}const W_=(e,t)=>F_(e.folderUri,t.folderUri);function G_(e){return e.sort(W_)}const K_={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,y_.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function q_(e){return K_.exclude(Gr(e))}function J_(e){if(`configUri`in e){N(!te(e.configUri),`configUri is emptyish`);let t=mn.isUri(e.configUri)?e.configUri:mn.parse(N_(e.configUri)),n=U_(dn.dirname(t));return{configUri:t,folder:n,folderUri:mn.parse(n)}}N(!te(e.folderUri),`folderUri is emptyish`);let t=U_(e.folderUri),n=mn.parse(t);return{configUri:dn.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var Y_=class e{static DefaultProjectId=K_.id;#e=[];#t=void 0;#n=[];#r=new vt.default(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=dn.joinPath(e,`likec4.config.json`),r=U_(e);return{id:t,config:K_.config,folder:r,folderUri:mn.parse(r),configUri:n,exclude:K_.exclude,includeConfig:{...K_.includeConfig}}}return M(this.#n.find(e=>e.id===t),`Project ${t} not found`)});#i=new vt.default(e=>{let t=N_(e),n=this.#a.get(t);return n?H_(n,t)?!this.#n.some(V_(t)):!1:q_(t)});#a=new vt.default(e=>{let t=I_(e);return this.#n.find(t)??this.#n.find(V_(e))??null});constructor(e){this.services=e,Y.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#n.length>1))return T(this.#n,1)?this.#n[0].id:e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#t=void 0,!t||t===e.DefaultProjectId){Y.debug`reset default project ID`;return}N(this.#n.find(e=>e.id===t),`Project "${t}" not found`),Y.debug`set default project ID to ${t}`,this.#t=t}}get default(){return this.#r.get(this.defaultProjectId??e.DefaultProjectId)}get all(){if(T(this.#n,1)){let e=[...y(this.#n,x(`id`)),K_.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[K_.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId??this.ownerProjectId(e);return this.#r.get(t)}findOverlaped(e){let t=R_(U_(e));return this.#n.filter(e=>t(e)||!!e.includePaths&&!!Xe(e.includePaths,t))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(N(this.#n.some(e=>t===e.id),`Project ID ${t} is not registered`),t):M(this.defaultProjectId,()=>`Specify exact project, known: [${y(this.#n,x(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#n.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return M_(t)&&cu(t)?!0:e.length===1?this.#i.get(N_(t)):H_(this.#r.get(e[0]),N_(t))}isIncluded(t,n){let r=N_(n);return T(this.#n,1)?t===e.DefaultProjectId?!this.#a.get(r)&&!q_(r):V_(this.#r.get(t),N_(n)):!q_(r)}async registerConfigFile(e,t){if(q_(N_(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${K_.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!vn(t))throw Xo(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Wl.validate(e.config),{configUri:r,folder:i,folderUri:a}=J_(e),o=Wl.normalizeInclude(n.include),s=this.#n.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(Y.info`project name changed from ${s.config.name} to ${n.name}`,Y.info`unregistering ${s.id}`,s.id=this.uniqueProjectId(n.name),Y.info`register ${s.id}`),this.warnIfConfigOverride(s,r),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#n=G_([...this.#n,s]),Y.info`register ${s.id}`),k_(()=>this.updateIncludesExcludes(s)),this.#o?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>vn(e)?Promise.reject(e):(Y.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#a.get(N_(t))?.id??this.#t??e.DefaultProjectId}#o=null;async reloadProjects(e){return this.#o?(Y.debug`reload projects is already in progress, waiting`,await this.#o.catch(()=>{})):(Y.debug`schedule reload projects`,this.#o=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(vn(e)||Y.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#o=null,this.notifyListeners()}),await this.#o)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Y.warn(`Failed to reloadProjects, no workspace folders found`);return}Y.debug`start reload projects`;let n=[];for(let e of t){let t=mn.parse(e.uri);Y.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)Y.debug`found config ${dn.relative(t,r.uri)}`,n.push(r.uri)}catch(e){Y.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#n.length===0){Y.warning(`No config files found`);return}Y.warning(`no config files found, but {count} projects were registered before`,{count:this.#n.length}),Y.warning(`reset`)}n.sort(F_);let r=new Map(this.#n.map(e=>[e.configUri.toString(),e]));this.#n=[],this.#r.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){Y.warn(U(t));let n=r.get(e.toString());n&&(Y.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{Y.warn(`fail to restore project ${n.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(y(this.#n,x(`id`))),n=e;if(!t.has(n))return n;Y.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){Y.trace(`resetCaches`),this.#t&&!this.#n.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#r.clear(),this.#a.clear(),this.#i.clear()}async rebuildProject(t,n){let r=this.#n.find(e=>e.id===t);if(!r)return t===e.DefaultProjectId?Y.info`Rebuilding all documents `:Y.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=Y.getChild(r.id),a=this.services.workspace.LangiumDocuments.userDocuments.filter(e=>V_(r,N_(e))).map(e=>e.uri).toArray();if(a.length===0){i.debug`no documents found for project ${r.id}, skipping rebuild`;return}i.info(`rebuild project documents: {docs}`,{docs:a.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(a,[],n).catch(e=>{i.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#n)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Wn.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return Y.warn(`Failed to get workspace URI, using default folder`,{error:e}),mn.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){Y.warn(U(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case v(t.exclude):e.exclude=K_.exclude;break;case t.exclude&&T(t.exclude,1):e.exclude=(0,y_.default)(y(t.exclude,t=>(!Rr(t)&&!t.startsWith(`**`)&&(t=Vr(`**`,t)),Wr(Fr(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!T(n,1))return e;e.includePaths=y(n,t=>{let n=dn.resolvePath(e.folderUri,t);return{uri:n,folder:U_(n)}}),Y.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#n)n.id!==e.id&&(R_(t,n)&&Y.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id}),n.includePaths?.forEach(r=>{R_(t,r)&&Y.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:n.id,otherIncludePath:r.folder})}));return e}warnIfConfigOverride(e,t){try{let[n,r]=y([e.configUri,t],dn.basename);n!==r&&Y.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}},X_=class extends Rn{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=mn.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){q(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){q(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(au,mn.parse(su)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{K.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),n.length===0&&K.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){K.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of Le(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){K.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?K.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):K.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=dn.basename(t.uri);return t.isDirectory?!Cg(r):t.isFile?(n.fileExtensions.includes(dn.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&T(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();K.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return N(e,`Workspace not initialized`),mn.parse(e.uri)}get workspaceURL(){let e=this.workspace();return N(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of this.#e)e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#e.push(e),Wn.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};const Z_=A({name:k().describe(`Project identifier`),title:k().optional().describe(`Human-readable project title`),contactPerson:k().optional().describe(`Maintainer contact information`),metadata:Pr(k(),jr()).optional().describe(`Custom project metadata as key-value pairs`),extends:Dr([k(),j(k())]).optional().describe(`Style inheritance paths`),exclude:j(k()).optional().describe(`File exclusion patterns`),include:A({paths:j(k()).describe(`Include paths`),maxDepth:O().describe(`Maximum directory depth`),fileThreshold:O().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:A({outDir:k().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:A({hasTheme:Or().describe(`Whether theme customization is defined`),hasDefaults:Or().describe(`Whether default style values are defined`),hasCustomCss:Or().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function Q_(e){let t={name:e.name};return e.title!=null&&(t.title=e.title),e.contactPerson!=null&&(t.contactPerson=e.contactPerson),e.metadata&&(t.metadata=e.metadata),e.extends&&(t.extends=e.extends),e.exclude&&(t.exclude=e.exclude),e.include&&(t.include={paths:e.include.paths||[],maxDepth:e.include.maxDepth??3,fileThreshold:e.include.fileThreshold??30}),e.manualLayouts&&(t.manualLayouts={outDir:e.manualLayouts.outDir??`.likec4`}),e.styles&&(t.styles={hasTheme:!!e.styles.theme,hasDefaults:!!e.styles.defaults,hasCustomCss:!!e.styles.customCss}),t}const $_=A({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k(),tags:j(k()),metadata:Pr(Dr([k(),j(k())])),includedInViews:j(A({id:k().describe(`View id`),title:k().describe(`View title`),type:Ar([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function ev(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:av(e.views())}}function tv(e,t,n,r,i,a){N(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...ev(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const nv=A({path:k().describe(`Path to the file`),range:A({start:A({line:O(),character:O()}),end:A({line:O(),character:O()})}).describe(`Range in the file`)}).nullable(),rv=k().refine(e=>!0).optional().default(Y_.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),iv=j(A({id:k().describe(`View id`),title:k().describe(`View title`),type:Ar([`element`,`deployment`,`dynamic`]).describe(`View type`)})),av=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),ov=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:mn.parse(r.uri).fsPath,range:r.range}:null}catch(e){return Wg.debug(`Failed to locate {params}`,{error:e,params:n}),null}},sv=$_.extend({description:k().nullable().describe(`Element description`),technology:k().nullable().describe(`Element technology`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),children:j(k()).describe(`Direct child element ids`),incomingCount:O().describe(`Number of incoming relationships`),outgoingCount:O().describe(`Number of outgoing relationships`)}),cv=Gg({name:`batch-read-elements`,description:`
|
|
37
55
|
Read details of multiple elements in a single call, reducing round-trips.
|
|
38
56
|
Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
|
|
39
57
|
|
|
@@ -95,7 +113,7 @@ Example response:
|
|
|
95
113
|
],
|
|
96
114
|
"notFound": []
|
|
97
115
|
}
|
|
98
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:j(k()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:
|
|
116
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:j(k()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:rv},outputSchema:{elements:j(sv),notFound:j(k()).describe(`Element ids that were not found`)}},async(e,t)=>{N(t.ids.length<=50,`Maximum 50 element ids per call`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=[];for(let e of t.ids){let t=r.findElement(e);if(!t){a.push(e);continue}i.push({...ev(t),description:t.description.text,technology:t.technology,shape:t.shape,color:t.color,children:[...t.children()].map(e=>e.id),incomingCount:t.allIncoming.size,outgoingCount:t.allOutgoing.size})}return{elements:i,notFound:a}}),lv=A({id:k(),kind:k(),title:k(),description:k().nullable(),technology:k().nullable(),shape:k(),color:k()}),uv=A({element1:lv,element2:lv,propertyDiffs:j(A({property:k().describe(`Property name`),element1Value:k().nullable().describe(`Value in element1`),element2Value:k().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:A({onlyInElement1:j(k()).describe(`Tags present only in element1`),onlyInElement2:j(k()).describe(`Tags present only in element2`),common:j(k()).describe(`Tags present in both elements`)}),metadata:A({onlyInElement1:Pr(Dr([k(),j(k())])).describe(`Metadata keys only in element1`),onlyInElement2:Pr(Dr([k(),j(k())])).describe(`Metadata keys only in element2`),different:j(A({key:k(),element1Value:Dr([k(),j(k())]),element2Value:Dr([k(),j(k())])})).describe(`Metadata keys present in both but with different values`),common:Pr(Dr([k(),j(k())])).describe(`Metadata keys with identical values in both`)}),relationships:A({incomingOnlyElement1:O().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:O().describe(`Count of unique source elements sending to element2 only`),incomingShared:O().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:O().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:O().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:O().describe(`Count of unique target elements receiving from both`)})}),dv=Gg({name:`element-diff`,description:`
|
|
99
117
|
Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
|
|
100
118
|
|
|
101
119
|
Request:
|
|
@@ -155,7 +173,7 @@ Example response:
|
|
|
155
173
|
"outgoingShared": 2
|
|
156
174
|
}
|
|
157
175
|
}
|
|
158
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:k().describe(`First element id (FQN)`),element2Id:k().describe(`Second element id (FQN)`),project:
|
|
176
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:k().describe(`First element id (FQN)`),element2Id:k().describe(`Second element id (FQN)`),project:rv},outputSchema:uv.shape},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);N(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);N(a,`Element "${t.element2Id}" not found in project "${n}"`);let o=[],s=[{name:`kind`,get:e=>e.kind},{name:`title`,get:e=>e.title},{name:`description`,get:e=>e.description.text},{name:`technology`,get:e=>e.technology},{name:`shape`,get:e=>e.shape},{name:`color`,get:e=>e.color}];for(let e of s){let t=e.get(i),n=e.get(a);t!==n&&o.push({property:e.name,element1Value:t,element2Value:n})}let c=new Set(i.tags),l=new Set(a.tags),u=[],d=[],f=[];for(let e of c)l.has(e)?u.push(e):d.push(e);for(let e of l)c.has(e)||f.push(e);let p=i.getMetadata(),m=a.getMetadata(),h=new Set([...Object.keys(p),...Object.keys(m)]),g={},_={},ee=[],te={};for(let e of h){let t=p[e],n=m[e];t!==void 0&&n===void 0?g[e]=t:t===void 0&&n!==void 0?_[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?te[e]=t:ee.push({key:e,element1Value:t,element2Value:n}))}let ne=new Set([...i.incoming()].map(e=>e.source.id)),re=new Set([...a.incoming()].map(e=>e.source.id)),ie=new Set([...i.outgoing()].map(e=>e.target.id)),ae=new Set([...a.outgoing()].map(e=>e.target.id)),oe=0,se=0,v=0;for(let e of ne)re.has(e)?oe++:se++;for(let e of re)ne.has(e)||v++;let ce=0,le=0,ue=0;for(let e of ie)ae.has(e)?ce++:le++;for(let e of ae)ie.has(e)||ue++;return{element1:{id:i.id,kind:i.kind,title:i.title,description:i.description.text,technology:i.technology,shape:i.shape,color:i.color},element2:{id:a.id,kind:a.kind,title:a.title,description:a.description.text,technology:a.technology,shape:a.shape,color:a.color},propertyDiffs:o,tags:{onlyInElement1:d,onlyInElement2:f,common:u},metadata:{onlyInElement1:g,onlyInElement2:_,different:ee,common:te},relationships:{incomingOnlyElement1:se,incomingOnlyElement2:v,incomingShared:oe,outgoingOnlyElement1:le,outgoingOnlyElement2:ue,outgoingShared:ce}}}),fv=Gg({name:`find-relationship-paths`,description:`
|
|
159
177
|
Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
|
|
160
178
|
|
|
161
179
|
Request:
|
|
@@ -244,10 +262,7 @@ Example response:
|
|
|
244
262
|
}
|
|
245
263
|
]
|
|
246
264
|
}
|
|
247
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:k().describe(`Source element FQN`),targetId:k().describe(`Target element FQN`),maxDepth:O().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:cr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:Uh},outputSchema:{paths:j(A({length:O().describe(`Number of hops in the path`),steps:j(A({source:k().describe(`Source element FQN`),target:k().describe(`Target element FQN`),relationship:A({kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);P(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);P(a,`Target element "${t.targetId}" not found in project "${n}"`),P(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}});var $h=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=ho(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=ca(r)):(this.imported=null,this.hierarchyLevel=ca(this.id))}get name(){return ia(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return R(this,Symbol.for(`tags`),()=>qt([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!Nt(this.$element.summary,this.$element.description)}get summary(){return Xo.memoize(this,`summary`,Xa(this.$element))}get description(){return Xo.memoize(this,`description`,Za(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return R(this,Symbol.for(`defaultView`),()=>wa(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return I(this,e)}isDescendantOf(e){return I(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=ua(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?_a([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return R(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return R(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return b(wa(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!wt(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},eg=class{Aux;get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$node.style}))}get name(){return ia(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Xo.memoize(this,`summary`,Xa(this.$node))}get description(){return Xo.memoize(this,`description`,Za(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=ua(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>ag.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>ag.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!wt(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},tg=class extends eg{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=ca(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get tags(){return R(this,Symbol.for(`tags`),()=>qt([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=wa(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return Ia(t,e)}},ng=class extends eg{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=ca(t.id)}get $node(){return this.$instance}get parent(){return N(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return R(this,`style`,()=>B({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.element.$element.style,...this.$instance.style}))}get tags(){return R(this,Symbol.for(`tags`),()=>qt([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get summary(){return Xo.memoize(this,`summary`,Xa(this.$instance)??Xa(this.element.$element))}get description(){return Xo.memoize(this,`description`,Za(this.$instance)??Za(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},rg=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return R(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},ig=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=ua(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return b(this.$relationship.title)?this.$relationship.title:null}get technology(){return An(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!Nt(this.$relationship.summary,this.$relationship.description)}get summary(){return Xo.memoize(this,`summary`,Xa(this.$relationship))}get description(){return Xo.memoize(this,`description`,Za(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!wt(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},ag=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(Ia(this.model,t.model),Ia(this.deployment,t.deployment))}difference(t){return e.from(z(this.model,t.model),z(this.deployment,t.deployment))}union(t){return e.from(Fa(this.model,t.model),Fa(this.deployment,t.deployment))}};const J=e=>typeof e==`string`?e:e.id,og=e=>{if(P(!e.includes(`
|
|
248
|
-
`),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return E(t,1)?t:[``]}return[e.trim()]},sg=e=>og(e).join(`/`),cg=e=>{let t=og(e);return E(t,2)?t.slice(0,-1).join(`/`):null},lg=e=>e.includes(`/`)?og(e).pop()??e:e.trim();var ug=class{#e=new Map;#t=new Map;#n=new Hn.default(()=>new Set);#r=new Hn.default(()=>new Set);#i=new Set;#a=new Map;#o=new Hn.default(()=>new Set);#s=new Hn.default(()=>new Set);#c=new Hn.default(()=>new Set);#l=new Hn.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=yn(t.elements);for(let e of ga(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of yn(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof tg||e instanceof ng)return e;let t=J(e);return N(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return P(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(P(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return P(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(P(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=J(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(V.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return va(this.#u,`${t}@${n}`,()=>new rg(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=J(e);return N(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=J(e);return this.#t.get(t)||null}children(e){let t=J(e);return this.#n.get(t)}*siblings(e){let t=J(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=J(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=J(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=J(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=Co(e)?new tg(this,Object.freeze(e)):new ng(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=ra(t.id);return n?(P(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(P(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new ig(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...da(n)])this.#c.get(e).add(t);for(let e of da(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of da(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},dg=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(V.flatten(t.source)),this.target=e.element(V.flatten(t.target));let n=ua(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return An(this.$relationship.title)?null:this.$relationship.title}get technology(){return An(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!Nt(this.$relationship.summary,this.$relationship.description)}get summary(){return Xo.memoize(this,`summary`,Xa(this.$relationship))}get description(){return Xo.memoize(this,`description`,Za(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!wt(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},fg=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Xo.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?vo(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return _o(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},pg=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Xo.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Xo.memoize(this,`notes`,this.$node.notes)}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return R(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return b(this.$node.modelRef)}hasDeployment(){return b(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return uo(this.$node)}isTagged(e){return this.tags.includes(e)}},mg=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new Hn.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new pg(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new fg(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?lg(n.title):null,this.viewPath=n.title?sg(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[ro]}get stage(){return this.#e[no]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return R(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Xo.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?R(this,`withDriftReasons`,()=>Qs(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?R(this,`snapshotWithManualLayout`,()=>Ys(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=J(e);return N(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(J(e))??null}findNodeWithElement(e){let t=J(e);return this.#i.has(t)?xa(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=J(e);return N(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(J(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(J(e))}includesDeployment(e){return this.#a.has(J(e))}includesRelation(e){return this.#o.has(J(e))}isComputed(){return this.#e[no]===`computed`}isLayouted(){return this.#e[no]===`layouted`}isDiagram(){return this.#e[no]===`layouted`}isElementView(){return this.#e[ro]===`element`}isScopedElementView(){return this.#e[ro]===`element`&&b(this.#e.viewOf)}isDeploymentView(){return this.#e[ro]===`deployment`}isDynamicView(){return this.#e[ro]===`dynamic`}},hg=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Ft(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return P(!this.isRoot,`Root view folder has no breadcrumbs`),R(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return P(!this.isRoot,`Root view folder has no parent`),An(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return R(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return R(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof mg&&e.push(t);return e})}},gg=class e{Aux;_elements=new Map;_parents=new Map;_children=new Hn.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new Hn.default(()=>new Set);_outgoing=new Hn.default(()=>new Set);_internal=new Hn.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new Hn.default(()=>new Set);_allTags=new Hn.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[no]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of on(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of on(e.imports??{}))for(let e of ga(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of yn(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new ug(this),to(e,`computed`)||to(e,`layouted`)){let t=Zi(`/`),n=w(yn(e.views),x(e=>({view:e,path:sg(e.title??e.id),folderPath:e.title&&cg(e.title)||``})),Zt((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=ln(e,`/`);P(E(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new hg(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||ln(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(wt(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new mg(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new hg(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return R(this,`styles`,()=>$o.from(this.project.styles,this.specification.customColors))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[no]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??R(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return R(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof $h)return e;let t=J(e);return N(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(J(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=J(e),r=this._relations.get(n)??null;return r||t===`model`?N(r,`Model relation ${n} not found`):N(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(J(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=J(e);return N(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return N(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return P(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=J(e);return this._parents.get(t)||null}children(e){let t=J(e);return this._children.get(t)}*siblings(e){let t=J(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=J(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=J(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=J(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return R(this,`tags`,()=>Zt([...this._allTags.keys()],Xi))}get tagsSortedByUsage(){return R(this,`tagsSortedByUsage`,()=>w([...this._allTags.entries()],x(([e,t])=>({tag:e,count:t.size,tagged:t})),Zt((e,t)=>Xi(e.tag,t.tag)),wn([T(`count`),`desc`])))}findByTag(e,t){return ba(this._allTags.get(e),e=>t===`elements`?e instanceof $h:t===`views`?e instanceof mg:t===`relationships`?e instanceof dg:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=jo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=jo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new $h(this,Object.freeze(e));this._elements.set(t.id,t);let n=ra(t.id);return n?(P(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){P(!mo(t.id),`Imported element already has global FQN`);let n=po(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new $h(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=ra(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=ra(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new dg(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=ua(n.id,r.id);if(i)for(let e of[i,...da(i)])this._internal.get(e).add(t);for(let e of da(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of da(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=gg.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(gg||={});let _g;(function(e){e.isInside=e=>t=>I(e,t.source.id)&&I(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||I(e,n.source.id))&&(n.target.id===t||I(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||I(e,t.target.id))&&!I(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||I(e,t.source.id))&&!I(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(_g||={});const vg=Symbol.for(`nodejs.util.inspect.custom`);var yg=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Va(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[vg](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
|
|
249
|
-
`)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return P(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&La(this.relations.model,t.relations.model)&&La(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new ag(t.model??new Set,t.deployment??new Set):this.relations)}};function bg(e,t){if(!t){let t=e;return e=>bg(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=I(t.source.id,e.source.id),a=I(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function xg(e,t){let n=t;for(let t of e)bg(t,n)&&(n=t);return n===t?null:n}function Sg(e){return e.boundary?.id?`.${e.boundary.id}`:``}function Cg(e,t){if(!e||ea(e)){let t=e??`asc`;return e=>wg(e,t)}return wg(e,t??`asc`)}function wg(e,t){return w(e,x(e=>({id:Sg(e),conn:e})),_a(t),x(e=>e.conn))}function Tg(e,t){return e.filter(e=>bg(t,e))}function Eg(e,t){return e.filter(bg(t))}function Dg(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Og(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function kg(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Ag(e,t){if(!t){let t=e;return e=>Ag(e,t)}let n=e;return sa(n.source,t)&&!sa(n.target,t)}function jg(e,t){if(!t){let t=e;return e=>jg(e,t)}let n=e;return sa(n.target,t)&&!sa(n.source,t)}function Mg(e,t){if(!t){let t=e;return e=>Mg(e,t)}let n=e;return sa(n.source,t)!==sa(n.target,t)}var Ng=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Va(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&Da(this.relations,kt(kg(this)))}get directRelations(){return new Set(ba(this.relations,kg(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,Fa(this.relations,t.relations))}difference(t){return new e(this.source,this.target,z(this.relations,t.relations))}intersect(t){return P(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,Ia(this.relations,t.relations))}equals(t){P(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&La(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[vg](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
|
|
250
|
-
`)}reversed(){return new e(this.target,this.source)}},Pg=e({findConnection:()=>Fg,findConnectionsBetween:()=>Ig,findConnectionsWithin:()=>Lg});function Fg(e,t,n=`directed`){if(e===t||oa(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new yg(e,t,r)]:[];return n===`directed`?i:[...i,...Fg(t,e,`directed`)]}function Ig(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Fg(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Lg(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Ig(t,r.slice(n+1),`both`)),e),[])}var Rg=e({findConnection:()=>zg,findConnectionsBetween:()=>Bg,findConnectionsWithin:()=>Vg});function zg(e,t,n=`directed`){if(e===t||oa(e,t))return[];let r=Ia(e.allOutgoing,t.allIncoming),i=r.size>0?new Ng(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=Ia(e.allIncoming,t.allOutgoing),o=a.size>0?new Ng(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function Bg(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of zg(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Vg(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Bg(t,r.slice(n+1),`both`)),e),[])}function Hg(e){return e instanceof tg}function Ug(e){return e instanceof ng}function Wg(e){return Hg(e)||Ug(e)}function Gg(e){return e instanceof rg}function Kg(e){return e instanceof $h}const qg=A({id:k(),title:k(),kind:k()}),Jg=A({type:ur([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:qg,target:qg,kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`),includedInViews:Wh.describe(`Views that include this relationship`),sourceLocation:Hh}),Yg=Gm({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
|
|
265
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:k().describe(`Source element FQN`),targetId:k().describe(`Target element FQN`),maxDepth:O().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:Or().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:rv},outputSchema:{paths:j(A({length:O().describe(`Number of hops in the path`),steps:j(A({source:k().describe(`Source element FQN`),target:k().describe(`Target element FQN`),relationship:A({kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);N(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);N(a,`Target element "${t.targetId}" not found in project "${n}"`),N(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}}),pv=A({id:k(),title:k(),kind:k()}),mv=A({type:Ar([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:pv,target:pv,kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`),includedInViews:iv.describe(`Views that include this relationship`),sourceLocation:nv}),hv=Gg({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
|
|
251
266
|
Find relationships between two LikeC4 elements within a project.
|
|
252
267
|
|
|
253
268
|
What it does:
|
|
@@ -318,7 +333,7 @@ Response:
|
|
|
318
333
|
}
|
|
319
334
|
]
|
|
320
335
|
}
|
|
321
|
-
`,inputSchema:{element1:k().describe(`Element ID (FQN)`),element2:k().describe(`Element ID (FQN)`),project:
|
|
336
|
+
`,inputSchema:{element1:k().describe(`Element ID (FQN)`),element2:k().describe(`Element ID (FQN)`),project:rv},outputSchema:{found:j(mv)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(Ki(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);N(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);N(o,`Element "${t.element2}" not found in project "${n}"`);let s=ov(e,n),c=Kc(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:av(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),gv=Gg({name:`list-projects`,description:`
|
|
322
337
|
List LikeC4 projects discoverable in the current workspace.
|
|
323
338
|
|
|
324
339
|
Request:
|
|
@@ -351,7 +366,7 @@ Example response:
|
|
|
351
366
|
}
|
|
352
367
|
]
|
|
353
368
|
}
|
|
354
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:j(A({id:k(),title:k(),folder:k(),sources:j(k())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),
|
|
369
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:j(A({id:k(),title:k(),folder:k(),sources:j(k())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),_v=Gg({name:`open-view`,description:`
|
|
355
370
|
Open a LikeC4 view in the editor's preview panel.
|
|
356
371
|
|
|
357
372
|
Request:
|
|
@@ -372,7 +387,7 @@ Example response:
|
|
|
372
387
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
|
|
373
388
|
}
|
|
374
389
|
}
|
|
375
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:k().describe(`View id (name)`),project:
|
|
390
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:k().describe(`View id (name)`),project:rv},outputSchema:{location:nv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findView(t.viewId);if(!r)throw Error(`View with ID '${t.viewId}' not found in project ${n}`);return await e.views.openView(r.id,n),{location:ov(e,n)({view:r.id})}}),vv=Ar([`exact`,`contains`,`exists`]),yv=Gg({name:`query-by-metadata`,description:`
|
|
376
391
|
Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
|
|
377
392
|
|
|
378
393
|
Request:
|
|
@@ -438,7 +453,7 @@ Example response:
|
|
|
438
453
|
}
|
|
439
454
|
]
|
|
440
455
|
}
|
|
441
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:k().describe(`Metadata key to filter by`),value:k().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:
|
|
456
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:k().describe(`Metadata key to filter by`),value:k().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:vv.optional().default(`exact`).describe(`Matching mode`),project:rv},outputSchema:{results:j($_.extend({matchedValue:k().describe(`The metadata value that matched`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.matchMode,a=[],o=(e,t,n)=>{let r=Array.isArray(e)?e:[e];switch(n){case`exists`:return!0;case`exact`:return t===void 0?!1:r.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return r.some(t=>t.toLowerCase().includes(e))}default:return!1}},s=(e,t,n)=>{let r=Array.isArray(e)?e:[e];if(n===`exists`||t===void 0)return r[0]||``;if(n===`exact`)return r.find(e=>e===t)||r[0]||``;if(n===`contains`){let e=t.toLowerCase();return r.find(t=>t.toLowerCase().includes(e))||r[0]||``}return r[0]||``};for(let e of r.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...ev(e),matchedValue:s(r,t.value,i)})}}if(a.length<50)for(let e of r.deployment.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...ev(e),matchedValue:s(r,t.value,i)})}}return{results:a}}),bv=Gg({name:`query-by-tag-pattern`,description:`
|
|
442
457
|
Search elements by tag patterns using prefix or substring matching.
|
|
443
458
|
Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
|
|
444
459
|
|
|
@@ -493,7 +508,7 @@ Example response:
|
|
|
493
508
|
"truncated": false,
|
|
494
509
|
"matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
|
|
495
510
|
}
|
|
496
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:k().min(1).describe(`Tag pattern to match`),matchMode:
|
|
511
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:k().min(1).describe(`Tag pattern to match`),matchMode:Ar([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:rv},outputSchema:{results:j($_.extend({matchedTags:j(k()).describe(`Tags that matched the pattern`)})),truncated:Or().describe(`True if results were truncated`),matchedTagValues:j(k()).describe(`All unique tag values matching the pattern across all elements`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.pattern.toLowerCase(),a=e=>{let n=e.toLowerCase();switch(t.matchMode){case`prefix`:return n.startsWith(i);case`contains`:return n.includes(i);case`suffix`:return n.endsWith(i)}},o=[],s=!1,c=new Set;for(let e of r.elements()){let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...ev(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!Yc(e))continue;let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...ev(e),matchedTags:t})}}return{results:o,truncated:s,matchedTagValues:[...c].sort((e,t)=>e.localeCompare(t))}}),xv=Gg({name:`query-by-tags`,description:`
|
|
497
512
|
Advanced tag filtering with boolean logic (AND, OR, NOT).
|
|
498
513
|
|
|
499
514
|
Request:
|
|
@@ -557,7 +572,7 @@ Example response:
|
|
|
557
572
|
}
|
|
558
573
|
]
|
|
559
574
|
}
|
|
560
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:j(k()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:j(k()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:j(k()).optional().describe(`Element must have NONE of these tags (NOT)`),project:
|
|
575
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:j(k()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:j(k()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:j(k()).optional().describe(`Element must have NONE of these tags (NOT)`),project:rv},outputSchema:{results:j($_),truncated:Or().describe(`True if results were truncated due to exceeding the 50-result limit`)}},async(e,t)=>{N(t.allOf&&t.allOf.length>0||t.anyOf&&t.anyOf.length>0||t.noneOf&&t.noneOf.length>0,`At least one condition (allOf, anyOf, or noneOf) must be specified with at least one tag`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=!1,o=e=>{let n=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>n.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>n.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>n.has(e)))};for(let e of r.elements()){if(i.length>=50){a=!0;break}o(e.tags)&&i.push(ev(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}Yc(e)&&o(e.tags)&&i.push(ev(e))}return{results:i,truncated:a}}),Sv=Ar([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),Cv=Gg({name:`query-graph`,description:`
|
|
561
576
|
Query element hierarchy and relationships in the architecture graph.
|
|
562
577
|
|
|
563
578
|
Request:
|
|
@@ -629,7 +644,7 @@ Example response:
|
|
|
629
644
|
],
|
|
630
645
|
"truncated": false
|
|
631
646
|
}
|
|
632
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:k().describe(`Element id (FQN) to query`),queryType:
|
|
647
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:k().describe(`Element id (FQN) to query`),queryType:Sv.describe(`Type of graph query`),includeIndirect:Or().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:rv},outputSchema:{results:j($_),truncated:Or().describe(`True if results were truncated due to exceeding maximum limit`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);N(r,`Element "${t.elementId}" not found in project "${n}"`);let i=[],a=!1;switch(t.queryType){case`ancestors`:for(let e of r.ancestors()){if(i.length>=100){a=!0;break}i.push(ev(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(ev(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(ev(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(ev(e))}break;case`parent`:{let e=r.parent;e&&i.push(ev(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.incomers(e)){if(i.length>=100){a=!0;break}i.push(ev(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.outgoers(e)){if(i.length>=100){a=!0;break}i.push(ev(t))}break}}return{results:i,truncated:a}}),wv=A({elementId:k().describe(`ID of the incoming element`),relationshipLabel:k().optional().describe(`Label on the relationship`),technology:k().optional().describe(`Technology specified on the relationship`)}),Tv=Gg({name:`query-incomers-graph`,description:`
|
|
633
648
|
Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
|
|
634
649
|
|
|
635
650
|
This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
|
|
@@ -686,7 +701,7 @@ Notes:
|
|
|
686
701
|
Example:
|
|
687
702
|
For a database element, this returns all services, APIs, and components that write to it,
|
|
688
703
|
plus all their dependencies, recursively up to maxDepth levels.
|
|
689
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query incomers for`),includeIndirect:
|
|
704
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Or().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:O().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:O().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:rv},outputSchema:{target:k().describe(`Target element id`),totalNodes:O().describe(`Total number of nodes in the graph`),maxDepth:O().describe(`Maximum depth reached`),truncated:Or().describe(`True if result was truncated due to maxNodes limit`),nodes:Pr($_.extend({incomers:j(wv).describe(`Incoming relationships with details`),depth:O().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);N(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=tv(r,t.elementId,`incoming`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,incomers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Ev=A({elementId:k().describe(`ID of the outgoing element`),relationshipLabel:k().optional().describe(`Label on the relationship`),technology:k().optional().describe(`Technology specified on the relationship`)}),Dv=Gg({name:`query-outgoers-graph`,description:`
|
|
690
705
|
Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
|
|
691
706
|
|
|
692
707
|
This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
|
|
@@ -743,7 +758,7 @@ Notes:
|
|
|
743
758
|
Example:
|
|
744
759
|
For an API service, this returns all clients, services, and systems that consume its output,
|
|
745
760
|
plus all their consumers, recursively up to maxDepth levels.
|
|
746
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:
|
|
761
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:k().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Or().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:O().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:O().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:rv},outputSchema:{target:k().describe(`Target element id`),totalNodes:O().describe(`Total number of nodes in the graph`),maxDepth:O().describe(`Maximum depth reached`),truncated:Or().describe(`True if result was truncated due to maxNodes limit`),nodes:Pr($_.extend({outgoers:j(Ev).describe(`Outgoing relationships with details`),depth:O().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);N(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=tv(r,t.elementId,`outgoing`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,outgoers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Ov=Gg({name:`read-deployment`,description:`
|
|
747
762
|
Read details about a deployment node or a deployed instance in a LikeC4 project.
|
|
748
763
|
|
|
749
764
|
What it does:
|
|
@@ -808,7 +823,7 @@ Example response (deployed instance):
|
|
|
808
823
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
|
|
809
824
|
}
|
|
810
825
|
}
|
|
811
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:k().describe(`Deployment id (FQN)`),project:
|
|
826
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:k().describe(`Deployment id (FQN)`),project:rv},outputSchema:{type:Ar([`deployment-node`,`deployed-instance`]),id:k().describe(`Deployment id (FQN)`),kind:k().describe(`Deployment node kind, or element kind for deployed instances`),name:k(),title:k(),description:k().nullable(),technology:k().nullable(),tags:j(k()),project:k(),metadata:Pr(Dr([k(),j(k())])),links:j(A({title:k().nullable().describe(`Optional link title`),url:k().describe(`Link URL`),relative:k().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:k(),color:k(),children:j(k()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:iv.describe(`Views that include this deployment node`),instanceof:A({id:k().describe(`Element ID (FQN)`),title:k(),kind:k()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:nv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);N(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=ov(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:av(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),kv=Gg({name:`read-element`,description:`
|
|
812
827
|
Read detailed information about a LikeC4 element.
|
|
813
828
|
|
|
814
829
|
Request:
|
|
@@ -895,7 +910,7 @@ Example response:
|
|
|
895
910
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
|
|
896
911
|
}
|
|
897
912
|
}
|
|
898
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:k().describe(`Element id (FQN)`),project:
|
|
913
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:k().describe(`Element id (FQN)`),project:rv},outputSchema:{id:k().describe(`Element id (FQN)`),kind:k().describe(`Element kind`),name:k().describe(`Element name`),title:k(),description:k().nullable(),technology:k().nullable(),tags:j(k()),project:k(),metadata:Pr(Dr([k(),j(k())])),links:j(A({title:k().nullable().describe(`Optional link title`),url:k().describe(`Link URL`),relative:k().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:k(),color:k(),children:j(k()).describe(`Children of this element (Array of FQNs)`),defaultView:k().nullable().describe(`Name of the default view of this element`),includedInViews:iv.describe(`Views that include this element`),relationships:A({incoming:j(A({source:A({id:k(),title:k(),kind:k()}).describe(`Source element of this relationship`),kind:k().nullable().describe(`Relationship kind`),target:k().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:j(A({source:k().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:A({id:k(),title:k(),kind:k()}).describe(`Target element of this relationship`),kind:k().nullable().describe(`Relationship kind`),title:k().nullable().describe(`Relationship title`),description:k().nullable().describe(`Relationship description`),technology:k().nullable().describe(`Relationship technology`),tags:j(k()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:j(k()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:nv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);N(r,`Element "${t.id}" not found in project "${n}"`);let i=ov(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:av(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),Av=Gg({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
|
|
899
914
|
Request:
|
|
900
915
|
- project: string (optional) — project id. Defaults to "default" if omitted.
|
|
901
916
|
|
|
@@ -986,7 +1001,7 @@ Example response:
|
|
|
986
1001
|
}
|
|
987
1002
|
]
|
|
988
1003
|
}
|
|
989
|
-
`,inputSchema:{project:
|
|
1004
|
+
`,inputSchema:{project:rv},outputSchema:{title:k(),folder:k(),sources:j(k()),config:Z_.describe(`Project configuration`),specification:A({elementKinds:j(k()),relationshipKinds:j(k()),deploymentKinds:j(k()),tags:j(k()),metadataKeys:j(k())}),elements:j(A({id:k(),kind:k(),title:k(),tags:j(k())})).describe(`List of elements in the project`),deployments:j(Er(`type`,[A({type:Mr(`deployment-node`),id:k().describe(`Node ID`),kind:k().describe(`Deployment node kind`),title:k().describe(`Node title`),tags:j(k())}),A({type:Mr(`deployed-instance`),id:k().describe(`Node ID`),title:k().describe(`Node title`),tags:j(k()),referencedElementId:k().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:j(A({id:k(),title:k(),type:Ar([`element`,`deployment`,`dynamic`])}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,sources:r.documents?.map(e=>e.fsPath)??[],config:Q_(r.config),specification:{elementKinds:ee(i.specification.elements),relationshipKinds:ee(i.specification.relationships),deploymentKinds:ee(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),jv=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,Mv=Er(`type`,[A({type:Mr(`element`),id:k().describe(`Node ID`),elementId:k().describe(`Element ID (FQN)`),kind:k().describe(`Element kind`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),children:j(k()).describe(`Children nodes, array of node IDs`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())}),A({type:Mr(`deployment-node`),id:k().describe(`Node ID`),deploymentId:k().describe(`Deployment entity ID (FQN)`),kind:k().describe(`Deployment kind`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),children:j(k()).describe(`Children nodes, array of node IDs`),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())}),A({type:Mr(`deployed-instance`),id:k().describe(`Node ID`),deploymentId:k().describe(`Deployment entity ID (FQN)`),title:k().describe(`Node title`),description:k().nullable(),technology:k().nullable(),referencedElement:A({id:k().describe(`Element ID (FQN)`),kind:k().describe(`Element kind`),title:k().describe(`Element title`)}),shape:k().describe(`Rendered shape`),color:k().describe(`Rendered color`),tags:j(k())})]),Nv=Gg({name:`read-view`,description:`
|
|
990
1005
|
Read detailed information about a LikeC4 view.
|
|
991
1006
|
|
|
992
1007
|
Request:
|
|
@@ -1034,7 +1049,7 @@ Example response:
|
|
|
1034
1049
|
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
|
|
1035
1050
|
}
|
|
1036
1051
|
}
|
|
1037
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:k().describe(`View id (name)`),project:
|
|
1052
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:k().describe(`View id (name)`),project:rv},outputSchema:{id:k(),type:Ar([`element`,`deployment`,`dynamic`]).describe(`View type`),title:k(),description:k().nullable(),tags:j(k()),project:k(),nodes:j(Mv),edges:j(A({source:k().describe(`Source node`),target:k().describe(`Target node`),label:k().nullable(),description:k().nullable(),technology:k().nullable(),tags:j(k())})).describe(`Edge represents relationship between nodes`),sourceLocation:nv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=ov(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>jv(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),Pv=j(Er(`type`,[A({type:Mr(`element`),project:k().describe(`Project ID`),id:k().describe(`Element ID (FQN)`),name:k().describe(`Element name`),kind:k(),title:k(),technology:k().nullable(),shape:k(),includedInViews:iv,metadata:Pr(Dr([k(),j(k())])),tags:j(k())}),A({type:Mr(`deployment-node`),project:k().describe(`Project ID`),id:k().describe(`Deployment ID (FQN)`),name:k().describe(`Deployment name`),kind:k(),title:k(),technology:k().nullable(),shape:k(),includedInViews:iv,metadata:Pr(Dr([k(),j(k())])),tags:j(k())})])),Fv=Gg({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
|
|
1038
1053
|
Search LikeC4 elements and deployment nodes across all projects.
|
|
1039
1054
|
|
|
1040
1055
|
Query syntax (case-insensitive):
|
|
@@ -1089,7 +1104,7 @@ Example response:
|
|
|
1089
1104
|
}
|
|
1090
1105
|
]
|
|
1091
1106
|
}
|
|
1092
|
-
`,inputSchema:{search:k().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:O(),found:
|
|
1107
|
+
`,inputSchema:{search:k().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:O(),found:Pv}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),Wg.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),Wg.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),Wg.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),Wg.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(Wg.debug(`search by id/title: {search}`,{search:i}),a=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of oa(n.elements(),e=>!e.imported&&a(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:av(e.views())});for(let e of oa(n.deployment.nodes(),a))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:av(e.views())})}catch(e){Wg.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),Iv=A({id:k().describe(`Element id (FQN)`),name:k().describe(`Element name`),kind:k().describe(`Element kind`),title:k().describe(`Human-readable title`),depth:O().describe(`Depth relative to the root element (1 = direct child)`),tags:j(k()).describe(`Assigned tags`),metadata:Pr(Dr([k(),j(k())])).describe(`Element metadata`),childCount:O().describe(`Number of direct children`),incomingCount:O().describe(`Number of incoming relationships`),outgoingCount:O().describe(`Number of outgoing relationships`)}),Lv=Gg({name:`subgraph-summary`,description:`
|
|
1093
1108
|
Get a compact, table-friendly summary of all descendants of a parent element.
|
|
1094
1109
|
Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
|
|
1095
1110
|
Much more efficient than calling read-element for each descendant individually.
|
|
@@ -1155,7 +1170,7 @@ Example response:
|
|
|
1155
1170
|
"truncated": false,
|
|
1156
1171
|
"truncatedByDepth": false
|
|
1157
1172
|
}
|
|
1158
|
-
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:k().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:O().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:j(k()).optional().describe(`If provided, only include these metadata keys in the response`),project:
|
|
1173
|
+
`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:k().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:O().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:j(k()).optional().describe(`If provided, only include these metadata keys in the response`),project:rv},outputSchema:{root:A({id:k(),kind:k(),title:k(),childCount:O()}),descendants:j(Iv),totalDescendants:O().describe(`Total number of descendants found`),truncated:Or().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:Or().describe(`True if deeper descendants exist beyond maxDepth`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);N(r,`Element "${t.elementId}" not found in project "${n}"`);let i=t.maxDepth,a=t.metadataKeys,o=[],s=0,c=!1,l=!1,u=[],d=[...r.children()];for(let e of d)u.push({element:e,depth:1});for(;u.length>0;){let{element:e,depth:t}=u.shift();if(t>i){l=!0;continue}s++;let n=[...e.children()];if(o.length<200){let r=e.getMetadata(),i=a?Object.fromEntries(a.filter(e=>e in r).map(e=>[e,r[e]])):r;o.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:i,childCount:n.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else c=!0;for(let e of n)u.push({element:e,depth:t+1})}return{root:{id:r.id,kind:r.kind,title:r.title,childCount:d.length},descendants:o,totalDescendants:s,truncated:c,truncatedByDepth:l}});var Rv=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new kr({name:`LikeC4`,version:qg},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
|
|
1159
1174
|
|
|
1160
1175
|
Conventions:
|
|
1161
1176
|
- All tools are read-only and idempotent.
|
|
@@ -1189,48 +1204,46 @@ Instructions:
|
|
|
1189
1204
|
- If response returns "sourceLocation", provide link to this location in the editor
|
|
1190
1205
|
|
|
1191
1206
|
Full documentation: https://likec4.dev/llms-full.txt
|
|
1192
|
-
`,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...Xg(this.services.likec4.LanguageServices)),n.registerTool(...u_(this.services.likec4.LanguageServices)),n.registerTool(...l_(this.services.likec4.LanguageServices)),n.registerTool(...c_(this.services.likec4.LanguageServices)),n.registerTool(...p_(this.services.likec4.LanguageServices)),n.registerTool(...h_(this.services.likec4.LanguageServices)),n.registerTool(...Yg(this.services.likec4.LanguageServices)),n.registerTool(...r_(this.services.likec4.LanguageServices)),n.registerTool(...a_(this.services.likec4.LanguageServices)),n.registerTool(...s_(this.services.likec4.LanguageServices)),n.registerTool(...$g(this.services.likec4.LanguageServices)),n.registerTool(...t_(this.services.likec4.LanguageServices)),n.registerTool(...Qh(this.services.likec4.LanguageServices)),n.registerTool(...Jh(this.services.likec4.LanguageServices)),n.registerTool(...e_(this.services.likec4.LanguageServices)),n.registerTool(...Zh(this.services.likec4.LanguageServices)),n.registerTool(...__(this.services.likec4.LanguageServices)),t&&n.registerTool(...Zg(this.services.likec4.LanguageServices)),n.server.onerror=e=>{W.error(ci(e))},n}},y_=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(Wm.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new pr,await this._mcp.connect(this.transport),Wm.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{Wm.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function b_(e){let t=new it;t.use(`*`,ot({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e.create(),r=new at({eventStore:new st({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(Wm.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),t.onError((e,t)=>(Wm.error(ci(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function x_(e){let{factory:t,port:n}=e,r=await b_(t);return new Promise((e,t)=>{let i=Er({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var S_=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}Wm.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await x_({factory:this.services.mcp.ServerFactory,port:e}),Wm.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(Wm.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?Wm.error(`Failed to stop MCP server`,{err:e}):Wm.info(`MCP server stopped`),t()})})):(Wm.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function C_(e,t=33335){Wm.debug(`Creating StreamableLikeC4MCPServer`);let n=new S_(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){Wm.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=ci(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),Wm.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function w_(e){return new y_(e)}function T_(e=`sse`){return{mcpServer:t=>e===`stdio`?w_(t):C_(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new v_(e)}}const E_={top:50,right:40,bottom:40,left:40};function D_(e,t){let n=e.nodes.map(e=>{let n=t.nodes[e.id];if(!n)return e;let{x:r,y:i,width:a,height:o}=n;return{...e,width:a,height:o,x:r,y:i}}),r=e.edges.map(e=>{let n=t.edges[e.id];return n?{...e,...n}:e});return{...e,bounds:{x:t.x,y:t.y,width:t.width,height:t.height},nodes:n,edges:r}}function O_(e,t){let n=new Map(e.nodes.map(e=>[e.id,e]));if(e.hash===t.hash||N_(e,t))return j_(e.nodes.filter(e=>!e.parent),n,t),D_(e,t);e.hasLayoutDrift=!0;let r=Qa.merge(...e.nodes.map(e=>t.nodes[e.id]).filter(e=>!!e));return e.nodes.filter(e=>e.parent==null).reduce((e,r)=>k_(r,e,n,t),{x:r.x,y:r.y+r.height+100}),e.edges.filter(e=>!t.edges[e.id]).forEach(e=>A_(e,t)),D_(e,t)}function k_(e,t,n,r){let i=r.nodes[e.id],a=i?.isCompound??!1,o=!i,s=o?t:{x:i.x,y:i.y},c=e.children.map(e=>r.nodes[e]).filter(e=>!!e),l=c.length>0&&Qa.merge(...c),u=a&&l?{x:l.x,y:l.y+l.height+100}:{x:s.x+E_.left,y:s.y+E_.top};return e.children.map(e=>n.get(e)).reduce((e,t)=>k_(t,e,n,r),u),i=e.children.length>0?M_(e,r):r.nodes[e.id]??{isCompound:!1,width:e.width,height:e.height,x:s.x,y:s.y},r.nodes[e.id]=i,o?{x:i.x+i.width+100,y:i.y}:t}function A_(e,t){let n=t.nodes[e.source],r=t.nodes[e.target],i=P_(Qa.center(n)),a=P_(Qa.center(r)),o=a.subtract(i),{x:s,y:c}=o.divide(2).add(i),l={...e?.labelBBox??{width:0,height:0},x:s,y:c},u=o.multiply(.7).add(i),d=o.multiply(.3).add(i);t.edges[e.id]={points:[[i.x,i.y],[d.x,d.y],[u.x,u.y],[a.x,a.y]],labelBBox:l,controlPoints:[u]}}function j_(e,t,n){e.filter(e=>e.children.length>0).forEach(e=>{j_(e.children.map(e=>t.get(e)).filter(e=>!!e),t,n),n.nodes[e.id]=M_(e,n)})}function M_(e,t){let n=Qa.merge(...e.children.map(e=>t.nodes[e]));return{isCompound:!0,x:n.x-E_.left,y:n.y-E_.top,width:n.width+E_.left+E_.right,height:n.height+E_.top+E_.bottom}}function N_(e,t){let n=e=>e.children.length>0;return Dr(e.autoLayout,t.autoLayout)&&e.nodes.every(e=>{let r=t.nodes[e.id];return!!r&&n(e)===r.isCompound})&&e.edges.every(e=>!!t.edges[e.id])}function P_({x:e,y:t}){return new eo(e,t)}function F_(e){return w(e,At(e=>e.parallelPrefix??void 0),zt((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),yn())}function I_(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>N(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new Vn.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=Vn.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(I(s.id,o.id)||s.id===o.id){n.pop();continue}if(!I(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var L_=class{#e=new Mr;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,kr.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of F_(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,kr.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,kr.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,kr.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Ft(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=N(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=N(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),P(e>=0,`actor ${t} not found`)}return N(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return x(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,kr.strong).before(i),this.put(s,kr.strong).before(r),this.put(c,kr.strong).after(a.right),this.put(l,kr.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];P(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=On(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=N(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Or;return this.#e.addEditVariable(t,kr.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,kr.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,kr.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,kr.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,kr.weak);break}}constraint(e,t,n=void 0,r=kr.medium){let i;switch(t){case`==`:i=jr.Eq;break;case`>=`:i=jr.Ge;break;case`<=`:i=jr.Le;break;case`== 0`:i=jr.Eq,n=0;break;case`>= 0`:i=jr.Ge,n=0;break;case`<= 0`:i=jr.Le,n=0;break;default:F(t)}this.#e.addConstraint(new Ar(e,i,n??0,r))}put(e,t=kr.required){let n=t===kr.required?kr.medium:kr.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function R_(e){let t=new Set,n=t=>N(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>_o(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));P(E(i,1),`actors array must not be empty`);let a=new Hn.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=Uo(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new L_({actors:i,steps:o,compounds:I_(i,e.nodes)}),l=c.getViewBounds(),u=w(c.getCompoundBoxes(),x(({node:e,...t})=>({...t,id:e.id,origin:e.id})),vn(`id`),zt((e,t)=>E(e,2)?x(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),yn(),Ct());return{actors:i.map(e=>z_({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:x(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function z_({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var B_=t(Fr(),1);function V_(e){return e.children.length>0}function H_(e){switch(e){case`open`:return`vee`;default:return e}}function U_(e){return Array.isArray(e)?[U_(e[0]),U_(e[1])]:(P(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const W_=e=>(P(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),Y=e=>Math.ceil(e/72*1e3)/1e3,G_=e=>Math.ceil(e);G_(40).toString();function K_(e,t){return Lr(Rr(e,{l:-35-5*t,s:-15-5*t}))}function q_(e){return Lr(Ir(e,.3))}function J_(e){return e.trim().replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`)}function Y_(e,{maxchars:t,maxLines:n,sanitize:r=Dt()}){let i=(0,B_.default)(e,{width:t,indent:``,escape:r}).split(`
|
|
1193
|
-
`);return Vt(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function X_({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Y_(e,{maxchars:t,maxLines:r,sanitize:J_}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${G_(n)}"${s}>${o}</FONT>`}function Z_(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:F(e)}}function Q_(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=b(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[X_({text:e.title,fontsize:r.textSize,maxchars:Z_(n),maxLines:a?1:3})];if(n!==`xs`){b(e.technology?.trim())&&l.push(X_({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Xo.from(e.description).text;t&&l.push(X_({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function $_(e,t){let n=X_({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const ev=`BGCOLOR="${$o.DEFAULT.relationshipColors.labelBg}A0"`;function tv({label:e,technology:t}){let n=[];return b(e?.trim())&&n.push(X_({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),b(t?.trim())&&n.push(X_({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${ev}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function nv(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${ev}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${G_(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return b(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${ev} CELLPADDING="3">`,X_({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const rv=`dashed`,iv=`Arial`,av=xi(`dot`),ov=50.1;var sv=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new zr({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(V_).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=la(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(V_(e))t(e,i);else{let t=N(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(V_(t))S(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return Pr(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=Nr({[M.likec4_viewId]:this.view.id,[M.bgcolor]:`transparent`,[M.layout]:`dot`,[M.compound]:!0,[M.rankdir]:e.direction,[M.TBbalance]:`min`,[M.splines]:`spline`,[M.outputorder]:`nodesfirst`,[M.nodesep]:Y(e.nodeSep??110),[M.ranksep]:Y(e.rankSep??120),[M.pad]:Y(15),[M.fontname]:iv});return t.attributes.graph.apply({[M.fontsize]:G_(this.styles.fontSize()),[M.labeljust]:e.direction===`RL`?`r`:`l`,[M.labelloc]:e.direction===`BT`?`b`:`t`,[M.margin]:ov}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[M.fontname]:iv,[M.shape]:`rect`,[M.fillcolor]:t.fill,[M.fontcolor]:t.hiContrast,[M.color]:t.stroke,[M.style]:`filled`,[M.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[M.arrowsize]:.75,[M.fontname]:iv,[M.fontsize]:G_(14),[M.penwidth]:G_(2),[M.color]:t.line,[M.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=V_(e),n=ia(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=ia(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){P(V_(e),`node should be compound`),P(It(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=q_(n.loContrast);return t.apply({[M.likec4_id]:e.id,[M.likec4_level]:e.level,[M.likec4_depth]:e.depth,[M.fillcolor]:K_(n.fill,e.depth),[M.color]:K_(n.stroke,e.depth),[M.style]:`filled`,[M.margin]:G_(e.children.length>1?40:32)}),wt(e.title.trim())||t.set(M.label,$_(e,r)),t}elementToNode(e,t){P(!V_(e),`node should not be compound`);let n=b(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[M.likec4_id]:e.id,[M.likec4_level]:e.level,[M.label]:Q_(e,this.styles),[M.margin]:`${Y(s)},${Y(i)}`}),t.attributes.set(M.width,Y(a)),t.attributes.set(M.height,Y(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[M.fillcolor]:r.fill,[M.fontcolor]:r.hiContrast,[M.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[M.margin]:`${Y(s)},${Y(0)}`,[M.penwidth]:G_(2),[M.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[M.margin]:`${Y(n?s:s+4)},${Y(i+6)}`});break;case`mobile`:t.attributes.apply({[M.margin]:`${Y(n?s:s+4)},${Y(i)}`});break;case`queue`:t.attributes.apply({[M.width]:Y(a),[M.height]:Y(o-8),[M.margin]:`${Y(n?s:s+4)},${Y(i)}`});break;case`component`:t.attributes.apply({[M.width]:Y(a+10),[M.margin]:`${Y(s+20)},${Y(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!V_(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return V_(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return N(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(P(V_(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,P(i,`subgraph ${e} not found`),n=N(t(this.leafElements(e)),`leaf element in ${e} not found`),r=N(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return w(this.descendants(e),C(e=>Tn(e.inEdges,e.outEdges)),qt(),xn(Tn(t.inEdges,t.outEdges)),x(e=>this.view.edges.find(t=>t.id===e)),D(b))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=w(this.view.nodes,D(V_),x(e=>e.id),Zt(fa),en(),x(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),D(({edges:e})=>e.length>1&&e.length<8),Xt(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=N(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=N(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(M.group,n.id),i.attributes.set(M.group,n.id)}catch(e){av.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=Y(i.center.x)+n,o=Y(e-i.center.y);i.fixedsize?t.attributes.apply({[M.pos]:`${a},${o}!`,[M.pin]:!0,[M.width]:Y(i.fixedsize.width),[M.height]:Y(i.fixedsize.height),[M.fixedsize]:!0}):t.attributes.set(M.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(M.weight),e.attributes.delete(M.minlen),e.attributes.delete(M.constraint);return this.graphvizModel.apply({[M.layout]:`fdp`,[M.overlap]:`vpsc`,[M.sep]:`+50,50`,[M.esep]:`+10,10`,[M.start]:`random2`,[M.splines]:`compound`,[M.K]:10}),this.graphvizModel.delete(M.compound),this.graphvizModel.delete(M.rankdir),this.graphvizModel.delete(M.nodesep),this.graphvizModel.delete(M.ranksep),this.graphvizModel.delete(M.pack),this.graphvizModel.delete(M.pad),this.graphvizModel.delete(M.packmode),this.graphvizModel.attributes.graph.delete(M.margin),this}},cv=class extends sv{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(M.TBbalance),e.apply({[M.nodesep]:Y(t.nodeSep??130),[M.ranksep]:Y(t.rankSep??130)}),e}postBuild(e){w(this.view.nodes,x(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),At(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),yn(),x(e=>e),Gt(t=>{t.length<2||e.subgraph({[M.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(N(n).id)})}),hn(()=>{e.set(M.newrank,!0),e.set(M.clusterrank,`global`),e.delete(M.pack),e.delete(M.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(M.margin,G_(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Ft(e)),[s,c,l]=this.edgeEndpoint(r,$t),u=Mt(l)||Mt(o),d=t.edge([a,c],{[M.likec4_id]:e.id,[M.style]:e.line??rv});l&&d.attributes.set(M.lhead,l),o&&d.attributes.set(M.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(M.weight,f);let p=tv(e);if(p&&d.attributes.set(u?M.xlabel:M.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[M.arrowtail]:`none`,[M.arrowhead]:`none`,[M.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[M.arrowhead]:H_(m),[M.arrowtail]:H_(e.tail??m),[M.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(M.constraint,!1),d):(m&&d.attributes.set(M.arrowhead,H_(m)),h!==`none`&&d.attributes.set(M.arrowtail,H_(h)),d)}},lv=class extends sv{postBuild(e){e.delete(M.TBbalance),e.set(M.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Ft(e)),[c,l,u]=this.edgeEndpoint(i,$t),d=t.edge([o,l],{[M.likec4_id]:e.id,[M.style]:e.line??rv});if(u&&d.attributes.set(M.lhead,u),s&&d.attributes.set(M.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(b).join(`
|
|
1194
|
-
`),p=nv(vo(e.id),f);d.attributes.set(M.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[M.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[M.arrowtail]:H_(h),[M.dir]:`back`}),g!==`none`&&d.attributes.apply({[M.arrowhead]:H_(g),[M.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[M.arrowhead]:H_(h),[M.arrowtail]:H_(g),[M.dir]:`both`}),d):h===`none`?(d.attributes.delete(M.arrowhead),d.attributes.apply({[M.arrowtail]:H_(g),[M.minlen]:0,[M.dir]:`back`}),d):(d.attributes.set(M.arrowhead,H_(h)),d)}};const uv=xi(`dot.rank`);var dv=class extends sv{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(V_(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=w(e.children,D(e=>!this.compoundIds.has(e)),x(e=>this.computedNode(e)),D(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=N(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;tn(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[M.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[M.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(M.newrank,!0),e.set(M.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[M.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,uv.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Ft(e)),[s,c,l]=this.edgeEndpoint(r,$t),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[M.likec4_id]:e.id,[M.style]:e.line??rv});l&&f.attributes.set(M.lhead,l),o&&f.attributes.set(M.ltail,o);let p=Mt(l)||Mt(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(M.weight,d.weight);let m=tv(e);if(m&&f.attributes.set(p?M.xlabel:M.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[M.color]:t.line,[M.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[M.arrowtail]:H_(h),[M.dir]:`back`}),g!==`none`&&f.attributes.apply({[M.arrowhead]:H_(g),[M.dir]:`both`,[M.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[M.arrowtail]:`none`,[M.arrowhead]:`none`,[M.dir]:`none`,[M.minlen]:0,[M.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[M.arrowhead]:H_(h),[M.arrowtail]:H_(g),[M.dir]:`both`}),f;if(f.attributes.set(M.arrowhead,H_(h)),g!==`none`&&f.attributes.set(M.arrowtail,H_(g)),this.view.edges.length===1)return f;let ee;return ee=u===null&&i.parent==null&&s.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let n=this.computedNode(t.source),r=this.computedNode(t.target);return V_(n)||V_(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(M.minlen,0),f}};function fv(e){let[t,n,r,i]=e?e.split(`,`).map(e=>U_(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function pv(e){try{let[t,n]=e.split(`,`);return{x:U_(parseFloat(t)),y:U_(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function mv(e){let{x:t,y:n}=pv(e.pos),r=W_(parseFloat(e.width)),i=W_(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function hv(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=U_(c.size);continue}if(c.op===`T`){let e=U_(c.pt[0])-t,l=U_(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=U_(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return bi.warn(`Failed on parsing label draw ops:
|
|
1195
|
-
{labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function gv({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);P(E(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&bi.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>U_(e));return P(E(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function _v(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=hv(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Y_(a,{maxchars:40,maxLines:5}).join(`
|
|
1196
|
-
`):
|
|
1197
|
-
|
|
1198
|
-
`).
|
|
1199
|
-
`),
|
|
1200
|
-
`).
|
|
1201
|
-
`),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=wv(e).print();if(!Fo(e.view))return t;try{return await this.graphviz.unflatten(t)}catch(n){return Tv.warn(`Error during unflatten: ${e.view.id}`,{error:n}),t}}async layoutProjectsView(e){Tv.debug`layouting projects overview...`;let t=new bv(e).print();try{t=await this.graphviz.unflatten(t)}catch(e){Tv.warn(`Error during unflatten of projects view`,{error:e})}let n=await this.dotToJson(t);return Tv.debug`layouting projects overview done`,yv(n,e)}};const Dv=bi.getChild([`layouter`,`queue`]);var Ov=class extends Ev{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new ar({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){return this.isProcessingBatch?(Dv.debug`waiting for batch to finish`,await this.queue.onIdle(),await Ma(),await this.runInQueue(e)):(this.queue.size>this.queue.concurrency*2+1&&(Dv.debug`task limit reached: ${this.queue.size} (pending: ${this.queue.pending}), waiting queue to shrink to ${this.queue.concurrency}`,await this.queue.onSizeLessThan(this.queue.concurrency+1)),Dv.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,Dv.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){Dv.debug`adding layoutProjectsView task to queue`;let t=await this.runInQueue(async()=>(Dv.debug`layouting projects view`,await super.layoutProjectsView(e)));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){if(this.isProcessingBatch)return Dv.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await Ma(),await this.batchLayout(e);if(e.cancelToken?.isCancellationRequested)return Dv.debug`cancellation requested`,[];let t=this.queue.concurrency;Dv.debug`starting batch layout, size: ${e.batch.length}, concurrency: ${t}`,this.isProcessingBatch=!0;let n=[];try{for(let r of e.batch)if(Dv.debug`add task for view ${r.view.id}`,this.queue.add(async()=>(t<=2&&await Ma(),await super.layout(r))).then(t=>{if(!t){e.onError?.(r,Error(`Layout queue returned null for view ${r.view.id}`));return}n.push(t),e.onSuccess?.(r,t)}).catch(t=>{Dv.error(`Fail layout view ${r.view.id}`,{err:t}),e.onError?.(r,t)}),this.queue.size>t+2&&(Dv.debug`task limit reached: ${this.queue.size}, waiting queue to shrink to ${t}`,await this.queue.onSizeLessThan(t+1),e.cancelToken?.isCancellationRequested)){Dv.debug`cancellation requested`;break}}finally{await this.queue.onIdle(),Dv.debug`batch layout done`,this.isProcessingBatch=!1}return n}dispose(){this.queue.clear(),super.dispose()}},kv=class extends je{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!Jl(e)&&!Wl(e)&&!Du(e))return super.getDocumentation(e);try{let t=me(e);if(t.state<_.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case Jl(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case Wl(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=V.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
|
|
1202
|
-
`)}case Du(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
|
|
1203
|
-
`):void 0}default:return e}}catch(e){G(e)}}};function Av(e,t){return[e,t]=jv(e,t)>0?[t,e]:[e,t],Mv(e.range,t.range.start)}function jv(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function Mv(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function Nv(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:We.newLine({allowMore:!0}),oneSpace:We.oneSpace(),noSpace:We.noSpace(),indent:We.indent({allowMore:!0}),noIndent:We.noIndent()};var Pv=class extends ze{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Tp,(e,t)=>{let n=nt(e.$cstNode,`values`).filter(b).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,eu,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...D([e.target,e.tags],b)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,Xu,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>Mf(e)||eu(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...D([e.target,e.tags],b)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,Ac,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(fm(e)&&Nv(e.$cstNode)||mm(e)&&fm(e.$container)&&Nv(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(We.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(We.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&Nv(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){Yd(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(Zd(e)||mp(e)||op(e)||up(e)||ip(e)||Sd(e)||wd(e)||Ed(e)||bd(e)||vd(e)||Ed(e)||ff(e)||ku(e)||nd(e)||Pf(e)||Jf(e)||uf(e)||gf(e)||Gu(e)||gu(e)||ou(e)||Hp(e)||Ip(e)||Bl(e)||Hl(e)||zu(e)||wu(e)||mf(e)||Xl(e)||nu(e)||Kl(e)||Qu(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=Nv(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!Av(o,e))&&t.cst([e]).prepend(We.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(We.newLine({allowMore:!0})):i.prepend(We.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,ju)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,Uu,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,mu)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,iu)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(Lu(e)||Kf(e)||Wp(e)||Sf(e)||wf(e)||cp(e)||fp(e)||Ll(e)||$d(e)||Nl(e)||Fd(e)||Qf(e)||Fl(e)||Ef(e)||vf(e)||jd(e)||Ld(e)||Nd(e)||ep(e)||Af(e)||Dp(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,tf,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,bf)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,Ap,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,cf,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,Du,(e,t)=>{let n=de(e.$cstNode,`kind`),r=de(e.$cstNode,`name`);r&&n&&(jv(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,ed,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,wd,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,Ed,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,bd,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,vd,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,Vd,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,zd,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((op(e)||up(e)||gp(e)||ip(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),np(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(fd(e)||Rf(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,Jl,(e,t)=>{let n=de(e.$cstNode,`kind`),r=de(e.$cstNode,`name`);r&&n&&(jv(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,Wl,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Pp,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Mp(e)||bu(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,Ip,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,Hp)?.keyword(`style`).append(X.oneSpace),this.on(e,uu)?.keyword(`style`).append(X.oneSpace),this.on(e,Ju)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,cd)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(If(e)||ud(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Ol,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,nm,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),El(e)||cm(e)||em(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,xl,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,Xp,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),yl(e)||Qp(e)||Jp(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(Oc(e)||Rp(e)||cu(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!Nv(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(Ju(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&Nv(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,Ud,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,Gd,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,Of,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,fu,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Oc(t)||Rp(t)||cu(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:F(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,ll)?.property(`value`),t??=this.on(e,Du)?.properties(`props`),t??=this.on(e,Vd)?.properties(`project`),t??=this.on(e,Mf)?.properties(`title`,`technology`),t??=this.on(e,Ip)?.properties(`title`),t??=this.on(e,Ac)?.properties(`title`),t??=this.on(e,Jl)?.properties(`title`),t??=this.on(e,Wl)?.properties(`title`),t??=this.on(e,eu)?.properties(`title`,`technology`),t??=this.on(e,tf)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function Fv(e,t){let n=[],r=e.parent;for(;r;){let e=N(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function Iv(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);P(t,`Source node ${n.source} not found`),P(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=Fv(t,e),a=Fv(r,e),o=i.length>0&&a.length>0?Ft($i(en(i),en(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var Lv=Pn(),Rv=t(Fn(),1);function zv(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function Bv(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function Vv(e){let t=zv([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>N(e.nodes.get(t)),i=new zr({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=Yt(w(n,x(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,Rv.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&w(Fv(o,e.nodes),bn(e=>e.inEdges.includes(t.id)),Gt(e=>{i.mergeNode(e.id),(0,Rv.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,Rv.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,Rv.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,Rv.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);P(s.length===n.length,`Not all edges were added to the graph`);let l=(0,Lv.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);P(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:Bv(zv(u)),edges:s}}function Hv(e){return e.hash=Ba({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:w(e.nodes,x(e=>({id:e.id,icon:b(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:so(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),Et(({id:e,...t})=>[e,t])),edges:w(e.edges,x(e=>({source:e.source,target:e.target,label:e.label,description:so(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),Et(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var Uv=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},Wv=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(ya(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(Ot(t)&&(P(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),ya(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=z(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=Ia(t,e.elements),t=w(t,ba(t=>e.explicits.has(t)&&!Da(e.final,sa(t))),Oa()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=z(e.explicits,t),e.final=z(e.final,t)),e}removeElements(e){return e.elements=z(e.elements,this.excluded.elements),e.explicits=z(e.explicits,this.excluded.elements),e.final=z(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=z(n,e.explicits),e.final=z(e.final,n),e)}precommit(e){return e}postcommit(e){return P(z(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),P(z(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Tg(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},Gv=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return Dg([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(ya(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(ya(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(ya(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=Yt(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(Dg([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=Fa(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=Ia(e.elements,Fa(e.explicits,this.explicits)),e.final=Ia(e.elements,Fa(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function Kv(e,t=`final`){let n=ga(L(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new Hn.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>I(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>I(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new Hn.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(_g.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var qv=class extends Wv{};function Jv(e){if(U.isCustom(e))return Jv(e.custom.expr);if(U.isWhere(e)){let t=Jv(e.where.expr),n=jo(e.where.condition);return e=>t(e)&&n(e)}if(U.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(U.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(U.isWildcard(e))return()=>!0;if(U.isModelRef(e)){let t=V.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||ra(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}F(e)}function Yv(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!wt(o);w(n,D(kt(uo)),D(t),Gt(t=>{t.shape=r??t.shape,t.color=i??t.color,Vt(a)&&(t.icon=a),Vt(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function Xv(e,t){for(let n of e)!Po(n)||n.targets.length===0||Yv(n,_n(n.targets.map(Jv)),t);return t}var Zv=class e{static kind=lo;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},Qv=class extends Wv{excludeRelations(e){return w(this.memory.connections,D(t=>za(t.relations,e)),Gt(t=>{this.excludeConnections(t.update(Ia(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=z(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=z(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},$v=class extends Qv{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:ey,findConnectionsBetween:ty}=Rg;var ny=class extends Gv{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!ya(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(ey(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(ty(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(ty(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(ty(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||I(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return So.isRelationExpr(this.expression)||w(e,Gt(({source:e,target:t,boundary:n})=>{w(Sn([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),Jt(([e,t])=>e===t),Xt(1),Gt(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=z(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},ry=class extends ny{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=z(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},iy=class e extends Uv{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new ny(this,e)}stageExclude(e){return new Qv(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},ay=class e extends iy{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=Vn.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new Zv(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new Zv(r,n,null));let a=Vn.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return N(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new ry(this,e)}stageExclude(e){return new $v(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new iy(t,this.scope)}};function oy(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function sy(e){let{id:t,title:n,...r}=Dn(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return B({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:Xa(e.$element),tags:[...e.tags],...r})}function cy({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&N(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:lo,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:B({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(pa).forEach(({id:e,...t})=>{let n=ra(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=ra(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=N(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,oy(o,r)),o.children.push(e),a=o.level+1);let c=B({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),a}function ly(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...kn(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function uy(e,t){let n=w(e,gn((e,t)=>(b(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),b(t.description)&&!e.description.some(jt(t.description))&&e.description.push(t.description),b(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),b(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),b(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),b(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),b(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),b(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),b(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=On(n.title)??(n.title.length>1?`[...]`:void 0),i=qt(n.tags),a=B({title:r,description:On(n.description),technology:On(n.technology),kind:On(n.kind),head:On(n.head),tail:On(n.tail),color:On(n.color),line:On(n.line),navigateTo:On(n.navigateTo),...ta(i)&&{tags:i}});if(t){let e=ly(t);a=En({...a,...e},b)}return S(a.title)&&b(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:dy,findConnectionsBetween:fy,findConnectionsWithin:py}=Pg;function my(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function hy(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function gy(e){if(H.isWildcard(e))return()=>!0;if(H.isElementTagExpr(e)||H.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(H.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>ra(e.id)===t:e=>e.id===t}if(H.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?ra(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}F(e)}function _y(e){return Xa(e.$instance)??Xa(e.element.$element)}function vy(e){let t=e.id,n=e.onlyOneInstance();return B({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:E(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:Xa(e.$node)??void 0,tags:[...e.tags],style:Dn(e.style,[`icon`,`shape`,`color`])})}function yy(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return B({id:e.id,kind:`instance`,title:e.title,description:_y(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:E(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function by(e){return e.isInstance()?yy(e):vy(e)}function xy(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];P(E(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=uy(n.map(e=>e.$relationship)),d=B({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function Sy(e,t){let n=cy(e.$styles,[...t.final].map(by));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=_y(r)??null,t.technology??=r.technology,wt(t.tags)&&(t.tags=[...r.tags]),(!t.links||wt(t.links))&&E(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function Cy(e,t){for(let n of e)!Po(n)||n.targets.length===0||Yv(n,_n(n.targets.map(gy)),t);return t}function wy(e){let t=new Hn.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new Hn.default(()=>new Set);for(let[e,r]of t)E(r,2)&&w(r,C(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),At(T(`group`)),yn(),D(E(2)),Gt(Kt(x(T(`conn`)),Cg(`desc`),Jt((e,t,n)=>t===0||e.boundary===n[t-1].boundary),Gt(t=>{n.get(t).add(e)}))));return n}function Ty(e){e=Dg(e);let t=wy(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;P(r.isDeploymentNode());let a=Ia(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=Fa(Ia(n.relations.model,e.internalModelRelationships()),Ia(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return w(t.entries(),Ea(([e,t])=>e.update({model:t,deployment:null})),L())}function Ey(e){return Og(e,Ty(e))}function Dy(e){return w(e,Dg,gn((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=ag.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=dy(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)bg(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new yg(r,i,o)),t},[]))}function Oy(e){return Og(e,Dy(e))}var ky=class extends Gv{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!ya(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(dy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(fy(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(fy(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(fy(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=w(e,Ey,Oy);return w(t,Gt(({source:e,target:t,boundary:n})=>{w(Sn([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),Jt(([e,t])=>e===t),Xt(1),Gt(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},Ay=class e extends Uv{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new ky(this,e)}stageExclude(e){return new qv(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&jt(this.state,t.state)}diff(e){return{added:{elements:L(z(e.elements,this.elements)),explicits:L(z(e.explicits,this.explicits)),final:L(z(e.final,this.final)),connections:L(Og(e.connections,this.connections))},removed:{elements:L(z(this.elements,e.elements)),explicits:L(z(this.explicits,e.explicits)),final:L(z(this.final,e.final)),connections:Og(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
|
|
1204
|
-
`)}[vg](e,t,n){return this.toString()}};const jy={include:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},My={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=Ky(fy(e,[...Zy(e)],`directed`),i);r.addConnections(t)}return r}P(H.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=my(t,e.incoming);for(let e of a){let t=Ky(fy(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.incoming)||H.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.incoming))return Wy(Py(t,e.incoming),{stage:r,memory:n},i);if(H.isWildcard(e.incoming))return r;let a=Ny(my(t,e.incoming)),o=w(n.connections,D(a),Ky(i));return r.excludeConnections(o),r}};function Ny(e){return _n(e.map(e=>{let t=t=>t===e||I(e,t);return e=>!t(e.source)&&t(e.target)}))}function Py(e,t){let n=hy(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const Fy={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of Zy(e)){let n=Ky(dy(t,e,`directed`),i);r.addConnections(n)}return r}P(H.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=my(t,e.outgoing);for(let e of o){let t=Ky(fy(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.outgoing)||H.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.outgoing))return Wy(Ly(t,e.outgoing),{stage:r,memory:n},i);if(H.isWildcard(e.outgoing))return r;let a=Iy(my(t,e.outgoing)),o=w(n.connections,D(a),Ky(i));return r.excludeConnections(o),r}};function Iy(e){return _n(e.map(e=>{let t=t=>t===e||I(e,t);return e=>t(e.source)&&!t(e.target)}))}function Ly(e,t){let n=hy(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const Ry={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(H.isElementTagExpr(e)||H.isElementKindExpr(e)||H.isElementTagExpr(t)||H.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);P(!H.isModelRef(e),`Invalid source model ref in direct relation`),P(!H.isModelRef(t),`Invalid target model ref in direct relation`);let o=H.isWildcard(e),s=H.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=w(py(r.instances()),Ky(a),x(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=my(r,e),i=Iy(t),o=i;if(n){let e=Ny(t);o=t=>i(t)!==e(t)}l=w(t,C(e=>fy(e,Zy(e),c)),D(o),Ky(a));break}case o&&!s:{let e=my(r,t),i=Ny(e),o=i;if(n){let t=Iy(e);o=e=>t(e)!==i(e)}l=w(e,C(e=>[...Zy(e)].flatMap(t=>dy(t,e,c))),D(o),Ky(a));break}default:{P(!o,`Inference failed - source should be a deployment ref`),P(!s,`Inference failed - target should be a deployment ref`);let n=my(r,e),i=my(r,t),u=Iy(n),d=Ny(i);l=w(n,C(e=>fy(e,i,c)),D(e=>u(e)&&d(e)),Ky(a))}}return i.addConnections(l),H.isDeploymentRef(e)&&Mt(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),H.isDeploymentRef(t)&&Mt(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=gy(e.target),o=gy(e.source),s;switch(!0){case H.isWildcard(e.source)&&H.isWildcard(e.target):return r.excludeConnections(Ky(n.connections,i)),r;case H.isModelRef(e.source)&&H.isModelRef(e.target):return s=zy({source:e.source,target:e.target,expr:e,model:t}),Wy(s,{stage:r,memory:n},i);case H.isModelRef(e.source)&&H.isWildcard(e.target):return s=Ly(t,e.source),Wy(s,{stage:r,memory:n},i);case H.isModelRef(e.source):return s=Ly(t,e.source),Wy(s,{stage:r,memory:n},i,e=>a(e.target));case H.isModelRef(e.target):return s=Py(t,e.target),Wy(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=w(n.connections,D(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),Ky(i));return c.length===0||r.excludeConnections(c),r}}};function zy({source:e,target:t,expr:n,model:r}){let i=hy(r,e),a=hy(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...Bg(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const By={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(H.isWildcard(e.inout)){for(let e of a){let t=Jy(fy(e,[...Zy(e)],`both`),i);r.addConnections(t)}return r}P(H.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=my(t,e.inout);for(let e of a){let t=Jy(fy(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(H.isElementTagExpr(e.inout)||H.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(H.isModelRef(e.inout)){let a=hy(t,e.inout);return a.length===0?r:Wy(Fa(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(H.isWildcard(e.inout))return r;let a=my(t,e.inout),o=Ny(a),s=Iy(a),c=w(n.connections,D(e=>o(e)!==s(e)),Ky(i));return r.excludeConnections(c),r}},Vy={include:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=jo(e.where.condition);return Uy(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},Hy={include:({model:e,stage:t,where:n})=>{let r=[],i=w([...e.roots()],qy(n),x(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(py([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=w([...t.elements],qy(n));return e.exclude(r),e}};function Uy(e,{expr:t,where:n,...r}){switch(!0){case H.isElementTagExpr(t):case H.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case yo.isCustom(t):case H.isCustom(t):case H.isModelRef(t):return;case H.isWhere(t):return jy[e]({...r,expr:t,where:n});case yo.isWhere(t):return Vy[e]({...r,expr:t,where:n});case H.isDeploymentRef(t):return Qy[e]({...r,expr:t,where:n});case H.isWildcard(t):return Hy[e]({...r,expr:t,where:n});case yo.isDirect(t):return Ry[e]({...r,expr:t,where:n});case yo.isInOut(t):return By[e]({...r,expr:t,where:n});case yo.isOutgoing(t):return Fy[e]({...r,expr:t,where:n});case yo.isIncoming(t):return My[e]({...r,expr:t,where:n});default:F(t)}}function Wy(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=w(n.connections,D(e=>i(e)),D(t=>za(t.relations.model,e)),x(t=>t.update({deployment:null,model:Ia(t.relations.model,e)})),Ky(r),D(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function Gy(e,t){return Ky(e,t).nonEmpty()}function Ky(...e){if(e.length===1)return t=>Ky(t,e[0]);let[t,n]=e;return n===null?t:Bt(t)?t.map(e=>Ky(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(Xy(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(Xy(t)(e))))})}function qy(...e){if(e.length===1)return t=>qy(t,e[0]);let[t,n]=e;return Bt(t)?t.filter(e=>qy(e,n)):n?.(Yy(t,t))??!0}function Jy(e,t){return t?w(e,D(e=>Gy(e,t))):e}function Yy(e,t){if(Kg(e)){let n=Wg(t)&&Ug(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]]}}if(Gg(e))return kn(e.element,[`tags`,`kind`]);if(Ug(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags]};if(Hg(e))return kn(e,[`tags`,`kind`]);F(e)}function Xy(e){return t=>({tags:t.tags,kind:t.kind,source:Yy(t.source,e.source),target:Yy(t.target,e.target)})}function Zy(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const Qy={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(Ug(r))return qy(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:eb(r,e);break;case t.selector===`children`:$y(r,e);break;case t.selector===`descendants`:tb(r,e);break;default:qy(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=gy(e),a=w([...n.elements],D(i),qy(r));return t.exclude(a),t}};function $y(e,{stage:t,where:n}){let r=qy([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(py(r)),t.connectWithExisting(r),t.addExplicit(r))}function eb(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=qy([...e.children()],r),a=!1;for(let e of i)if(fy(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(py(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function tb(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),qy(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(py(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=nb(t);w(i,D(e=>a.has(e)),Gt(e=>t.addExplicit(e)))}function nb(e){return w(e.mergedConnections(),Ey,Oy,gn((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var rb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=w(e.connections,Ey,Oy),n=Og(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=Fa(this.memory.elements,e.elements),n=Fa(e.final,this.memory.explicits),r=new Hn.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||I(e,t))return!0;return!1};return w(z(t,i),ba(e=>e.isDeploymentNode()),L(),ma,Gt(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&Da(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=Kv(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=On([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=On(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function ib(e,t){let n=Ay.empty();for(let r of t)if(No(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=Uy(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return rb.for(n).commit()}function ab(e,{docUri:t,rules:n,...r}){let i=ib(e.deployment,n),a=Sy(e,i),o=xy(i.connections);Iv(a,o);let s=Vv({nodes:a,edges:o}),c=Cy(n,s.nodes),l=Cn(n,Ho),u=Vs(c);return Hv({...r,[no]:`computed`,[ro]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:x(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function ob(e){return t=>Ko(t)?t.groupRules.flatMap(ob(e)):No(t)&&`include`in t?t.include.filter(e):[]}function sb(e,t){let n=e.flatMap(ob(U.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=Tt(t,S),p=B({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!An(p),h=!An(f),g=Jv(e);r.forEach((e,t)=>{uo(e)||!g(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function cb(e,t){return e.reduce((e,n)=>{if(Bo(n)){let r=t.predicates[n.predicateId];return S(r)?e:e.concat(r)}if(zo(n)){let r=t.styles[n.styleId];return S(r)?e:e.concat(r)}return e.push(n),e},[])}function lb(e,t){return e.reduce((e,n)=>{if(Bo(n)){let r=t.dynamicPredicates[n.predicateId];return S(r)?e:e.concat(r)}if(zo(n)){let r=t.styles[n.styleId];return S(r)?e:e.concat(r)}return e.push(n),e},[])}function ub(e,t){let n=new Set;for(let r of t)if(No(r))for(let t of r.include){let r=Jv(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const db=e=>{if(Wo(e)){let t=[],n=[];for(let r of e.__parallel)if(Go(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return Go(e)?[...e.__series]:e};function fb(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of C(t,db)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function pb(e,t,n){let r=zg(e,t,`directed`).flatMap(e=>[...e.relations]).sort(Pa);if(!ta(r))return{};if(r.length===1){let e=r[0];return B({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=w(r,C(e=>e.tags),qt()),a=E(i,1)?i:void 0,o=x(r,e=>e.id),s=$t(r).$relationship.navigateTo;s===n&&(s=void 0),s||=w(r,C(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),qt(),On());let c=w(r,gn((e,{title:t,technology:n,$relationship:r})=>(b(t)&&e.title.add(t),b(r.color)&&e.color.add(r.color),b(r.line)&&e.line.add(r.line),b(r.kind)&&e.kind.add(r.kind),b(n)&&e.technology.add(n),b(r.description)&&!e.description.some(jt(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return B({tags:a??void 0,relations:o,navigateTo:s,kind:On([...c.kind]),title:On([...c.title]),color:On([...c.color]),line:On([...c.line]),technology:On([...c.technology]),description:On(c.description)})}var mb=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=lb(t,this.model.globals),a=ub(this.model,i),o=fb(this.model,n),s=w(Fa(Ia(a,o),o,a),L(),ga),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(I(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(Go(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?go(n,t):go(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);P(h>=0,`Source ${i} not found`);let g=this.model.element(a),ee=s.indexOf(g);P(ee>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:te,relations:ne,navigateTo:re,...ie}=pb(m,g,this.view.id),ae=b(d)&&d!==this.view.id?d:re,oe=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(B({...ie,...p,...oe&&{technology:oe},id:r,source:m,target:g,navigateTo:ae,title:o??te,relations:ne??[],isBackward:h>ee})),t+1},u=1;for(let e of n){if(Wo(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=cy(this.model.$styles,s.map(sy)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=N(d.get(t.id),`Source node ${t.id} not found`),l=N(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:ua(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=ra(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of da(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of da(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=sb(i,Xv(i,s.map(e=>N(d.get(e.id))))),h=Cn(i,Ho),g=Vs(m);return Hv({...r,[ro]:`dynamic`,[no]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:x(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function hb(e,t){return new mb(e,t).compute()}function gb(e){switch(!0){case xo.isCustom(e):return gb(e.customRelation.expr);case xo.isWhere(e):{let t=gb(e.where.expr),n=jo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind},target:{tags:e.target.tags,kind:e.target.kind},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind}})}case xo.isDirect(e):{let t=Jv(e.source),n=Jv(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case xo.isInOut(e):{let t=Jv(e.inout);return e=>t(e.source)||t(e.target)}case xo.isIncoming(e):{let t=Jv(e.incoming);return e=>t(e.target)}case xo.isOutgoing(e):{let t=Jv(e.outgoing);return e=>t(e.source)}default:F(e)}}function _b(e,t,n){let r=e.flatMap(ob(xo.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:oo(a)}:{},c=o?{notes:oo(o)}:{},l=Tt(s,S),u=gb(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...kn(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function vb(e){return w([...e],Dg,gn((e,t,n,r)=>{let i=Eg(r,t),a=Fa(...i.map(T(`relations`))),o=Ia(t.relations,a);if(i.length>0&&(o=Fa(o,t.directRelations)),xg(r,t.reversed())&&(o=Fa(o,t.directRelations)),o.size<t.relations.size){let e=r.some(Mg(t.source)),n=r.some(Mg(t.target));e&&(o=Fa(o,Oa(ba(t.relations,Ag(t.source))))),n&&(o=Fa(o,Oa(ba(t.relations,jg(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var yb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=vb(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=Fa(this.memory.elements,e.elements),n=Fa(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||I(e,t))return!0;return!1};return w(z(t,r),L(),ma,Gt(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&Da(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=Kv(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=On([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=On(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:bb,findConnectionsBetween:xb,findConnectionsWithin:Sb}=Rg;function Cb(e,t){switch(!0){case U.isElementKindExpr(t):return[...ba(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case U.isElementTagExpr(t):return[...ba(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(V.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(V.flatten(t.ref)),r=t.selector===`children`?L(n.children()):L(n.descendants());return r&&r.length>0?r:[n]}case U.isModelRef(t):return[e.element(V.flatten(t.ref))];default:F(t)}}function wb(e,t){if(t.isEmpty()||e.length===0)return e;let n=_n(e.map(e=>sa(e))),r=L(ba(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function Tb(e,{memory:t,model:n}){let r=Cb(n,e);return U.isModelRef(e)?e.selector===`descendants`?r:wb(r,t):r}const Eb={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(V.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(Sb(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));return n.exclude(i),n}},Db={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Sb(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));return n.exclude(i),n}},Ob={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(Sb(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Cb(t,e));return n.exclude(i),n}},kb=()=>!0,Ab=e=>e;function jb(e){return e.reduce((e,t)=>{let n=[...t.relations];P(E(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=uy(n.map(e=>e.$relationship),On(D(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=B({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function Mb(e,t){return cy(e.$styles,[...t.final].map(sy),t.groups)}const Nb=U.isWildcard,Pb=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),Fb={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=Nb(e),l=Nb(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==kb:{let e=w(i.relationships(),ba(o),L(),x(e=>new Ng(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==kb:u.push(...Sb(r.elements));break;case c&&l:u.push(...Sb(i.roots()));break;case!c&&l&&o!==kb:{let t=w(Cb(i,e),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ba(o),ka(),L(),Yt(t=>t.source===e),([t,n])=>Tn(w(t,D(t=>!Pb(e,t.target)),x(t=>new Ng(e,t.target,new Set([t])))),w(n,D(t=>!Pb(e,t.source)),x(t=>new Ng(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=Ib(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...xb(e,a,o));break}case c&&!l&&o!==kb:{let e=w(Cb(i,t),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ba(o),L(),Yt(t=>t.target===e),([t,n])=>Tn(w(n,D(t=>!Pb(e,t.target)),x(t=>new Ng(e,t.target,new Set([t])))),w(t,D(t=>!Pb(e,t.source)),x(t=>new Ng(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=Ib(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...xb(t,e,o));break}default:{P(!Nb(e),`Inference failed - source must be not a wildcard`),P(!Nb(t),`Inference failed - target must be not a wildcard`);let a=Tb(e,{memory:r,model:i}),o=Tb(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...xb(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=Nb(e),c=Nb(t),l;switch(!0){case s&&c:l=w(i.connections,C(Kt(T(`relations`),ba(o),L())),Oa());break;case!s&&c:l=w(Cb(r,e),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ba(o),L())),Oa());break;case s&&!c:l=w(Cb(r,t),C(e=>w(e,pn(un(n===!0),{onTrue:e=>Fa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ba(o),L())),Oa());break;default:{P(!Nb(e),`Inference failed - source must be not a wildcard`),P(!Nb(t),`Inference failed - target must be not a wildcard`);let i=Cb(r,e),a=Cb(r,t),s=new Set;for(let e of i)for(let t of a)oa(e,t)||(s=Fa(s,Ia(e.allOutgoing,t.allIncoming),n?Ia(t.allOutgoing,e.allIncoming):new Set));l=Oa(ba(s,o))}}return a.excludeRelations(l),a}};function Ib(e,{memory:t,model:n}){let r=Cb(n,e);if(!E(r,1))return[[],[]];if(U.isModelRef(e)){let i=L(n.element(V.flatten(e.ref)).ascendingSiblings());return[wb(r,t),wb(i,t)]}return[r,w(r,x(e=>e.ascendingSiblings()),Sa(),ka(),L(),e=>wb(e,t))]}const Lb={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(U.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...bb(e,t,`directed`))}else{let e=Tb(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...qt(e.flatMap(e=>[...e.ascendingSiblings()])));let i=Rb(n,o);for(let n of t)s.push(...xb(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=Cb(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function Rb(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=Jv(t);return t=>e(t.target)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return _n([...e.children(n)].map(e=>_g.isIncoming(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return _n([_g.isInside(n),...[...e.children(n)].map(e=>_g.isIncoming(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return _n([_g.isIncoming(e),_g.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return _g.isIncoming(e)}default:F(t)}}const zb={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(U.isWildcard(e)){if(!t)return;o.push(...xb(t,t.ascendingSiblings()))}else{let t=Tb(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=qt(t.flatMap(e=>L(e.ascendingSiblings()))));for(let e of t)o.push(...xb(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=Cb(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(Oa(a.filter(i))),r}},Bb={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(U.isWildcard(o)){if(!t)return;s.push(...xb(t,t.ascendingSiblings(),`directed`))}else{let e=Tb(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...qt(e.flatMap(e=>[...e.ascendingSiblings()])));let i=Vb(n,o);for(let n of e)s.push(...xb(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(U.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=Cb(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(Oa(a.filter(i))),r}};function Vb(e,t){switch(!0){case U.isElementKindExpr(t):case U.isElementTagExpr(t):{let e=Jv(t);return t=>e(t.source)}case U.isModelRef(t)&&t.selector===`children`:{let n=V.flatten(t.ref);return _n([...e.children(n)].map(e=>_g.isOutgoing(e.id)))}case U.isModelRef(t)&&t.selector===`descendants`:{let n=V.flatten(t.ref);return _n([_g.isInside(n),...[...e.children(n)].map(e=>_g.isOutgoing(e.id))])}case U.isModelRef(t)&&t.selector===`expanded`:{let e=V.flatten(t.ref);return _n([_g.isOutgoing(e),_g.isInside(e)])}case U.isModelRef(t):{let e=V.flatten(t.ref);return _g.isOutgoing(e)}default:F(t)}}const Hb={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=Yt(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(Sb(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=L(ba(e.children(),i)),s=o.length>0;if(!s)if(a){if(xb(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=Oa([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections(xb(e,o,`directed`));s&&(n.addConnections(Sb(o)),n.addExplicit(o));for(let e of o)n.addConnections(xb(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===kb?e?(n.exclude([e,...e.descendants()]),n):iy.empty(t.scope).stageExclude(n.expression):(n.exclude(D([...t.elements],r)),n)};function Ub(e,t,n){switch(!0){case U.isCustom(e):return t===`include`?Ub(e.custom.expr,t,n):n.stage;case U.isWhere(e):{let r=jo(e.where.condition),i=e=>D(e,r);return Ub(e.where.expr,t,{...n,where:r,filterWhere:i})}case U.isModelRef(e)&&e.selector===`expanded`:return Eb[t]({...n,expr:e})??n.stage;case U.isWildcard(e):return Hb[t]({...n,expr:e})??n.stage;case U.isElementKindExpr(e):case U.isElementTagExpr(e):return Db[t]({...n,expr:e})??n.stage;case U.isModelRef(e):return Ob[t]({...n,expr:e})??n.stage;default:F(e)}}function Wb(e,t,n){switch(!0){case xo.isCustom(e):return t===`include`?Wb(e.customRelation.expr,t,n):n.stage;case xo.isWhere(e):{let r=jo(e.where.condition),i=e=>new Set(D([...e],r)),a=e=>w(e,x(e=>new Ng(e.source,e.target,i(e.relations))),D(e=>e.nonEmpty()));return Wb(e.where.expr,t,{...n,where:r,filterWhere:a})}case xo.isInOut(e):return zb[t]({...n,expr:e})??n.stage;case xo.isDirect(e):return Fb[t]({...n,expr:e})??n.stage;case xo.isOutgoing(e):return Bb[t]({...n,expr:e})??n.stage;case xo.isIncoming(e):return Lb[t]({...n,expr:e})??n.stage;default:F(e)}}function Gb(e,t,n){let r={model:e,scope:t.scope,where:kb,filterWhere:Ab};for(let i of n){if(Ko(i)){t=Gb(e,ay.enter(t,i),i.groupRules),P(t instanceof ay,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(No(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case So.isFqnExpr(i):n=Ub(i,e,{...r,stage:n,memory:t})??n;break;case So.isRelationExpr(i):n=Wb(i,e,{...r,stage:n,memory:t})??n;break;default:F(i)}t=n.commit()}}}return t}function Kb(e,t,n){return t=Gb(e,t,n),yb.for(t).commit()}function qb(e,{docUri:t,rules:n,...r}){let i=cb(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=Kb(e,iy.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=Yb(o);let s=Mb(e,o),c=jb(o.connections);Iv(s,c);let l=Vv({nodes:s,edges:c}),u=sb(i,Xv(i,l.nodes)),d=Cn(i,Ho),f=Vs(u),p=Jb(i,u);return Hv({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:_b(i,u,l.edges),nodes:x(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function Jb(e,t){let n=[];for(let r of e){if(!qo(r)||r.targets.length===0)continue;let e=w(t,D(_n(r.targets.map(Jv))),x(e=>e.id));E(e,1)&&n.push({type:r.rank,nodes:e})}return n}function Yb(e){if(e.groups.length===0)return e;let t=new Hn.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(w(ga([...e.explicitFirstSeenIn.keys()]),Gt(i=>{if(!r(i)){let r=N(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),w(ga([...e.lastSeenIn.keys()]),D(e=>!n.has(e)),Gt(a=>{if(r(a)||i(a))return;let o=N(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function Xb(e,t){switch(!0){case Fo(e):return qb(t,e);case Lo(e):return ab(t,e);case Ro(e):return hb(t,e);default:F(e)}}function Zb(e,t){try{return{isSuccess:!0,view:Xb(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function Qb(e){let t=new zr({type:`directed`}),n=[];for(let r of yn(e))t.addNode(r.id,{view:r}),Io(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,Rv.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,Lv.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!Io(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!Fo(i))return e;let a=qt([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:ta(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const $b=e=>cn(e).length,ex=e=>Va(e);function tx(e){let t=nx(e),n=(e,t)=>`${e}->${t}`,r=new Hn.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;P(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!wt(t.$data.imports))for(let[e,n]of on(t.$data.imports))for(let r of n){let n=po(e,r.id);a(t,N(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];P(E(i,1),`Relationships set must have at least one relationship`);let a={id:Va(e),source:ex(t),target:ex(n),projectId:t,relations:x(i,T(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:qt(C(i,T(`tags`)))},o=On(i);return o&&(a.label=o.title,a.description=Xa(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});Iv(t,o);let s=Vv({nodes:t,edges:o});return{id:`projects-view`,[ro]:`projects`,[no]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function nx(e){let t=new Map;for(let n of e){let e=ao(n.projectId),r={id:ex(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${$b(n.$data.elements)}`,`Relationships: ${$b(n.$data.relations)}`,`Views: ${$b(n.$data.views)}`].join(`
|
|
1205
|
-
`)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function rx(e,t){return{...qb(e,{id:fo(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}De();const ix=W.getChild(`LanguageServices`),ax=e=>e.severity===Ge.Error;var ox=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof Hm?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=w(this.services.shared.workspace.LangiumDocuments.groupedByProject(),on(),x(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:x(n,T(`uri`)),config:a}}));if(E(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(E(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=x(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),T(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return gg.create({...r.$data,_stage:`layouted`,views:w(i,x(T(`diagram`)),Ht(T(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===gg.EMPTY){ix.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!E(n,1))throw Error(`No models found`);let r=tx(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return w(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),C(e=>w(e.diagnostics??[],D(ax),x(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}async dispose(){try{ix.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){ix.error(ci(e))}finally{ix.debug(`LikeC4LanguageServices disposed`)}}},sx=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){G(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function cx(e){try{let t=vp(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function lx(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function ux(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function dx(e){let t;for(;t=e.value?.ref;){if(Jl(t))return null;if(Wl(t))return t;if(S(e.parent))return null;e=e.parent}return null}function fx(e){let t=ux(e);return t?.$type===`Imported`?t:null}function px(e){let t;for(;t=e.value?.ref;){if(Sc(t))return!0;if(S(e.parent))return!1;e=e.parent}return!1}function mx(e){if(zd(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;P(Vd(e))}if(Vd(e))return e.project;let t=u(e)?me(e):e;return t.likec4ProjectId?t.likec4ProjectId:(W.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,Fh.DefaultProjectId)}function hx(...e){return Va(e.length>1?e.join(`:::`):e[0])}function gx(e){try{return e()}catch(e){W.trace(`Safe call failed`,{error:e});return}}function _x(){try{return globalThis.performance.now()}catch{return Date.now()}}function vx(){let e=_x();return{get ms(){return _x()-e},get pretty(){return Vr(_x()-e)}}}var yx=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if($m(e))return e.state<_.Linked&&(W.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,e.uri,n),W.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Zm.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=mx(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};De();const bx=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function xx(e,t){return ye(t.feature)&&t.property===`project`&&Vd(e.node)}var Sx=class extends ne{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case _e(t.feature):return this.completionForKeyword(e,t.feature,n);case ve(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case xx(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:v.Snippet,insertTextFormat:Pe.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&ge(e.node,gf):n(e,{label:t.value,detail:`Insert deployment view`,kind:v.Class,insertTextFormat:Pe.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
|
|
1206
|
-
`)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${1|${Wi.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:v.Property,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
|
|
1207
|
-
`)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
|
|
1208
|
-
`)});break;case t.value===`dynamic`&&ge(e.node,gf):n(e,{label:t.value,detail:`Insert dynamic view`,kind:v.Class,insertTextFormat:Pe.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
|
|
1209
|
-
`)});break;case t.value===`style`&&e.node&&ge(e.node,wd):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${bx}|} $0\n}`});break;case t.value===`style`&&e.node&&ge(e.node,_n([gf,Ed])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${bx}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:v.Module,insertTextFormat:Pe.Snippet,insertText:`${t.value} {\n\t\${1|${bx}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:v.Class,insertTextFormat:Pe.Snippet,insertText:`extend $1 {
|
|
1207
|
+
`,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...gv(this.services.likec4.LanguageServices)),n.registerTool(...Av(this.services.likec4.LanguageServices)),n.registerTool(...kv(this.services.likec4.LanguageServices)),n.registerTool(...Ov(this.services.likec4.LanguageServices)),n.registerTool(...Nv(this.services.likec4.LanguageServices)),n.registerTool(...Fv(this.services.likec4.LanguageServices)),n.registerTool(...hv(this.services.likec4.LanguageServices)),n.registerTool(...Cv(this.services.likec4.LanguageServices)),n.registerTool(...Tv(this.services.likec4.LanguageServices)),n.registerTool(...Dv(this.services.likec4.LanguageServices)),n.registerTool(...yv(this.services.likec4.LanguageServices)),n.registerTool(...xv(this.services.likec4.LanguageServices)),n.registerTool(...fv(this.services.likec4.LanguageServices)),n.registerTool(...cv(this.services.likec4.LanguageServices)),n.registerTool(...bv(this.services.likec4.LanguageServices)),n.registerTool(...dv(this.services.likec4.LanguageServices)),n.registerTool(...Lv(this.services.likec4.LanguageServices)),t&&n.registerTool(..._v(this.services.likec4.LanguageServices)),n.server.onerror=e=>{K.error(U(e))},n}},zv=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(Wg.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new Nr,await this._mcp.connect(this.transport),Wg.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{Wg.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function Bv(e){let t=new yr;t.use(`*`,xr({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e.create(),r=new br({eventStore:new Sr({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(Wg.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),t.onError((e,t)=>(Wg.error(U(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function Vv(e){let{factory:t,port:n}=e,r=await Bv(t);return new Promise((e,t)=>{let i=qr({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var Hv=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}Wg.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await Vv({factory:this.services.mcp.ServerFactory,port:e}),Wg.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(Wg.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?Wg.error(`Failed to stop MCP server`,{err:e}):Wg.info(`MCP server stopped`),t()})})):(Wg.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function Uv(e,t=33335){Wg.debug(`Creating StreamableLikeC4MCPServer`);let n=new Hv(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){Wg.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=U(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),Wg.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function Wv(e){return new zv(e)}function Gv(e=`sse`){return{mcpServer:t=>e===`stdio`?Wv(t):Uv(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new Rv(e)}}var Kv=class extends Un{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!Jd(e)&&!Wd(e)&&!Of(e))return super.getDocumentation(e);try{let t=On(e);if(t.state<Jn.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case Jd(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case Wd(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=B.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
|
|
1208
|
+
`)}case Of(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
|
|
1209
|
+
`):void 0}default:return e}}catch(e){q(e)}}};function qv(e,t){return[e,t]=Jv(e,t)>0?[t,e]:[e,t],Yv(e.range,t.range.start)}function Jv(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function Yv(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function Xv(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:ar.newLine({allowMore:!0}),oneSpace:ar.oneSpace(),noSpace:ar.noSpace(),indent:ar.indent({allowMore:!0}),noIndent:ar.noIndent()};var Zv=class extends Qn{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Th,(e,t)=>{let n=sn(e.$cstNode,`values`).filter(C).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,ef,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],C)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,Zf,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>Mm(e)||ef(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],C)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,Au,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(fg(e)&&Xv(e.$cstNode)||mg(e)&&fg(e.$container)&&Xv(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(ar.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(ar.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&Xv(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){Xp(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(Qp(e)||mh(e)||oh(e)||uh(e)||ih(e)||Cp(e)||Tp(e)||Dp(e)||xp(e)||yp(e)||Dp(e)||fm(e)||Af(e)||rp(e)||Pm(e)||Jm(e)||um(e)||gm(e)||Kf(e)||_f(e)||sf(e)||Hh(e)||Ih(e)||Bd(e)||Hd(e)||Bf(e)||Tf(e)||mm(e)||Xd(e)||nf(e)||Kd(e)||$f(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=Xv(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!qv(o,e))&&t.cst([e]).prepend(ar.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(ar.newLine({allowMore:!0})):i.prepend(ar.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,Mf)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,Wf,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,hf)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,af)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(Rf(e)||Km(e)||Wh(e)||Sm(e)||wm(e)||ch(e)||fh(e)||Ld(e)||em(e)||Nd(e)||Ip(e)||Qm(e)||Fd(e)||Em(e)||vm(e)||Mp(e)||Rp(e)||Pp(e)||eh(e)||Am(e)||Dh(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,nm,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,bm)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,Ah,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,cm,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,Of,(e,t)=>{let n=_r(e.$cstNode,`kind`),r=_r(e.$cstNode,`name`);r&&n&&(Jv(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,tp,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,Tp,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,Dp,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,xp,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,yp,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,Hp,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,Bp,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((oh(e)||uh(e)||gh(e)||ih(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),nh(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(pp(e)||Rm(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,Jd,(e,t)=>{let n=_r(e.$cstNode,`kind`),r=_r(e.$cstNode,`name`);r&&n&&(Jv(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,Wd,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Ph,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Mh(e)||xf(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,Ih,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,Hh)?.keyword(`style`).append(X.oneSpace),this.on(e,df)?.keyword(`style`).append(X.oneSpace),this.on(e,Yf)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,lp)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(Im(e)||dp(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Od,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,ng,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Ed(e)||cg(e)||eg(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,xd,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,Xh,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),yd(e)||Qh(e)||Jh(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(Ou(e)||Rh(e)||lf(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!Xv(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(Yf(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&Xv(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,Wp,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,Kp,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,Om,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,pf,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Ou(t)||Rh(t)||lf(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:P(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,ld)?.property(`value`),t??=this.on(e,Of)?.properties(`props`),t??=this.on(e,Hp)?.properties(`project`),t??=this.on(e,Mm)?.properties(`title`,`technology`),t??=this.on(e,Ih)?.properties(`title`),t??=this.on(e,Au)?.properties(`title`),t??=this.on(e,Jd)?.properties(`title`),t??=this.on(e,Wd)?.properties(`title`),t??=this.on(e,ef)?.properties(`title`,`technology`),t??=this.on(e,nm)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};function Qv(e,t){let n=[],r=e.parent;for(;r;){let e=M(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function $v(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);N(t,`Source node ${n.source} not found`),N(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=Qv(t,e),a=Qv(r,e),o=i.length>0&&a.length>0?Re(zi(je(i),je(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var ey=ut(),ty=t(dt(),1);function ny(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function ry(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function iy(e){let t=ny([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>M(e.nodes.get(t)),i=new Qt({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=it(w(n,y(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,ty.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&w(Qv(o,e.nodes),Ze(e=>e.inEdges.includes(t.id)),me(e=>{i.mergeNode(e.id),(0,ty.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,ty.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,ty.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,ty.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);N(s.length===n.length,`Not all edges were added to the graph`);let l=(0,ey.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);N(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:ry(ny(u)),edges:s}}function ay(e){return e.hash=Ea({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:w(e.nodes,y(e=>({id:e.id,icon:C(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:Wa(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),re(({id:e,...t})=>[e,t])),edges:w(e.edges,y(e=>({source:e.source,target:e.target,label:e.label,description:Wa(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),re(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var oy=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},sy=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(aa(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(ve(t)&&(N(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),aa(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=R(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=Sa(t,e.elements),t=w(t,oa(t=>e.explicits.has(t)&&!pa(e.final,qi(t))),ma()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=R(e.explicits,t),e.final=R(e.final,t)),e}removeElements(e){return e.elements=R(e.elements,this.excluded.elements),e.explicits=R(e.explicits,this.excluded.elements),e.final=R(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=R(n,e.explicits),e.final=R(e.final,n),e)}precommit(e){return e}postcommit(e){return N(R(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),N(R(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Mc(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},cy=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return Pc([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(aa(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(aa(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(aa(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=it(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(Pc([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=xa(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=Sa(e.elements,xa(e.explicits,this.explicits)),e.final=Sa(e.elements,xa(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function ly(e,t=`final`){let n=na(I(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new vt.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>F(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>F(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new vt.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(wc.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var uy=class extends sy{};function dy(e){if(H.isCustom(e))return dy(e.custom.expr);if(H.isWhere(e)){let t=dy(e.where.expr),n=mo(e.where.condition);return e=>t(e)&&n(e)}if(H.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(H.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(H.isWildcard(e))return()=>!0;if(H.isModelRef(e)){let t=B.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||Ui(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}P(e)}function fy(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!b(o);w(n,S(ue(qa)),S(t),me(t=>{t.shape=r??t.shape,t.color=i??t.color,se(a)&&(t.icon=a),se(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function py(e,t){for(let n of e)!_o(n)||n.targets.length===0||fy(n,Ve(n.targets.map(dy)),t);return t}var my=class e{static kind=Ka;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},hy=class extends sy{excludeRelations(e){return w(this.memory.connections,S(t=>Ta(t.relations,e)),me(t=>{this.excludeConnections(t.update(Sa(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=R(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=R(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},gy=class extends hy{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:_y,findConnectionsBetween:vy}=Gc;var yy=class extends cy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!aa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(_y(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(vy(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(vy(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(vy(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||F(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return io.isRelationExpr(this.expression)||w(e,me(({source:e,target:t,boundary:n})=>{w(Qe([...I(e.ancestors()).reverse(),e],[...I(t.ancestors()).reverse(),t]),Ge(([e,t])=>e===t),Ee(1),me(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=R(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},by=class extends yy{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=R(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},xy=class e extends oy{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new yy(this,e)}stageExclude(e){return new hy(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},Sy=class e extends xy{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=_t.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new my(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new my(r,n,null));let a=_t.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return M(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new by(this,e)}stageExclude(e){return new gy(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new xy(t,this.scope)}};function Cy(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function wy(e){let{id:t,title:n,...r}=_e(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return z({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:Ia(e.$element),tags:[...e.tags],...r})}function Ty({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&M(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:Ka,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:z({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort($i).forEach(({id:e,...t})=>{let n=Ui(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=Ui(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=M(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,Cy(o,r)),o.children.push(e),a=o.level+1);let c=z({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,M(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,M(r.get(e)))}),a}function Ey(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...Te(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function Dy(e,t){let n=w(e,Ke((e,t)=>(C(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),C(t.description)&&!e.description.some(Je(t.description))&&e.description.push(t.description),C(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),C(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),C(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),C(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),C(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),C(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),C(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=ge(n.title)??(n.title.length>1?`[...]`:void 0),i=Ce(n.tags),a=z({title:r,description:ge(n.description),technology:ge(n.technology),kind:ge(n.kind),head:ge(n.head),tail:ge(n.tail),color:ge(n.color),line:ge(n.line),navigateTo:ge(n.navigateTo),...Vi(i)&&{tags:i}});if(t){let e=Ey(t);a=at({...a,...e},C)}return v(a.title)&&C(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:Oy,findConnectionsBetween:ky,findConnectionsWithin:Ay}=Vc;function jy(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function My(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function Ny(e){if(V.isWildcard(e))return()=>!0;if(V.isElementTagExpr(e)||V.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(V.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>Ui(e.id)===t:e=>e.id===t}if(V.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?Ui(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}P(e)}function Py(e){return Ia(e.$instance)??Ia(e.element.$element)}function Fy(e){let t=e.id,n=e.onlyOneInstance();return z({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:T(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:Ia(e.$node)??void 0,tags:[...e.tags],style:_e(e.style,[`icon`,`shape`,`color`])})}function Iy(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return z({id:e.id,kind:`instance`,title:e.title,description:Py(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:T(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function Ly(e){return e.isInstance()?Iy(e):Fy(e)}function Ry(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];N(T(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Dy(n.map(e=>e.$relationship)),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function zy(e,t){let n=Ty(e.$styles,[...t.final].map(Ly));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=Py(r)??null,t.technology??=r.technology,b(t.tags)&&(t.tags=[...r.tags]),(!t.links||b(t.links))&&T(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function By(e,t){for(let n of e)!_o(n)||n.targets.length===0||fy(n,Ve(n.targets.map(Ny)),t);return t}function Vy(e){let t=new vt.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new vt.default(()=>new Set);for(let[e,r]of t)T(r,2)&&w(r,_(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),xe(x(`group`)),Ye(),S(T(2)),me(nt(y(x(`conn`)),Ac(`desc`),Ge((e,t,n)=>t===0||e.boundary===n[t-1].boundary),me(t=>{n.get(t).add(e)}))));return n}function Hy(e){e=Pc(e);let t=Vy(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;N(r.isDeploymentNode());let a=Sa(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=xa(Sa(n.relations.model,e.internalModelRelationships()),Sa(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return w(t.entries(),fa(([e,t])=>e.update({model:t,deployment:null})),I())}function Uy(e){return Fc(e,Hy(e))}function Wy(e){return w(e,Pc,Ke((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=fc.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=Oy(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)Dc(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new Ec(r,i,o)),t},[]))}function Gy(e){return Fc(e,Wy(e))}var Ky=class extends cy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!aa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Oy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(ky(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(ky(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(ky(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=w(e,Uy,Gy);return w(t,me(({source:e,target:t,boundary:n})=>{w(Qe([...I(e.ancestors()).reverse(),e],[...I(t.ancestors()).reverse(),t]),Ge(([e,t])=>e===t),Ee(1),me(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},qy=class e extends oy{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new Ky(this,e)}stageExclude(e){return new uy(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&Je(this.state,t.state)}diff(e){return{added:{elements:I(R(e.elements,this.elements)),explicits:I(R(e.explicits,this.explicits)),final:I(R(e.final,this.final)),connections:I(Fc(e.connections,this.connections))},removed:{elements:I(R(this.elements,e.elements)),explicits:I(R(this.explicits,e.explicits)),final:I(R(this.final,e.final)),connections:Fc(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
|
|
1210
|
+
`)}[Tc](e,t,n){return this.toString()}};const Jy={include:({expr:e,model:t,memory:n,stage:r})=>{let i=mo(e.where.condition);return ob(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=mo(e.where.condition);return ob(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},Yy={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=lb(ky(e,[...mb(e)],`directed`),i);r.addConnections(t)}return r}N(V.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=jy(t,e.incoming);for(let e of a){let t=lb(ky(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.incoming)||V.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.incoming))return sb(Zy(t,e.incoming),{stage:r,memory:n},i);if(V.isWildcard(e.incoming))return r;let a=Xy(jy(t,e.incoming)),o=w(n.connections,S(a),lb(i));return r.excludeConnections(o),r}};function Xy(e){return Ve(e.map(e=>{let t=t=>t===e||F(e,t);return e=>!t(e.source)&&t(e.target)}))}function Zy(e,t){let n=My(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const Qy={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of mb(e)){let n=lb(Oy(t,e,`directed`),i);r.addConnections(n)}return r}N(V.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=jy(t,e.outgoing);for(let e of o){let t=lb(ky(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.outgoing)||V.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.outgoing))return sb(eb(t,e.outgoing),{stage:r,memory:n},i);if(V.isWildcard(e.outgoing))return r;let a=$y(jy(t,e.outgoing)),o=w(n.connections,S(a),lb(i));return r.excludeConnections(o),r}};function $y(e){return Ve(e.map(e=>{let t=t=>t===e||F(e,t);return e=>t(e.source)&&!t(e.target)}))}function eb(e,t){let n=My(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const tb={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(V.isElementTagExpr(e)||V.isElementKindExpr(e)||V.isElementTagExpr(t)||V.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);N(!V.isModelRef(e),`Invalid source model ref in direct relation`),N(!V.isModelRef(t),`Invalid target model ref in direct relation`);let o=V.isWildcard(e),s=V.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=w(Ay(r.instances()),lb(a),y(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=jy(r,e),i=$y(t),o=i;if(n){let e=Xy(t);o=t=>i(t)!==e(t)}l=w(t,_(e=>ky(e,mb(e),c)),S(o),lb(a));break}case o&&!s:{let e=jy(r,t),i=Xy(e),o=i;if(n){let t=$y(e);o=e=>t(e)!==i(e)}l=w(e,_(e=>[...mb(e)].flatMap(t=>Oy(t,e,c))),S(o),lb(a));break}default:{N(!o,`Inference failed - source should be a deployment ref`),N(!s,`Inference failed - target should be a deployment ref`);let n=jy(r,e),i=jy(r,t),u=$y(n),d=Xy(i);l=w(n,_(e=>ky(e,i,c)),S(e=>u(e)&&d(e)),lb(a))}}return i.addConnections(l),V.isDeploymentRef(e)&&he(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),V.isDeploymentRef(t)&&he(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=Ny(e.target),o=Ny(e.source),s;switch(!0){case V.isWildcard(e.source)&&V.isWildcard(e.target):return r.excludeConnections(lb(n.connections,i)),r;case V.isModelRef(e.source)&&V.isModelRef(e.target):return s=nb({source:e.source,target:e.target,expr:e,model:t}),sb(s,{stage:r,memory:n},i);case V.isModelRef(e.source)&&V.isWildcard(e.target):return s=eb(t,e.source),sb(s,{stage:r,memory:n},i);case V.isModelRef(e.source):return s=eb(t,e.source),sb(s,{stage:r,memory:n},i,e=>a(e.target));case V.isModelRef(e.target):return s=Zy(t,e.target),sb(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=w(n.connections,S(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),lb(i));return c.length===0||r.excludeConnections(c),r}}};function nb({source:e,target:t,expr:n,model:r}){let i=My(r,e),a=My(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...qc(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const rb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.inout)){for(let e of a){let t=db(ky(e,[...mb(e)],`both`),i);r.addConnections(t)}return r}N(V.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=jy(t,e.inout);for(let e of a){let t=db(ky(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.inout)||V.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.inout)){let a=My(t,e.inout);return a.length===0?r:sb(xa(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(V.isWildcard(e.inout))return r;let a=jy(t,e.inout),o=Xy(a),s=$y(a),c=w(n.connections,S(e=>o(e)!==s(e)),lb(i));return r.excludeConnections(c),r}},ib={include:({expr:e,model:t,memory:n,stage:r})=>{let i=mo(e.where.condition);return ob(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=mo(e.where.condition);return ob(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},ab={include:({model:e,stage:t,where:n})=>{let r=[],i=w([...e.roots()],ub(n),y(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(Ay([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=w([...t.elements],ub(n));return e.exclude(r),e}};function ob(e,{expr:t,where:n,...r}){switch(!0){case V.isElementTagExpr(t):case V.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case to.isCustom(t):case V.isCustom(t):case V.isModelRef(t):return;case V.isWhere(t):return Jy[e]({...r,expr:t,where:n});case to.isWhere(t):return ib[e]({...r,expr:t,where:n});case V.isDeploymentRef(t):return hb[e]({...r,expr:t,where:n});case V.isWildcard(t):return ab[e]({...r,expr:t,where:n});case to.isDirect(t):return tb[e]({...r,expr:t,where:n});case to.isInOut(t):return rb[e]({...r,expr:t,where:n});case to.isOutgoing(t):return Qy[e]({...r,expr:t,where:n});case to.isIncoming(t):return Yy[e]({...r,expr:t,where:n});default:P(t)}}function sb(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=w(n.connections,S(e=>i(e)),S(t=>Ta(t.relations.model,e)),y(t=>t.update({deployment:null,model:Sa(t.relations.model,e)})),lb(r),S(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function cb(e,t){return lb(e,t).nonEmpty()}function lb(...e){if(e.length===1)return t=>lb(t,e[0]);let[t,n]=e;return n===null?t:ye(t)?t.map(e=>lb(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(pb(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(pb(t)(e))))})}function ub(...e){if(e.length===1)return t=>ub(t,e[0]);let[t,n]=e;return ye(t)?t.filter(e=>ub(e,n)):n?.(fb(t,t))??!0}function db(e,t){return t?w(e,S(e=>cb(e,t))):e}function fb(e,t){if($c(e)){let n=Zc(t)&&Xc(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]]}}if(Qc(e))return Te(e.element,[`tags`,`kind`]);if(Xc(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags]};if(Yc(e))return Te(e,[`tags`,`kind`]);P(e)}function pb(e){return t=>({tags:t.tags,kind:t.kind,source:fb(t.source,e.source),target:fb(t.target,e.target)})}function mb(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const hb={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(Xc(r))return ub(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:_b(r,e);break;case t.selector===`children`:gb(r,e);break;case t.selector===`descendants`:vb(r,e);break;default:ub(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=Ny(e),a=w([...n.elements],S(i),ub(r));return t.exclude(a),t}};function gb(e,{stage:t,where:n}){let r=ub([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(Ay(r)),t.connectWithExisting(r),t.addExplicit(r))}function _b(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=ub([...e.children()],r),a=!1;for(let e of i)if(ky(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(Ay(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function vb(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),ub(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(Ay(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=yb(t);w(i,S(e=>a.has(e)),me(e=>t.addExplicit(e)))}function yb(e){return w(e.mergedConnections(),Uy,Gy,Ke((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var bb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=w(e.connections,Uy,Gy),n=Fc(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=xa(this.memory.elements,e.elements),n=xa(e.final,this.memory.explicits),r=new vt.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||F(e,t))return!0;return!1};return w(R(t,i),oa(e=>e.isDeploymentNode()),I(),ea,me(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&pa(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=ly(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=ge([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=ge(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function xb(e,t){let n=qy.empty();for(let r of t)if(go(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=ob(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return bb.for(n).commit()}function Sb(e,{docUri:t,rules:n,...r}){let i=xb(e.deployment,n),a=zy(e,i),o=Ry(i.connections);$v(a,o);let s=iy({nodes:a,edges:o}),c=By(n,s.nodes),l=Ue(n,wo),u=Io(c);return ay({...r,[za]:`computed`,[Ba]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:y(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function Cb(e){return t=>Oo(t)?t.groupRules.flatMap(Cb(e)):go(t)&&`include`in t?t.include.filter(e):[]}function wb(e,t){let n=e.flatMap(Cb(H.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=rt(t,v),p=z({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!te(p),h=!te(f),g=dy(e);r.forEach((e,t)=>{qa(e)||!g(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function Tb(e,t){return e.reduce((e,n)=>{if(Co(n)){let r=t.predicates[n.predicateId];return v(r)?e:e.concat(r)}if(So(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Eb(e,t){return e.reduce((e,n)=>{if(Co(n)){let r=t.dynamicPredicates[n.predicateId];return v(r)?e:e.concat(r)}if(So(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Db(e,t){let n=new Set;for(let r of t)if(go(r))for(let t of r.include){let r=dy(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const Ob=e=>{if(Eo(e)){let t=[],n=[];for(let r of e.__parallel)if(Do(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return Do(e)?[...e.__series]:e};function kb(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of _(t,Ob)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function Ab(e,t,n){let r=Kc(e,t,`directed`).flatMap(e=>[...e.relations]).sort(ba);if(!Vi(r))return{};if(r.length===1){let e=r[0];return z({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=w(r,_(e=>e.tags),Ce()),a=T(i,1)?i:void 0,o=y(r,e=>e.id),s=$e(r).$relationship.navigateTo;s===n&&(s=void 0),s||=w(r,_(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),Ce(),ge());let c=w(r,Ke((e,{title:t,technology:n,$relationship:r})=>(C(t)&&e.title.add(t),C(r.color)&&e.color.add(r.color),C(r.line)&&e.line.add(r.line),C(r.kind)&&e.kind.add(r.kind),C(n)&&e.technology.add(n),C(r.description)&&!e.description.some(Je(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return z({tags:a??void 0,relations:o,navigateTo:s,kind:ge([...c.kind]),title:ge([...c.title]),color:ge([...c.color]),line:ge([...c.line]),technology:ge([...c.technology]),description:ge(c.description)})}var jb=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=Eb(t,this.model.globals),a=Db(this.model,i),o=kb(this.model,n),s=w(xa(Sa(a,o),o,a),I(),na),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(F(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(Do(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?Qa(n,t):Qa(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);N(h>=0,`Source ${i} not found`);let g=this.model.element(a),_=s.indexOf(g);N(_>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:ee,relations:te,navigateTo:ne,...re}=Ab(m,g,this.view.id),ie=C(d)&&d!==this.view.id?d:ne,ae=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(z({...re,...p,...ae&&{technology:ae},id:r,source:m,target:g,navigateTo:ie,title:o??ee,relations:te??[],isBackward:h>_})),t+1},u=1;for(let e of n){if(Eo(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=Ty(this.model.$styles,s.map(wy)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=M(d.get(t.id),`Source node ${t.id} not found`),l=M(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:Xi(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=Ui(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of Zi(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of Zi(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=wb(i,py(i,s.map(e=>M(d.get(e.id))))),h=Ue(i,wo),g=Io(m);return ay({...r,[Ba]:`dynamic`,[za]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:y(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function Mb(e,t){return new jb(e,t).compute()}function Nb(e){switch(!0){case ro.isCustom(e):return Nb(e.customRelation.expr);case ro.isWhere(e):{let t=Nb(e.where.expr),n=mo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind},target:{tags:e.target.tags,kind:e.target.kind},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind}})}case ro.isDirect(e):{let t=dy(e.source),n=dy(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case ro.isInOut(e):{let t=dy(e.inout);return e=>t(e.source)||t(e.target)}case ro.isIncoming(e):{let t=dy(e.incoming);return e=>t(e.target)}case ro.isOutgoing(e):{let t=dy(e.outgoing);return e=>t(e.source)}default:P(e)}}function Pb(e,t,n){let r=e.flatMap(Cb(ro.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:Ua(a)}:{},c=o?{notes:Ua(o)}:{},l=rt(s,v),u=Nb(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...Te(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function Fb(e){return w([...e],Pc,Ke((e,t,n,r)=>{let i=Nc(r,t),a=xa(...i.map(x(`relations`))),o=Sa(t.relations,a);if(i.length>0&&(o=xa(o,t.directRelations)),Oc(r,t.reversed())&&(o=xa(o,t.directRelations)),o.size<t.relations.size){let e=r.some(zc(t.source)),n=r.some(zc(t.target));e&&(o=xa(o,ma(oa(t.relations,Lc(t.source))))),n&&(o=xa(o,ma(oa(t.relations,Rc(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var Ib=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=Fb(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=xa(this.memory.elements,e.elements),n=xa(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||F(e,t))return!0;return!1};return w(R(t,r),I(),ea,me(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&pa(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=ly(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=ge([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=ge(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:Lb,findConnectionsBetween:Rb,findConnectionsWithin:zb}=Gc;function Bb(e,t){switch(!0){case H.isElementKindExpr(t):return[...oa(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case H.isElementTagExpr(t):return[...oa(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(B.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(B.flatten(t.ref)),r=t.selector===`children`?I(n.children()):I(n.descendants());return r&&r.length>0?r:[n]}case H.isModelRef(t):return[e.element(B.flatten(t.ref))];default:P(t)}}function Vb(e,t){if(t.isEmpty()||e.length===0)return e;let n=Ve(e.map(e=>qi(e))),r=I(oa(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function Hb(e,{memory:t,model:n}){let r=Bb(n,e);return H.isModelRef(e)?e.selector===`descendants`?r:Vb(r,t):r}const Ub={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(B.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(zb(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Bb(t,e));return n.exclude(i),n}},Wb={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Bb(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(zb(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Bb(t,e));return n.exclude(i),n}},Gb={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Bb(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(zb(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(Bb(t,e));return n.exclude(i),n}},Kb=()=>!0,qb=e=>e;function Jb(e){return e.reduce((e,t)=>{let n=[...t.relations];N(T(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Dy(n.map(e=>e.$relationship),ge(S(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function Yb(e,t){return Ty(e.$styles,[...t.final].map(wy),t.groups)}const Xb=H.isWildcard,Zb=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),Qb={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=Xb(e),l=Xb(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==Kb:{let e=w(i.relationships(),oa(o),I(),y(e=>new Bc(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==Kb:u.push(...zb(r.elements));break;case c&&l:u.push(...zb(i.roots()));break;case!c&&l&&o!==Kb:{let t=w(Bb(i,e),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),oa(o),ha(),I(),it(t=>t.source===e),([t,n])=>ke(w(t,S(t=>!Zb(e,t.target)),y(t=>new Bc(e,t.target,new Set([t])))),w(n,S(t=>!Zb(e,t.source)),y(t=>new Bc(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=$b(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...Rb(e,a,o));break}case c&&!l&&o!==Kb:{let e=w(Bb(i,t),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),oa(o),I(),it(t=>t.target===e),([t,n])=>ke(w(n,S(t=>!Zb(e,t.target)),y(t=>new Bc(e,t.target,new Set([t])))),w(t,S(t=>!Zb(e,t.source)),y(t=>new Bc(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=$b(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...Rb(t,e,o));break}default:{N(!Xb(e),`Inference failed - source must be not a wildcard`),N(!Xb(t),`Inference failed - target must be not a wildcard`);let a=Hb(e,{memory:r,model:i}),o=Hb(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...Rb(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=Xb(e),c=Xb(t),l;switch(!0){case s&&c:l=w(i.connections,_(nt(x(`relations`),oa(o),I())),ma());break;case!s&&c:l=w(Bb(r,e),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),oa(o),I())),ma());break;case s&&!c:l=w(Bb(r,t),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),oa(o),I())),ma());break;default:{N(!Xb(e),`Inference failed - source must be not a wildcard`),N(!Xb(t),`Inference failed - target must be not a wildcard`);let i=Bb(r,e),a=Bb(r,t),s=new Set;for(let e of i)for(let t of a)Ki(e,t)||(s=xa(s,Sa(e.allOutgoing,t.allIncoming),n?Sa(t.allOutgoing,e.allIncoming):new Set));l=ma(oa(s,o))}}return a.excludeRelations(l),a}};function $b(e,{memory:t,model:n}){let r=Bb(n,e);if(!T(r,1))return[[],[]];if(H.isModelRef(e)){let i=I(n.element(B.flatten(e.ref)).ascendingSiblings());return[Vb(r,t),Vb(i,t)]}return[r,w(r,y(e=>e.ascendingSiblings()),ca(),ha(),I(),e=>Vb(e,t))]}const ex={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(H.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...Lb(e,t,`directed`))}else{let e=Hb(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...Ce(e.flatMap(e=>[...e.ascendingSiblings()])));let i=tx(n,o);for(let n of t)s.push(...Rb(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=Bb(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function tx(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=dy(t);return t=>e(t.target)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Ve([...e.children(n)].map(e=>wc.isIncoming(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Ve([wc.isInside(n),...[...e.children(n)].map(e=>wc.isIncoming(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Ve([wc.isIncoming(e),wc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return wc.isIncoming(e)}default:P(t)}}const nx={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(H.isWildcard(e)){if(!t)return;o.push(...Rb(t,t.ascendingSiblings()))}else{let t=Hb(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=Ce(t.flatMap(e=>I(e.ascendingSiblings()))));for(let e of t)o.push(...Rb(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=Bb(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(ma(a.filter(i))),r}},rx={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(H.isWildcard(o)){if(!t)return;s.push(...Rb(t,t.ascendingSiblings(),`directed`))}else{let e=Hb(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...Ce(e.flatMap(e=>[...e.ascendingSiblings()])));let i=ix(n,o);for(let n of e)s.push(...Rb(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=Bb(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(ma(a.filter(i))),r}};function ix(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=dy(t);return t=>e(t.source)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Ve([...e.children(n)].map(e=>wc.isOutgoing(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Ve([wc.isInside(n),...[...e.children(n)].map(e=>wc.isOutgoing(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Ve([wc.isOutgoing(e),wc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return wc.isOutgoing(e)}default:P(t)}}const ax={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=it(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(zb(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=I(oa(e.children(),i)),s=o.length>0;if(!s)if(a){if(Rb(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=ma([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections(Rb(e,o,`directed`));s&&(n.addConnections(zb(o)),n.addExplicit(o));for(let e of o)n.addConnections(Rb(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===Kb?e?(n.exclude([e,...e.descendants()]),n):xy.empty(t.scope).stageExclude(n.expression):(n.exclude(S([...t.elements],r)),n)};function ox(e,t,n){switch(!0){case H.isCustom(e):return t===`include`?ox(e.custom.expr,t,n):n.stage;case H.isWhere(e):{let r=mo(e.where.condition),i=e=>S(e,r);return ox(e.where.expr,t,{...n,where:r,filterWhere:i})}case H.isModelRef(e)&&e.selector===`expanded`:return Ub[t]({...n,expr:e})??n.stage;case H.isWildcard(e):return ax[t]({...n,expr:e})??n.stage;case H.isElementKindExpr(e):case H.isElementTagExpr(e):return Wb[t]({...n,expr:e})??n.stage;case H.isModelRef(e):return Gb[t]({...n,expr:e})??n.stage;default:P(e)}}function sx(e,t,n){switch(!0){case ro.isCustom(e):return t===`include`?sx(e.customRelation.expr,t,n):n.stage;case ro.isWhere(e):{let r=mo(e.where.condition),i=e=>new Set(S([...e],r)),a=e=>w(e,y(e=>new Bc(e.source,e.target,i(e.relations))),S(e=>e.nonEmpty()));return sx(e.where.expr,t,{...n,where:r,filterWhere:a})}case ro.isInOut(e):return nx[t]({...n,expr:e})??n.stage;case ro.isDirect(e):return Qb[t]({...n,expr:e})??n.stage;case ro.isOutgoing(e):return rx[t]({...n,expr:e})??n.stage;case ro.isIncoming(e):return ex[t]({...n,expr:e})??n.stage;default:P(e)}}function cx(e,t,n){let r={model:e,scope:t.scope,where:Kb,filterWhere:qb};for(let i of n){if(Oo(i)){t=cx(e,Sy.enter(t,i),i.groupRules),N(t instanceof Sy,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(go(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case io.isFqnExpr(i):n=ox(i,e,{...r,stage:n,memory:t})??n;break;case io.isRelationExpr(i):n=sx(i,e,{...r,stage:n,memory:t})??n;break;default:P(i)}t=n.commit()}}}return t}function lx(e,t,n){return t=cx(e,t,n),Ib.for(t).commit()}function ux(e,{docUri:t,rules:n,...r}){let i=Tb(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=lx(e,xy.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=fx(o);let s=Yb(e,o),c=Jb(o.connections);$v(s,c);let l=iy({nodes:s,edges:c}),u=wb(i,py(i,l.nodes)),d=Ue(i,wo),f=Io(u),p=dx(i,u);return ay({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:Pb(i,u,l.edges),nodes:y(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function dx(e,t){let n=[];for(let r of e){if(!ko(r)||r.targets.length===0)continue;let e=w(t,S(Ve(r.targets.map(dy))),y(e=>e.id));T(e,1)&&n.push({type:r.rank,nodes:e})}return n}function fx(e){if(e.groups.length===0)return e;let t=new vt.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(w(na([...e.explicitFirstSeenIn.keys()]),me(i=>{if(!r(i)){let r=M(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),w(na([...e.lastSeenIn.keys()]),S(e=>!n.has(e)),me(a=>{if(r(a)||i(a))return;let o=M(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function px(e,t){switch(!0){case vo(e):return ux(t,e);case bo(e):return Sb(t,e);case xo(e):return Mb(t,e);default:P(e)}}function mx(e,t){try{return{isSuccess:!0,view:px(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function hx(e){let t=new Qt({type:`directed`}),n=[];for(let r of Ye(e))t.addNode(r.id,{view:r}),yo(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,ty.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,ey.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!yo(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!vo(i))return e;let a=Ce([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:Vi(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const gx=e=>ee(e).length,_x=e=>Da(e);function vx(e){let t=yx(e),n=(e,t)=>`${e}->${t}`,r=new vt.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;N(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!b(t.$data.imports))for(let[e,n]of we(t.$data.imports))for(let r of n){let n=Ya(e,r.id);a(t,M(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];N(T(i,1),`Relationships set must have at least one relationship`);let a={id:Da(e),source:_x(t),target:_x(n),projectId:t,relations:y(i,x(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:Ce(_(i,x(`tags`)))},o=ge(i);return o&&(a.label=o.title,a.description=Ia(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});$v(t,o);let s=iy({nodes:t,edges:o});return{id:`projects-view`,[Ba]:`projects`,[za]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function yx(e){let t=new Map;for(let n of e){let e=Ha(n.projectId),r={id:_x(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${gx(n.$data.elements)}`,`Relationships: ${gx(n.$data.relations)}`,`Views: ${gx(n.$data.views)}`].join(`
|
|
1211
|
+
`)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function bx(e,t){return{...ux(e,{id:Ja(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}Hn();const xx=K.getChild(`LanguageServices`),Sx=e=>e.severity===Kn.Error;var Cx=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof Hg?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=w(this.services.shared.workspace.LangiumDocuments.groupedByProject(),we(),y(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:y(n,x(`uri`)),config:a}}));if(T(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(T(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=y(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),x(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return Cc.create({...r.$data,_stage:`layouted`,views:w(i,y(x(`diagram`)),oe(x(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Cc.EMPTY){xx.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!T(n,1))throw Error(`No models found`);let r=vx(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return w(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),_(e=>w(e.diagnostics??[],S(Sx),y(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:P(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,n=this.services.lsp.Formatter,r=wx(e),i=this.collectDocumentsToFormat(t,e);i.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let a=new Map;for(let e of i){let t=e.uri.toString(),i=await n.formatDocument(e,{options:r,textDocument:{uri:t}}),o=i.length===0?e.textDocument.getText():on.applyEdits(e.textDocument,i);a.set(t,o)}return a}collectDocumentsToFormat(e,t){let n=t?.projectIds??[],r=t?.documentUris??[],i=new Map;if(n.length>0)for(let t of n)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);else if(r.length===0)for(let t of this.projectsManager.all)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);for(let t of r){if(i.has(t))continue;let n;try{n=e.getDocument(mn.parse(t))}catch{xx.warn(`format: skipping unknown document ${t}`);continue}if(!$g(n)){xx.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{xx.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){xx.error(U(e))}finally{xx.debug(`LikeC4LanguageServices disposed`)}}};function wx(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var Tx=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if($g(e))return e.state<Jn.Linked&&(K.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Jn.Linked,e.uri,n),K.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Zg.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=D_(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};Hn();const Ex=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function Dx(e,t){return Sn(t.feature)&&t.property===`project`&&Hp(e.node)}var Ox=class extends _n{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case jn(t.feature):return this.completionForKeyword(e,t.feature,n);case kn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case Dx(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:or.Snippet,insertTextFormat:Pn.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&fn(e.node,gm):n(e,{label:t.value,detail:`Insert deployment view`,kind:or.Class,insertTextFormat:Pn.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
|
|
1212
|
+
`)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:or.Property,insertTextFormat:Pn.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:or.Property,insertTextFormat:Pn.Snippet,insertText:`${t.value} \${1|${Ai.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:or.Property,insertTextFormat:Pn.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:or.Module,insertTextFormat:Pn.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:or.Module,insertTextFormat:Pn.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
|
|
1213
|
+
`)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:or.Module,insertTextFormat:Pn.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
|
|
1214
|
+
`)});break;case t.value===`dynamic`&&fn(e.node,gm):n(e,{label:t.value,detail:`Insert dynamic view`,kind:or.Class,insertTextFormat:Pn.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
|
|
1215
|
+
`)});break;case t.value===`style`&&e.node&&fn(e.node,Tp):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:or.Module,insertTextFormat:Pn.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${Ex}|} $0\n}`});break;case t.value===`style`&&e.node&&fn(e.node,Ve([gm,Dp])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:or.Module,insertTextFormat:Pn.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${Ex}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:or.Module,insertTextFormat:Pn.Snippet,insertText:`${t.value} {\n\t\${1|${Ex}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:or.Class,insertTextFormat:Pn.Snippet,insertText:`extend $1 {
|
|
1210
1216
|
$0
|
|
1211
|
-
}`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:
|
|
1217
|
+
}`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:or.Property,insertTextFormat:Pn.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:or.Property,insertTextFormat:Pn.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:or.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:Pn.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=b(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:or.Folder,insertText:n,filterText:n,textEdit:zn.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},kx=ur(),Ax=class extends Yn{createDocumentHighlight(e){return kx.DocumentHighlight.create(e.segment.range,kx.DocumentHighlightKind.Read)}},jx=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!$g(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:gn(e.parseResult.value).filter(nm).map(t=>{try{let n=_r(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Hr(r))return{range:n,target:r}}catch(e){q(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Hr(t)||Br(t))return t;if(Rr(t))return Fr(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Fr(n.toString(),t)}relativeLink(e,t){if(Br(t))return zr(t);if(Rr(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return zr(Ir(new URL(t,r).toString(),n))}return null}};Hn();const Mx=K.getChild(`DocumentSymbolProvider`);var Nx=class{nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,n){if(!$g(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<Jn.Linked&&(Mx.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Jn.Linked,e.uri,n),Mx.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return q(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(C);return n.length===0?[]:[{kind:fr.Namespace,name:`icons`,range:t.range,selectionRange:Cn(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=_r(t,`name`);if(!n)return[];let r=w([...e.elements,...e.tags,...e.relationships],y(e=>{try{if(oh(e)||uh(e)||ih(e))return this.getKindSymbol(e);if(gh(e))return this.getTagSymbol(e)}catch(e){return q(e),null}P(e)}),S(C));return r.length===0?[]:[{kind:fr.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=_r(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>ap(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=_r(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(tp(e))return this.getExtendElementSymbol(e);if(Of(e))return this.getElementSymbol(e)}catch(e){q(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:S_(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=_r(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=_r(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||b(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||b(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||b(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.name?_r(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(Jd(e))return this.getDeploymentNodeSymbol(e);if(Wd(e))return this.getDeployedInstanceSymbol(e);if(Zf(e))return[]}catch(e){q(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=On(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Px=`
|
|
1212
1218
|
---
|
|
1213
|
-
`;var
|
|
1219
|
+
`;var Fx=class extends In{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(xh(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(Mf(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(Qd(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Wm(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(Of(e))return this.getElementHover(e);if(Jd(e))return this.getDeploymentNodeHover(e);if(Wd(e))return this.getDeployedInstanceHover(e)}catch(e){K.debug(U(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=Ia(n);i&&r.push(``,(i.md??i.txt).split(`
|
|
1214
1220
|
`).join(`
|
|
1215
1221
|
`));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
|
|
1216
1222
|
<small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
|
|
1217
|
-
`)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(
|
|
1218
|
-
`):void 0}getDeploymentNodeHover(e){let t=
|
|
1219
|
-
`)}}}getDeployedInstanceHover(e){let t=
|
|
1220
|
-
`)}}}},Ax=Ye(),jx=class{getCodeActions(e,t){let n=t.context.diagnostics,r=[];for(let i of n)i.code===`manual-layout-v1`&&r.push({title:`Migrate Manual Layouts`,command:Ax.Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[e.textDocument.uri]:[Ax.TextEdit.insert(t.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[i]});return r.length>0?r:void 0}};De();const Mx=W.getChild(`SemanticTokenProvider`),Nx={...Te},Px={...qe};function Fx(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Px)return t.push(Px[i]),n;if(i in Nx)return()=>e(Nx[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Ix=`Stop Highlighting`,Lx=()=>{throw Ix};var Rx=class extends Ke{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(Wf,e=>{e.property(`name`).function()}),e(na(Mf,Of,eu),e=>{e.property(`kind`).function()}),e(qd,e=>{e.property(`name`).definition.function(),Lx()}),e(na(bf,Hf),e=>{e.property(`value`).readonly.definition.interface(),Lx()}),e(um,e=>{e.cst().readonly.definition.variable(),Lx()}),e(gd,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(Cp,e=>{e.cst().type(),Lx()}),e(Bf,e=>{e.cst().function(),Lx()}),e(em,e=>{b(e.node.value)&&e.property(`value`).function()}),e(na(yl,El),e=>{b(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(na(im,om),e=>{e.property(`participant`).keyword()}),e(Nu,e=>{b(e.node.kind)&&e.property(`kind`).definition.type()}),e(na(Ed,wd),e=>{e.property(`id`).readonly.definition.variable()}),e(Pp,e=>{e.property(`style`).readonly.definition.variable()}),e(na(bd,vd),e=>{e.property(`name`).readonly.definition.variable()}),e(Mp,e=>{e.property(`predicate`).readonly.definition.variable()}),e(Vu,e=>{b(e.node.tag)&&e.property(`tag`).definition.type()}),e(na(md,bp),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.$cstNode?.text;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable(),Lx()}),e(vp,e=>{e.node.parent?e.property(`el`).property():(e.property(`el`).readonly.definition.variable(),Lx())}),e(np,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(gp,e=>{b(e.node.color)&&e.keyword(`color`).property()}),e(na(op,up,ip),e=>{e.property(`kind`).readonly.declaration.type()}),e(xp,e=>{e.property(`name`).definition.type()}),e(Ef,e=>{e.property(`value`).number()}),e(Fd,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(tf,e=>{b(e.node.value)&&e.property(`value`).string()}),e(Ll,e=>{b(e.node.customColor)&&e.property(`customColor`).enum(),b(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(jd,e=>{b(e.node.customColor)&&e.property(`customColor`).enum(),b(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(na(Qf,Nl,$d,Fl,sl,Nd,vu),e=>{b(e.node.value)&&e.property(`value`).enum()})}async semanticHighlight(e,t,n=Ax.CancellationToken.None){return e.state<_.Linked&&await this.ensureState(e,n),await super.semanticHighlight(e,t,n)}async semanticHighlightRange(e,t,n=Ax.CancellationToken.None){return e.state<_.Linked&&await this.ensureState(e,n),await super.semanticHighlightRange(e,t,n)}async semanticHighlightDelta(e,t,n=Ax.CancellationToken.None){return e.state<_.Linked&&await this.ensureState(e,n),await super.semanticHighlightDelta(e,t,n)}async ensureState(e,t){e.state<_.Linked&&(Mx.debug`waiting for document ${e.uri.path} to be ${`Linked`}`,await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,e.uri,t),Mx.debug`document ${e.uri.path} is ${`Linked`}`)}highlightElement(e,t){if(na(Du,Jl,Wl)(e))return this.highlightNameAndKind(e);if(Gc(e))return this.highlightView(e);vc(e)&&!na(qc,zu,Jf)(e)&&b(e.key)&&t({node:e,property:`key`,type:Te.property});let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===Ix)return`prune`;Mx.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),Wl(e)||this.mark(e).property(`kind`).keyword(),Du(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>Fx((n,r)=>this.highlightToken({range:N(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>Fx((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>Fx((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const zx=na(Du,ed);var Bx=class extends sx{projects;langiumDocuments;documentCache;workspaceCache;logger=W.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new Rn.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Ce(e.shared,_.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(_.IndexedContent,e=>{$m(e)&&lc(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=_.IndexedContent)}get(e){return e.state<_.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:le.basename(e.uri),state:e.state,expect:_.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){P(Du(e)||Sc(e));let t=Qm.readId(e);if(b(t))return t;let n=me(e);return n.state<_.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:le.basename(n.uri)}),P($m(n)),this.get(n),N(Qm.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return re(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return re(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new In.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return Vx(t)}))}directChildrenOf(e,t){return re(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new In.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return Vx(n)}))}uniqueDescedants(e,t){return re(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new In.default,r=new In.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=Vx(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,..._a(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(zx));if(t.length===0)return Hx.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new In.default,a=new In.default,o=new In.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return Qm.writeId(t,i),o.set(i,a),a};function l(e,t){let n=co(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=D(e.body?.elements??[],zx);if(!E(s,1))return[o];let u=s.flatMap(e=>l(e,n));for(let e of u)a.set(n,e);return[o,...u]}function u(e){let t=lx(e.element),n=w(e.body?.elements??[],D(Du),C(e=>l(e,t)));if(n.length!==0)for(let e of[t,...da(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(ed(n)){u(n);continue}l(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:le.basename(e.uri),error:t})}return new Hx(r,i,a,o,n)}};function Vx(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Xi(e.name,t.name))}var Hx=class e{static EMPTY=new e([],new In.default,new In.default,new In.default,Fh.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Ux=na(Sc,Xu);var Wx=class extends Bx{Names;logger=W.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Ux));if(t.length===0)return Hx.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new In.default,a=new In.default,o=new In.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return Qm.writeId(t,i),o.set(i,a),a};function u(e,t){let n=s.getName(e);if(!b(n))return[];let o=co(n,t),c=l(e,n,o);if(t?i.set(t,c):r.push(c),Wl(e))return[c];let d=D(e.body?.elements??[],Ux);if(!E(d,1))return[c];let f=d.flatMap(e=>u(e,o));for(let e of f)a.set(o,e);return[c,...f]}function d(e){let t=lx(e.deploymentNode),n=w(e.body?.elements??[],D(Ux),C(e=>u(e,t)));if(n.length!==0)for(let e of[t,...da(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(Xu(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:le.basename(e.uri),error:t})}return new Hx(r,i,a,o,n)}};const Gx=/^(aws|azure|gcp|tech):(.+)$/;function Kx(e){if(!e)return;let t=Gx.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var qx=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new In.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;Mt(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=Qi(n),this.projectId=On(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return W.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,An(a)&&(a=u.title||ia(r)),u.tags&&ta(u.tags)&&(e=e?qt([...u.tags,...e]):u.tags);let d=B({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=Kx(d.icon)),B({metadata:l&&!wt(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){G(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Mt(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:V.flatten(e.element)};if(`element`in e)return W.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return W.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===ia(e.id)&&t.title?t.title:i,B({...t,...a,title:i,style:B({...t.style,...r}),id:n})}catch(e){G(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>Mt(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},Jx=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function Yx(e){let t=new Map;for(let n of e)if(Fo(n)&&n.viewOf&&S(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=mn(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}const{getDocument:Xx}=he;function Zx({nodes:e,edges:t,autoLayout:n,...r}){return{...r,autoLayout:Vo(n)?{direction:n}:n,nodes:zt(e,({b:e,c:t,...n})=>({x:e[0],y:e[1],width:e[2],height:e[3],isCompound:t,...n})),edges:zt(t,({p:e,cp:t,l:n,...r})=>({...!!t&&{controlPoints:t},...!!n&&{labelBBox:n},...r,points:e}))}}function Qx(e){return e.includes(`@likec4-generated`)}function $x(e){if(!Qx(e))throw Error(`Not a likec4-generated comment: ${e}`);return Zx(Hr(Ur(e.trim().split(`
|
|
1221
|
-
`).filter(e=>!e.includes(`**`)&&!e.includes(`@likec4-`)&&!e.includes(`*/`)).map(e=>e.replaceAll(`*`,``).trim()).join(``))))}function eS(e){let t=ie(e.$cstNode,[`BLOCK_COMMENT`]);if(!(!t||!Qx(t.text)))try{return $x(t.text)}catch(n){let r=Xx(e);G(n),W.warn(`Ignoring manual layout of "${e.name??`unnamed`}" at ${r.uri.fsPath}:${1+(t.range.start.line||0)}`);return}}var tS=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=qt([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=qt([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=qt([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:E(r,1)?r:null,links:E(n,1)?n:null,...!wt(i)&&{metadata:i}}}};function nS(e,t,n){let r=new qx(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=zt(r.specs.colors,e=>Ga(e.color)),a=new Set,o=new tS,s=new tS,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,u=e=>{e?.metadata&&cn(e.metadata).forEach(e=>a.add(e))},d=w(n,C(e=>(o.merge(e.c4ExtendElements),x(e.c4Elements,r.toModelElement))),D(b),ga,gn((e,t)=>{let n=ra(t.id);return n&&S(e[n])?(W.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),u(e[t.id]),e)},{})),f=w(n,C(e=>x(e.c4Relations,r.toModelRelation)),D(e=>{if(!e)return!1;let t=V.flatten(e.source),n=V.flatten(e.target);return S(d[t])&&!mo(t)||S(d[n])&&!mo(n)?(W.debug`Invalid relation ${e.id}
|
|
1223
|
+
`)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Px,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let a=e=>{let n=[e.id,t],r=mn.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},o=[...e.scopedViews()].map(a);o.length>0&&n.push(Px,`<small>Element views:</small>`,...o);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:a(t)).filter(he);if(s.length>0){let e=o.length>0?`Also appears in views:`:`Appears in views:`;n.push(o.length>0?``:Px,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
|
|
1224
|
+
`):void 0}getDeploymentNodeHover(e){let t=On(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=Ia(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
|
|
1225
|
+
`)}}}getDeployedInstanceHover(e){let t=On(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=B.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${B.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
|
|
1226
|
+
`)}}}},Ix=$n(),Lx=class{getCodeActions(e,t){}};Hn();const Rx=K.getChild(`SemanticTokenProvider`),zx={...Xn},Bx={...Ln};function Vx(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in Bx)return t.push(Bx[i]),n;if(i in zx)return()=>e(zx[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const Hx=`Stop Highlighting`,Ux=()=>{throw Hx};var Wx=class extends sr{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(Wm,e=>{e.property(`name`).function()}),e(Hi(Mm,Om,ef),e=>{e.property(`kind`).function()}),e(Jp,e=>{e.property(`name`).definition.function(),Ux()}),e(Hi(bm,Hm),e=>{e.property(`value`).readonly.definition.interface()}),e(ug,e=>{e.cst().readonly.definition.variable(),Ux()}),e(_p,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(Ch,e=>{e.cst().type()}),e(Bm,e=>{e.cst().function()}),e(eg,e=>{C(e.node.value?.$refText)&&e.property(`value`).function()}),e(Hi(yd,Ed),e=>{C(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(Hi(ig,og),e=>{e.property(`participant`).keyword()}),e(Pf,e=>{C(e.node.kind)&&e.property(`kind`).definition.type()}),e(Hi(Dp,Tp),e=>{e.property(`id`).readonly.definition.variable()}),e(Ph,e=>{e.property(`style`).readonly.definition.variable()}),e(Hi(xp,yp),e=>{e.property(`name`).readonly.definition.variable()}),e(Mh,e=>{e.property(`predicate`).readonly.definition.variable()}),e(Hf,e=>{C(e.node.tag)&&e.property(`tag`).definition.type()}),e(Hi(hp,bh),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),e(vh,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),e(nh,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(gh,e=>{C(e.node.color)&&e.keyword(`color`).property()}),e(Hi(oh,uh,ih),e=>{e.property(`kind`).readonly.declaration.type()}),e(xh,e=>{e.property(`name`).definition.type()}),e(Em,e=>{e.property(`value`).number()}),e(Ip,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(nm,e=>{C(e.node.value)&&e.property(`value`).string()}),e(Hi(Ld,Mp),e=>{C(e.node.customColor)&&e.property(`customColor`).enum(),C(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(e=>vu(e)&&!Hi(qu,Bf,Jm)(e)&&C(e.key),e=>e.property(`key`).property()),e(Hi(Qm,Nd,em,Fd,sd,Pp,Rp,yf),e=>{C(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Hi(Of,Jd,Wd)(e))return this.highlightNameAndKind(e);if(Gu(e))return this.highlightView(e);let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===Hx)return`prune`;Rx.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),Wd(e)||this.mark(e).property(`kind`).keyword(),Of(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){return{node:e,cst:t=>Vx((n,r)=>this.highlightToken({range:M(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>Vx((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>Vx((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const Gx=Hi(Of,tp);var Kx=class extends b_{projects;langiumDocuments;documentCache;workspaceCache;logger=K.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new mt.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new Fn(e.shared,Jn.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(Jn.IndexedContent,e=>{$g(e)&&lu(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=Jn.IndexedContent)}get(e){return e.state<Jn.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:dn.basename(e.uri),state:e.state,expect:Jn.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){N(Of(e)||Su(e));let t=Qg.readId(e);if(C(t))return t;let n=On(e);return n.state<Jn.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:dn.basename(n.uri)}),N($g(n)),this.get(n),M(Qg.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return An(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return An(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new ft.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return qx(t)}))}directChildrenOf(e,t){return An(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new ft.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return qx(n)}))}uniqueDescedants(e,t){return An(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new ft.default,r=new ft.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=qx(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...ra(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Gx));if(t.length===0)return Jx.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new ft.default,a=new ft.default,o=new ft.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return Qg.writeId(t,i),o.set(i,a),a};function l(e,t){let n=Ga(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=S(e.body?.elements??[],Gx);if(!T(s,1))return[o];let u=s.flatMap(e=>l(e,n));for(let e of u)a.set(n,e);return[o,...u]}function u(e){let t=S_(e.element),n=w(e.body?.elements??[],S(Of),_(e=>l(e,t)));if(n.length!==0)for(let e of[t,...Zi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(tp(n)){u(n);continue}l(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:dn.basename(e.uri),error:t})}return new Jx(r,i,a,o,n)}};function qx(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Ii(e.name,t.name))}var Jx=class e{static EMPTY=new e([],new ft.default,new ft.default,new ft.default,Y_.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Yx=Hi(Su,Zf);var Xx=class extends Kx{Names;logger=K.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Yx));if(t.length===0)return Jx.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new ft.default,a=new ft.default,o=new ft.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return Qg.writeId(t,i),o.set(i,a),a};function u(e,t){let n=s.getName(e);if(!C(n))return[];let o=Ga(n,t),c=l(e,n,o);if(t?i.set(t,c):r.push(c),Wd(e))return[c];let d=S(e.body?.elements??[],Yx);if(!T(d,1))return[c];let f=d.flatMap(e=>u(e,o));for(let e of f)a.set(o,e);return[c,...f]}function d(e){let t=S_(e.deploymentNode),n=w(e.body?.elements??[],S(Yx),_(e=>u(e,t)));if(n.length!==0)for(let e of[t,...Zi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(Zf(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:dn.basename(e.uri),error:t})}return new Jx(r,i,a,o,n)}};const Zx=/^(aws|azure|gcp|tech):(.+)$/;function Qx(e){if(!e)return;let t=Zx.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var $x=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new ft.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;he(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=Ri(n),this.projectId=ge(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return K.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,te(a)&&(a=u.title||Wi(r)),u.tags&&Vi(u.tags)&&(e=e?Ce([...u.tags,...e]):u.tags);let d=z({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=Qx(d.icon)),z({metadata:l&&!b(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){q(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>he(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:B.flatten(e.element)};if(`element`in e)return K.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return K.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===Wi(e.id)&&t.title?t.title:i,z({...t,...a,title:i,style:z({...t.style,...r}),id:n})}catch(e){q(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>he(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},eS=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function tS(e){let t=new Map;for(let n of e)if(vo(n)&&n.viewOf&&v(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=Xe(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var nS=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=Ce([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=Ce([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=Ce([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:T(r,1)?r:null,links:T(n,1)?n:null,...!b(i)&&{metadata:i}}}};function rS(e,t,n){let r=new $x(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=ie(r.specs.colors,e=>ja(e.color)),a=new Set,o=new nS,s=new nS,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,u=e=>{e?.metadata&&ee(e.metadata).forEach(e=>a.add(e))},d=w(n,_(e=>(o.merge(e.c4ExtendElements),y(e.c4Elements,r.toModelElement))),S(C),na,Ke((e,t)=>{let n=Ui(t.id);return n&&v(e[n])?(K.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),u(e[t.id]),e)},{})),f=w(n,_(e=>y(e.c4Relations,r.toModelRelation)),S(e=>{if(!e)return!1;let t=B.flatten(e.source),n=B.flatten(e.target);return v(d[t])&&!Xa(t)||v(d[n])&&!Xa(n)?(K.debug`Invalid relation ${e.id}
|
|
1222
1227
|
source: ${t} resolved: ${!!d[t]}
|
|
1223
|
-
target: ${n} resolved: ${!!d[n]}\n`,!1):!0}),
|
|
1228
|
+
target: ${n} resolved: ${!!d[n]}\n`,!1):!0}),y(e=>{let t=O_(`extend-relation`,B.flatten(e.source),B.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=Ce([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=Ce(r),s=i;return{...e,...T(o,1)&&{tags:o},...T(s,1)&&{links:s},...!b(a)&&{metadata:a}}}),me(u),oe(x(`id`))),p=w(n,_(e=>(s.merge(e.c4ExtendDeployments),y(e.c4Deployments,r.toDeploymentElement))),S(C),na,Ke((e,t)=>{let n=Ui(t.id);return n&&v(e[n])?(K.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=ao(t)?s.applyExtended(t):t,u(e[t.id]),e)},{})),m=w(n,_(e=>y(e.c4DeploymentRelations,r.toDeploymentRelation)),S(e=>e?v(p[e.source.deployment])||v(p[e.target.deployment])?(K.debug`Invalid deployment relation ${e.id}
|
|
1224
1229
|
source: ${e.source.deployment} resolved: ${!!p[e.source.deployment]}
|
|
1225
|
-
target: ${e.target.deployment} resolved: ${!!p[e.target.deployment]}\n`,!1):!0:!1),gn((e,t)=>Vt(e[t.id])?(W.debug`Duplicate deployment relation ${t.id}`,e):(u(t),e[t.id]=t,e),{}));function h(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[ro]===`element`&&S(i)&&`viewOf`in e&&(i=d[e.viewOf]?.title??null),S(i)&&r===`index`&&(i=`Landscape view`),{...Tt(s,e=>e===void 0),[no]:`parsed`,sourcePath:le.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>x(e.c4Views,h(e)));if(g.some(e=>e.id===`index`)||g.unshift({[no]:`parsed`,[ro]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews!==!1){let e=new Set;for(let t of g)t[ro]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of cn(d)){if(e.has(n)||mo(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[no]:`parsed`,[ro]:`element`,id:r,viewOf:n,title:`Auto / ${d[n]?.title??n}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ee=w(g,Ht(T(`id`)));g.some(Io)&&(ee=Qb(ee));for(let e of c)l.has(e.astPath)||W.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[no]:`parsed`,projectId:t.id,project:B({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:zt(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Xi)},customColors:i},elements:d,relations:f,globals:r.globals,views:ee,deployments:{elements:p,relations:m},imports:{}},imports:r.imports}}const rS=e=>`parsed-without-imports-${e}`,iS=e=>`parsed-model-${e}`,aS=e=>`computed-model-${e}`,oS=W.getChild(`builder`);var sS=class extends sx{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.cache=e.shared.workspace.Cache,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let t=Kt(Dt(),D(e=>lc(e)&&!this.projects.isExcluded(e)),x(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(_.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),oS.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=rS(e);return t.get(n,()=>{let t=oS.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,nS(this.services,n,r))}catch(t){return oS.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=oS.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);E(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=oS.getChild(e),r=this.cache,i=vx();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await d(t);let a=iS(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,gg.create(t)):(n.debug`parseModel: returning EMPTY`,gg.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=aS(e)+(t?.hash??``);return n.get(r,()=>{let n=oS.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,gg.EMPTY.asComputed;let i=gg.create(r),a=[];for(let e of yn(r.views)){let r=Zb(e,i);if(!r.isSuccess){n.warn(ci(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}Yx(a);let o=Et(a,t=>{let n=cS(e,t.id),r=this.previousViews[n],i=r&&Dr(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),s={...r,manualLayouts:{...t?.views},[no]:`computed`,views:o};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(gg.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=oS.getChild(e),r=vx();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await d(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===gg.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Me.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){oS.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){oS.warn(ci(e))}}};function cS(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:lS,findNodeForProperty:uS}=f,{getDocument:dS,streamAllContents:fS}=he,pS=W.getChild(`locator`);var mS=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=sn(t)?this.projects.ensureProjectId():mx(t)),sn(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=dS(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return pS.debug(ci(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=ho(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Mf(r)&&!eu(r))continue;let i=r.kind?uS(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?uS(r.$cstNode,`dotKind`):void 0,i??=lS(r.$cstNode,`->`),i??=uS(r.$cstNode,`title`),i??=uS(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(Gc(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?uS(r.$cstNode,`name`):void 0;return i??=lS(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<_.Linked&&(pS.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(_.Linked,n.uri,t));let r=mx(n);pS.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??$o.DEFAULT;if(!e)return pS.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=w(fS(n.parseResult.value),ba(e=>xp(e)||Cp(e)),L(),C(n=>{let r,i;try{xp(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return P(a,`Tag ${r} not found in merged specification`),P(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:xp(n)}}catch(e){return pS.warn(`Fail on tag ${r}`,{err:e}),[]}}));return pS.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return pS.warn(ci(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!mu(n)||!n.body)return pS.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!Ac(i))return pS.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?uS(i.$cstNode,`kind`):void 0;return a??=i.dotKind?uS(i.$cstNode,`dotKind`):void 0,a??=lS(i.$cstNode,`->`),a??=lS(i.$cstNode,`<-`),a??=uS(i.$cstNode,`title`),a??=uS(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const hS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);Pt(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),W.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:gS}=he,_S=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;hS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=mx(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},vS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;hS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=mx(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},yS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=gS(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){W.warn(ci(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(V.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(V.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(V.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(V.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}oa(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},bS=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!Jl(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),xS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=cx(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=cx(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(I(i,o)||I(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},SS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;mm(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=cx(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},CS=e=>Z((e,t)=>{if(wt(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}ge(e,gu)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:wS}=he,TS=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}hS.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=wS(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(mx(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},ES=e=>Z((e,t)=>{px(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:DS}=he,OS=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=mx(DS(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},kS=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),AS=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Fd(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),zu(n)&&ku(n.$container)&&n.$container.props.some(e=>Fd(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},jS=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||sn(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=It(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!It(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!It(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!It(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),It(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),sn(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}F(e)},MS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(me(e)),i=gx(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=gx(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}V.isImportRef(i)&&(V.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),oa(V.flatten(i),V.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},NS=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),PS=e=>{let t=e.likec4.ModelParser,n=new Ce(e.shared,_.Linked),r=({source:e,target:t,kind:n,title:r})=>hx(`extend-relation`,V.flatten(e),V.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(w(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),C(e=>e.c4Relations??[]),x(e=>r(e)))))}return Z((e,n)=>{let a=me(e),o=t.forDocument(a),s=gx(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=gx(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!V.isModelRef(s)&&!V.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!V.isModelRef(c)&&!V.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=mx(a),u=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:d=``}=o.parseBaseProps({},{title:e.title}),f=r({source:s,target:c,kind:u,title:d});i(l).has(f)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},FS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),IS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),LS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),RS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=mx(e),i=t.projectElements(r,Au).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==me(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},zS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=mx(e),i=t.projectElements(r,Zl).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==me(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},BS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=mx(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==me(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},VS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=mx(e);t.projectElements(r,Uf).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},HS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=mx(e),i=t.projectElements(r,yd),a=t.projectElements(r,_d);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},US=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=mx(e);t.projectElements(r,Dd).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},WS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=ie(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&Qx(r.text)&&n(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:e,range:r.range,code:`manual-layout-v1`}),!e.name)return;hS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=mx(e);t.projectElements(i,Wc).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function GS(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const KS=e=>Z((e,t)=>{let n=GS(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(gd),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!qS(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function qS(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:qS(e.parent,t.parent)}const JS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=lh(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(me(r)),o=H.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case H.isWildcard(o)&&i:case H.isElementKindExpr(o)&&i:case H.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case H.isWildcard(o):case H.isModelRef(o):case H.isDeploymentRef(o):return;case H.isElementKindExpr(o):case H.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:F(o)}})},YS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(me(e)).parseFqnRefExpr(e),i=lh(e),a=mh(e)&&!ge(e,e=>uu(e)||Hp(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!ge(e,Qc)){if(H.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(H.isDeploymentRef(r)&&V.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}b(e.selector)&&!Jl(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case H.isElementKindExpr(r):case H.isElementTagExpr(r):case H.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},XS=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!Gd(e.$container)&&S(te(e,Uu)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),ZS=e=>Z((e,t)=>{if(lh(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=te(e,Uu);n&&S(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),QS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=te(e,cu);if(!r||r.isInclude!==!0)return;let i=me(e),a=t.forDocument(i),o=yo.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(yo.isDirect(o)){(H.isModelRef(o.source)||H.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=yo.isIncoming(o)?o.incoming:yo.isOutgoing(o)?o.outgoing:o.inout,H.isModelRef(c)){n(`error`,s,{node:e});return}})},$S=e=>Z((e,t)=>{let n=lh(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var eC=class extends Xe{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};De();const tC=na(Vd,zd,Sd,bd,vd,wd,Ed,fd,Rf,Rc,Qc,wu,fm,mm,Tc,cu,Pc,Qc,gd,pl,dl,Tp,hl,Oc,Gc,_l,Wl,Jl,eu,al,vu,uf,qc,Mf,Pf,Mc,ll,bf,Du,ku,zu,Fu,ed,nd,Xu,Qu,id,od,op,up,ip,gp,np,mp,Ju,bc),nC=e=>{let t=e;for(;t&&!Yd(t);){if(tC(t))return t;t=t.$container}};function rC(e){let t=e.state>=_.Validated?e.diagnostics?.filter(e=>e.severity===Ge.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(S(e)||n.has(e))continue;n.add(e);let t=nC(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function iC(e){W.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:vS(e),DeploymentNodeKind:zS(e),DeploymentNode:_S(e),DeploymentRelation:yS(e),ExtendDeployment:bS(e),ExtendRelation:PS(e),FqnRefExpr:YS(e),RelationExpr:QS(e),OpacityProperty:kS(e),IconProperty:AS(e),SpecificationRule:FS(e),Model:IS(e),Globals:LS(e),GlobalPredicateGroup:HS(e),GlobalDynamicPredicateGroup:HS(e),GlobalStyleId:US(e),DynamicStepSingle:xS(e),DynamicStepChain:SS(e),LikeC4View:WS(e),Element:TS(e),ElementRef:ES(e),ElementKind:RS(e),Relation:MS(e),RelationBody:NS(e),Tag:BS(e),FqnExprWith:JS(e),RelationExprWith:$S(e),RelationshipKind:VS(e),IncomingRelationExpr:XS(e),OutgoingRelationExpr:ZS(e),ImportsFromPoject:OS(e),ColorLiteral:jS(e),DynamicViewDisplayVariantProperty:CS(e),ViewRuleRank:KS(e)});let t=e.shared.lsp.Connection;t&&Na(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)W.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>W.error(ci(e)))})})}const aC=W.getChild(`parser`);function oC(e){if(e==null)return;let t=sC(e);return sn(t)?t.split(`
|
|
1230
|
+
target: ${e.target.deployment} resolved: ${!!p[e.target.deployment]}\n`,!1):!0:!1),Ke((e,t)=>se(e[t.id])?(K.debug`Duplicate deployment relation ${t.id}`,e):(u(t),e[t.id]=t,e),{}));function h(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[Ba]===`element`&&v(i)&&`viewOf`in e&&(i=d[e.viewOf]?.title??null),v(i)&&r===`index`&&(i=`Landscape view`),{...rt(s,e=>e===void 0),[za]:`parsed`,sourcePath:dn.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>y(e.c4Views,h(e)));if(g.some(e=>e.id===`index`)||g.unshift({[za]:`parsed`,[Ba]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of g)t[Ba]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of ee(d)){if(e.has(n)||Xa(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[za]:`parsed`,[Ba]:`element`,id:r,viewOf:n,title:`Auto / ${(d[n]?.title??n).replaceAll(`
|
|
1231
|
+
`,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let te=w(g,oe(x(`id`)));g.some(yo)&&(te=hx(te));for(let e of c)l.has(e.astPath)||K.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[za]:`parsed`,projectId:t.id,project:z({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:ie(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Ii)},customColors:i},elements:d,relations:f,globals:r.globals,views:te,deployments:{elements:p,relations:m},imports:{}},imports:r.imports}}const iS=e=>`parsed-without-imports-${e}`,aS=e=>`parsed-model-${e}`,oS=e=>`computed-model-${e}`,sS=K.getChild(`builder`);var cS=class extends b_{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.cache=e.shared.workspace.Cache,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let t=nt(le(),S(e=>lu(e)&&!this.projects.isExcluded(e)),y(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(Jn.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),sS.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=iS(e);return t.get(n,()=>{let t=sS.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,rS(this.services,n,r))}catch(t){return sS.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=sS.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);T(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=sS.getChild(e),r=this.cache,i=j_();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await qn(t);let a=aS(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,Cc.create(t)):(n.debug`parseModel: returning EMPTY`,Cc.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=oS(e)+(t?.hash??``);return n.get(r,()=>{let n=sS.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,Cc.EMPTY.asComputed;let i=Cc.create(r),a=[];for(let e of Ye(r.views)){let r=mx(e,i);if(!r.isSuccess){n.warn(U(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}tS(a);let o=re(a,t=>{let n=lS(e,t.id),r=this.previousViews[n],i=r&&Jr(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),s={...r,manualLayouts:{...t?.views},[za]:`computed`,views:o};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(Cc.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=sS.getChild(e),r=j_();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await qn(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===Cc.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Wn.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){sS.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){sS.warn(U(e))}}};function lS(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:uS,findNodeForProperty:dS}=Dn,{getDocument:fS,streamAllContents:pS}=pn,mS=K.getChild(`locator`);var hS=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=de(t)?this.projects.ensureProjectId():D_(t)),de(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=fS(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return mS.debug(U(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=Za(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Mm(r)&&!ef(r))continue;let i=r.kind?dS(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?dS(r.$cstNode,`dotKind`):void 0,i??=uS(r.$cstNode,`->`),i??=dS(r.$cstNode,`title`),i??=dS(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(Gu(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?dS(r.$cstNode,`name`):void 0;return i??=uS(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<Jn.Linked&&(mS.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Jn.Linked,n.uri,t));let r=D_(n);mS.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??Fo.DEFAULT;if(!e)return mS.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=w(pS(n.parseResult.value),oa(e=>xh(e)||Ch(e)),I(),_(n=>{let r,i;try{xh(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return N(a,`Tag ${r} not found in merged specification`),N(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:xh(n)}}catch(e){return mS.warn(`Fail on tag ${r}`,{err:e}),[]}}));return mS.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return mS.warn(U(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!hf(n)||!n.body)return mS.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!Au(i))return mS.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?dS(i.$cstNode,`kind`):void 0;return a??=i.dotKind?dS(i.$cstNode,`dotKind`):void 0,a??=uS(i.$cstNode,`->`),a??=uS(i.$cstNode,`<-`),a??=dS(i.$cstNode,`title`),a??=dS(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const gS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);pe(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),K.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:_S}=pn,vS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=M(n.getNameNode(e),`name CstNode not found`).range;gS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=D_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},yS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=M(n.getNameNode(e),`name CstNode not found`).range;gS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=D_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},bS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=_S(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){K.warn(U(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(B.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(B.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(B.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(B.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Ki(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},xS=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!Jd(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),SS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=x_(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=x_(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(F(i,o)||F(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},CS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;mg(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=x_(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},wS=e=>Z((e,t)=>{if(b(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}fn(e,_f)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:TS}=pn,ES=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}gS.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=TS(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(D_(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},DS=e=>Z((e,t)=>{E_(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:OS}=pn,kS=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=D_(OS(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},AS=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),jS=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Ip(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),Bf(n)&&Af(n.$container)&&n.$container.props.some(e=>Ip(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},MS=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||de(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=ae(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!ae(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!ae(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!ae(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),ae(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),de(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}P(e)},NS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(On(e)),i=k_(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=k_(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}B.isImportRef(i)&&(B.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Ki(B.flatten(i),B.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},PS=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),FS=e=>{let t=e.likec4.ModelParser,n=new Fn(e.shared,Jn.Linked),r=({source:e,target:t,kind:n,title:r})=>O_(`extend-relation`,B.flatten(e),B.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(w(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),_(e=>e.c4Relations??[]),y(e=>r(e)))))}return Z((e,n)=>{let a=On(e),o=t.forDocument(a),s=k_(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=k_(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!B.isModelRef(s)&&!B.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!B.isModelRef(c)&&!B.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=D_(a),u=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:d=``}=o.parseBaseProps({},{title:e.title}),f=r({source:s,target:c,kind:u,title:d});i(l).has(f)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},IS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),LS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),RS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),zS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{gS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=D_(e),i=t.projectElements(r,jf).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==On(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},BS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{gS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=D_(e),i=t.projectElements(r,Zd).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==On(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},VS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=D_(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==On(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},HS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{gS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=D_(e);t.projectElements(r,Um).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},US=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=D_(e),i=t.projectElements(r,bp),a=t.projectElements(r,vp);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},WS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=D_(e);t.projectElements(r,Op).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},GS=/@likec4-generated/,KS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=ir(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&GS.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;gS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=D_(e);t.projectElements(i,Wu).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function qS(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const JS=e=>Z((e,t)=>{let n=qS(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(_p),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!YS(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function YS(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:YS(e.parent,t.parent)}const XS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=l_(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(On(r)),o=V.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case V.isWildcard(o)&&i:case V.isElementKindExpr(o)&&i:case V.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case V.isWildcard(o):case V.isModelRef(o):case V.isDeploymentRef(o):return;case V.isElementKindExpr(o):case V.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:P(o)}})},ZS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(On(e)).parseFqnRefExpr(e),i=l_(e),a=m_(e)&&!fn(e,e=>df(e)||Hh(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!fn(e,Qu)){if(V.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(V.isDeploymentRef(r)&&B.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}C(e.selector)&&!Jd(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case V.isElementKindExpr(r):case V.isElementTagExpr(r):case V.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},QS=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!Kp(e.$container)&&v(En(e,Wf)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),$S=e=>Z((e,t)=>{if(l_(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=En(e,Wf);n&&v(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),eC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=En(e,lf);if(!r||r.isInclude!==!0)return;let i=On(e),a=t.forDocument(i),o=to.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(to.isDirect(o)){(V.isModelRef(o.source)||V.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=to.isIncoming(o)?o.incoming:to.isOutgoing(o)?o.outgoing:o.inout,V.isModelRef(c)){n(`error`,s,{node:e});return}})},tC=e=>Z((e,t)=>{let n=l_(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var nC=class extends dr{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};Hn();const rC=Hi(Hp,Bp,Cp,xp,yp,Tp,Dp,pp,Rm,Ru,Qu,Tf,fg,mg,Tu,lf,Pu,Qu,_p,pd,dd,Th,hd,Ou,Gu,_d,Wd,Jd,ef,ad,yf,um,qu,Mm,Pm,Mu,ld,bm,Of,Af,Bf,If,tp,rp,Zf,$f,ap,sp,oh,uh,ih,gh,nh,mh,Yf,bu),iC=e=>{let t=e;for(;t&&!Xp(t);){if(rC(t))return t;t=t.$container}};function aC(e){let t=e.state>=Jn.Validated?e.diagnostics?.filter(e=>e.severity===Kn.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(v(e)||n.has(e))continue;n.add(e);let t=iC(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function oC(e){K.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:yS(e),DeploymentNodeKind:BS(e),DeploymentNode:vS(e),DeploymentRelation:bS(e),ExtendDeployment:xS(e),ExtendRelation:FS(e),FqnRefExpr:ZS(e),RelationExpr:eC(e),OpacityProperty:AS(e),IconProperty:jS(e),SpecificationRule:IS(e),Model:LS(e),Globals:RS(e),GlobalPredicateGroup:US(e),GlobalDynamicPredicateGroup:US(e),GlobalStyleId:WS(e),DynamicStepSingle:SS(e),DynamicStepChain:CS(e),LikeC4View:KS(e),Element:ES(e),ElementRef:DS(e),ElementKind:zS(e),Relation:NS(e),RelationBody:PS(e),Tag:VS(e),FqnExprWith:XS(e),RelationExprWith:tC(e),RelationshipKind:HS(e),IncomingRelationExpr:QS(e),OutgoingRelationExpr:$S(e),ImportsFromPoject:kS(e),ColorLiteral:MS(e),DynamicViewDisplayVariantProperty:wS(e),ViewRuleRank:JS(e)});let t=e.shared.lsp.Connection;t&&ya(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)K.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>K.error(U(e)))})})}const sC=K.getChild(`parser`);function cC(e){if(e==null)return;let t=lC(e);return de(t)?t.split(`
|
|
1226
1232
|
`).join(` `):`md`in t?{md:t.md.split(`
|
|
1227
1233
|
`).join(` `)}:{txt:t.txt.split(`
|
|
1228
|
-
`).join(` `)}}function sC(e){if(e!=null)switch(!0){case sn(e):return Wr(e).trim();case rf(e)&&sn(e.markdown):return{md:Wr(e.markdown).trim()};case rf(e)&&sn(e.text):return{txt:Wr(e.text).trim()};case rf(e):return{txt:``};default:return}}var cC=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=rC(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(u(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?aC.getChild(n).debug(r):aC.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return C(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(zd(e)){let t=mx(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),po(t,n)}return ed(e)?lx(e.element):Xu(e)?lx(e.deploymentNode):Sc(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||wt(e.props))return;let t=e=>{if(rf(e)){let t=sC(e);if(!t)return[];if(typeof t==`string`)return b(t)?[t]:[];{let e=t.md||t.txt;return b(e)?[e]:[]}}else if(of(e))return e.values.map(e=>sC(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(b);return[]},n=w(e.props,C(e=>t(e.value).map(t=>[e.key,t])),D(([e,t])=>b(t)));if(wt(n))return;let r=w(n,At(([e])=>e),zt(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return wt(i)?void 0:i}parseMarkdownOrString(e){if(rf(e))return sC(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>N(e.tag.ref,`Tag reference is not resolved`).name).filter(b)),t=t.prev;return ta(n)?qt(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,D(e.props,tf),e=>{let t=e.value;if(An(t))return;let n=b(e.title)?oC(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return B({url:t,title:n,relative:r&&r!==t?r:void 0})});return ta(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Sr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&vr(n):return hr(this.doc.uri.toString(),`../`,n);case n&&br(n):return xr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){aC.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?xr(i,r):i;return xr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(kd(e))return`#${e.hex}`;if(Xf(e)){let t=It(e.alpha)?e.alpha:void 0;return sn(e.alpha)&&(t=th(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}F(e)}}parseElementStyle(e){if(!e)return{};if(Bt(e)){let t=this.parseStyleProps(e.find(zu)?.props);try{let n=this.parseIconProperty(e.find(Fd));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case Fl(n):b(n.value)&&(t.border=n.value);break;case Ll(n):{let e=oh(n);b(e)&&(t.color=e);break}case Qf(n):b(n.value)&&(t.shape=n.value);break;case Fd(n):{let e=this.parseIconProperty(n);b(e)&&(t.icon=e);break}case jd(n):{let e=oh(n);b(e)&&(t.iconColor=e);break}case Ld(n):b(n.value)&&(t.iconSize=rh(n));break;case Nd(n):b(n.value)&&(t.iconPosition=ih(n));break;case Ef(n):t.opacity=nh(n);break;case vf(n):t.multiple=Ot(n.value)?n.value:!1;break;case ep(n):b(n.value)&&(t.size=rh(n));break;case Af(n):b(n.value)&&(t.padding=rh(n));break;case Dp(n):b(n.value)&&(t.textSize=rh(n));break;default:F(n)}}catch(e){this.logError(e,n)}return B(t)}parseBaseProps(e,t){let n=sC(t?.title??eh(e.title)),r=t?.description?{txt:sC(t.description)}:this.parseMarkdownOrString(e.description);return B({title:n,summary:t?.summary?{txt:sC(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:oC(t?.technology)??sC(eh(e.technology))})}};function*lC(e){let t=Bn.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(eu(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function uC(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of lC(e))try{switch(!0){case eu(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case Wl(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case Jl(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case Xu(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:F(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(qc)),c=w(e.body?.props??[],D(t),D(Lu),Et(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return B({id:n,kind:r,title:l??ia(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);P(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qc)),s=w(e.body?.props??[],D(t),D(Lu),Et(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return B({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qc)),r=this.parseLinks(e.body);return!t&&wt(n??{})&&!r?null:B({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(Vt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);P(V.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);P(V.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(qc)),l=w(e.body?.props??[],D(Kf),D(e=>b(e.value)),Et(e=>[e.key,e.value])),u=w(e.body?.props??[],D(Hf),$t())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Jf);return B({id:hx(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...ah(f?.props,t),navigateTo:u,astPath:n})}}}function dC(e){return class extends e{parseDeploymentView(e){let t=e.body;P(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+hx(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(w(n,D(Wp),Et(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);Zm.writeId(e,i);let l=eS(e);return{[ro]:`deployment`,id:i,astPath:r,title:oC(a)??null,description:o,tags:s,links:ta(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e)),...l&&{manualLayout:l}}}parseDeploymentViewRule(e){if(cu(e))return this.parseDeploymentViewRulePredicate(e);if(Ap(e))return sh(e);if(uu(e))return this.parseDeploymentViewRuleStyle(e);F(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;Mt(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){G(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(dl)),n=sC(eh(e.props.find(Sf)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const fC=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function pC(e){return!im(e)&&!om(e)?null:e.participant}function mC(e){switch(!0){case Al(e):{let t=e.value.tag.ref?.name,n=pC(e);P(t,`Expected tag name`);let r={tag:fC(e,t)};return n?{participant:n,operator:r}:r}case wl(e):{let t=e.value?.ref?.name,n=pC(e);P(t,`Expected kind name`);let r={kind:fC(e,t)};return n?{participant:n,operator:r}:r}case Xp(e)||nm(e):return{not:mC(e.value)};case Kp(e):{let t=mC(e.left),n=mC(e.right);return hC(e.operator.toLowerCase(),t,n)}default:F(e)}}function hC(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[ko(t)?t.and:t,ko(n)?n.and:n].flat();return P(ta(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[Ao(t)?t.or:t,Ao(n)?n.or:n].flat();return P(ta(e),`Expected non-empty array`),{or:e}}default:F(e)}}function gC(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(zd(t)){let e={project:mx(t),model:this.resolveFqn(N(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(Du(t)){let n=fx(e);if(n){let e={project:mx(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=dx(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Sc(t))return{deployment:this.resolveFqn(t)};F(t)}parseExpressionV2(e){if(Hc(e))return this.parseFqnExprOrWith(e);if(nl(e))return this.parseRelationExprOrWith(e);F(e)}parseFqnExprOrWith(e){if(fd(e))return this.parseFqnExprWith(e);if(Bc(e))return this.parseFqnExprOrWhere(e);F(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(bf(t)){let n=t.value.view.$refText;return b(n)&&(e.custom.navigateTo=n),e}if(wf(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Lu(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=sC(eh(t.value));return n&&(e.custom[t.key]=n),e}if(Fd(t)){let n=this.parseIconProperty(t);return Vt(n)&&(e.custom[t.key]=n),e}if(Ll(t)){let n=oh(t);return Vt(n)&&(e.custom[t.key]=n),e}if(Qf(t)||Fl(t))return Vt(t.value)&&(e.custom[t.key]=t.value),e;if(Ef(t))return Vt(t.value)&&(e.custom[t.key]=nh(t)),e;if(jd(t)){let n=oh(t);return Vt(n)&&(e.custom[t.key]=n),e}if(Sf(t)){let n=b(t.value)?sC(eh(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(vf(t))return Ot(t.value)&&(e.custom[t.key]=t.value),e;if(ep(t)||Dp(t)||Af(t)||Ld(t))return b(t.value)&&(e.custom[t.key]=rh(t)),e;if(Nd(t))return b(t.value)&&(e.custom[t.key]=t.value),e;F(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(ud(e))return this.parseFqnExprWhere(e);if(Rc(e))return this.parseFqnExpr(e);F(e)}parseFqnExprWhere(e){return P(!ud(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?mC(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(um(e))return{wildcard:!0};if(Nu(e))return P(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(Vu(e))return P(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(gd(e))return this.parseFqnRefExpr(e);F(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],n=e;for(;n;){try{Mt(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(Rf(e))return this.parseRelationExprWith(e);if(el(e))return this.parseRelationExprOrWhere(e);F(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(wf(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(Kf(t)||Sf(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=sC(eh(t.value));return n&&(e[t.key]=n),e}if(Nl(t))return b(t.value)&&(e[t.key]=t.value),e;if(Ll(t)){let n=oh(t);return b(n)&&(e[t.key]=n),e}if($d(t))return b(t.value)&&(e[t.key]=t.value),e;if(Hf(t)){let n=t.value.view.ref?.name;return b(n)&&(e[t.key]=n),e}F(t)},{})}parseRelationExprOrWhere(e){if(If(e))return this.parseRelationExprWhere(e);if(Qc(e))return this.parseRelationExpr(e);F(e)}parseRelationExprWhere(e){P(!If(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?mC(e.where):null,a;return a=i&&r?hC(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:F(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function _C(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!b(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!b(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);E(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(bd(e)){let r=this.parseGlobalPredicateGroup(e);E(r,1)&&(n.predicates[t]=r);return}if(vd(e)){let r=this.parseGlobalDynamicPredicateGroup(e);E(r,1)&&(n.dynamicPredicates[t]=r);return}F(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(wd(e))return[this.parseViewRuleStyle(e)];if(Ed(e))return e.styles.map(e=>this.parseViewRuleStyle(e));F(e)}}}function vC(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(N(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*yC(e){let t=Bn.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Mf(r)){n.push(r);continue}if(id(r)){n.push(r);continue}if(r.body?.elements&&E(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function bC(e){return class extends e{parseModel(){let e=this.doc;for(let t of yC(e))try{if(Du(t)){e.c4Elements.push(this.parseElement(t));continue}if(Mf(t)){e.c4Relations.push(this.parseRelation(t));continue}if(ed(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(id(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}F(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qc)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=w(e.body?.props??[],D(t),D(Lu),Et(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return B({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qc)),r=this.parseLinks(e.body);if(!t&&An(n)&&!r)return null;let i=this.getAstNodePath(e);return B({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);P(V.isModelRef(t)||V.isImportRef(t),`Source must be a model reference`),P(V.isModelRef(n)||V.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(qc)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&wt(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return B({id:hx(`extend-relation`,V.flatten(t),V.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(Vt(e.source)){let t=this.parseFqnRef(e.source);return P(V.isModelRef(t)||V.isImportRef(t),`Relation source must be a model reference`),t}if(ku(e.$container)||nd(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);P(V.isModelRef(r)||V.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(qc)),c=this.getAstNodePath(e),l=w(e.body?.props??[],D(Kf),D(e=>b(e.value)),Et(e=>[e.key,e.value])),u=w(e.body?.props??[],D(Hf),x(e=>e.value.view.ref?.name),D(b),$t()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Jf);return B({id:hx(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...ah(m?.props,t)})}}}function xC(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(fd(e))return this.parseFqnExprWith(e);if(Bc(e))return this.parseFqnExprOrWhere(e);F(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SC(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!b(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=w(n.filter(fp)??[],D(e=>this.isValid(e)&&Mt(e.value)),Et(e=>[e.key,sC(eh(e.value))]),Tt(S));t.relationships[r]={...i,...ah(n.filter(al),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}b(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:N(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!b(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(zu)),o=this.parseLinks(e),s=w(n.filter(cp)??[],D(e=>this.isValid(e)),Et(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=sC(eh(s.notation));return{[r]:B({...c,notation:l,tags:i??void 0,...o&&ta(o)&&{links:o},style:a})}}}}function CC(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!wt(t.folder.trim())?oC(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Uu(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case mu(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case iu(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:F(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;P(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=cx(e.viewOf),n=t&&gx(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+hx(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(w(n.props,D(e=>this.isValid(e)),D(Wp),Et(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u=eS(e),d={[ro]:`element`,id:a,astPath:r,title:oC(o)??null,description:s,tags:c,links:ta(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i},...u&&{manualLayout:u}};if(Zm.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return P(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}parseElementViewRule(e){if(Rp(e))return this.parseViewRulePredicate(e);if(Mp(e))return this.parseViewRuleGlobalPredicateRef(e);if(_l(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ap(e))return sh(e);if(Ip(e))return this.parseViewRuleGroup(e);if(Bp(e))return this.parseViewRuleRank(e);F(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(Hp(e))return this.parseViewRuleStyle(e);if(Pp(e))return this.parseViewRuleGlobalStyle(e);F(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Rp(n)){t.push(this.parseViewRulePredicate(n));continue}if(Ip(n)){t.push(this.parseViewRuleGroup(n));continue}F(n)}catch(e){this.logError(e,n,`views`)}return{title:oC(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>So.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>So.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(dl)),r=sC(eh(e.props.find(Sf)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;P(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+hx(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(w(i,D(Wp),Et(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Zm.writeId(e,o);let d=eS(e),f=mn(i,vu)?.value;return{[ro]:`dynamic`,id:o,astPath:a,title:oC(s)??null,description:c,tags:l,links:ta(u)?u:null,variant:f,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>wu(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e)),...d&&{manualLayout:d}}}parseDynamicViewRule(e){if(Su(e))return this.parseDynamicViewIncludePredicate(e);if(bu(e))return this.parseViewRuleGlobalPredicateRef(e);if(_l(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ap(e))return sh(e);F(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Hc(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=wC(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return P(ta(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(mm(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return P(ta(t),`Dynamic step chain must have at least one step`),{seriesId:wC(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(mm(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!ta(n)||!this.isValid(e))return[];let r=Ft(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=cx(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=cx(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:wC(e)},r=sC(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case Hf(t):{let e=t.value.view.ref?.name;b(e)&&(n.navigateTo=e);break}case Kf(t):case Sf(t):if(Vt(t.value))if(t.key===`description`){let e=sC(t.value);e&&(n.description=e)}else n[t.key]=sC(eh(t.value))??``;break;case wf(t):Vt(t.value)&&(n[t.key]=sC(t.value));break;case Nl(t):Vt(t.value)&&(n[t.key]=t.value);break;case Ll(t):{let e=oh(t);Vt(e)&&(n[t.key]=e);break}case $d(t):Vt(t.value)&&(n[t.key]=t.value);break;default:F(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function wC(e){let t=e,n=[];for(;!gu(t);)It(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}De();const TC=w(cC,gC,vC,bC,uC,dC,xC,SC,CC,_C);var EC=class extends TC{};const DC=W.getChild(`parser`),OC=e=>e.severity===Ge.Error;var kC=class{cachedParsers=new Rn.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(_.Linked,async e=>{this.cachedParsers.has(e)&&(DC.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:le.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(_.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){G(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(_.Validated,async e=>{e.diagnostics?.some(OC)&&this.cachedParsers.has(e)&&(DC.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:le.basename(e.uri)}),this.cachedParsers.delete(e))})}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){P($m(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=le.relative(t.folderUri,e.uri);e.likec4ProjectId?DC.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):DC.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<_.Linked&&DC.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new In.default(Set)};e=Object.assign(e,r);let i=new EC(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},AC=class extends oe{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),se.convertString(t)):super.runConverter(e,t,n)}};De();const{findNodeForKeyword:jC}=f,MC=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...on(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},NC=(e,t)=>n=>{if(!Hp(n)&&!uu(n))return!1;let r=n.targets.value;if(!r||b(n.targets.prev)||r.$type!==`FqnRefExpr`||b(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function PC(e,{view:t,viewAst:n,targets:r,style:i}){P(n.body,`View ${t.id} has no body`);let a=n.$cstNode;P(a,`viewCstNode`);let o=Ft(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;P(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=D(n.body.rules,e=>Hp(e)||uu(e)),u=t[ro]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Cn(l,NC(e,c)),n=u&&I(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>MC(e,i,s));h.push(Ze.insert(o,`
|
|
1234
|
+
`).join(` `)}}function lC(e){if(e!=null)switch(!0){case de(e):return Yr(e).trim();case im(e)&&de(e.markdown):return{md:Yr(e.markdown).trim()};case im(e)&&de(e.text):return{txt:Yr(e.text).trim()};case im(e):return{txt:``};default:return}}var uC=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=aC(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Bn(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?sC.getChild(n).debug(r):sC.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return _(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(Bp(e)){let t=D_(e),n=this.resolveFqn(M(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Ya(t,n)}return tp(e)?S_(e.element):Zf(e)?S_(e.deploymentNode):Su(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||b(e.props))return;let t=e=>{if(im(e)){let t=lC(e);if(!t)return[];if(typeof t==`string`)return C(t)?[t]:[];{let e=t.md||t.txt;return C(e)?[e]:[]}}else if(om(e))return e.values.map(e=>lC(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(C);return[]},n=w(e.props,_(e=>t(e.value).map(t=>[e.key,t])),S(([e,t])=>C(t)));if(b(n))return;let r=w(n,xe(([e])=>e),ie(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return b(i)?void 0:i}parseMarkdownOrString(e){if(im(e))return lC(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>M(e.tag.ref,`Tag reference is not resolved`).name).filter(C)),t=t.prev;return Vi(n)?Ce(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,S(e.props,nm),e=>{let t=e.value;if(te(t))return;let n=C(e.title)?cC(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return z({url:t,title:n,relative:r&&r!==t?r:void 0})});return Vi(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Hr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&Rr(n):return Fr(this.doc.uri.toString(),`../`,n);case n&&Br(n):return Vr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){sC.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?Vr(i,r):i;return Vr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(Ap(e))return`#${e.hex}`;if(Xm(e)){let t=ae(e.alpha)?e.alpha:void 0;return de(e.alpha)&&(t=t_(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}P(e)}}parseElementStyle(e){if(!e)return{};if(ye(e)){let t=this.parseStyleProps(e.find(Bf)?.props);try{let n=this.parseIconProperty(e.find(Ip));n&&(t.icon=n)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let n of e)if(this.isValid(n))try{switch(!0){case Fd(n):C(n.value)&&(t.border=n.value);break;case Ld(n):{let e=o_(n);C(e)&&(t.color=e);break}case Qm(n):C(n.value)&&(t.shape=n.value);break;case Ip(n):{let e=this.parseIconProperty(n);C(e)&&(t.icon=e);break}case Mp(n):{let e=o_(n);C(e)&&(t.iconColor=e);break}case Rp(n):C(n.value)&&(t.iconSize=r_(n));break;case Pp(n):C(n.value)&&(t.iconPosition=i_(n));break;case Em(n):t.opacity=n_(n);break;case vm(n):t.multiple=ve(n.value)?n.value:!1;break;case eh(n):C(n.value)&&(t.size=r_(n));break;case Am(n):C(n.value)&&(t.padding=r_(n));break;case Dh(n):C(n.value)&&(t.textSize=r_(n));break;default:P(n)}}catch(e){this.logError(e,n)}return z(t)}parseBaseProps(e,t){let n=lC(t?.title??e_(e.title)),r=t?.description?{txt:lC(t.description)}:this.parseMarkdownOrString(e.description);return z({title:n,summary:t?.summary?{txt:lC(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:cC(t?.technology)??lC(e_(e.technology))})}};function*dC(e){let t=gt.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(ef(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function fC(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of dC(e))try{switch(!0){case ef(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case Wd(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case Jd(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case Zf(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:P(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=M(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(qu)),c=w(e.body?.props??[],S(t),S(Rf),re(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return z({id:n,kind:r,title:l??Wi(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);N(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qu)),s=w(e.body?.props??[],S(t),S(Rf),re(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return z({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qu)),r=this.parseLinks(e.body);return!t&&b(n??{})&&!r?null:z({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(se(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);N(B.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);N(B.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(qu)),l=w(e.body?.props??[],S(Km),S(e=>C(e.value)),re(e=>[e.key,e.value])),u=w(e.body?.props??[],S(Hm),$e())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Jm);return z({id:O_(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...a_(f?.props,t),navigateTo:u,astPath:n})}}}function pC(e){return class extends e{parseDeploymentView(e){let t=e.body;N(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+O_(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(w(n,S(Wh),re(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return Zg.writeId(e,i),{[Ba]:`deployment`,id:i,astPath:r,title:cC(a)??null,description:o,tags:s,links:Vi(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(lf(e))return this.parseDeploymentViewRulePredicate(e);if(Ah(e))return s_(e);if(df(e))return this.parseDeploymentViewRuleStyle(e);P(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;he(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){q(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(dd)),n=lC(e_(e.props.find(Sm)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const mC=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function hC(e){return!ig(e)&&!og(e)?null:e.participant}function gC(e){switch(!0){case Ad(e):{let t=e.value.tag.ref?.name,n=hC(e);N(t,`Expected tag name`);let r={tag:mC(e,t)};return n?{participant:n,operator:r}:r}case wd(e):{let t=e.value?.ref?.name,n=hC(e);N(t,`Expected kind name`);let r={kind:mC(e,t)};return n?{participant:n,operator:r}:r}case Xh(e)||ng(e):return{not:gC(e.value)};case Kh(e):{let t=gC(e.left),n=gC(e.right);return _C(e.operator.toLowerCase(),t,n)}default:P(e)}}function _C(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[fo(t)?t.and:t,fo(n)?n.and:n].flat();return N(Vi(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[po(t)?t.or:t,po(n)?n.or:n].flat();return N(Vi(e),`Expected non-empty array`),{or:e}}default:P(e)}}function vC(e){return class extends e{parseFqnRef(e){let t=M(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(Bp(t)){let e={project:D_(t),model:this.resolveFqn(M(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(Of(t)){let n=T_(e);if(n){let e={project:D_(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=w_(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Su(t))return{deployment:this.resolveFqn(t)};P(t)}parseExpressionV2(e){if(Hu(e))return this.parseFqnExprOrWith(e);if(nd(e))return this.parseRelationExprOrWith(e);P(e)}parseFqnExprOrWith(e){if(pp(e))return this.parseFqnExprWith(e);if(Bu(e))return this.parseFqnExprOrWhere(e);P(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(bm(t)){let n=t.value.view.$refText;return C(n)&&(e.custom.navigateTo=n),e}if(wm(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Rf(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=lC(e_(t.value));return n&&(e.custom[t.key]=n),e}if(Ip(t)){let n=this.parseIconProperty(t);return se(n)&&(e.custom[t.key]=n),e}if(Ld(t)){let n=o_(t);return se(n)&&(e.custom[t.key]=n),e}if(Qm(t)||Fd(t))return se(t.value)&&(e.custom[t.key]=t.value),e;if(Em(t))return se(t.value)&&(e.custom[t.key]=n_(t)),e;if(Mp(t)){let n=o_(t);return se(n)&&(e.custom[t.key]=n),e}if(Sm(t)){let n=C(t.value)?lC(e_(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(vm(t))return ve(t.value)&&(e.custom[t.key]=t.value),e;if(eh(t)||Dh(t)||Am(t)||Rp(t))return C(t.value)&&(e.custom[t.key]=r_(t)),e;if(Pp(t))return C(t.value)&&(e.custom[t.key]=t.value),e;P(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(dp(e))return this.parseFqnExprWhere(e);if(Ru(e))return this.parseFqnExpr(e);P(e)}parseFqnExprWhere(e){return N(!dp(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?gC(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(ug(e))return{wildcard:!0};if(Pf(e))return N(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(Hf(e))return N(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(_p(e))return this.parseFqnRefExpr(e);P(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],n=e;for(;n;){try{he(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(Rm(e))return this.parseRelationExprWith(e);if(ed(e))return this.parseRelationExprOrWhere(e);P(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(wm(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(Km(t)||Sm(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=lC(e_(t.value));return n&&(e[t.key]=n),e}if(Nd(t))return C(t.value)&&(e[t.key]=t.value),e;if(Ld(t)){let n=o_(t);return C(n)&&(e[t.key]=n),e}if(em(t))return C(t.value)&&(e[t.key]=t.value),e;if(Hm(t)){let n=t.value.view.ref?.name;return C(n)&&(e[t.key]=n),e}P(t)},{})}parseRelationExprOrWhere(e){if(Im(e))return this.parseRelationExprWhere(e);if(Qu(e))return this.parseRelationExpr(e);P(e)}parseRelationExprWhere(e){N(!Im(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?gC(e.where):null,a;return a=i&&r?_C(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:P(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function yC(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!C(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!C(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);T(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(xp(e)){let r=this.parseGlobalPredicateGroup(e);T(r,1)&&(n.predicates[t]=r);return}if(yp(e)){let r=this.parseGlobalDynamicPredicateGroup(e);T(r,1)&&(n.dynamicPredicates[t]=r);return}P(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Tp(e))return[this.parseViewRuleStyle(e)];if(Dp(e))return e.styles.map(e=>this.parseViewRuleStyle(e));P(e)}}}function bC(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(M(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*xC(e){let t=gt.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Mm(r)){n.push(r);continue}if(ap(r)){n.push(r);continue}if(r.body?.elements&&T(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function SC(e){return class extends e{parseModel(){let e=this.doc;for(let t of xC(e))try{if(Of(t)){e.c4Elements.push(this.parseElement(t));continue}if(Mm(t)){e.c4Relations.push(this.parseRelation(t));continue}if(tp(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(ap(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}P(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=M(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(qu)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=w(e.body?.props??[],S(t),S(Rf),re(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return z({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(qu)),r=this.parseLinks(e.body);if(!t&&te(n)&&!r)return null;let i=this.getAstNodePath(e);return z({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);N(B.isModelRef(t)||B.isImportRef(t),`Source must be a model reference`),N(B.isModelRef(n)||B.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(qu)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&b(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return z({id:O_(`extend-relation`,B.flatten(t),B.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(se(e.source)){let t=this.parseFqnRef(e.source);return N(B.isModelRef(t)||B.isImportRef(t),`Relation source must be a model reference`),t}if(Af(e.$container)||rp(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);N(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(qu)),c=this.getAstNodePath(e),l=w(e.body?.props??[],S(Km),S(e=>C(e.value)),re(e=>[e.key,e.value])),u=w(e.body?.props??[],S(Hm),y(e=>e.value.view.ref?.name),S(C),$e()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Jm);return z({id:O_(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...a_(m?.props,t)})}}}function CC(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(pp(e))return this.parseFqnExprWith(e);if(Bu(e))return this.parseFqnExprOrWhere(e);P(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function wC(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!C(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=w(n.filter(fh)??[],S(e=>this.isValid(e)&&he(e.value)),re(e=>[e.key,lC(e_(e.value))]),rt(v));t.relationships[r]={...i,...a_(n.filter(ad),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}C(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:M(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!C(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(Bf)),o=this.parseLinks(e),s=w(n.filter(ch)??[],S(e=>this.isValid(e)),re(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=lC(e_(s.notation));return{[r]:z({...c,notation:l,tags:i??void 0,...o&&Vi(o)&&{links:o},style:a})}}}}function TC(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!b(t.folder.trim())?cC(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Wf(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case hf(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case af(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:P(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;N(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=x_(e.viewOf),n=t&&k_(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+O_(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(w(n.props,S(e=>this.isValid(e)),S(Wh),re(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Ba]:`element`,id:a,astPath:r,title:cC(o)??null,description:s,tags:c,links:Vi(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(Zg.writeId(e,u.id),`extends`in e){let t=e.extends.view.ref;return N(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(u,{extends:t.name})}return u}parseElementViewRule(e){if(Rh(e))return this.parseViewRulePredicate(e);if(Mh(e))return this.parseViewRuleGlobalPredicateRef(e);if(_d(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ah(e))return s_(e);if(Ih(e))return this.parseViewRuleGroup(e);if(Bh(e))return this.parseViewRuleRank(e);P(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(Hh(e))return this.parseViewRuleStyle(e);if(Ph(e))return this.parseViewRuleGlobalStyle(e);P(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Rh(n)){t.push(this.parseViewRulePredicate(n));continue}if(Ih(n)){t.push(this.parseViewRuleGroup(n));continue}P(n)}catch(e){this.logError(e,n,`views`)}return{title:cC(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>io.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>io.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(dd)),r=lC(e_(e.props.find(Sm)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;N(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+O_(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(w(i,S(Wh),re(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Zg.writeId(e,o);let d=Xe(i,yf)?.value;return{[Ba]:`dynamic`,id:o,astPath:a,title:cC(s)??null,description:c,tags:l,links:Vi(u)?u:null,variant:d,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>Tf(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(Cf(e))return this.parseDynamicViewIncludePredicate(e);if(xf(e))return this.parseViewRuleGlobalPredicateRef(e);if(_d(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Ah(e))return s_(e);P(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Hu(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=EC(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return N(Vi(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(mg(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return N(Vi(t),`Dynamic step chain must have at least one step`),{seriesId:EC(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(mg(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!Vi(n)||!this.isValid(e))return[];let r=Re(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=x_(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=x_(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:EC(e)},r=lC(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case Hm(t):{let e=t.value.view.ref?.name;C(e)&&(n.navigateTo=e);break}case Km(t):case Sm(t):if(se(t.value))if(t.key===`description`){let e=lC(t.value);e&&(n.description=e)}else n[t.key]=lC(e_(t.value))??``;break;case wm(t):se(t.value)&&(n[t.key]=lC(t.value));break;case Nd(t):se(t.value)&&(n[t.key]=t.value);break;case Ld(t):{let e=o_(t);se(e)&&(n[t.key]=e);break}case em(t):se(t.value)&&(n[t.key]=t.value);break;default:P(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function EC(e){let t=e,n=[];for(;!_f(t);)ae(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}Hn();const DC=w(uC,vC,bC,SC,fC,pC,CC,wC,TC,yC);var OC=class extends DC{};const kC=K.getChild(`parser`),AC=e=>e.severity===Kn.Error;var jC=class{cachedParsers=new mt.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(Jn.Linked,async e=>{this.cachedParsers.has(e)&&(kC.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:dn.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(Jn.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){q(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(Jn.Validated,async e=>{e.diagnostics?.some(AC)&&this.cachedParsers.has(e)&&(kC.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:dn.basename(e.uri)}),this.cachedParsers.delete(e))})}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){N($g(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=dn.relative(t.folderUri,e.uri);e.likec4ProjectId?kC.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):kC.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<Jn.Linked&&kC.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new ft.default(Set)};e=Object.assign(e,r);let i=new OC(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},MC=class extends yn{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),xn.convertString(t)):super.runConverter(e,t,n)}};Hn();const{findNodeForKeyword:NC}=Dn,PC=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...we(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},FC=(e,t)=>n=>{if(!Hh(n)&&!df(n))return!1;let r=n.targets.value;if(!r||C(n.targets.prev)||r.$type!==`FqnRefExpr`||C(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function IC(e,{view:t,viewAst:n,targets:r,style:i}){N(n.body,`View ${t.id} has no body`);let a=n.$cstNode;N(a,`viewCstNode`);let o=Re(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;N(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=S(n.body.rules,e=>Hh(e)||df(e)),u=t[Ba]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Ue(l,FC(e,c)),n=u&&F(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>PC(e,i,s));h.push(zn.insert(o,`
|
|
1229
1235
|
`+e.join(`
|
|
1230
|
-
`))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:
|
|
1231
|
-
`+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}De();const{findNodeForKeyword:FC}=f;function IC(e,{view:t,viewAst:n,layout:r}){P(n.body,`View ${t.id} has no body`);let i=n.$cstNode;P(i,`viewCstNode`);let a=ch(r.direction),o=Cn(n.body.rules,Ap),s=`autoLayout ${a}`;if(It(r.rankSep)&&(s+=` ${r.rankSep}`,It(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Ze.replace(o.$cstNode.range,s);let c=FC(n.body.$cstNode,`}`)?.range.start;P(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Ze.insert(c,l)}De();async function LC(e,{lookup:t}){if(!t.view.manualLayout)return!1;let n=t.viewAst.$cstNode;P(n,`invalid view.$cstNode`);let r=e.shared.lsp.Connection;P(r,`LSP Connection not available`);let i=ie(n,[`BLOCK_COMMENT`]);return i&&Qx(i.text)?(await r.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${t.view.id}`,edit:{changes:{[t.doc.textDocument.uri]:[Ze.del(i.range)]}}})).applied:!1}De();const RC=W.getChild(`model-changes`);var zC=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);RC.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return P(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),s.view.manualLayout&&t&&await LC(this.services,{lookup:s}).catch(e=>{RC.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return s.view.manualLayout&&await LC(this.services,{lookup:s}).catch(e=>{RC.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.remove(o,r)};P(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?{success:!0,location:{uri:c.uri,range:u}}:(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=ci(li(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return RC.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return PC(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=IC(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:F(t)}}},BC=class extends h{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(m(e))return e.name;if(zd(e))return e.imported.$refText;if(Wl(e))return e.target.modelElement.value.$refText}getNameNode(e){if(m(e))return super.getNameNode(e);if(zd(e))return e.imported.$refNode;if(Wl(e))return e.target.modelElement.value.$refNode}};function VC(e){return w(e,At(e=>`${e.type}.${e.name}`),on(),C(([e,t])=>t.length===1?t:[]))}var HC=class extends $e{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){G(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(S(r)||r.length===0))for(let e of r)try{b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}exportGlobals(e,t,n){if(!(S(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}}exportModel(e,t,n){if(!(S(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{Du(r)&&b(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){G(e)}}exportLibrary(e,t,n){if(!S(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){G(e)}}exportSpecification(e,t,n){if(!(S(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case ip(r):case op(r):b(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case gp(r):b(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case up(r):b(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case np(r):b(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:F(r)}}catch(e){G(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(S(r)||r.length===0))for(let e of r)try{Jl(e)&&b(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){G(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new pe;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){G(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){G(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){G(e)}VC(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new pe,i=[];for(let a of e.elements){if(Mf(a))continue;let e;if(Du(a)?(b(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):ed(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){G(e)}}i.length&&w(i,D(e=>!r.has(e.name)),At(e=>e.name),Ut((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new pe,i=[];for(let a of e.elements){if(eu(a))continue;let e=a.body;if(!Xu(a)){let i=this.nameProvider.getName(a);if(b(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){G(e)}}i.length&&w(i,D(e=>!r.has(e.name)),At(e=>e.name),Ut((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:UC}=he;var WC=class extends Qe{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=mx(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(md(r))return new p(this.streamForFqnRef(t,r,e));if(bp(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Eu)return this.getProjectScope(t,n,e);if(zd(r)){let e=mx(r);return new p(this.fqnIndex.rootElements(e))}if(vp(r)&&e.property===`el`){let i=r.parent;return i?new p(this.fqnIndex.directChildrenOf(t,lx(i))):this.getProjectScope(t,n,e)}return new p(re(this.computeScope(t,e)))}catch(r){return G(r),this.getProjectScope(t,n,e)}}catch(e){return G(e),et}}*genUniqueDescedants(e){if(!e)return;let t=mx(e);if(Du(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(Jl(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(cx(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(cx(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new p(this.deploymentsIndex.directChildrenOf(e,lx(r)).filter(e=>this.reflection.isSubtype(e.type,ql))):this.getProjectScope(e,ql,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&Jl(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return re(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return Ue;if(zd(i))return re(this.genUniqueDescedants(i.imported.ref));if(Jl(i))return re(this.genUniqueDescedants(i));if(Wl(i)){let e=i.target.modelElement.value.ref,t=zd(e)?e.imported.ref:Du(e)?e:void 0;return re(this.genUniqueDescedants(t))}return Du(i)?re(this.genUniqueDescedants(i)):F(i)}*genScopeForParentlessFqnRef(e,t,n){ge(t,Fu)||ph(t)?yield*this.computeScope(e,n,Eu):fh(t)?(yield*this.computeScope(e,n,Eu),yield*this.computeScope(e,n,ql),yield*this.computeScope(e,n,Ul)):(yield*this.computeScope(e,n,ql),yield*this.computeScope(e,n,Ul),ge(t,ou)&&(yield*this.computeScope(e,n,Eu)));let r=UC(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Rd)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Eu),i=this.reflection.isSubtype(n,xc),a=UC(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&Qu(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&nd(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Gu(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===Kd?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new fe(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Kd)return super.getGlobalScope(e,t);let n=mx(t.container);return this.getProjectScope(n,e,t)}},GC=Ae();let KC;(function(e){e.type=new GC.NotificationType(`likec4/onDidChangeModel`)})(KC||={});let qC;(function(e){e.type=new GC.NotificationType0(`likec4/onDidChangeProjects`)})(qC||={});let JC;(function(e){e.type=new GC.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(JC||={});let YC;(function(e){e.type=new GC.NotificationType(`likec4/onRequestOpenView`)})(YC||={});let XC;(function(e){e.req=new GC.RequestType(`likec4/fetchComputedModel`)})(XC||={});let ZC;(function(e){e.req=new GC.RequestType0(`likec4/fetchViewsFromAllProjects`)})(ZC||={});let QC;(function(e){e.req=new GC.RequestType(`likec4/fetchLayoutedModel`)})(QC||={});let $C;(function(e){e.req=new GC.RequestType(`likec4/layout-view`)})($C||={});let ew;(function(e){e.req=new GC.RequestType(`likec4/validate-layout`)})(ew||={});let tw;(function(e){e.req=new GC.RequestType0(`likec4/reload-projects`)})(tw||={});let nw;(function(e){e.req=new GC.RequestType0(`likec4/fetch-projects`)})(nw||={});let rw;(function(e){e.req=new GC.RequestType(`likec4/register-project`)})(rw||={});let iw;(function(e){e.req=new GC.RequestType(`likec4/build`)})(iw||={});let aw;(function(e){e.req=new GC.RequestType(`likec4/locate`)})(aw||={});let ow;(function(e){e.req=new GC.RequestType(`likec4/change-view`)})(ow||={});let sw;(function(e){e.req=new GC.RequestType0(`likec4/metrics`)})(sw||={});let cw;(function(e){e.req=new GC.RequestType(`likec4/document-tags`)})(cw||={});let lw;(function(e){e.req=new GC.RequestType0(`likec4/fetch-projects-overview`)})(lw||={});const Q=W.getChild(`rpc`);var uw=class extends sx{constructor(e){super(),this.services=e}init=Rt(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=Wt(t=>{t>1?Q.debug`send ${`onDidChangeModel`} (${t} batched)`:Q.debug`send ${`onDidChangeModel`}`,e.sendNotification(KC.type,``).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=Wt(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(qC.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:100,maxBurstDurationMs:500}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(XC.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===gg.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(JC.type,async({snapshotUri:e})=>{Q.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(n.ProjectsManager.ownerProjectId(e))}),e.onRequest(QC.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:Ht(i,e=>e.id)}}}),e.onRequest($C.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(ew.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:c((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(nw.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:zt(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:x(e,e=>e.uri.toString())}})})),e.onRequest(tw.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(rw.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(g.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(ZC.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await d(e);try{let n=await t.Views.computedViews(i,e);r.push(...w(n,x(e=>({id:e.id,title:e.title??e.id,projectId:i})),Zt((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(iw.req,async({docs:t},n)=>{let a=t.map(e=>g.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>le.equals(t,e))).toArray();Q.debug(`[ServerRpc] received request to build:
|
|
1236
|
+
`))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Re(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;N(t,`RuleCstNode not found`);for(let[n,r]of we(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;m({start:e,end:t}),h.push(zn.replace({start:e,end:t},n+` `+i));continue}let o=NC(t,`{`)?.range.end;N(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;h.push(zn.insert(o,`
|
|
1237
|
+
`+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}Hn();const{findNodeForKeyword:LC}=Dn;function RC(e,{view:t,viewAst:n,layout:r}){N(n.body,`View ${t.id} has no body`);let i=n.$cstNode;N(i,`viewCstNode`);let a=c_(r.direction),o=Ue(n.body.rules,Ah),s=`autoLayout ${a}`;if(ae(r.rankSep)&&(s+=` ${r.rankSep}`,ae(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return zn.replace(o.$cstNode.range,s);let c=LC(n.body.$cstNode,`}`)?.range.start;N(c,`Closing brace not found`);let l=`\t${s}\n\t`;return zn.insert(c,l)}Hn();const zC=K.getChild(`model-changes`);var BC=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);zC.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return N(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return{success:!0,location:await n.ManualLayouts.remove(o,r)};N(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?{success:!0,location:{uri:c.uri,range:u}}:(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=U(Xo(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return zC.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return IC(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=RC(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:P(t)}}},VC=class extends un{constructor(e){super(),this.services=e}getNameStrict(e){return M(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(ln(e))return e.name;if(Bp(e))return e.imported.$refText;if(Wd(e))return e.target.modelElement.value.$refText}getNameNode(e){if(ln(e))return super.getNameNode(e);if(Bp(e))return e.imported.$refNode;if(Wd(e))return e.target.modelElement.value.$refNode}};function HC(e){return w(e,xe(e=>`${e.type}.${e.name}`),we(),_(([e,t])=>t.length===1?t:[]))}var UC=class extends mr{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){q(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(v(r)||r.length===0))for(let e of r)try{C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}exportGlobals(e,t,n){if(!(v(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}}exportModel(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{Of(r)&&C(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportLibrary(e,t,n){if(!v(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportSpecification(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case ih(r):case oh(r):C(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case gh(r):C(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case uh(r):C(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case nh(r):C(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:P(r)}}catch(e){q(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(v(r)||r.length===0))for(let e of r)try{Jd(e)&&C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new Tn;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){q(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){q(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){q(e)}HC(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new Tn,i=[];for(let a of e.elements){if(Mm(a))continue;let e;if(Of(a)?(C(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):tp(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){q(e)}}i.length&&w(i,S(e=>!r.has(e.name)),xe(e=>e.name),Se((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new Tn,i=[];for(let a of e.elements){if(ef(a))continue;let e=a.body;if(!Zf(a)){let i=this.nameProvider.getName(a);if(C(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){q(e)}}i.length&&w(i,S(e=>!r.has(e.name)),xe(e=>e.name),Se((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:WC}=pn;var GC=class extends pr{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=D_(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(hp(r))return new cn(this.streamForFqnRef(t,r,e));if(bh(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Df)return this.getProjectScope(t,n,e);if(Bp(r)){let e=D_(r);return new cn(this.fqnIndex.rootElements(e))}if(vh(r)&&e.property===`el`){let i=r.parent;return i?new cn(this.fqnIndex.directChildrenOf(t,S_(i))):this.getProjectScope(t,n,e)}return new cn(An(this.computeScope(t,e)))}catch(r){return q(r),this.getProjectScope(t,n,e)}}catch(e){return q(e),hr}}*genUniqueDescedants(e){if(!e)return;let t=D_(e);if(Of(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(Jd(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(x_(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(x_(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new cn(this.deploymentsIndex.directChildrenOf(e,S_(r)).filter(e=>this.reflection.isSubtype(e.type,qd))):this.getProjectScope(e,qd,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&Jd(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return An(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return hn;if(Bp(i))return An(this.genUniqueDescedants(i.imported.ref));if(Jd(i))return An(this.genUniqueDescedants(i));if(Wd(i)){let e=i.target.modelElement.value.ref,t=Bp(e)?e.imported.ref:Of(e)?e:void 0;return An(this.genUniqueDescedants(t))}return Of(i)?An(this.genUniqueDescedants(i)):P(i)}*genScopeForParentlessFqnRef(e,t,n){fn(t,If)||p_(t)?yield*this.computeScope(e,n,Df):f_(t)?(yield*this.computeScope(e,n,Df),yield*this.computeScope(e,n,qd),yield*this.computeScope(e,n,Ud)):(yield*this.computeScope(e,n,qd),yield*this.computeScope(e,n,Ud),fn(t,sf)&&(yield*this.computeScope(e,n,Df)));let r=WC(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,zp)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Df),i=this.reflection.isSubtype(n,xu),a=WC(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&$f(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&rp(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&Kf(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===qp?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new wn(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===qp)return super.getGlobalScope(e,t);let n=D_(t.container);return this.getProjectScope(n,e,t)}},KC=rr();let qC;(function(e){e.type=new KC.NotificationType(`likec4/onDidChangeModel`)})(qC||={});let JC;(function(e){e.type=new KC.NotificationType0(`likec4/onDidChangeProjects`)})(JC||={});let YC;(function(e){e.type=new KC.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(YC||={});let XC;(function(e){e.type=new KC.NotificationType(`likec4/onRequestOpenView`)})(XC||={});let ZC;(function(e){e.req=new KC.RequestType(`likec4/fetchComputedModel`)})(ZC||={});let QC;(function(e){e.req=new KC.RequestType0(`likec4/fetchViewsFromAllProjects`)})(QC||={});let $C;(function(e){e.req=new KC.RequestType(`likec4/fetchLayoutedModel`)})($C||={});let ew;(function(e){e.req=new KC.RequestType(`likec4/layout-view`)})(ew||={});let tw;(function(e){e.req=new KC.RequestType(`likec4/validate-layout`)})(tw||={});let nw;(function(e){e.req=new KC.RequestType0(`likec4/reload-projects`)})(nw||={});let rw;(function(e){e.req=new KC.RequestType0(`likec4/fetch-projects`)})(rw||={});let iw;(function(e){e.req=new KC.RequestType(`likec4/register-project`)})(iw||={});let aw;(function(e){e.req=new KC.RequestType(`likec4/build`)})(aw||={});let ow;(function(e){e.req=new KC.RequestType(`likec4/locate`)})(ow||={});let sw;(function(e){e.req=new KC.RequestType(`likec4/change-view`)})(sw||={});let cw;(function(e){e.req=new KC.RequestType0(`likec4/metrics`)})(cw||={});let lw;(function(e){e.req=new KC.RequestType(`likec4/document-tags`)})(lw||={});let uw;(function(e){e.req=new KC.RequestType0(`likec4/fetch-projects-overview`)})(uw||={});const Q=K.getChild(`rpc`);var dw=class extends b_{constructor(e){super(),this.services=e}init=ne(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=be(t=>{t>1?Q.debug`send ${`onDidChangeModel`} (${t} batched)`:Q.debug`send ${`onDidChangeModel`}`,e.sendNotification(qC.type,``).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=be(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(JC.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(ZC.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===Cc.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(YC.type,async({snapshotUri:e})=>{Q.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(n.ProjectsManager.ownerProjectId(e))}),e.onRequest($C.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:oe(i,e=>e.id)}}}),e.onRequest(ew.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(tw.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:c((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(rw.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:ie(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:y(e,e=>e.uri.toString())}})})),e.onRequest(nw.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(iw.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(mn.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(QC.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await qn(e);try{let n=await t.Views.computedViews(i,e);r.push(...w(n,y(e=>({id:e.id,title:e.title??e.id,projectId:i})),Oe((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(aw.req,async({docs:t},n)=>{let a=t.map(e=>mn.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>dn.equals(t,e))).toArray();Q.debug(`[ServerRpc] received request to build:
|
|
1232
1238
|
changed (total ${a.length}):${t.map(e=>`
|
|
1233
1239
|
- `+e).join(``)}
|
|
1234
1240
|
deleted (total ${o.length}):${o.map(e=>`
|
|
1235
1241
|
- `+e.toString()).join(`
|
|
1236
|
-
`)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await d(n),await i.update(a,o,n)}),e.onRequest(aw.req,e=>{switch(Q.debug`received request ${`locate`}, ${e}`,!0){case`element`in e:return t.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,e.projectId);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:e.projectId});case`view`in e:return t.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:F(e)}}),e.onRequest(ow.req,async(e,r)=>{Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuildProject(e.projectId,r),i}),e.onRequest(sw.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===gg.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=cn(n.specification.elements).length,r.deploymentKinds+=cn(n.specification.deployments).length,r.relationshipKinds+=cn(n.specification.relationships).length,r.tags+=cn(n.specification.tags).length,r.customColors+=cn(n.specification.customColors??{}).length,r.elements+=cn(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=cn(n.$data.relations).length,r.views+=cn(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await d(e),{metrics:r}}),e.onRequest(cw.req,async({documentUri:e},r)=>{let i=g.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(lw.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Me.create(()=>{a.cancel()}));function c(e){return w(e,D(e=>!!e.hasLayoutDrift),x(e=>{let n=t.ModelLocator.locateView(e.id);return P(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Ax.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(YC.type,e)}};De();var dw=class{constructor(e){this.services=e}getSymbolKind(e){let t=u(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Eu,$u,ql,Ul,Rd):return Le.Constructor;case n(df,hf,pf,xd,pp):return Le.Namespace;case n(Wc):return Le.Class;case n(`Tag`,Kd,Rl,hp):return Le.EnumMember;case n(Uf,lp):return Le.Event;case n(Au,Zl,ap,rp):return Le.TypeParameter}return Le.Field}getCompletionItemKind(e){let t=u(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Rl):return v.Color;case n(Eu,ql,Ul,$u,Rd):return v.Constructor;case n(df,hf,pf,xd,pp):return v.Module;case n(Wc):return v.Class;case n(`Tag`,Kd,Rl,hp):return v.EnumMember;case n(Uf,lp):return v.Event;case n(Au,ap,Zl,rp):return v.TypeParameter;default:return v.Reference}}},fw=class extends Be{};const pw=W.getChild(`views`);var mw=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return yn((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=yn(e.$data.views);if(n.length===0)return[];let r=vx(),i=e.project.id,a=pw.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await d(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=pw.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=vx(),r=this.cache.get(a)??await this.layouter.layout({view:a,styles:i.$styles});return this.cache.has(a)?o.debug`layout ${e} from cache`:(this.viewSucceed(a,i,r),o.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),b(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,i,t)}:r}catch(e){let t=ci(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=yn(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):G(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){pw.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=rx(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return pw.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[io]===`manual`?(pw.error(`View ${e.id} already has manual layout, this should not happen`),e):Ys(e,r):Qs(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};function hw(e){return{lsp:{NodeKindProvider:e=>new dw(e),WorkspaceSymbolProvider:e=>new fw(e)},workspace:{Cache:e=>new Ce(e,_.Validated),IndexManager:e=>new Ym(e),LangiumDocuments:e=>new vh(e),ProjectsManager:e=>new Fh(e),WorkspaceManager:e=>new Ih(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function gw(e){return{documentation:{DocumentationProvider:$(kv)},validation:{DocumentValidator:$(eC)},Rpc:$(uw),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(ox),Layouter:e=>new Ov({graphviz:new Cv}),Views:$(mw),DeploymentsIndex:$(Wx),ModelChanges:$(zC),FqnIndex:$(Bx),ModelParser:$(kC),ModelBuilder:$(sS),ModelLocator:$(mS),LastSeen:$(Jx)},lsp:{CompletionProvider:$(Sx),DocumentHighlightProvider:$(wx),DocumentSymbolProvider:$(Dx),SemanticTokenProvider:$(Rx),HoverProvider:$(kx),CodeLensProvider:$(yx),DocumentLinkProvider:$(Tx),Formatter:$(Pv),CodeActionProvider:$(jx)},workspace:{AstNodeDescriptionProvider:$(Jm)},references:{NameProvider:$(BC),ScopeComputation:$(HC),ScopeProvider:$(WC)},parser:{ValueConverter:$(AC)}}}function _w(e={},t,n,r){let i=vw(e),a=be([Ne({shared:i}),xm,gw({...Vm,...Pm,...Fm,...e}),t,n,r].reduce(yw,{}));return i.ServiceRegistry.register(a),iC(a),e.connection?Na(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function vw(e={}){let t={...Vm,...Pm,...Fm,...e};return be(xe(t),bm,hw(t))}function yw(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=yw(t,r):e[n]=r}}return e}Gr(),bi.getChild(`graphviz-binary`),Symbol.dispose,Kr(qr({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;Si({sinks:{console:yi(Jr&&!t?{formatter:gi()}:void 0)}}),process.on(`uncaughtException`,e=>{bi.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{bi.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=Zr(e.workspace||`.`);bi.info`Loading LikeC4 from workspace: ${r}`,e.watch&&bi.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`;let i=_w({...zm(e.watch),...mc,...T_(t?`stdio`:{port:n})});await i.shared.workspace.WorkspaceManager.initializeWorkspace([{uri:g.file(r).toString(),name:`workspace`}]),await i.likec4.mcp.Server.start()}})).catch(e=>{bi.error(e),process.exit(1)});export{};
|
|
1242
|
+
`)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await qn(n),await i.update(a,o,n)}),e.onRequest(ow.req,e=>{Q.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:P(e)}}),e.onRequest(sw.req,async(e,r)=>{Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuildProject(e.projectId,r),i}),e.onRequest(cw.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Cc.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=ee(n.specification.elements).length,r.deploymentKinds+=ee(n.specification.deployments).length,r.relationshipKinds+=ee(n.specification.relationships).length,r.tags+=ee(n.specification.tags).length,r.customColors+=ee(n.specification.customColors??{}).length,r.elements+=ee(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=ee(n.$data.relations).length,r.views+=ee(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await qn(e),{metrics:r}}),e.onRequest(lw.req,async({documentUri:e},r)=>{let i=mn.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(uw.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Wn.create(()=>{a.cancel()}));function c(e){return w(e,S(e=>!!e.hasLayoutDrift),y(e=>{let n=t.ModelLocator.locateView(e.id);return N(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Ix.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(XC.type,e)}};Hn();var fw=class{constructor(e){this.services=e}getSymbolKind(e){let t=Bn(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Df,ep,qd,Ud,zp):return fr.Constructor;case n(dm,hm,pm,Sp,ph):return fr.Namespace;case n(Wu):return fr.Class;case n(`Tag`,qp,Rd,hh):return fr.EnumMember;case n(Um,lh):return fr.Event;case n(jf,Zd,ah,rh):return fr.TypeParameter}return fr.Field}getCompletionItemKind(e){let t=Bn(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Rd):return or.Color;case n(Df,qd,Ud,ep,zp):return or.Constructor;case n(dm,hm,pm,Sp,ph):return or.Module;case n(Wu):return or.Class;case n(`Tag`,qp,Rd,hh):return or.EnumMember;case n(Um,lh):return or.Event;case n(jf,ah,Zd,rh):return or.TypeParameter;default:return or.Reference}}},pw=class extends er{};const mw=K.getChild(`views`);var hw=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Ye((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ye(e.$data.views);if(n.length===0)return[];let r=j_(),i=e.project.id,a=mw.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await qn(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=mw.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=j_(),r=this.cache.get(a)??await this.layouter.layout({view:a,styles:i.$styles});return this.cache.has(a)?o.debug`layout ${e} from cache`:(this.viewSucceed(a,i,r),o.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),C(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,i,t)}:r}catch(e){let t=U(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Ye(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):q(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){mw.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=bx(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return mw.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Va]===`manual`?(mw.error(`View ${e.id} already has manual layout, this should not happen`),e):Wo(e,r):qo(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};const gw={graphviz(){return new ec}};function _w(e){return{graphviz(){return e}}}function vw(e){return{lsp:{NodeKindProvider:e=>new fw(e),WorkspaceSymbolProvider:e=>new pw(e)},workspace:{Cache:e=>new Fn(e,Jn.Validated),IndexManager:e=>new Yg(e),LangiumDocuments:e=>new v_(e),ProjectsManager:e=>new Y_(e),WorkspaceManager:e=>new X_(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function yw(e){return{documentation:{DocumentationProvider:$(Kv)},validation:{DocumentValidator:$(nC)},Rpc:$(dw),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(Cx),Graphviz:t=>e.graphviz(t),Layouter:e=>new ac({graphviz:e.likec4.Graphviz}),Views:$(hw),DeploymentsIndex:$(Xx),ModelChanges:$(BC),FqnIndex:$(Kx),ModelParser:$(jC),ModelBuilder:$(cS),ModelLocator:$(hS),LastSeen:$(eS)},lsp:{CompletionProvider:$(Ox),DocumentHighlightProvider:$(Ax),DocumentSymbolProvider:$(Nx),SemanticTokenProvider:$(Wx),HoverProvider:$(Fx),CodeLensProvider:$(Tx),DocumentLinkProvider:$(jx),Formatter:$(Zv),CodeActionProvider:$(Lx)},workspace:{AstNodeDescriptionProvider:$(Jg)},references:{NameProvider:$(VC),ScopeComputation:$(UC),ScopeProvider:$(GC)},parser:{ValueConverter:$(MC)}}}function bw(e={},t,n,r){let i=xw(e),a=Mn([Gn({shared:i}),xg,yw({...Vg,...Pg,...Fg,...gw,...e}),t,n,r].reduce(Sw,{}));return i.ServiceRegistry.register(a),oC(a),e.connection?ya(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function xw(e={}){let t={...Vg,...Pg,...Fg,...e};return Mn(Nn(t),bg,vw(t))}function Sw(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=Sw(t,r):e[n]=r}}return e}Hn();var Cw=class{langium;logger;constructor(e,t=us){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
|
|
1243
|
+
${e.map(e=>` - ${e.folder.fsPath}`).join(`
|
|
1244
|
+
`)}
|
|
1245
|
+
|
|
1246
|
+
Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}projects(){return y(this.languageServices.projects(),x(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return this.LangiumDocuments.all.toArray().flatMap(e=>(e.diagnostics??[]).filter(e=>e.severity===Kn.Error).map(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.all.some(e=>e.diagnostics?.some(e=>e.severity===Kn.Error)??!1)}printErrors(){let e=!1;for(let t of this.LangiumDocuments.all){let n=t.diagnostics?.filter(e=>e.severity===1);if(n&&n.length>0){e=!0;let r=n.flatMap(e=>{let t=e.range.start.line,n=e.message.split(`
|
|
1247
|
+
`);return n.length>10&&(n.length=10,n.push(`...`)),n.map((e,n)=>n===0?` `+Qr.dim(`Line ${t}: `)+Qr.red(e):` `.repeat(10)+Qr.red(e))}).join(`
|
|
1248
|
+
`);this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}}return e}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async format(e){let{projects:t,...n}=e??{},r={...n,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(r)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const ww={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,mcp:!1,configureLogger:!1,logLevel:void 0},Tw=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
|
|
1249
|
+
`)}`);async function Ew(e,t=us,n){let r=new Cw(e,t);return(n?.throwIfInvalid??ww.throwIfInvalid)===!0&&r.hasErrors()?(await r.dispose(),Promise.reject(Tw(r))):((n?.printErrors??ww.printErrors)&&r.hasErrors()&&r.printErrors(),r)}function Dw(e){let t=e?.configureLogger??`console`;if(t!==!1){if(t===`stderr`||e?.mcp===`stdio`){il({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}il({colors:ui,logLevel:e?.logLevel})}}function Ow(e){let t=us.getChild(`lang`),n=bt(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`,mcp:!1}),r=n.graphviz===`binary`;t.info(`${Qr.dim(`layout`)} ${r?`binary`:`wasm`}`);let i=bw({...n.useFileSystem?{...zg(n.watch),...n.manualLayouts?mu:Fg}:{...Pg,...Fg},...n.mcp?Gv(n.mcp===`stdio`?`stdio`:n.mcp):{},..._w(r?new nl:new ec)});return typeof n.mcp==`object`&&n.mcp.port&&i.likec4.mcp.Server.start(n.mcp.port).catch(e=>{t.error(U(e))}),n.mcp===`stdio`&&i.likec4.mcp.Server.start().catch(e=>{t.error(U(e))}),i}async function kw(e,t){Dw(t);let n=Xr(e),r=Ur(li(n).toString());return L(globalThis,`likec4:`+n,async()=>{let e=us.getChild(`lang`),i=Ow(bt(t,{...ww,useFileSystem:!0,manualLayouts:!0,watch:!1,mcp:!1})),a={name:Zr(n),uri:r},o=i.shared.workspace.WorkspaceManager;e.info(`${Qr.dim(`workspace:`)} ${n}`),o.initialize({capabilities:{},processId:null,rootUri:null,workspaceFolders:[a]}),await o.initializeWorkspace([a]);let s=i.shared.workspace.LangiumDocuments.userDocuments.toArray();if(s.length===0&&(e.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw Error(`no LikeC4 sources found`);return e.info(`${Qr.dim(`workspace:`)} found ${s.length} source files`),Ew(i,us,t)})}$r(ei({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},graphviz:{type:`enum`,options:[`binary`,`wasm`],description:`use binary or wasm graphviz`,default:`wasm`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`},logLevel:{type:`enum`,options:[`trace`,`debug`,`info`,`warning`,`error`],description:`change log level`,required:!1}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;il({useStdErr:t,colors:Qr.isColorSupported,logLevel:e.logLevel}),process.on(`uncaughtException`,e=>{us.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{us.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=ri(e.workspace||`.`);us.info`Loading LikeC4 from workspace: ${r}`,e.watch&&us.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`,await kw(r,{graphviz:e.graphviz,mcp:t?`stdio`:{port:n},configureLogger:!1,watch:e.watch})}})).catch(e=>{us.error(e),process.exit(1)});export{};
|