@kazant/flexgraph 1.2.0 → 1.3.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.
@@ -1,2 +1,2 @@
1
- /*! FlexGraph v1.2.0 | MIT License | (c) 2026 Alexander Pettersen (kazant) | https://github.com/kazant/flexgraph */
2
- var Je=Object.defineProperty;var Qe=(r,t)=>{for(var e in t)Je(r,e,{get:t[e],enumerable:!0})};var tn=["top","right","bottom","left"],en=["TB","LR","BT","RL"],nn=["orthogonal","straight","curved"],Rt=Object.freeze({direction:"TB",nodeSpacing:40,rankSpacing:80,edgeSpacing:10,edgeRouting:"orthogonal",cornerRadius:6,lineHops:!0,hopRadius:4,animate:!0,animationDuration:300,nodeMargin:14,groupPadding:20,groupLabelHeight:22,componentSpacing:80,maxIterations:24,bendPenalty:24,crossingPenalty:120,bundleFanOut:5,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!0,multiSelect:!0,history:!0,historyLimit:100,expandText:"Details",collapseText:"Hide",explore:!1,exploreUnfocused:"dim",exploreLimit:25,exploreBreadcrumb:!0,exploreStartText:"Start",exploreMoreText:void 0,edgeTypes:{default:{markerEnd:"arrow"},"has-many":{markerStart:"one",markerEnd:"many"},"has-one":{markerStart:"one",markerEnd:"onlyOne"},"belongs-to":{markerStart:"many",markerEnd:"one"},"many-to-many":{markerStart:"many",markerEnd:"many"},association:{markerEnd:"open"},composition:{markerStart:"diamond"},dependency:{markerEnd:"open"}}}),gt=class extends Error{constructor(t,e=[]){super(t),this.name="GraphValidationError",this.details=e}},tt=r=>typeof r=="number"&&Number.isFinite(r);function yt(...r){let t={...Rt,edgeTypes:{...Rt.edgeTypes}};for(let e of r)if(e)for(let[s,o]of Object.entries(e))o!==void 0&&(s==="edgeTypes"?Object.assign(t.edgeTypes,o):t[s]=o);return en.includes(t.direction)||(t.direction="TB"),nn.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function $t(r,t,e){if(!r||typeof r!="object")throw new gt("Graph must be an object");let s=yt(r.options,t),o=[],n=[],i=[],d=new Map;for(let f of r.groups||[]){if(!f||f.id==null){o.push("Group without id");continue}let l=String(f.id);if(d.has(l)){o.push(`Duplicate group id "${l}"`);continue}let u={id:l,label:f.label??l,className:f.className||"",data:f};i.push(u),d.set(l,u)}let a=[],c=new Map;(r.nodes||[]).forEach((f,l)=>{if(!f||f.id==null){o.push(`Node at index ${l} has no id`);return}let u=String(f.id);if(c.has(u)){o.push(`Duplicate node id "${u}"`);return}let m=e&&e.get(u),w=tt(f.width)?f.width:m?m.width:s.defaultNodeWidth,M=tt(f.height)?f.height:m?m.height:s.defaultNodeHeight,b=f.group!=null?String(f.group):null;if(b&&!d.has(b)){let S={id:b,label:b,className:"",data:{id:b}};i.push(S),d.set(b,S)}let x=[],y=new Set;for(let S of f.ports||[]){if(!S||S.id==null){n.push(`Node "${u}": port without id ignored`);continue}let A=String(S.id);if(y.has(A)){n.push(`Node "${u}": duplicate port "${A}" ignored`);continue}let N=tn.includes(S.side)?S.side:null;N||n.push(`Node "${u}": port "${A}" has invalid side "${S.side}", using auto side`),y.add(A),x.push({id:A,side:N,offset:tt(S.offset)?Math.min(1,Math.max(0,S.offset)):null,label:S.label,data:S})}let _=f.constraints||{},k={pinned:!!_.pinned,x:tt(_.x)?_.x:tt(f.x)&&_.pinned?f.x:null,y:tt(_.y)?_.y:tt(f.y)&&_.pinned?f.y:null,rank:Number.isInteger(_.rank)&&_.rank>=0?_.rank:null};k.pinned&&(k.x==null||k.y==null)&&(n.push(`Node "${u}" is pinned but has no x/y; pin ignored until it has a position`),k.pinned=!1);let E={id:u,index:l,label:f.label??u,width:w,height:M,group:b,ports:x,portById:new Map(x.map(S=>[S.id,S])),constraints:k,className:f.className||"",type:f.type||null,data:f};a.push(E),c.set(u,E)});let h=[],p=new Map;(r.edges||[]).forEach((f,l)=>{if(!f)return;let u=f.id!=null?String(f.id):`e${l}`;if(p.has(u)){o.push(`Duplicate edge id "${u}"`);return}let m=String(f.source),w=String(f.target);if(!c.has(m)){o.push(`Edge "${u}": unknown source node "${m}"`);return}if(!c.has(w)){o.push(`Edge "${u}": unknown target node "${w}"`);return}let M=f.sourcePort!=null?String(f.sourcePort):null,b=f.targetPort!=null?String(f.targetPort):null;M&&!c.get(m).portById.has(M)&&(n.push(`Edge "${u}": node "${m}" has no port "${M}"`),M=null),b&&!c.get(w).portById.has(b)&&(n.push(`Edge "${u}": node "${w}" has no port "${b}"`),b=null);let x=s.edgeTypes[f.type]||s.edgeTypes.default||{},y={id:u,index:l,source:m,target:w,sourcePort:M,targetPort:b,type:f.type||"default",label:f.label??null,minLen:Number.isInteger(f.minLen)&&f.minLen>=0?f.minLen:1,weight:tt(f.weight)?f.weight:1,markerStart:f.markerStart!==void 0?f.markerStart:x.markerStart||null,markerEnd:f.markerEnd!==void 0?f.markerEnd:x.markerEnd||null,className:f.className||"",data:f};h.push(y),p.set(u,y)});let g=[];for(let f of r.constraints||[])if(!(!f||!f.type))if(f.type==="leftOf"||f.type==="before"){let l=String(f.a),u=String(f.b);if(!c.has(l)||!c.has(u)){n.push("leftOf constraint references unknown node");continue}g.push({type:"leftOf",a:l,b:u})}else if(f.type==="sameRank"){let l=(f.nodes||[]).map(String).filter(u=>c.has(u));l.length>=2?g.push({type:"sameRank",nodes:l}):n.push("sameRank constraint needs at least two known nodes")}else if(f.type==="rank"){let l=String(f.node);c.has(l)&&Number.isInteger(f.rank)&&(c.get(l).constraints.rank=f.rank)}else n.push(`Unknown constraint type "${f.type}"`);if(o.length)throw new gt(o[0],o);return{options:s,nodes:a,nodeById:c,edges:h,edgeById:p,groups:i,groupById:d,constraints:g,warnings:n}}function sn(r,t){let e=new Map(r.map(d=>[d,[]])),s=new Map(r.map(d=>[d,0]));for(let d of t)e.get(d.v).push(d),s.set(d.w,s.get(d.w)+1);let o=new Map,n=new Set,i=[...r.filter(d=>s.get(d)===0),...r];for(let d of i){if(o.has(d))continue;let a=[[d,0]];for(o.set(d,1);a.length;){let c=a[a.length-1],[h,p]=c,g=e.get(h);if(p>=g.length){o.set(h,2),a.pop();continue}c[1]++;let f=g[p],l=o.get(f.w);l===1?n.add(f.id):l||(o.set(f.w,1),a.push([f.w,0]))}}return n}var Tt=class{constructor(t){this.p=new Map(t.map(e=>[e,e]))}find(t){let e=t;for(;this.p.get(e)!==e;)e=this.p.get(e);for(;this.p.get(t)!==e;){let s=this.p.get(t);this.p.set(t,e),t=s}return e}union(t,e){let s=this.find(t),o=this.find(e);s!==o&&this.p.set(o,s)}};function ue(r,t,e={}){let s=[],o=new Tt(r);for(let x of e.sameRank||[])for(let y=1;y<x.length;y++)o.union(x[0],x[y]);let n=[...new Set(r.map(x=>o.find(x)))],i=new Set,d=new Set,a=[];for(let x of t){if(x.source===x.target){i.add(x.id);continue}let y=o.find(x.source),_=o.find(x.target);if(y===_){d.add(x.id);continue}a.push({id:x.id,v:y,w:_,minLen:x.minLen??1})}let c=sn(n,a),h=a.map(x=>c.has(x.id)?{...x,v:x.w,w:x.v}:x),p=new Map;if(e.fixedRank)for(let[x,y]of e.fixedRank){if(!o.p.has(x))continue;let _=o.find(x);p.has(_)&&p.get(_)!==y&&s.push(`Conflicting fixed ranks in sameRank set of "${x}"`),p.set(_,Math.max(p.get(_)??0,y))}let g=new Map(n.map(x=>[x,[]])),f=new Map(n.map(x=>[x,[]]));for(let x of h)g.get(x.v).push(x),f.get(x.w).push(x);let l=new Map(n.map(x=>[x,f.get(x).length])),u=n.filter(x=>l.get(x)===0),m=[];for(;u.length;){let x=u.shift();m.push(x);for(let y of g.get(x))l.set(y.w,l.get(y.w)-1),l.get(y.w)===0&&u.push(y.w)}let w=new Map;for(let x of m){let y=p.get(x)??0;for(let _ of f.get(x))y=Math.max(y,w.get(_.v)+_.minLen);p.has(x)&&y!==p.get(x)&&s.push(`Fixed rank ${p.get(x)} for "${x}" cannot be satisfied; using ${y}`),w.set(x,y)}for(let x=m.length-1;x>=0;x--){let y=m[x];if(p.has(y))continue;let _=g.get(y);if(!_.length||f.get(y).length>=_.length)continue;let E=1/0;for(let S of _)E=Math.min(E,w.get(S.w)-S.minLen);E>w.get(y)&&w.set(y,E)}let M=1/0;for(let x of w.values())M=Math.min(M,x);if(!p.size&&M>0)for(let[x,y]of w)w.set(x,y-M);let b=new Map;for(let x of r)b.set(x,w.get(o.find(x))??0);return{rank:b,reversed:c,flat:d,selfLoops:i,warnings:s}}function ge(r,t,e=0){let s=[],o=new Map;for(let c of r)o.set(c.id,s.length),s.push({id:c.id,real:!0,rank:c.rank,width:c.width,height:c.height??0,group:c.group??null,pinX:c.pinX??null,inputIndex:s.length,up:[],down:[]});let n=new Map,i=[],d=(c,h,p,g,f,l)=>{let u={a:c,b:h,aOff:p,bOff:g,w:f,edgeId:l};i.push(u),s[c].down.push({n:h,off:g,own:p,w:f}),s[h].up.push({n:c,off:p,own:g,w:f})};for(let c of t){let h=o.get(c.v),p=o.get(c.w),g=s[h].rank,f=s[p].rank;if(f<=g)continue;let l=s[h].group&&s[h].group===s[p].group?s[h].group:null,u=[],m=h,w=c.vOff||0;for(let M=g+1;M<f;M++){let b=s.length;s.push({id:`__d_${c.id}_${M}`,real:!1,rank:M,width:e,height:0,group:l,pinX:null,edgeId:c.id,inputIndex:b,up:[],down:[]}),d(m,b,w,0,c.weight??1,c.id),u.push(b),m=b,w=0}d(m,p,w,c.wOff||0,c.weight??1,c.id),n.set(c.id,u)}let a=0;for(let c of s)a=Math.max(a,c.rank);return{v:s,index:o,segs:i,chains:n,maxRank:a}}function Ht(r){let t=Array.from({length:r.maxRank+1},()=>[]),e=new Uint8Array(r.v.length),s=r.v.map((o,n)=>n).filter(o=>r.v[o].real).sort((o,n)=>r.v[o].rank-r.v[n].rank||r.v[o].inputIndex-r.v[n].inputIndex);for(let o of s){if(e[o])continue;let n=[o];for(;n.length;){let i=n.pop();if(e[i])continue;e[i]=1,t[r.v[i].rank].push(i);let d=r.v[i].down.map(a=>a.n);for(let a=d.length-1;a>=0;a--)e[d[a]]||n.push(d[a])}}for(let o=0;o<r.v.length;o++)e[o]||t[r.v[o].rank].push(o);return t}function on(r){let t=r.length;if(t<2)return 0;let e=r.slice(),s=new Array(t),o=0;for(let n=1;n<t;n*=2){for(let i=0;i<t;i+=2*n){let d=Math.min(i+n,t),a=Math.min(i+2*n,t),c=i,h=d,p=i;for(;c<d&&h<a;)e[c]<=e[h]?s[p++]=e[c++]:(o+=d-c,s[p++]=e[h++]);for(;c<d;)s[p++]=e[c++];for(;h<a;)s[p++]=e[h++]}[e,s]=[s,e]}return o}function rn(r,t,e,s){let o=[];for(let n of t)for(let i of r.v[n].down)o.push([s[n]+i.own*.999,s[i.n]+i.off*.999]);return o.sort((n,i)=>n[0]-i[0]||n[1]-i[1]),on(o.map(n=>n[1]))}function zt(r,t){let e=Mt(r,t),s=0;for(let o=0;o<t.length-1;o++)s+=rn(r,t[o],t[o+1],e);return s}function Mt(r,t){let e=new Float64Array(r.v.length);for(let s of t)s.forEach((o,n)=>{e[o]=n});return e}function ye(r,t={}){let e=t.maxIterations??24,s=(t.leftOf||[]).map(([c,h])=>[r.index.get(c),r.index.get(h)]).filter(([c,h])=>c!=null&&h!=null&&r.v[c].rank===r.v[h].rank),o=new Set(s.map(([c,h])=>c+":"+h)),n=[];t.initial&&n.push(t.initial.map(c=>c.slice()));let i=Ht(r);n.push(i),!t.initial&&e>4&&(n.push(i.map(c=>c.slice().reverse())),n.push(i.map(c=>c.slice().sort((h,p)=>r.v[h].inputIndex-r.v[p].inputIndex))));let d=null,a=1/0;for(let c of n){let h=an(r,c,s,o,e);if(h.crossings<a&&(d=h.layers,a=h.crossings),a===0)break}return{layers:d,crossings:a}}function an(r,t,e,s,o){let n=t.map(c=>xe(r,c,e)),i=n.map(c=>c.slice()),d=zt(r,n),a=0;for(let c=0;c<o&&d>0;c++){let h=c%2===0;dn(r,n,h,e,c%4>=2),hn(r,n,s);let p=zt(r,n);if(p<d)d=p,i=n.map(g=>g.slice()),a=0;else if(++a>=6)break}if(d>0&&o>4){n=i.map(c=>c.slice());for(let c=0;c<2;c++){cn(r,n,s);let h=zt(r,n);if(h<d)d=h,i=n.map(p=>p.slice());else break}}return{layers:i,crossings:d}}function cn(r,t,e){let s=Mt(r,t);for(let o of t)if(!(o.length<3||o.length>120))for(let n of o.slice()){let i=r.v[n];if(i.pinX!=null||i.group)continue;let d=o.indexOf(n),a=0,c=d,h=0;for(let p=d-1;p>=0;p--){let g=o[p];if(e.has(g+":"+n)||r.v[g].group)break;h+=ct(r,n,g,s)-ct(r,g,n,s),h<a&&(a=h,c=p)}h=0;for(let p=d+1;p<o.length;p++){let g=o[p];if(e.has(n+":"+g)||r.v[g].group)break;h+=ct(r,g,n,s)-ct(r,n,g,s),h<a&&(a=h,c=p)}c!==d&&(o.splice(d,1),o.splice(c,0,n),o.forEach((p,g)=>{s[p]=g}))}}function dn(r,t,e,s,o){let n=Mt(r,t),i=t.length,d=e?pe(1,i):pe(i-2,-1,-1);for(let a of d){let c=t[a],h=new Map;c.forEach((l,u)=>{let m=e?r.v[l].up:r.v[l].down;if(!m.length){h.set(l,u);return}if(o){let b=m.map(y=>n[y.n]+y.off-y.own).sort((y,_)=>y-_),x=b.length>>1;h.set(l,b.length%2?b[x]:(b[x-1]+b[x])/2);return}let w=0,M=0;for(let b of m)w+=(n[b.n]+b.off-b.own)*b.w,M+=b.w;h.set(l,w/M)});let p=new Map;for(let l of c){let u=r.v[l].group;if(!u)continue;let m=p.get(u)||[0,0];m[0]+=h.get(l),m[1]++,p.set(u,m)}let g=l=>{let u=r.v[l].group;return u?p.get(u)[0]/p.get(u)[1]:h.get(l)},f=new Map(c.map((l,u)=>[l,u]));c.sort((l,u)=>g(l)-g(u)||(r.v[l].group||"").localeCompare(r.v[u].group||"")||h.get(l)-h.get(u)||f.get(l)-f.get(u)),t[a]=xe(r,c,s),t[a].forEach((l,u)=>{n[l]=u})}}function xe(r,t,e){let s=t.slice(),o=[],n=[];if(s.forEach((i,d)=>{r.v[i].pinX!=null&&(o.push(d),n.push(i))}),n.length>1&&(n.sort((i,d)=>r.v[i].pinX-r.v[d].pinX),o.forEach((i,d)=>{s[i]=n[d]})),e.length)for(let i=0;i<e.length+1;i++){let d=!1;for(let[a,c]of e){let h=s.indexOf(a),p=s.indexOf(c);h<0||p<0||h<p||(s.splice(h,1),s.splice(s.indexOf(c),0,a),d=!0)}if(!d)break}return s}function ct(r,t,e,s){let o=0;for(let n of["up","down"]){let i=r.v[t][n],d=r.v[e][n];for(let a of i)for(let c of d)s[a.n]+a.off>s[c.n]+c.off&&(o+=a.w*c.w)}return o}function hn(r,t,e){let s=Mt(r,t),o=!0,n=0;for(;o&&n++<8;){o=!1;for(let i of t)for(let d=0;d<i.length-1;d++){let a=i[d],c=i[d+1],h=r.v[a],p=r.v[c];if((h.group||null)!==(p.group||null)||h.pinX!=null&&p.pinX!=null||e.has(a+":"+c))continue;let g=ct(r,a,c,s);ct(r,c,a,s)<g&&(i[d]=c,i[d+1]=a,s[c]=d,s[a]=d+1,o=!0)}}}function pe(r,t,e=1){let s=[];if(e>0)for(let o=r;o<t;o+=e)s.push(o);else for(let o=r;o>t;o+=e)s.push(o);return s}function ln(r,t,e){let s=r.length,o=new Float64Array(s);for(let h=1;h<s;h++)o[h]=o[h-1]+e[h];let n=[],i=[],d=[],a=[];for(let h=0;h<s;h++)for(n.push(r[h]-o[h]),i.push(t[h]),d.push(h),a.push(h);n.length>1&&n[n.length-2]>n[n.length-1];){let p=n.length-1,g=p-1,f=i[g]+i[p];n[g]=(n[g]*i[g]+n[p]*i[p])/f,i[g]=f,a[g]=a[p],n.pop(),i.pop(),d.pop(),a.pop()}let c=new Float64Array(s);for(let h=0;h<n.length;h++)for(let p=d[h];p<=a[h];p++)c[p]=n[h]+o[p];return c}function me(r,t,e){let s=r.v.length,o=new Float64Array(s),n=new Float64Array(s),i=e.groupPadding??20,d=e.groupLabelHeight??0,a=(b,x)=>{let y=r.v[b],_=r.v[x],k;return!y.real&&!_.real?k=e.edgeSpacing:!y.real||!_.real?k=(e.nodeSpacing+e.edgeSpacing)/2:k=e.nodeSpacing,y.group!==_.group&&(y.group&&(k+=i),_.group&&(k+=i+(e.labelOnOrderAxis?d:0))),(y.width+_.width)/2+k},c=t.map(b=>b.map((x,y)=>y===0?0:a(b[y-1],x)));t.forEach((b,x)=>{let y=0;b.forEach((k,E)=>{y+=c[x][E],o[k]=y});let _=y/2;b.forEach(k=>{o[k]-=_})});let h=b=>r.v[b].real?1:4,p=(b,x,y)=>{let _=t[b];if(!_.length)return;let k=new Array(_.length),E=new Array(_.length);_.forEach((A,N)=>{let O=r.v[A];if(O.pinX!=null){k[N]=O.pinX,E[N]=1e6;return}let v=0,P=0,T=K=>{for(let q of K){let nt=q.w*(r.v[q.n].real?1:2)*h(A);v+=(o[q.n]+q.off*r.v[q.n].width-q.own*O.width)*nt,P+=nt}};x&&T(O.up),y&&T(O.down),P===0?(k[N]=o[A],E[N]=.05):(k[N]=v/P,E[N]=P)});let S=ln(k,E,c[b]);_.forEach((A,N)=>{o[A]=S[N]})},g=t.length,f=e.iterations??8;for(let b=0;b<f;b++){for(let x=1;x<g;x++)p(x,!0,!1);for(let x=g-2;x>=0;x--)p(x,!1,!0)}for(let b=0;b<2;b++){for(let x=0;x<g;x++)p(x,!0,!0);for(let x=g-1;x>=0;x--)p(x,!0,!0)}let l=t.map(b=>b.reduce((x,y)=>Math.max(x,r.v[y].height||0),0)),u=new Map;for(let b of r.v){if(!b.real||!b.group)continue;let x=u.get(b.group)||[1/0,-1/0];x[0]=Math.min(x[0],b.rank),x[1]=Math.max(x[1],b.rank),u.set(b.group,x)}let m=new Float64Array(g);for(let[b,x]of u.values()){let y=e.labelOnOrderAxis||e.labelAtRankEnd?0:d,_=e.labelAtRankEnd&&!e.labelOnOrderAxis?d:0;b>0&&(m[b]=Math.max(m[b],i+y)),x<g-1&&(m[x+1]=Math.max(m[x+1],i+_))}let w=[],M=0;for(let b=0;b<g;b++)b>0?M+=l[b-1]/2+e.rankSpacing+m[b]+l[b]/2:M=l[0]/2,w.push(M);for(let b=0;b<s;b++)n[b]=w[r.v[b].rank];return{x:o,y:n,rankY:w,rankHeight:l}}var U={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function we(r){switch(r){case"LR":return{x:1,y:0,exit:"right",entry:"left"};case"RL":return{x:-1,y:0,exit:"left",entry:"right"};case"BT":return{x:0,y:-1,exit:"top",entry:"bottom"};default:return{x:0,y:1,exit:"bottom",entry:"top"}}}function dt(r){let t=new Map,e={top:[],right:[],bottom:[],left:[]};for(let s of r.ports)s.side&&e[s.side].push(s);for(let s of Object.keys(e)){let o=e[s];o.forEach((n,i)=>{let d=n.offset!=null?n.offset:(i+1)/(o.length+1);t.set(n.id,{side:s,t:d,...fn(s,d)})})}return t}function fn(r,t){switch(r){case"top":return{px:t,py:0};case"bottom":return{px:t,py:1};case"left":return{px:0,py:t};default:return{px:1,py:t}}}var et=r=>({x:r.x+r.width/2,y:r.y+r.height/2});function be(r,t){return{x:r.x-t,y:r.y-t,width:r.width+2*t,height:r.height+2*t}}function Me(r,t,e,s=.5){return t>r.x+s&&t<r.x+r.width-s&&e>r.y+s&&e<r.y+r.height-s}function ht(r,t,e,s=.5){let o=e.x+s,n=e.x+e.width-s,i=e.y+s,d=e.y+e.height-s;if(n<=o||d<=i)return!1;let a=0,c=1,h=t.x-r.x,p=t.y-r.y,g=(f,l)=>{if(f===0)return l>0;let u=l/f;if(f<0){if(u>c)return!1;u>a&&(a=u)}else{if(u<a)return!1;u<c&&(c=u)}return!0};return!g(-h,r.x-o)||!g(h,n-r.x)||!g(-p,r.y-i)||!g(p,d-r.y)?!1:c-a>1e-9}function Ft(r,t){let e=et(r),s=t.x-e.x,o=t.y-e.y;if(s===0&&o===0)return{...e,side:"bottom"};let n=s!==0?r.width/2/Math.abs(s):1/0,i=o!==0?r.height/2/Math.abs(o):1/0,d=Math.min(n,i),a=n<i?s>0?"right":"left":o>0?"bottom":"top";return{x:e.x+s*d,y:e.y+o*d,side:a}}function _t(r){let t=[];for(let e of r){let s=t[t.length-1];s&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01||t.push({x:e.x,y:e.y})}for(let e=t.length-2;e>=1;e--){let s=t[e-1],o=t[e],n=t[e+1],i=(o.x-s.x)*(n.y-o.y)-(o.y-s.y)*(n.x-o.x),d=(o.x-s.x)*(n.x-o.x)+(o.y-s.y)*(n.y-o.y);Math.abs(i)<.01&&d>=0&&t.splice(e,1)}return t}function un(r){let t=0;for(let e=1;e<r.length;e++)t+=Math.hypot(r[e].x-r[e-1].x,r[e].y-r[e-1].y);return t}function Dt(r,t){if(r.length===0)return[];if(r.length===1)return Array.from({length:t},()=>({...r[0]}));let e=un(r)||1,s=[],o=0,n=0;for(let i=0;i<t;i++){let d=e*i/(t-1);for(;o<r.length-2;){let g=Math.hypot(r[o+1].x-r[o].x,r[o+1].y-r[o].y);if(n+g>=d)break;n+=g,o++}let a=r[o],c=r[o+1],h=Math.hypot(c.x-a.x,c.y-a.y)||1,p=Math.min(1,Math.max(0,(d-n)/h));s.push({x:a.x+(c.x-a.x)*p,y:a.y+(c.y-a.y)*p})}return s}var _e=(r,t,e)=>{switch(r){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:-e,y:t};default:return{x:t,y:e}}},Xt=(r,t,e)=>{switch(r){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:e,y:-t};default:return{x:t,y:e}}};function kt(r,t={}){return r.nodes.some(e=>e.group)?pn(r,t):Gt(r,t)}function ke(r,t,e){let s=new Set(t.map(n=>n.id)),o=t.map(n=>({...n,group:null,constraints:e?n.constraints:{...n.constraints,pinned:!1}}));return{options:r.options,nodes:o,nodeById:new Map(o.map(n=>[n.id,n])),edges:r.edges.filter(n=>s.has(n.source)&&s.has(n.target)),groups:[],groupById:new Map,constraints:r.constraints.filter(n=>n.type==="sameRank"?n.nodes.every(i=>s.has(i)):s.has(n.a)&&s.has(n.b)),warnings:[]}}function pn(r,t){let e=ve(r,t.hints||null,t.hints||null),s=new Map,o=i=>({x:i.x+i.width/2,y:i.y+i.height/2});for(let i of r.nodes){let d=e.nodes.get(i.id);if(!i.group){s.set(i.id,o(d));continue}let a=0,c=0,h=0;for(let p of r.edges){let g=p.source===i.id?p.target:p.target===i.id?p.source:null;if(g==null||r.nodeById.get(g).group===i.group)continue;let f=o(e.nodes.get(g));a+=f.x,c+=f.y,h++}s.set(i.id,h?{x:a/h,y:c/h}:o(d))}let n=ve(r,s,t.hints||s);return n.crossingsRouted<=e.crossingsRouted?n:e}function ve(r,t,e){let s=r.options,o=s.groupPadding,n=s.groupLabelHeight,i=new Map;for(let l of r.nodes)l.group&&(i.has(l.group)||i.set(l.group,[]),i.get(l.group).push(l));let d=new Map,a=[];for(let[l,u]of i){let m=Gt(ke(r,u,!1),{hints:t}),w=m.bounds,M="\0group:"+l;d.set(l,{sub:m,b:w,blockId:M}),a.push({id:M,index:-1,label:l,width:w.width+2*o,height:w.height+2*o+n,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let c=l=>{let u=r.nodeById.get(l);return u.group?d.get(u.group).blockId:l},h=ke(r,r.nodes.filter(l=>!l.group),!0);h.nodes.push(...a);for(let l of a)h.nodeById.set(l.id,l);h.edges=[];for(let l of r.edges){let u=c(l.source),m=c(l.target);u===m&&(l.source!==l.target||u!==l.source)||h.edges.push({...l,source:u,target:m,sourcePort:u===l.source?l.sourcePort:null,targetPort:m===l.target?l.targetPort:null})}let p=null;if(e){p=new Map(e);for(let[l,u]of i){let m=0,w=0,M=0;for(let b of u){let x=e.get(b.id);x&&(m+=x.x,w+=x.y,M++)}M&&p.set(d.get(l).blockId,{x:m/M,y:w/M})}}let g=Gt(h,{hints:p}),f={nodes:new Map,edges:new Map,groups:new Map,crossings:g.crossings,warnings:g.warnings};for(let l of r.nodes)l.group||f.nodes.set(l.id,g.nodes.get(l.id));for(let[,{sub:l,b:u,blockId:m}]of d){let w=g.nodes.get(m),M=w.x+o-u.x,b=w.y+o+n-u.y;for(let[x,y]of l.nodes)f.nodes.set(x,{...y,x:y.x+M,y:y.y+b});for(let[x,y]of l.edges)f.edges.set(x,{...y,waypoints:y.waypoints.map(_=>({x:_.x+M,y:_.y+b}))});f.crossings+=l.crossings}for(let l of r.edges){if(f.edges.has(l.id))continue;let u=g.edges.get(l.id),m=c(l.source)!==l.source||c(l.target)!==l.target;f.edges.set(l.id,u?{...u,waypoints:m?[]:u.waypoints}:{waypoints:[],reversed:!1,selfLoop:l.source===l.target,flat:!1})}for(let l of r.nodes)if(l.group&&l.constraints.pinned){let u=f.nodes.get(l.id);u.x=l.constraints.x,u.y=l.constraints.y}if(mt(r,f),!r.nodes.some(l=>l.constraints.pinned)){let l=xt(f);Se(f,-l.x,-l.y);for(let u of f.groups.values())u.x-=l.x,u.y-=l.y}return f.bounds=xt(f),f.crossingsRouted=gn(r,f),f}function gn(r,t){let e=[];for(let n of r.edges){if(n.source===n.target)continue;let i=t.nodes.get(n.source),d=t.nodes.get(n.target);e.push([n.source,n.target,i.x+i.width/2,i.y+i.height/2,d.x+d.width/2,d.y+d.height/2])}let s=0,o=(n,i,d,a,c,h)=>(d-n)*(h-i)-(a-i)*(c-n);for(let n=0;n<e.length;n++)for(let i=n+1;i<e.length;i++){let d=e[n],a=e[i];if(d[0]===a[0]||d[0]===a[1]||d[1]===a[0]||d[1]===a[1])continue;let c=o(a[2],a[3],a[4],a[5],d[2],d[3]),h=o(a[2],a[3],a[4],a[5],d[4],d[5]),p=o(d[2],d[3],d[4],d[5],a[2],a[3]),g=o(d[2],d[3],d[4],d[5],a[4],a[5]);c*h<0&&p*g<0&&s++}return s}function Gt(r,t={}){let e=r.options,s=e.direction,o=s==="LR"||s==="RL",n=[],i=new Map;for(let g of r.nodes){let f=dt(g),l=new Map;for(let[w,M]of f)l.set(w,(o?M.py:M.px)-.5);let u=null,m=null;if(g.constraints.pinned){let w=Xt(s,g.constraints.x+g.width/2,g.constraints.y+g.height/2);u=w.x,m=w.y}i.set(g.id,{iw:o?g.height:g.width,ih:o?g.width:g.height,frac:l,pinX:u,pinY:m})}let d=xn(r),a={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:n},c=[];for(let g of d){let f=g.nodes,l=new Set(f),u=r.edges.filter(v=>l.has(v.source)),m=new Map;for(let v of f){let P=r.nodeById.get(v).constraints.rank;P!=null&&m.set(v,P)}let w=r.constraints.filter(v=>v.type==="sameRank").map(v=>v.nodes.filter(P=>l.has(P))).filter(v=>v.length>1),M=ue(f,u,{fixedRank:m,sameRank:w});n.push(...M.warnings);let b=f.map(v=>{let P=r.nodeById.get(v),T=i.get(v);return{id:v,rank:M.rank.get(v),width:T.iw,height:T.ih,group:P.group,pinX:T.pinX}}),x=[];for(let v of u){if(M.selfLoops.has(v.id)||M.flat.has(v.id))continue;let P=M.reversed.has(v.id),T=v.sourcePort?i.get(v.source).frac.get(v.sourcePort)??0:0,K=v.targetPort?i.get(v.target).frac.get(v.targetPort)??0:0;x.push(P?{id:v.id,v:v.target,w:v.source,vOff:K,wOff:T,weight:v.weight}:{id:v.id,v:v.source,w:v.target,vOff:T,wOff:K,weight:v.weight})}let y=ge(b,x,0),_;t.hints&&t.hints.size&&(_=yn(y,t.hints,s));let k=r.constraints.filter(v=>v.type==="leftOf"&&l.has(v.a)&&l.has(v.b)).map(v=>[v.a,v.b]),E=ye(y,{maxIterations:e.maxIterations,leftOf:k,initial:_});a.crossings+=E.crossings;let S=me(y,E.layers,{nodeSpacing:e.nodeSpacing,edgeSpacing:e.edgeSpacing,rankSpacing:e.rankSpacing,groupPadding:e.groupPadding,groupLabelHeight:e.groupLabelHeight,labelOnOrderAxis:o,labelAtRankEnd:s==="BT"||s==="RL"?!o:!1}),A=f.filter(v=>i.get(v).pinY!=null);if(A.length){let v=0;for(let P of A)v+=i.get(P).pinY-S.y[y.index.get(P)];v/=A.length;for(let P=0;P<S.y.length;P++)S.y[P]+=v;for(let P of A){let T=y.index.get(P);S.x[T]=i.get(P).pinX,S.y[T]=i.get(P).pinY}}let N=1/0,O=-1/0;for(let v=0;v<y.v.length;v++){let P=y.v[v].width/2;N=Math.min(N,S.x[v]-P),O=Math.max(O,S.x[v]+P)}c.push({comp:g,g:y,co:S,rk:M,layers:E.layers,minX:N,maxX:O,pinned:A.length>0})}if(t.hints&&t.hints.size){let g=l=>{let u=0,m=0;for(let w of l.comp.nodes){let M=t.hints.get(w);M&&(u+=Xt(s,M.x,M.y).x,m++)}return m?u/m:1/0},f=new Map(c.map(l=>[l,g(l)]));c.sort((l,u)=>f.get(l)-f.get(u))}let h=-1/0;for(let g of c)g.pinned&&(h=Math.max(h,g.maxX+e.componentSpacing));h===-1/0&&(h=0);for(let g of c){if(g.pinned)continue;let f=h-g.minX;for(let l=0;l<g.co.x.length;l++)g.co.x[l]+=f;h+=g.maxX-g.minX+e.componentSpacing}for(let g of c){let{g:f,co:l,rk:u}=g;g.layers.forEach((m,w)=>m.forEach((M,b)=>{let x=f.v[M];if(!x.real)return;let y=r.nodeById.get(x.id),_=_e(s,l.x[M],l.y[M]);a.nodes.set(x.id,{x:_.x-y.width/2,y:_.y-y.height/2,width:y.width,height:y.height,rank:w,order:b})}));for(let m of r.edges){if(!g.comp.set.has(m.source))continue;let M=(f.chains.get(m.id)||[]).map(x=>_e(s,l.x[x],l.y[x])),b=u.reversed.has(m.id);b&&(M=M.reverse()),a.edges.set(m.id,{waypoints:M,reversed:b,selfLoop:u.selfLoops.has(m.id),flat:u.flat.has(m.id)})}}if(!c.some(g=>g.pinned)){let g=1/0,f=1/0;for(let u of a.nodes.values())g=Math.min(g,u.x),f=Math.min(f,u.y);let l=r.groups.length?e.groupPadding+e.groupLabelHeight:0;Number.isFinite(g)&&Se(a,-g+l,-f+l)}return mt(r,a),a.bounds=xt(a),a}function Se(r,t,e){for(let s of r.nodes.values())s.x+=t,s.y+=e;for(let s of r.edges.values())for(let o of s.waypoints)o.x+=t,o.y+=e}function mt(r,t){let e=r.options;t.groups=new Map;for(let s of r.groups){let o=1/0,n=1/0,i=-1/0,d=-1/0;for(let c of r.nodes){if(c.group!==s.id)continue;let h=t.nodes.get(c.id);h&&(o=Math.min(o,h.x),n=Math.min(n,h.y),i=Math.max(i,h.x+h.width),d=Math.max(d,h.y+h.height))}if(!Number.isFinite(o))continue;let a=e.groupPadding;t.groups.set(s.id,{x:o-a,y:n-a-e.groupLabelHeight,width:i-o+2*a,height:d-n+2*a+e.groupLabelHeight})}return t.groups}function xt(r){let t=1/0,e=1/0,s=-1/0,o=-1/0,n=i=>{t=Math.min(t,i.x),e=Math.min(e,i.y),s=Math.max(s,i.x+i.width),o=Math.max(o,i.y+i.height)};for(let i of r.nodes.values())n(i);for(let i of r.groups.values())n(i);return Number.isFinite(t)?{x:t,y:e,width:s-t,height:o-e}:{x:0,y:0,width:0,height:0}}function yn(r,t,e){let s=Ht(r),o=new Float64Array(r.v.length).fill(NaN);r.v.forEach((n,i)=>{if(n.real&&t.has(n.id)){let d=t.get(n.id);o[i]=Xt(e,d.x,d.y).x}});for(let[,n]of r.chains){if(!n.length)continue;let i=r.v[n[0]].up[0]?.n,d=r.v[n[n.length-1]].down[0]?.n;i==null||d==null||Number.isNaN(o[i])||Number.isNaN(o[d])||n.forEach((a,c)=>{o[a]=o[i]+(o[d]-o[i])*(c+1)/(n.length+1)})}return s.map(n=>{let i=new Map(n.map((d,a)=>[d,a]));return n.slice().sort((d,a)=>{let c=o[d],h=o[a];return Number.isNaN(c)&&Number.isNaN(h)?i.get(d)-i.get(a):Number.isNaN(c)?1:Number.isNaN(h)?-1:c-h})})}function xn(r){let t=new Map(r.nodes.map(i=>[i.id,i.id])),e=i=>{for(;t.get(i)!==i;)t.set(i,t.get(t.get(i))),i=t.get(i);return i},s=(i,d)=>{let a=e(i),c=e(d);a!==c&&t.set(c,a)};for(let i of r.edges)s(i.source,i.target);let o=new Map;for(let i of r.nodes)i.group&&(o.has(i.group)?s(o.get(i.group),i.id):o.set(i.group,i.id));for(let i of r.constraints)if(i.type==="leftOf"&&s(i.a,i.b),i.type==="sameRank")for(let d of i.nodes)s(i.nodes[0],d);let n=new Map;for(let i of r.nodes){let d=e(i.id);n.has(d)||n.set(d,[]),n.get(d).push(i.id)}return[...n.values()].map(i=>({nodes:i,set:new Set(i)}))}function Ee(r,t,e,s){let o=s==="LR"||s==="RL",n=[...r.nodes.entries()],i=(d,a)=>d.x<a.x+a.width+e&&a.x<d.x+d.width+e&&d.y<a.y+a.height+e&&a.y<d.y+d.height+e;for(let[d,a]of n)if(!t.has(d))for(let c=0;c<200;c++){let h=n.find(([g,f])=>g!==d&&i(a,f));if(!h)break;let p=h[1];o?a.y=p.y+p.height+e:a.x=p.x+p.width+e}}function mn(r,t,e){let s=we(e),o=et(r),n=et(t),i=n.x-o.x,d=n.y-o.y,a=Math.abs(i)-(r.width+t.width)/2,c=Math.abs(d)-(r.height+t.height)/2,h=s.x!==0?i*s.x:d*s.y,p=s.x!==0?a:c;return h>0&&p>4?[s.exit,s.entry]:a>=c?i>=0?["right","left"]:["left","right"]:d>=0?["bottom","top"]:["top","bottom"]}function Ie(r,t){let e=r.options.direction,s=new Map,o=new Map;for(let a of r.nodes){let c=t.get(a.id);if(!c)continue;let h=dt(a),p=new Map;for(let[g,f]of h)p.set(g,{x:c.x+f.px*c.width,y:c.y+f.py*c.height,side:f.side,t:f.t});o.set(a.id,p)}let n=new Map,i=new Map;for(let a of r.edges){let c=t.get(a.source),h=t.get(a.target);if(!c||!h)continue;if(a.source===a.target){let u=o.get(a.source),m=a.sourcePort&&u.get(a.sourcePort),w=a.targetPort&&u.get(a.targetPort),M=Math.min(20,c.width/4,c.height/4);s.set(a.id,{source:m&&m.side?{x:m.x,y:m.y,side:m.side}:{x:c.x+c.width-M,y:c.y,side:"top"},target:w&&w.side?{x:w.x,y:w.y,side:w.side}:{x:c.x+c.width,y:c.y+M,side:"right"}});continue}let[p,g]=mn(c,h,e),f=a.sourcePort&&o.get(a.source).get(a.sourcePort),l=a.targetPort&&o.get(a.target).get(a.targetPort);f&&f.side&&(p=f.side),l&&l.side&&(g=l.side),i.set(a.id,[p,g]),f||Le(n,a.source+"|"+p,{edgeId:a.id,end:"source",other:a.target}),l||Le(n,a.target+"|"+g,{edgeId:a.id,end:"target",other:a.source}),s.set(a.id,{source:f?{x:f.x,y:f.y,side:f.side}:null,target:l?{x:l.x,y:l.y,side:l.side}:null})}for(let a=0;a<2;a++)for(let[c,h]of n){let[p,g]=c.split("|"),f=t.get(p),l=g==="top"||g==="bottom",u=w=>{let M=s.get(w.edgeId),b=w.end==="source"?M.target:M.source;if(a>0&&b)return l?b.x:b.y;let x=et(t.get(w.other));return l?x.x:x.y};h.sort((w,M)=>u(w)-u(M)||(w.edgeId<M.edgeId?-1:1));let m=[...o.get(p)?.values()||[]].filter(w=>w.side===g).map(w=>w.t);h.forEach((w,M)=>{let b=(M+1)/(h.length+1);for(let y of m)Math.abs(y-b)<.06&&(b=Math.min(.95,b+.1));let x=l?{x:f.x+b*f.width,y:g==="top"?f.y:f.y+f.height,side:g}:{x:g==="left"?f.x:f.x+f.width,y:f.y+b*f.height,side:g};s.get(w.edgeId)[w.end]=x})}let d=a=>{a&&(a.x=Math.round(a.x*100)/100,a.y=Math.round(a.y*100)/100)};for(let a of s.values())d(a.source),d(a.target);return{ends:s,ports:o,sides:i}}function Le(r,t,e){r.has(t)||r.set(t,[]),r.get(t).push(e)}function Pe(r,t,e){let s=e.spacing,o={h:new Map,v:new Map},n=new Map;for(let[p,g]of r)n.set(p,g.points.map(f=>({x:f.x,y:f.y})));for(let[p,g]of r){if(g.kind!=="orthogonal"||g.bundle)continue;let f=g.points;for(let l=0;l<f.length-1;l++){if(e.fixedEnds!==!1&&(l===0||l===f.length-2))continue;let u=f[l],m=f[l+1],w=Math.abs(u.x-m.x)<.01,M=Math.abs(u.y-m.y)<.01;if(!w&&!M)continue;let b=w?u.x:u.y,x=w?Math.min(u.y,m.y):Math.min(u.x,m.x),y=w?Math.max(u.y,m.y):Math.max(u.x,m.x);if(y-x<.5)continue;let _=w?u.y<=m.y:u.x<=m.x,k=f[l-1],E=f[l+2],S=(T,K)=>T?Math.sign(w?T.x-K.x:T.y-K.y):0,A=S(k,u),N=S(E,m),O={id:p,i:l,c:b,lo:x,hi:y,vertical:w,loIsA:_,pts:n.get(p),dirLo:_?A:N,dirHi:_?N:A},v=Math.round(b*100),P=w?o.v:o.h;P.has(v)||P.set(v,[]),P.get(v).push(O)}}let i=[...o.v.values()].flat(),d=[...o.h.values()].flat(),a=[];for(let p of[!0,!1])for(let g of(p?o.v:o.h).values()){if(g.length<2)continue;g.sort((m,w)=>m.lo-w.lo);let f=[g[0]],l=g[0].hi,u=()=>{f.length>1&&c(f,p)};for(let m=1;m<g.length;m++){let w=g[m];w.lo<l-.5?(f.push(w),l=Math.max(l,w.hi)):(u(),f=[w],l=w.hi)}u()}function c(p,g){if(new Set(p.map(_=>_.id)).size<2)return;let f=[];for(let _ of p){let k=f.length;for(;k>0&&Mn(_,f[k-1])<0;)k--;f.splice(k,0,_)}let l=p[0].c,u=Math.min(...p.map(_=>_.lo)),m=Math.max(...p.map(_=>_.hi)),w=1/0,M=1/0;for(let _ of t.values()){let k=g?_.y:_.x;if((g?_.y+_.height:_.x+_.width)<=u||k>=m)continue;let S=g?_.x:_.y,A=g?_.x+_.width:_.y+_.height;A<=l+.01?w=Math.min(w,l-A):S>=l-.01&&(M=Math.min(M,S-l))}for(let _ of g?i:d){if(_.c===l||_.hi<=u||_.lo>=m)continue;let k=Math.abs(_.c-l)/2;_.c<l?w=Math.min(w,k+4):M=Math.min(M,k+4)}let b=f.length,x=Math.max(0,Math.min(w,M)-4),y=Math.min(s,b>1?2*x/(b-1):s);f.forEach((_,k)=>{let E=(k-(b-1)/2)*y;Math.abs(E)>.01&&a.push([_.id,_.i,g,E])})}let h=new Map;for(let[p,g,f,l]of a)h.has(p)||h.set(p,new Map),h.get(p).set(g,f?{x:l,y:0}:{x:0,y:l});for(let[p,g]of h){let f=r.get(p),l=f.points,u=[],m={x:0,y:0};for(let w=0;w<l.length;w++){let M=w>0&&g.get(w-1)||m,b=w<l.length-1&&g.get(w)||m,x=w>0&&w<l.length-1&&wn(l[w-1],l[w],l[w+1]);x&&(M.x!==b.x||M.y!==b.y)?(u.push({x:l[w].x+M.x,y:l[w].y+M.y}),u.push({x:l[w].x+b.x,y:l[w].y+b.y})):u.push({x:l[w].x+M.x+(x?0:b.x),y:l[w].y+M.y+(x?0:b.y)})}f.points=bn(u)}}function wn(r,t,e){return Math.abs(r.x-t.x)<.01&&Math.abs(t.x-e.x)<.01||Math.abs(r.y-t.y)<.01&&Math.abs(t.y-e.y)<.01}function bn(r){let t=[];for(let e of r){let s=t[t.length-1];s&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01||t.push(e)}return t}function Mn(r,t){return Oe(r,t,!0)||Oe(r,t,!1)||kn(r,t)}function Ae(r,t){let{pts:e,i:s,loIsA:o}=r,n=[];if(t?!o:o)for(let d=s+1;d<e.length;d++)n.push(e[d]);else for(let d=s;d>=0;d--)n.push(e[d]);return n}var _n=(r,t)=>r.x*t.y-r.y*t.x,Ne=(r,t)=>{let e=t.x-r.x,s=t.y-r.y,o=Math.hypot(e,s)||1;return{x:e/o,y:s/o}};function Oe(r,t,e){let s=r.vertical,o=Ae(r,e),n=Ae(t,e),i=e?Math.max(r.lo,t.lo):Math.min(r.hi,t.hi),d=s?{x:r.c,y:i}:{x:i,y:r.c},a=s?{x:0,y:e?-1:1}:{x:e?-1:1,y:0},c=a,h=0,p=0,g=(l,u)=>{if(l===u)return 0;let m={x:a.y,y:-a.x},w=s?m.x:m.y;return(l<u?w<0:w>0)?-1:1},f=(l,u)=>u+1<l.length?Math.sign(Math.round(_n(c,Ne(l[u],l[u+1]))*1e3)):null;for(let l=0;l<64;l++){let u=h<o.length?(o[h].x-d.x)*c.x+(o[h].y-d.y)*c.y:1/0,m=p<n.length?(n[p].x-d.x)*c.x+(n[p].y-d.y)*c.y:1/0;if(u===1/0&&m===1/0)return 0;if(Math.abs(u-m)<.5){let M=f(o,h),b=f(n,p);if(M===null||b===null)return M===null&&b===null?0:g(M??0,b??0);if(M!==b)return g(M,b);d=o[h],c=Ne(o[h],o[h+1]),h++,p++;continue}if(u<m){let M=f(o,h);return M?g(M,0):0}let w=f(n,p);return w?g(0,w):0}return 0}var kn=(r,t)=>r.id<t.id?-1:r.id>t.id?1:r.i-t.i;function jt(r,t,e=4){let s=[],o=new Map(t.map((a,c)=>[a,c]));for(let a of t){let c=r.get(a).points;for(let h=0;h<c.length-1;h++){let p=c[h],g=c[h+1];Math.abs(p.x-g.x)<.01&&Math.abs(p.y-g.y)>.01&&s.push([o.get(a),p.x,Math.min(p.y,g.y),Math.max(p.y,g.y)])}}let n=64,i=new Map;for(let a of s){let c=Math.floor(a[1]/n);i.has(c)||i.set(c,[]),i.get(c).push(a)}let d=new Map;for(let a of t){let c=o.get(a),h=r.get(a).points,p=[];for(let g=0;g<h.length-1;g++){let f=h[g],l=h[g+1];if(Math.abs(f.y-l.y)>.01)continue;let u=Math.min(f.x,l.x)+e*2,m=Math.max(f.x,l.x)-e*2;if(!(m<=u))for(let w=Math.floor(u/n);w<=Math.floor(m/n);w++)for(let M of i.get(w)||[])M[0]>=c||M[1]<=u||M[1]>=m||f.y<=M[2]+e||f.y>=M[3]-e||p.push({seg:g,x:M[1],y:f.y})}p.length&&d.set(a,p)}return d}var Ut=1,vn=[1,-1,0,0],Sn=[0,0,1,-1],Kt=[1,0,3,2],Ce=r=>r.x>0?0:r.x<0?1:r.y>0?2:3;function it(r,t,e={}){let s=r.options,o=t.nodes,n=s.edgeRouting,{ends:i,ports:d}=Ie(r,o),a=new Map,c=new Map,h=e.only||null,p=e.prev||null;if(n==="orthogonal")En(r,o,i,s,h,p,a,c),Pe(a,o,{spacing:s.edgeSpacing,fixedEnds:!0});else for(let l of r.edges){let u=o.get(l.source),m=o.get(l.target);if(!u||!m)continue;if(l.source===l.target){a.set(l.id,Be(u,s,i.get(l.id)));continue}let w=t.edges.get(l.id),M=w&&w.waypoints||[],b=i.get(l.id),x,y;n==="curved"||l.sourcePort?x=b.source:x=Ft(u,M[0]||et(m)),n==="curved"||l.targetPort?y=b.target:y=Ft(m,M[M.length-1]||et(u)),a.set(l.id,{points:[x,...M.map(_=>({..._})),y],kind:n,sourceSide:x.side,targetSide:y.side})}let g=r.edges.map(l=>l.id).filter(l=>a.has(l)),f=s.lineHops&&n==="orthogonal"?jt(a,g,s.hopRadius):new Map;for(let[l,u]of a)u.hops=f.get(l)||[];return{paths:a,raw:c,ports:d,mode:n}}function Be(r,t,e){let s=Math.max(t.nodeMargin*1.5,16),o=e.source,n=e.target,i=U[o.side],d=U[n.side],a={x:o.x+i.x*s,y:o.y+i.y*s},c={x:n.x+d.x*s,y:n.y+d.y*s},h;if(o.side===n.side)h=o.side==="left"||o.side==="right"?[a,{x:a.x,y:c.y}]:[a,{x:c.x,y:a.y}];else if((o.side==="top"||o.side==="bottom")!=(n.side==="top"||n.side==="bottom"))h=o.side==="top"||o.side==="bottom"?[a,{x:c.x,y:a.y}]:[a,{x:a.x,y:c.y}];else{let p=o.side==="top"||o.side==="bottom",g=p?r.x+r.width+s:r.y+r.height+s;h=p?[a,{x:g,y:a.y},{x:g,y:c.y}]:[a,{x:a.x,y:g},{x:c.x,y:g}]}return{points:_t([o,...h,c,n]),kind:"orthogonal",sourceSide:o.side,targetSide:n.side,selfLoop:!0}}function En(r,t,e,s,o,n,i,d){let a=s.nodeMargin,c=[];for(let[l,u]of t)c.push({id:l,...be(u,a)});let h=new Map;for(let l of r.edges){let u=e.get(l.id);if(!u||!u.source||!u.target)continue;let m=U[u.source.side],w=U[u.target.side];h.set(l.id,{s:{x:u.source.x+m.x*a,y:u.source.y+m.y*a},t:{x:u.target.x+w.x*a,y:u.target.y+w.y*a},sDir:Ce(m),tNeed:Kt[Ce(w)]})}let p=Nn(c,h,a);for(let l of r.edges)if(o&&!o.has(l.id)&&n&&n.raw.has(l.id)){let u=n.raw.get(l.id);d.set(l.id,u),p.markPath(u);let m=n.paths.get(l.id);m&&i.set(l.id,{...m,points:u.map(w=>({...w}))})}let g=r.edges.filter(l=>!i.has(l.id)&&t.has(l.source)&&t.has(l.target)),f=l=>{let u=h.get(l.id);return u?Math.abs(u.s.x-u.t.x)+Math.abs(u.s.y-u.t.y):0};g.sort((l,u)=>f(l)-f(u)),In(r,t,e,s,c,g,p,i,d);for(let l of g){if(i.has(l.id))continue;if(l.source===l.target){let b=Be(t.get(l.source),s,e.get(l.id));i.set(l.id,b),d.set(l.id,b.points);continue}let u=e.get(l.id),m=h.get(l.id),w=p.astar(m.s,m.sDir,m.t,m.tNeed,s);w||(w=An(m.s,m.t,u.source.side,u.target.side));let M=[u.source,..._t(w),u.target];p.markPath(M),d.set(l.id,M),i.set(l.id,{points:M.map(b=>({...b})),kind:"orthogonal",sourceSide:u.source.side,targetSide:u.target.side})}}var Ln={top:"bottom",bottom:"top",left:"right",right:"left"};function In(r,t,e,s,o,n,i,d,a){let c=s.bundleFanOut;if(!c)return;let h=new Map;for(let p of n){if(p.source===p.target||p.sourcePort||p.markerStart)continue;let g=e.get(p.id);if(!g||!g.source||!g.target||g.target.side!==Ln[g.source.side])continue;let f=p.source+"|"+g.source.side;h.has(f)||h.set(f,[]),h.get(f).push(p)}for(let[p,g]of h){if(g.length<c)continue;let f=g[0].source,l=e.get(g[0].id).source.side,u=t.get(f),m=U[l],w=m.y!==0,M=w?m.y:m.x,b=l==="bottom"?u.y+u.height:l==="top"?u.y:l==="right"?u.x+u.width:u.x,x=1/0;for(let S of g){let A=e.get(S.id).target;x=Math.min(x,((w?A.y:A.x)-b)*M)}if(x<2*s.nodeMargin+4)continue;let y=b+M*x/2,_=w?{x:u.x+u.width/2,y:b}:{x:b,y:u.y+u.height/2},k=[],E=!0;for(let S of g){let A=e.get(S.id).target,N=_t(w?[_,{x:_.x,y},{x:A.x,y},A]:[_,{x:y,y:_.y},{x:y,y:A.y},A]);for(let O=0;E&&O<N.length-1;O++)for(let v of o)if(v.id!==f&&v.id!==S.target&&ht(N[O],N[O+1],v,1)){E=!1;break}if(!E)break;k.push([S,N,A.side])}if(E)for(let[S,A,N]of k)i.markPath(A),a.set(S.id,A),d.set(S.id,{points:A.map(O=>({...O})),kind:"orthogonal",sourceSide:l,targetSide:N,bundle:p})}}function An(r,t,e,s){let o=e==="top"||e==="bottom",n=s==="top"||s==="bottom";if(o&&n){let i=(r.y+t.y)/2;return[r,{x:r.x,y:i},{x:t.x,y:i},t]}if(!o&&!n){let i=(r.x+t.x)/2;return[r,{x:i,y:r.y},{x:i,y:t.y},t]}return o?[r,{x:r.x,y:t.y},t]:[r,{x:t.x,y:r.y},t]}function Nn(r,t,e){let s=new Set,o=new Set,n=L=>Math.round(L*100)/100,i=1/0,d=1/0,a=-1/0,c=-1/0;for(let L of r)s.add(n(L.x)),s.add(n(L.x+L.width)),o.add(n(L.y)),o.add(n(L.y+L.height)),i=Math.min(i,L.x),d=Math.min(d,L.y),a=Math.max(a,L.x+L.width),c=Math.max(c,L.y+L.height);for(let L of t.values())for(let I of[L.s,L.t])s.add(n(I.x)),o.add(n(I.y)),i=Math.min(i,I.x),d=Math.min(d,I.y),a=Math.max(a,I.x),c=Math.max(c,I.y);s.add(n(i-2*e)),s.add(n(a+2*e)),o.add(n(d-2*e)),o.add(n(c+2*e));let h=L=>{let I=[...L].sort((R,Y)=>R-Y),B=[];for(let R=0;R<I.length;R++)B.push(I[R]),R+1<I.length&&I[R+1]-I[R]>4&&B.push(n((I[R]+I[R+1])/2));return B},p=h(s),g=h(o),f=p.length,l=g.length,u=f*l,m=new Map(p.map((L,I)=>[L,I])),w=new Map(g.map((L,I)=>[L,I])),M=120,b=new Map,x=(L,I)=>L*73856093^I*19349663;for(let L of r)for(let I=Math.floor(L.x/M);I<=Math.floor((L.x+L.width)/M);I++)for(let B=Math.floor(L.y/M);B<=Math.floor((L.y+L.height)/M);B++){let R=x(I,B);b.has(R)||b.set(R,[]),b.get(R).push(L)}let y=(L,I)=>{let B=b.get(x(Math.floor(L/M),Math.floor(I/M)));if(!B)return!1;for(let R of B)if(Me(R,L,I,.01))return!0;return!1},_=u<=4e6?new Uint8Array(u):null,k=_?null:new Map,E=L=>{if(_){let B=_[L];return B||(B=y(p[L%f],g[L/f|0])?2:1,_[L]=B),B===2}let I=k.get(L);return I===void 0&&(I=y(p[L%f],g[L/f|0]),k.set(L,I)),I},S=new Uint8Array(u),A=new Uint8Array(u),N=(L,I)=>{let B=I?S:A,R=B[L];if(!R){let Y=L%f,Z=L/f|0,z=I?(p[Y]+p[Y+1])/2:p[Y],X=I?g[Z]:(g[Z]+g[Z+1])/2;R=y(z,X)?2:1,B[L]=R}return R===2},O=new Uint16Array(u),v=new Uint16Array(u),P=new Uint16Array(u),T=new Uint16Array(u),K=L=>{let I=m.get(n(L.x)),B=w.get(n(L.y));return I==null||B==null?-1:B*f+I};function q(L){for(let I=0;I<L.length-1;I++){let B=L[I],R=L[I+1],Y=Math.abs(B.y-R.y)<.01,Z=Math.abs(B.x-R.x)<.01;if(Y){let z=w.get(n(B.y)),X=m.get(n(B.x)),j=m.get(n(R.x));if(z==null||X==null||j==null)continue;let st=Math.min(X,j),ot=Math.max(X,j);for(let D=st;D<=ot;D++)O[z*f+D]++,D<ot&&P[z*f+D]++}else if(Z){let z=m.get(n(B.x)),X=w.get(n(B.y)),j=w.get(n(R.y));if(z==null||X==null||j==null)continue;let st=Math.min(X,j),ot=Math.max(X,j);for(let D=st;D<=ot;D++)v[D*f+z]++,D<ot&&T[D*f+z]++}}}let nt=u*4,J=nt<=16e6,ne=J?new Float64Array(nt):null,se=J?new Int32Array(nt):null,oe=J?new Uint32Array(nt):null,Lt=0;function Ze(L,I,B,R,Y){let Z=K(L),z=K(B);if(Z<0||z<0)return null;let X=p[z%f],j=g[z/f|0],st=Y.bendPenalty,ot=Y.crossingPenalty;Lt++;let D=J?null:new Map,ie=J?null:new Map,re=J?$=>oe[$]===Lt?ne[$]:void 0:$=>D.get($),ae=J?($,G,Q)=>{oe[$]=Lt,ne[$]=G,se[$]=Q}:($,G,Q)=>{D.set($,G),ie.set($,Q)},We=J?$=>se[$]:$=>ie.get($),lt=new Yt,ce=Z*4+I;ae(ce,0,-1),lt.push(ce,Ut*(Math.abs(p[Z%f]-X)+Math.abs(g[Z/f|0]-j)));let It=1/0,At=-1,Ve=0,qe=4e5;for(;lt.size;){let $=lt.peekKey(),G=lt.pop();if($>=It)break;let Q=re(G),at=G>>2,wt=G&3,Ot=at%f,Pt=at/f|0;if(!($>Q+Ut*(Math.abs(p[Ot]-X)+Math.abs(g[Pt]-j))+1e-6)){if(++Ve>qe)break;if(at===z){let H=wt===R?0:wt===Kt[R]?2*st:st;Q+H<It&&(It=Q+H,At=G);continue}for(let H=0;H<4;H++){if(H===Kt[wt])continue;let ft=Ot+vn[H],ut=Pt+Sn[H];if(ft<0||ut<0||ft>=f||ut>=l)continue;let V=ut*f+ft;if(V!==z&&E(V))continue;let pt=H<2;if(N(pt?H===0?at:V:H===2?at:V,pt))continue;let de=Math.abs(pt?p[ft]-p[Ot]:g[ut]-g[Pt]),bt=de;H!==wt&&(bt+=st);let he=H===0||H===2?at:V,le=pt?P[he]:T[he];le&&(bt+=de*.25*le),V!==z&&(pt?v[V]:O[V])&&(bt+=ot);let Ct=V*4+H,Bt=Q+bt,fe=re(Ct);(fe===void 0||Bt<fe-1e-9)&&(ae(Ct,Bt,G),lt.push(Ct,Bt+Ut*(Math.abs(p[ft]-X)+Math.abs(g[ut]-j))))}}}if(At<0)return null;let Nt=[];for(let $=At;$!==-1&&$!==void 0;$=We($)){let G=$>>2;Nt.push({x:p[G%f],y:g[G/f|0]})}return Nt.reverse(),Nt}return{astar:Ze,markPath:q,xs:p,ys:g,N:u}}var Yt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,e){let s=this.k,o=this.v,n=s.length;for(s.push(e),o.push(t);n>0;){let i=n-1>>1;if(s[i]<=e)break;s[n]=s[i],o[n]=o[i],n=i}s[n]=e,o[n]=t}peekKey(){return this.k[0]}pop(){let t=this.k,e=this.v,s=e[0],o=t.pop(),n=e.pop();if(t.length){let i=0,d=t.length;for(;;){let a=2*i+1;if(a>=d||(a+1<d&&t[a+1]<t[a]&&a++,t[a]>=o))break;t[i]=t[a],e[i]=e[a],i=a}t[i]=o,e[i]=n}return s}};function Zt(r,t,e,s){if(!s)return 0;let o=r.options,n=(a,c)=>c.x>=a.x-1&&c.x<=a.x+a.width+1&&c.y>=a.y-1&&c.y<=a.y+a.height+1&&Math.min(Math.abs(c.x-a.x),Math.abs(c.x-a.x-a.width),Math.abs(c.y-a.y),Math.abs(c.y-a.y-a.height))<=1,i=(a,c)=>{let h={left:Math.abs(c.x-a.x),right:Math.abs(c.x-a.x-a.width),top:Math.abs(c.y-a.y),bottom:Math.abs(c.y-a.y-a.height)};return Object.keys(h).reduce((p,g)=>h[g]<h[p]?g:p)},d=0;for(let a of r.edges){let c=s[a.id],h=t.paths.get(a.id),p=e.get(a.source),g=e.get(a.target);if(!Array.isArray(c)||c.length<2||!h||!p||!g)continue;let f=c.map(u=>({x:+u[0],y:+u[1]}));if(f.some(u=>!Number.isFinite(u.x)||!Number.isFinite(u.y))||!n(p,f[0])||!n(g,f[f.length-1]))continue;let l=!0;for(let u=0;l&&u<f.length-1;u++){let m=f[u],w=f[u+1];t.mode==="orthogonal"&&Math.abs(m.x-w.x)>.5&&Math.abs(m.y-w.y)>.5&&(l=!1)}l&&(h.points=f,h.sourceSide=i(p,f[0]),h.targetSide=i(g,f[f.length-1]),t.raw&&t.raw.set(a.id,f.map(u=>({...u}))),d++)}if(d){let a=r.edges.map(h=>h.id).filter(h=>t.paths.has(h)),c=o.lineHops&&t.mode==="orthogonal"?jt(t.paths,a,o.hopRadius):new Map;for(let[h,p]of t.paths)p.hops=c.get(h)||[]}return d}var On=[.5,.3,.7,.15,.85],vt=3;function $e(r,{nodes:t=[],edges:e=[]}={}){let s=[...t],o=[];for(let[a,c]of e)for(let h=0;h<c.length-1;h++)o.push({id:a,i:h,a:c[h],b:c[h+1],box:Pn(c[h],c[h+1])});let n=[],i=new Map,d=[...r].sort((a,c)=>Re(a.points)-Re(c.points));for(let a of d){let c=a.points;if(!c||!c.length)continue;let h=a.width,p=a.height,g=[];for(let u=0;u<c.length-1;u++)g.push(Math.hypot(c[u+1].x-c[u].x,c[u+1].y-c[u].y));let f=Math.max(1,...g),l=null;for(let u=0;u<g.length;u++){let m=c[u],w=c[u+1],M=g[u];if(M<1)continue;let b=Math.abs(w.y-m.y)<Math.abs(w.x-m.x),x=b?h:p;for(let y of On){if(y!==.5&&M<x*2.2)continue;let _={x:m.x+(w.x-m.x)*y,y:m.y+(w.y-m.y)*y},k=b?[[0,0],[0,-(p/2+vt)],[0,p/2+vt]]:[[0,0],[h/2+vt,0],[-(h/2+vt),0]];for(let E=0;E<k.length;E++){let S=_.x+k[E][0],A=_.y+k[E][1],N={x:S-h/2,y:A-p/2,width:h,height:p},O=(1-M/f)*20+Math.abs(y-.5)*40+(E?12:0);if(!E&&M<x+8&&(O+=25),!(l&&O>=l.cost)){for(let v of n)Wt(N,v,2)&&(O+=1e3+Cn(N,v));if(!(l&&O>=l.cost)){for(let v of s)Wt(N,v,2)&&(O+=800);if(!(l&&O>=l.cost)){for(let v of o)v.id===a.id&&v.i===u||Wt(N,v.box,0)&&Bn(v.a,v.b,N)&&(O+=v.id===a.id?60:150);(!l||O<l.cost)&&(l={cost:O,x:S,y:A,r:N})}}}}}}if(!l){let u=c[0];l={x:u.x,y:u.y,r:{x:u.x-h/2,y:u.y-p/2,width:h,height:p}}}n.push(l.r),i.set(a.id,{x:l.x,y:l.y})}return i}function Re(r){let t=0;for(let e=0;e<(r?.length||0)-1;e++)t+=Math.hypot(r[e+1].x-r[e].x,r[e+1].y-r[e].y);return t}function Pn(r,t){let e=Math.min(r.x,t.x),s=Math.min(r.y,t.y);return{x:e,y:s,width:Math.abs(r.x-t.x),height:Math.abs(r.y-t.y)}}function Wt(r,t,e){return r.x<t.x+t.width+e&&t.x<r.x+r.width+e&&r.y<t.y+t.height+e&&t.y<r.y+r.height+e}function Cn(r,t){let e=Math.min(r.x+r.width,t.x+t.width)-Math.max(r.x,t.x),s=Math.min(r.y+r.height,t.y+t.height)-Math.max(r.y,t.y);return e>0&&s>0?e*s:0}function Bn(r,t,e){let s=0,o=1,n=t.x-r.x,i=t.y-r.y,d=(a,c)=>{if(Math.abs(a)<1e-9)return c>=0;let h=c/a;if(a<0){if(h>o)return!1;h>s&&(s=h)}else{if(h<s)return!1;h<o&&(o=h)}return!0};return d(-n,r.x-e.x)&&d(n,e.x+e.width-r.x)&&d(-i,r.y-e.y)&&d(i,e.y+e.height-r.y)}var rt="http://www.w3.org/2000/svg",Rn=0,Vt={arrow:'<path class="fg-marker-fill" d="M0,-5 L12,0 L0,5 Z"/>',open:'<path class="fg-marker-stroke" d="M1,-5 L12,0 L1,5"/>',many:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',one:'<path class="fg-marker-stroke" d="M6,-6 L6,6 M0,0 L12,0"/>',onlyOne:'<path class="fg-marker-stroke" d="M3,-6 L3,6 M8,-6 L8,6 M0,0 L12,0"/>',oneOrMany:'<path class="fg-marker-stroke" d="M-3,-6 L-3,6 M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',zeroOrMany:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/><circle class="fg-marker-hollow" cx="-5" cy="0" r="3.5"/>',zeroOrOne:'<path class="fg-marker-stroke" d="M8,-6 L8,6 M0,0 L12,0"/><circle class="fg-marker-hollow" cx="0" cy="0" r="3.5"/>',diamond:'<path class="fg-marker-fill" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',hollowDiamond:'<path class="fg-marker-hollow" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',circle:'<circle class="fg-marker-fill" cx="8" cy="0" r="4"/>'};var St=class{constructor(t,e){this.id="fg"+ ++Rn,this.options=e,this.container=t,t.classList.add("fg-container");let s=this.viewport=F("div","fg-viewport");s.tabIndex=0,this.world=F("div","fg-world"),this.groupsLayer=F("div","fg-groups"),this.svg=document.createElementNS(rt,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(rt,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(rt,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=F("div","fg-labels"),this.nodesLayer=F("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),s.appendChild(this.world),t.appendChild(s),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.expanded=new Set,this.transform={x:0,y:0,k:1}}destroy(){clearTimeout(this._settle),this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let e=this.options,s=new Set,o=new Map,n=[];for(let i of t){let d=String(i.id);s.add(d);let a=this.nodeEls.get(d),c=qt(i,e),h=c&&this.expanded.has(d),p=Tn(i)+(c?h?"+":"-":"");if(a||(a=F("div","fg-node"),a.dataset.id=d,this.nodesLayer.appendChild(a),this.nodeEls.set(d,a)),a._sig!==p){a._sig=p,a.className="fg-node"+(i.className?" "+i.className:"")+(i.type?" fg-node--"+i.type:"")+(c?" fg-node--expandable":"")+(h?" fg-node--expanded":""),a.innerHTML="";let l=c?F("div","fg-node__body"):a;c&&a.appendChild(l);let u=e.renderNode?e.renderNode(i,l):void 0;if(typeof u=="string")l.innerHTML=u;else if(u instanceof Node)l.appendChild(u);else if(u===void 0)if(i.html!=null)l.innerHTML=i.html;else{let m=F("div","fg-node__label");m.textContent=i.label??d,l.appendChild(m)}if(c){if(h){let m=F("div","fg-node__details"),w=e.renderDetails?e.renderDetails(i,m):i.details;typeof w=="string"?m.innerHTML=w:w instanceof Node&&m.appendChild(w),a.appendChild(m)}a.appendChild(Hn(h,e))}a._measured=null}let g=typeof i.width=="number",f=typeof i.height=="number"&&!h;a.style.width=g?i.width+"px":"",a.style.height=f?i.height+"px":"",(!g||!f)&&n.push([d,a,g?i.width:null,f?i.height:null])}for(let[i,d]of this.nodeEls)s.has(i)||(d.remove(),this.nodeEls.delete(i));for(let[,i,d]of n)i.classList.add(d==null?"fg-node--measuring":"fg-node--measuring-h");for(let[i,d,a,c]of n){if(!d._measured){let h=d.getBoundingClientRect(),p=this.transform.k||1;d._measured={width:Math.ceil(h.width/p-.01)||this.options.defaultNodeWidth,height:Math.ceil(h.height/p-.01)||this.options.defaultNodeHeight}}o.set(i,{width:a??d._measured.width,height:c??d._measured.height})}for(let[,i]of n)i.classList.remove("fg-node--measuring","fg-node--measuring-h");return o}renderBadges(t){for(let[e,s]of this.nodeEls){let o=t&&t.get(e),n=s.querySelector(":scope > .fg-node__badge");if(!o){n?.remove();continue}n||(n=F("div","fg-node__badge"),s.appendChild(n)),n.textContent!==o.text&&(n.textContent=o.text),n.classList.toggle("fg-node__badge--open",!!o.open),n.title=o.title||""}}renderPorts(t){for(let e of t.nodes){let s=this.nodeEls.get(e.id);if(!s)continue;let o=this.options.showPorts?JSON.stringify(e.ports.map(n=>[n.id,n.side,n.offset])):"";if(s._portSig!==o&&(s._portSig=o,s.querySelectorAll(":scope > .fg-port").forEach(n=>n.remove()),!!o))for(let[n,i]of dt(e)){let d=F("div","fg-port fg-port--"+i.side);d.dataset.port=n,d.style.left=i.px*100+"%",d.style.top=i.py*100+"%",s.appendChild(d)}}}placeNodes(t,e){for(let s of t.nodes){let o=this.nodeEls.get(s.id),n=e.get(s.id);!o||!n||(o.style.width=n.width+"px",o.style.height=n.height+"px",o.style.transform=`translate(${n.x}px, ${n.y}px)`,o.classList.toggle("fg-node--pinned",!!s.constraints.pinned))}}renderGroups(t,e){let s=new Set;for(let o of t.groups){let n=e.get(o.id);if(!n)continue;s.add(o.id);let i=this.groupEls.get(o.id);if(!i){i=F("div","fg-group"),i.dataset.id=o.id;let d=F("div","fg-group__label");i.appendChild(d),this.groupsLayer.appendChild(i),this.groupEls.set(o.id,i)}i.className="fg-group"+(o.className?" "+o.className:""),i.firstChild.textContent=o.label,i.firstChild.style.height=this.options.groupLabelHeight+"px",i.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(i.style,{transform:`translate(${n.x}px, ${n.y}px)`,width:n.width+"px",height:n.height+"px"})}for(let[o,n]of this.groupEls)s.has(o)||(n.remove(),this.groupEls.delete(o))}ensureMarker(t){if(!t||!Vt[t]||this.markersUsed.has(t))return;let e=document.createElementNS(rt,"marker");e.setAttribute("id",`${this.id}-m-${t}`),e.setAttribute("viewBox","-10 -8 24 16"),e.setAttribute("refX","12"),e.setAttribute("refY","0"),e.setAttribute("markerWidth","24"),e.setAttribute("markerHeight","16"),e.setAttribute("markerUnits","userSpaceOnUse"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("class","fg-marker fg-marker--"+t),e.innerHTML=Vt[t],this.defs.appendChild(e),this.markersUsed.add(t)}renderEdges(t,e,s,o){let n=this.options,i=new Set,d=[];for(let a of t.edges){let c=e.paths.get(a.id);if(!c)continue;i.add(a.id);let h=this.edgeEls.get(a.id);if(!h){h=document.createElementNS(rt,"g"),h.dataset.id=a.id;let u=document.createElementNS(rt,"path");u.setAttribute("class","fg-edge__hit");let m=document.createElementNS(rt,"path");m.setAttribute("class","fg-edge__line"),h.append(u,m),this.edgesGroup.appendChild(h),this.edgeEls.set(a.id,h)}h.setAttribute("class",`fg-edge fg-edge--${$n(a.type)}${a.className?" "+a.className:""}`);let p=s?s.get(a.id):null,g=p?Fn(p):Te(c,n.cornerRadius,n.lineHops?c.hops:[],n.hopRadius),[f,l]=h.childNodes;f.setAttribute("d",g),l.setAttribute("d",g);for(let[u,m]of[["marker-start",a.markerStart],["marker-end",a.markerEnd]])m&&Vt[m]?(this.ensureMarker(m),l.setAttribute(u,`url(#${this.id}-m-${m})`)):l.removeAttribute(u);this.renderLabel(a,!s)&&!s&&d.push([a.id,c])}for(let[a,c]of this.edgeEls)i.has(a)||(c.remove(),this.edgeEls.delete(a),this.renderLabel({id:a,label:null},!1));d.length&&this.placeLabels(d,e,o);for(let a of t.edges){let c=this.edgeEls.get(a.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,e){let s=this.labelEls.get(t.id);return t.label==null||t.label===""?(s&&(s.remove(),this.labelEls.delete(t.id)),!1):(s||(s=F("div","fg-edge-label"),s.dataset.id=t.id,this.labelsLayer.appendChild(s),this.labelEls.set(t.id,s)),s.textContent!==String(t.label)&&(s.textContent=t.label,s._size=null),s.style.visibility=e?"":"hidden",!0)}placeLabels(t,e,s){let o=[];for(let[d,a]of t){let c=this.labelEls.get(d);c._size||(c._size={width:c.offsetWidth,height:c.offsetHeight}),o.push({id:d,points:a.points,width:c._size.width,height:c._size.height})}let n=[...e.paths].map(([d,a])=>[d,a.points]),i=$e(o,{nodes:s?s.values():[],edges:n});for(let[d,a]of i){let c=this.labelEls.get(d),h=c._size;c.style.transform=`translate(${C(a.x-h.width/2)}px, ${C(a.y-h.height/2)}px)`}}setTransform(t){this.transform=t,this.world.style.transform=`translate(${Math.round(t.x)}px, ${Math.round(t.y)}px) scale(${t.k})`,this._k!==t.k&&(this._k=t.k,this.world.style.setProperty("--fg-zoom",t.k)),this.world.classList.add("fg-moving"),clearTimeout(this._settle),this._settle=setTimeout(()=>this.world.classList.remove("fg-moving"),150)}};function F(r,t){let e=document.createElement(r);return t&&(e.className=t),e}function $n(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function Tn(r){return JSON.stringify([r.label,r.html,r.className,r.type,r.columns,r.data,r.details])}function qt(r,t){return r.expandable!=null?!!r.expandable:r.details!=null||!!t.renderDetails}var zn='<svg viewBox="0 0 12 12" width="12" height="12" aria-hidden="true"><path d="M3 4.5 6 7.5 9 4.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>';function Hn(r,t){let e=F("button","fg-node__toggle");return e.type="button",e.setAttribute("aria-expanded",String(r)),e.innerHTML=`<span></span>${zn}`,e.firstChild.textContent=r?t.collapseText:t.expandText,e}var C=r=>Math.round(r*100)/100;function Fn(r){return r.map((t,e)=>(e?"L":"M")+C(t.x)+","+C(t.y)).join(" ")}function Te(r,t=6,e=[],s=4){let o=r.points;if(!o||o.length<2)return"";if(r.kind==="curved")return Dn(r);let n=`M${C(o[0].x)},${C(o[0].y)}`,i=o.length,d=new Array(i).fill(0);for(let c=1;c<i-1;c++){let h=Math.hypot(o[c].x-o[c-1].x,o[c].y-o[c-1].y),p=Math.hypot(o[c+1].x-o[c].x,o[c+1].y-o[c].y);d[c]=Math.max(0,Math.min(t,h/2,p/2))}let a=new Map;for(let c of e||[])a.has(c.seg)||a.set(c.seg,[]),a.get(c.seg).push(c);for(let c=0;c<i-1;c++){let h=o[c],p=o[c+1],g=Math.hypot(p.x-h.x,p.y-h.y)||1,f=(p.x-h.x)/g,l=(p.y-h.y)/g,u=d[c+1],m=p.x-f*u,w=p.y-l*u,M=a.get(c);if(M&&Math.abs(l)<1e-6){let b=Math.sign(f),x=h.x+f*d[c];M.sort((y,_)=>(y.x-_.x)*b);for(let y of M)(y.x-x)*b<s+1||(m-y.x)*b<s+1||(n+=` L${C(y.x-b*s)},${C(h.y)} A${s},${s} 0 0 ${b>0?1:0} ${C(y.x+b*s)},${C(h.y)}`)}if(n+=` L${C(m)},${C(w)}`,c+1<i-1&&u>0){let b=o[c+2],x=Math.hypot(b.x-p.x,b.y-p.y)||1;n+=` Q${C(p.x)},${C(p.y)} ${C(p.x+(b.x-p.x)/x*u)},${C(p.y+(b.y-p.y)/x*u)}`}}return n}function Dn(r){let t=r.points,e=t[0],s=t[t.length-1],o=Math.hypot(s.x-e.x,s.y-e.y),n=Math.max(30,Math.min(160,o*.4));if(t.length===2){let g=U[r.sourceSide]||{x:0,y:0},f=U[r.targetSide]||{x:0,y:0};return`M${C(e.x)},${C(e.y)} C${C(e.x+g.x*n)},${C(e.y+g.y*n)} ${C(s.x+f.x*n)},${C(s.y+f.y*n)} ${C(s.x)},${C(s.y)}`}let i=U[r.sourceSide],d=U[r.targetSide],a=i?{x:e.x-i.x*40,y:e.y-i.y*40}:e,c=d?{x:s.x-d.x*40,y:s.y-d.y*40}:s,h=[a,...t,c],p=`M${C(e.x)},${C(e.y)}`;for(let g=1;g<h.length-2;g++){let f=h[g-1],l=h[g],u=h[g+1],m=h[g+2],w={x:l.x+(u.x-f.x)/6,y:l.y+(u.y-f.y)/6},M={x:u.x-(m.x-l.x)/6,y:u.y-(m.y-l.y)/6};p+=` C${C(w.x)},${C(w.y)} ${C(M.x)},${C(M.y)} ${C(u.x)},${C(u.y)}`}return p}function ze(r,t,e,s=28){let o=new Map;for(let[n,i]of t){let d=r&&r.get(n),a=Dt(i.points,s);if(!d){o.set(n,a);continue}let c=Dt(d.points,s);o.set(n,a.map((h,p)=>({x:c[p].x+(h.x-c[p].x)*e,y:c[p].y+(h.y-c[p].y)*e})))}return o}function He(r){let t=r.renderer,e=t.viewport,s=()=>r.options,o=new Map,n=null,i=0,d=null,a=(y,_)=>{let k=e.getBoundingClientRect(),E=t.transform;return{x:(y-k.left-E.x)/E.k,y:(_-k.top-E.y)/E.k}},c=y=>{let _=y.target.closest&&y.target.closest(".fg-node");if(_&&t.nodesLayer.contains(_))return{kind:"node",id:_.dataset.id,el:_};let k=y.target.closest&&y.target.closest(".fg-edge");if(k)return{kind:"edge",id:k.dataset.id,el:k};let E=y.target.closest&&y.target.closest(".fg-edge-label");if(E)return{kind:"edge",id:E.dataset.id,el:E};let S=y.target.closest&&y.target.closest(".fg-group");return S?{kind:"group",id:S.dataset.id,el:S}:{kind:"background"}};function h(y){if(r._stopZoom(),y.button!==void 0&&y.button!==0&&y.pointerType==="mouse"||y.target.closest&&y.target.closest(".fg-controls")||y.target.closest&&y.target.closest("input, textarea, select, button, a, [data-fg-nodrag]"))return;if(o.set(y.pointerId,{x:y.clientX,y:y.clientY}),e.setPointerCapture?.(y.pointerId),o.size===2&&s().zoomable){let[E,S]=[...o.values()];n={type:"pinch",dist:Math.hypot(E.x-S.x,E.y-S.y),k:t.transform.k,mid:{x:(E.x+S.x)/2,y:(E.y+S.y)/2}};return}let _=c(y),k={x:y.clientX,y:y.clientY};if((_.kind==="background"||_.kind==="group")&&y.shiftKey&&s().multiSelect)n={type:"box",target:_,start:k,moved:!1,base:r.getSelectedItems()};else if(_.kind==="node"&&s().draggable){let E=r.positions.get(_.id),S=a(y.clientX,y.clientY);n={type:"drag",id:_.id,target:_,start:k,moved:!1,dx:S.x-E.x,dy:S.y-E.y}}else s().pannable?n={type:"pan",target:_,start:k,moved:!1,tx:t.transform.x,ty:t.transform.y}:n={type:"click",target:_,start:k,moved:!1}}function p(y){if(o.has(y.pointerId)&&o.set(y.pointerId,{x:y.clientX,y:y.clientY}),!n)return;if(n.type==="pinch"){if(o.size<2)return;let[k,E]=[...o.values()],S=Math.hypot(k.x-E.x,k.y-E.y);r.zoomAt(n.k*(S/n.dist),n.mid.x,n.mid.y,!0);return}let _=Math.hypot(y.clientX-n.start.x,y.clientY-n.start.y);if(!(!n.moved&&_<4)){if(n.moved||(n.moved=!0,n.type==="drag"&&(r._dragStart(n.id),e.classList.add("fg-dragging")),n.type==="pan"&&e.classList.add("fg-panning"),n.type==="box"&&(n.el=document.createElement("div"),n.el.className="fg-selection-box",e.appendChild(n.el))),n.type==="box"){let k=e.getBoundingClientRect(),E=Math.min(n.start.x,y.clientX),S=Math.min(n.start.y,y.clientY),A=Math.abs(y.clientX-n.start.x),N=Math.abs(y.clientY-n.start.y);Object.assign(n.el.style,{left:E-k.left+"px",top:S-k.top+"px",width:A+"px",height:N+"px"});let O=a(E,S),v=a(E+A,S+N);d={box:{x:O.x,y:O.y,width:v.x-O.x,height:v.y-O.y},base:n.base},i||(i=requestAnimationFrame(g));return}if(n.type==="pan")r.setTransform({x:n.tx+y.clientX-n.start.x,y:n.ty+y.clientY-n.start.y,k:t.transform.k});else if(n.type==="drag"){let k=a(y.clientX,y.clientY);d={id:n.id,x:k.x-n.dx,y:k.y-n.dy},i||(i=requestAnimationFrame(g))}}}function g(){if(i=0,d){let y=d;d=null,y.box?r._boxSelect(y.box,y.base):r._dragMove(y.id,y.x,y.y)}}function f(y){if(o.delete(y.pointerId),!n)return;let _=n;if(_.type==="pinch"){o.size===0&&(n=null);return}if(n=null,e.classList.remove("fg-dragging","fg-panning"),_.type==="box"&&_.moved){i&&(cancelAnimationFrame(i),i=0,g()),_.el.remove();return}if(_.type==="drag"&&_.moved){i&&(cancelAnimationFrame(i),i=0,g()),r._dragEnd(_.id);return}!_.moved&&y.type==="pointerup"&&r._click(_.target,y)}function l(y){if(r._stopZoom(),!s().zoomable)return;y.preventDefault();let _=t.transform.k*Math.exp(-y.deltaY*(y.ctrlKey?.01:.0015));r.zoomAt(_,y.clientX,y.clientY,!0)}let u=null;function m(y){if(n&&n.moved)return;let _=c(y),k=_.kind==="node"||_.kind==="edge"?_.kind+":"+_.id:null;k!==u&&(u=k,r._hover(k?_:null))}function w(y){y.target.closest&&y.target.closest(".fg-controls, input, textarea, select, a")||r._contextMenu(c(y),y)}function M(y){let _=y.target.closest&&y.target.closest(".fg-node__toggle");if(!_)return;let k=_.closest(".fg-node");k&&t.nodesLayer.contains(k)&&(y.stopPropagation(),r.toggleExpand(k.dataset.id))}function b(){u&&(u=null,r._hover(null))}function x(y){y.key==="Escape"?r._escape():(y.key==="z"||y.key==="Z")&&(y.ctrlKey||y.metaKey)&&s().history?(y.preventDefault(),y.shiftKey?r.redo():r.undo()):(y.key==="y"||y.key==="Y")&&(y.ctrlKey||y.metaKey)&&s().history?(y.preventDefault(),r.redo()):(y.key==="a"||y.key==="A")&&(y.ctrlKey||y.metaKey)&&s().multiSelect?(y.preventDefault(),r.selectAll()):(y.key==="+"||y.key==="=")&&s().zoomable?r.zoomBy(1.2):y.key==="-"&&s().zoomable?r.zoomBy(1/1.2):y.key==="0"&&r.fit()}return e.addEventListener("pointerdown",h),e.addEventListener("pointermove",p),e.addEventListener("pointerup",f),e.addEventListener("pointercancel",f),e.addEventListener("wheel",l,{passive:!1}),e.addEventListener("pointerover",m),e.addEventListener("contextmenu",w),e.addEventListener("click",M),e.addEventListener("pointerleave",b),e.addEventListener("keydown",x),()=>{e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",p),e.removeEventListener("pointerup",f),e.removeEventListener("pointercancel",f),e.removeEventListener("wheel",l),e.removeEventListener("pointerover",m),e.removeEventListener("contextmenu",w),e.removeEventListener("click",M),e.removeEventListener("pointerleave",b),e.removeEventListener("keydown",x),i&&cancelAnimationFrame(i)}}function Et(r,t,e="chain"){let s=new Set,o=new Set,n=[],i=[];if(t.kind==="node")s.add(t.id),n=[t.id],i=[t.id];else{let h=r.find(p=>p.id===t.id);if(!h)return{nodes:s,edges:o};o.add(h.id),s.add(h.source),s.add(h.target),n=[h.source],i=[h.target]}let d=new Map,a=new Map;for(let h of r)d.has(h.target)||d.set(h.target,[]),a.has(h.source)||a.set(h.source,[]),d.get(h.target).push(h),a.get(h.source).push(h);let c=(h,p,g)=>{let f=new Set(h),l=[...h];for(;l.length;){let u=l.shift();for(let m of p.get(u)||[]){let w=g(m);o.add(m.id),s.add(w),e==="chain"&&!f.has(w)&&(f.add(w),l.push(w))}}};return(t.kind==="node"||e==="chain")&&(c(n,d,h=>h.source),c(i,a,h=>h.target)),{nodes:s,edges:o}}var W="__fg_more:";function Fe(r){let t=new Map;for(let n of r.nodes||[])n&&n.id!=null&&t.set(String(n.id),n);let e=new Map,s=new Set;for(let n of r.edges||[]){if(!n)continue;let i=String(n.source),d=String(n.target);if(i===d||!t.has(i)||!t.has(d))continue;e.has(i)||e.set(i,[]);let a=e.get(i);a.includes(d)||a.push(d),s.add(d)}let o=[...t.keys()].filter(n=>!s.has(n)&&e.has(n));return!o.length&&t.size&&(o=[t.keys().next().value]),{children:e,roots:o,nodeById:t}}function De(r,t,{path:e=[],shown:s=new Map,limit:o=50,hide:n=!1,moreLabel:i}={}){i=i||(x=>`+${x.toLocaleString("en-US")} more`);let{children:d,roots:a,nodeById:c}=t,h=new Set,p=new Set,g=new Map,f=[],l=(x,y)=>{let _=Math.max(o,s.get(x??"")||0);for(let k of y.slice(0,_))h.add(k),x!=null&&!g.has(k)&&g.set(k,x);y.length>_&&f.push({parent:x,count:y.length-_})},u=e.length-1;if((!n||!e.length)&&l(null,a),e.forEach((x,y)=>{h.add(x),p.add(x),(!n||y===u)&&l(x,d.get(x)||[])}),e.length)for(let x of d.get(e[u])||[])h.has(x)&&p.add(x);else for(let x of h)p.add(x);let m=[],w=[];for(let x of h)m.push(c.get(x));for(let x of r.edges||[])x&&h.has(String(x.source))&&h.has(String(x.target))&&w.push(x);for(let x of f){let y=W+(x.parent??"");m.push({id:y,label:i(x.count),className:"fg-node--more",expandable:!1,_more:x}),x.parent!=null&&w.push({id:y+":edge",source:x.parent,target:y,className:"fg-edge--more"}),(x.parent==null||x.parent===e[u])&&p.add(y)}let M=new Map;for(let x of h){let y=d.get(x);y&&M.set(x,y.length)}let b=(r.constraints||[]).filter(x=>[x.a,x.b,x.node,...x.nodes||[]].every(y=>y==null||h.has(String(y))));return{data:{...r,nodes:m,edges:w,constraints:b},focus:p,parentOf:g,childCount:M}}function Xe(r,t,e){let s=r.indexOf(t);if(s>=0)return r.slice(0,s===r.length-1?s:s+1);let o=e.get(t),n=o!=null?r.indexOf(o):-1;return n>=0?[...r.slice(0,n+1),t]:[t]}var Xn="1.2.0";var Ge={};Qe(Ge,{countCrossings:()=>jn,countNodeOverlaps:()=>Un,countOverlappingSegments:()=>Kn});function Gn(r,t,e,s){let o=(c,h,p)=>(h.x-c.x)*(p.y-c.y)-(h.y-c.y)*(p.x-c.x),n=o(e,s,r),i=o(e,s,t),d=o(r,t,e),a=o(r,t,s);return(n>1e-9&&i<-1e-9||n<-1e-9&&i>1e-9)&&(d>1e-9&&a<-1e-9||d<-1e-9&&a>1e-9)}function jn(r){let t=[...r.entries()].map(([s,o])=>[s,Array.isArray(o)?o:o.points]),e=0;for(let s=0;s<t.length;s++)for(let o=s+1;o<t.length;o++){let n=t[s][1],i=t[o][1];for(let d=0;d<n.length-1;d++)for(let a=0;a<i.length-1;a++)Gn(n[d],n[d+1],i[a],i[a+1])&&e++}return e}function Un(r,t,e){let s=0;for(let[o,n]of r){let i=Array.isArray(n)?n:n.points,d=e.get(o);for(let[a,c]of t)if(!(d&&(a===d.source||a===d.target))){for(let h=0;h<i.length-1;h++)if(ht(i[h],i[h+1],c,1)){s++;break}}}return s}function Kn(r){let t=[];for(let[o,n]of r){let i=Array.isArray(n)?n:n.points;for(let d=0;d<i.length-1;d++)t.push([o,i[d],i[d+1],d===0?i[0]:d===i.length-2?i[i.length-1]:null])}let e=(o,n)=>o&&n&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01,s=0;for(let o=0;o<t.length;o++)for(let n=o+1;n<t.length;n++){let[i,d,a,c]=t[o],[h,p,g,f]=t[n];if(i===h||e(c,f))continue;let l=Math.abs(d.y-a.y)<.01,u=Math.abs(p.y-g.y)<.01,m=Math.abs(d.x-a.x)<.01,w=Math.abs(p.x-g.x)<.01;if(l&&u&&Math.abs(d.y-p.y)<.5){let M=Math.max(Math.min(d.x,a.x),Math.min(p.x,g.x));Math.min(Math.max(d.x,a.x),Math.max(p.x,g.x))-M>1&&s++}else if(m&&w&&Math.abs(d.x-p.x)<.5){let M=Math.max(Math.min(d.y,a.y),Math.min(p.y,g.y));Math.min(Math.max(d.y,a.y),Math.max(p.y,g.y))-M>1&&s++}}return s}function Rs(r,t){let e=$t(r,t),s=kt(e),o=it(e,s);return{model:e,layout:s,routing:o}}function $s(r,t,e={}){return new ee(r,t,e)}var Yn=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],Jt=r=>{let t={};for(let e of Yn)r[e]!==void 0&&(t[e]=r[e]);return t},je=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,ee=class{constructor(t,e,s={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=e||{nodes:[],edges:[]},this.userOptions={...s},this.options=yt(this.data.options,this.userOptions),this.renderer=new St(t,this.options),this.positions=new Map,this.pins=new Map,this.layoutEdges=new Map,this.routing=null,this.model=null,this.selected=null,this._sel=new Map,this._listeners=new Map,this._anim=0,this._hl=[],this._explore={path:[],shown:new Map},this._undo=[],this._redo=[],this._recDepth=0;for(let o of this.data.nodes||[])o&&o.expanded&&this.renderer.expanded.add(String(o.id));this.options.controls&&this._controls(),this._detach=He(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:e=!1}={}){return this._record("relayout",()=>this._build({mode:"relayout",animate:t,fresh:e}))}updateGraph(t,e={}){return this._record("update",()=>this._updateGraph(t,e))}_updateGraph(t,{mode:e="stable",animate:s=this.options.animate}={}){this.data=t;let o=new Set((t.nodes||[]).map(i=>String(i.id)));for(let i of[...this.pins.keys()])o.has(i)||this.pins.delete(i);for(let i of[...this.positions.keys()])o.has(i)||this.positions.delete(i);for(let i of[...this.renderer.expanded])o.has(i)||this.renderer.expanded.delete(i);let n=this._explore.path.findIndex(i=>!o.has(i));return n>=0&&(this._explore.path=this._explore.path.slice(0,n)),this._build({mode:e,animate:s})}setOptions(t,e){return te.some(o=>o in t&&t[o]!==this.options[o])?this._record("options",()=>this._setOptions(t,e)):this._setOptions(t,e)}_setOptions(t,{relayout:e=!0}={}){Object.assign(this.userOptions,t),this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options;let s="explore"in t||"exploreUnfocused"in t||"exploreLimit"in t;return"explore"in t&&(this._explore={path:[],shown:new Map}),s&&(e=!0),e?this.relayout({fresh:"direction"in t||"explore"in t}):this._reroute()}exportState(){let t={};for(let[s,o]of this.positions)t[s]={x:Ke(o.x),y:Ke(o.y),pinned:!!this.pins.get(s)};let e={};if(this.routing)for(let[s,o]of this.routing.paths)e[s]=o.points.map(n=>[Ye(n.x),Ye(n.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:e,transform:{...this.renderer.transform}}}importState(t,e){return!t||!t.nodes?Promise.resolve(this):this._record("import",()=>this._importState(t,e))}_importState(t,{animate:e=this.options.animate,transform:s=!0}={}){let o=this._snapshot();for(let[n,i]of Object.entries(t.nodes)){let d=this.positions.get(n);d&&(d.x=i.x,d.y=i.y,i.pinned?this.pins.set(n,{x:i.x,y:i.y}):this.pins.delete(n))}this.model=this._prepareModel();for(let n of this.layoutEdges.values())n.waypoints=[];return this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&Zt(this.model,this.routing,this.positions,t.edges),this._present(o,e),s&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,e=!0){let s=this.positions.get(t);if(!s)return;let o=this.pins.get(t);(e?o&&o.x===s.x&&o.y===s.y:!o)||this._record(e?"pin":"unpin",()=>this._pin(t,s,e))}_pin(t,e,s){s?this.pins.set(t,{x:e.x,y:e.y}):this.pins.delete(t);let o=this.model.nodeById.get(t);o&&Object.assign(o.constraints,{pinned:s,x:s?e.x:null,y:s?e.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:s})}unpin(t){this.pin(t,!1)}unpinAll(){this.pins.size&&this.batch("unpin",()=>{for(let t of[...this.pins.keys()])this.pin(t,!1)})}async undo(){return this._step(this._undo,this._redo,"undo")}async redo(){return this._step(this._redo,this._undo,"redo")}canUndo(){return this._undo.length>0}canRedo(){return this._redo.length>0}getHistory(){return{undo:this._undo.map(t=>t.label),redo:this._redo.map(t=>t.label)}}clearHistory(){this._undo=[],this._redo=[],this._historyChanged("clear")}batch(t,e){return this._record(t,e)}select(t,{add:e=!1,toggle:s=!1}={}){let o=(t==null?[]:Array.isArray(t)?t:[t]).map(Zn).filter(Boolean),n=Ue([...this._sel.values()]);!e&&!s&&this._sel.clear();for(let i of o){let d=i.kind+":"+i.id,a=this._sel.delete(d);s&&a||this._sel.set(d,i)}this.selected=[...this._sel.values()].pop()||null,this._paintSelection(),this._applyHighlight(),this._emit("select",this.selected),Ue([...this._sel.values()])!==n&&this._emit("selectionchange",this._selectionPayload())}getSelection(){return this.selected}getSelectedItems(){return[...this._sel.values()].map(t=>({...t}))}getSelectedNodes(){return this._selectionPayload().nodes}getSelectedEdges(){return this._selectionPayload().edges}selectAll(){this.model&&this.select(this.model.nodes.filter(t=>!t.id.startsWith(W)).map(t=>t.id))}clearSelection(){this.select(null)}getConnections(t,{chain:e=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let s=this._ex?this.model.edges.filter(i=>!i.target.startsWith(W)):this.model.edges,o=i=>{let d=new Set([t]),a=[],c=[t];for(;c.length;){let h=c.shift();for(let p of s){let g=i==="next"?p.source:p.target,f=i==="next"?p.target:p.source;g!==h||d.has(f)||(d.add(f),a.push(f),e&&c.push(f))}}return a.map(h=>this.model.nodeById.get(h).data)},n=i=>i.data;return{previous:o("previous"),next:o("next"),incoming:s.filter(i=>i.target===t).map(n),outgoing:s.filter(i=>i.source===t).map(n)}}expand(t,e=!0){t=String(t);let s=this.model?.nodeById.get(t);return!s||!qt(s.data,this.options)?Promise.resolve(!1):this.renderer.expanded.has(t)===!!e?Promise.resolve(!0):this._record(e?"expand":"collapse",()=>(e?this.renderer.expanded.add(t):this.renderer.expanded.delete(t),this.options.onNodeExpand?.(s.data,!!e),this._emit("expand",{id:t,expanded:!!e,node:s.data}),this._relayoutKeeping(t).then(()=>!0)))}collapse(t){return this.expand(t,!1)}toggleExpand(t){return this.expand(t,!this.isExpanded(t))}isExpanded(t){return this.renderer.expanded.has(String(t))}getExplorePath(){return[...this._explore.path]}setExplorePath(t,{animate:e=this.options.animate}={}){let s=(t||[]).map(String),o=this._explore.path;if(this._explore.path=s,this._emit("explore",{path:[...s]}),!this.options.explore)return Promise.resolve(this);let n=s.length>o.length?s[s.length-1]:o[s.length]??s[s.length-1];return this._relayoutKeeping(n,{animate:e,reveal:s[s.length-1]})}exploreBack(){let t=this._explore.path;return t.length?this.setExplorePath(t.slice(0,-1)):Promise.resolve(this)}fit({padding:t=40,maxZoom:e=1}={}){let s=this.renderer.viewport,o=xt({nodes:this.positions,groups:this._groups||new Map});if(!o.width&&!o.height)return;let n=s.clientWidth||800,i=s.clientHeight||600,d=Math.min((n-2*t)/(o.width||1),(i-2*t)/(o.height||1),e);d=Qt(d,this.options.minZoom,this.options.maxZoom),this.setTransform({k:d,x:(n-o.width*d)/2-o.x*d,y:(i-o.height*d)/2-o.y*d})}fitNodes(t,{padding:e=40,maxZoom:s=this.options.maxZoom,animate:o=this.options.animate,edges:n}={}){let i=this._fitTransform(t,{padding:e,maxZoom:s,edges:n});return i?(this._animateTransform(i,o),!0):!1}_fitTransform(t,{padding:e=40,maxZoom:s=this.options.maxZoom,edges:o}={}){let n=new Set([...t].map(String).filter(M=>this.positions.has(M)));if(!n.size)return null;let i=1/0,d=1/0,a=-1/0,c=-1/0,h=(M,b)=>{i=Math.min(i,M),d=Math.min(d,b),a=Math.max(a,M),c=Math.max(c,b)};for(let M of n){let b=this.positions.get(M);h(b.x,b.y),h(b.x+b.width,b.y+b.height)}let p=o||this.model.edges.filter(M=>n.has(M.source)&&n.has(M.target)).map(M=>M.id);for(let M of p)for(let b of this.routing?.paths.get(M)?.points||[])h(b.x,b.y);let g=this.renderer.viewport,f=g.clientWidth||800,l=g.clientHeight||600,u=a-i,m=c-d,w=Math.min((f-2*e)/(u||1),(l-2*e)/(m||1),s);return w=Qt(w,this.options.minZoom,this.options.maxZoom),{k:w,x:(f-u*w)/2-i*w,y:(l-m*w)/2-d*w}}fitFlow(t=this.selected,{mode:e="chain",...s}={}){if(t==null)return!1;if(t===this.selected&&this._sel.size>1){let d=[...this._sel.values()].flatMap(a=>{if(a.kind==="node")return[a.id];let c=this.model?.edgeById.get(a.id);return c?[c.source,c.target]:[]});return this.fitNodes(d,s)}let o;if(typeof t=="string")o={kind:"node",id:t};else if(t.kind)o={kind:t.kind,id:String(t.id)};else{let d=this.model?.edges.find(a=>a.data===t);if(!d)return!1;o={kind:"edge",id:d.id}}if(!(o.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(o.id))return!1;let i=Et(this.model.edges,o,e);return this.fitNodes(i.nodes,{...s,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,e){this._stopZoom();let s=this.getTransform();if(!e||je()||typeof requestAnimationFrame>"u"){this.setTransform(t);return}let o=this.options.animationDuration,n=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,d=a=>{let c=Math.min(1,(a-n)/o),h=i(c),p=s.k*Math.pow(t.k/s.k,h),g=t.k-s.k?(p-s.k)/(t.k-s.k):h;this.setTransform({k:p,x:s.x+(t.x-s.x)*g,y:s.y+(t.y-s.y)*g}),c<1&&(this._zoomAnim=requestAnimationFrame(d))};this._zoomAnim=requestAnimationFrame(d)}zoomAt(t,e,s){let o=this.renderer.transform;t=Qt(t,this.options.minZoom,this.options.maxZoom);let n=this.renderer.viewport.getBoundingClientRect(),i=e-n.left,d=s-n.top;this.setTransform({k:t,x:i-(i-o.x)*t/o.k,y:d-(d-o.y)*t/o.k})}zoomBy(t){let e=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,e.left+e.width/2,e.top+e.height/2)}zoomTo(t){this.zoomAt(t,...Vn(this.renderer.viewport))}setTransform(t){this.renderer.setTransform(t),this._emit("viewport",{...t})}getTransform(){return{...this.renderer.transform}}getLayout(){let t=new Map([...this.positions].map(([s,o])=>[s,{...o}])),e=new Map;if(this.routing)for(let[s,o]of this.routing.paths)e.set(s,o.points.map(n=>({...n})));return{nodes:t,edges:e,groups:new Map(this._groups||[])}}on(t,e){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(e),()=>this._listeners.get(t).delete(e)}destroy(){cancelAnimationFrame(this._anim),this.container.classList.remove("fg-explore","fg-explore--blur"),delete this.container.dataset.fgDirection,this._stopZoom(),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,e){for(let s of this._listeners.get(t)||[])try{s(e)}catch(o){console.error(o)}}_refreshView(){if(!this.options.explore){this._ex=null,this._viewData=this.data;return}this._exIndexFor!==this.data&&(this._exIndex=Fe(this.data),this._exIndexFor=this.data);let t=this.options;this._ex=De(this.data,this._exIndex,{path:this._explore.path,shown:this._explore.shown,limit:t.exploreLimit,hide:t.exploreUnfocused==="hide",moreLabel:t.exploreMoreText}),this._viewData=this._ex.data}async _relayoutKeeping(t,{animate:e=this.options.animate,reveal:s}={}){let o=this.getTransform(),n=this.positions.get(t);await this._build({mode:"relayout",animate:e});let i=this.positions.get(t),d=o;if(n&&i&&(d={k:o.k,x:o.x-(i.x-n.x)*o.k,y:o.y-(i.y-n.y)*o.k}),s&&this.positions.has(s)){let a=[s,...this.model.edges.filter(h=>h.source===s).map(h=>h.target)],c=this._fitTransform(a,{maxZoom:o.k});c&&c.k>=o.k*.6&&!this._inView(a,d)&&(d=c)}return this._animateTransform(d,e&&!!n),this}_inView(t,e,s=20){let o=this.renderer.viewport,n=o.clientWidth||800,i=o.clientHeight||600;return t.every(d=>{let a=this.positions.get(d);if(!a)return!0;let c=a.x*e.k+e.x,h=a.y*e.k+e.y;return c>=s&&h>=s&&c+a.width*e.k<=n-s&&h+a.height*e.k<=i-s})}_prepareModel(t){let e=this._viewData||this.data,s=this.renderer.syncNodes(e.nodes||[]),o=(e.nodes||[]).map(i=>{let d=String(i.id),a=t&&t.get(d)||this.pins.get(d);return a?{...i,constraints:{...i.constraints||{},pinned:!0,x:a.x,y:a.y}}:i}),n=$t({...e,nodes:o},this.userOptions,s);for(let i of n.warnings)console.warn("[FlexGraph] "+i);return this.options=n.options,this.renderer.options=n.options,n}_snapshot(){return{positions:new Map([...this.positions].map(([t,e])=>[t,{...e}])),routing:this.routing,groups:this._groups}}_build(t){let e=this._buildNow(t);return this._lastBuild=e.catch(()=>{}),e}async _buildNow({mode:t,animate:e,fresh:s}){let o=this._snapshot();this._refreshView(),this._exploreChrome();let n=this._prepareModel(),i,d=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")i=await this._layoutInWorker(n,t,s);else if(t==="stable"&&d){let a=new Map;for(let h of n.nodes){let p=this.positions.get(h.id);p&&a.set(h.id,{x:p.x,y:p.y})}let c=this._prepareModel(a);i=kt(c),Ee(i,new Set(a.keys()),this.options.nodeSpacing/2,this.options.direction);for(let h of i.edges.values())h.waypoints=[];n=this._prepareModel()}else{let a=s||!d?null:new Map([...this.positions].map(([c,h])=>[c,{x:h.x+h.width/2,y:h.y+h.height/2}]));i=kt(n,{hints:a})}return this.model=n,this.positions=new Map([...i.nodes].map(([a,c])=>[a,{x:c.x,y:c.y,width:c.width,height:c.height}])),this.layoutEdges=i.edges,this.routing=i.routing||it(n,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(n),this._present(d?o:null,e),this._pruneSelection(),this._emit("layout",{crossings:i.crossings}),this}_layoutInWorker(t,e,s){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=a=>{let c=this._wpending.get(a.data.seq);c&&(this._wpending.delete(a.data.seq),a.data.error?c.reject(new Error(a.data.error)):c.resolve(a.data))});let o={options:this.data.options,nodes:t.nodes.map(a=>({...Jt(a.data),id:a.id,width:a.width,height:a.height,constraints:a.constraints})),edges:t.edges.map(a=>Jt(a.data)),groups:t.groups.map(a=>({id:a.id,label:a.label})),constraints:(this._viewData?.constraints||[]).map(Jt)},n={};for(let[a,c]of Object.entries(this.userOptions))typeof c!="function"&&a!=="worker"&&(n[a]=c);let i=s||e!=="relayout"?null:new Map([...this.positions].map(([a,c])=>[a,{x:c.x+c.width/2,y:c.y+c.height/2}])),d=++this._wseq;return new Promise((a,c)=>{this._wpending.set(d,{resolve:a,reject:c}),this._worker.postMessage({seq:d,data:o,options:n,hints:i})}).then(a=>({nodes:a.nodes,edges:a.edges,crossings:a.crossings,routing:a.routing}))}_reroute(){return this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let e=this.renderer;e.placeNodes(this.model,this.positions),this._groups=mt(this.model,{nodes:this.positions}),e.renderGroups(this.model,this._groups),e.renderEdges(this.model,this.routing,t,t?null:this.positions);for(let s of this._sel.values())s.kind==="edge"&&e.edgeEls.get(s.id)?.classList.add("fg-selected");if(this._hl.length)for(let s of this._hl)s.classList.add("fg-hl");this._exploreFocus()}_exploreFocus(){let t=this.renderer,e=this._ex,s=new Map;if(e){let o=new Set(this._explore.path);for(let[n,i]of e.childCount)s.set(n,{text:o.has(n)?"\u2212":String(i),open:o.has(n),title:`${i} ${i===1?"child":"children"}`})}for(let[o,n]of t.nodeEls)n.classList.toggle("fg-unfocused",!!e&&!e.focus.has(o));for(let o of this.model.edges)t.edgeEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target))),t.labelEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target)));t.renderBadges(s)}_exploreChrome(){let t=this.options,e=this.renderer.viewport;this.container.classList.toggle("fg-explore",!!t.explore),this.container.classList.toggle("fg-explore--blur",!!t.explore&&t.exploreUnfocused==="blur"),this.container.dataset.fgDirection=t.direction;let s=e.querySelector(":scope > .fg-breadcrumb");if(!t.explore||!t.exploreBreadcrumb){s?.remove();return}s||(s=document.createElement("nav"),s.className="fg-breadcrumb",s.setAttribute("aria-label","Explore path"),e.appendChild(s)),s.innerHTML="";let o=this._explore.path,n=(i,d,a)=>{let c=document.createElement("button");c.type="button",c.textContent=i,a&&c.setAttribute("aria-current","step"),c.addEventListener("click",h=>{h.stopPropagation(),this.setExplorePath(d)}),s.appendChild(c)};n(t.exploreStartText,[],!o.length),o.forEach((i,d)=>{let a=document.createElement("span");a.className="fg-breadcrumb__sep",a.textContent="\u203A",a.setAttribute("aria-hidden","true"),s.appendChild(a);let c=this._exIndex?.nodeById.get(i);n(String(c?.label??i),o.slice(0,d+1),d===o.length-1)})}_present(t,e){if(cancelAnimationFrame(this._anim),!t||!e||je()||!t.routing){this._render();return}let s=this.positions,o=this.options.animationDuration,n=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,d=a=>{let c=Math.min(1,(a-n)/o);if(c>=1){this._render(),this._emit("animationend");return}let h=i(c),p=new Map;for(let[g,f]of s){let l=this._ex?.parentOf.get(g)??(g.startsWith(W)?g.slice(W.length):null),u=t.positions.get(g)||l!=null&&t.positions.get(l)||f;p.set(g,{x:u.x+(f.x-u.x)*h,y:u.y+(f.y-u.y)*h,width:f.width,height:f.height})}this.renderer.placeNodes(this.model,p),this._groups=mt(this.model,{nodes:p}),this.renderer.renderGroups(this.model,this._groups),this.renderer.renderEdges(this.model,this.routing,ze(t.routing.paths,this.routing.paths,h)),this._anim=requestAnimationFrame(d)};this._anim=requestAnimationFrame(d)}_dragStart(t){cancelAnimationFrame(this._anim),this._dragSnap=this._canRecord()?this._capture("move"):null;let e=this._sel.has("node:"+t)?[...this._sel.values()].filter(n=>n.kind==="node"&&this.positions.has(n.id)).map(n=>n.id):[t],s=new Set(e);this._dragGroup=e.map(n=>{let i=this.positions.get(n);return{id:n,x:i.x,y:i.y}});let o=new Set(s);for(let n of this.model.edges)s.has(n.source)&&o.add(n.target),s.has(n.target)&&o.add(n.source);this._affected=new Set(this.model.edges.filter(n=>o.has(n.source)||o.has(n.target)).map(n=>n.id));for(let n of this._affected){let i=this.model.edgeById.get(n);if(s.has(i.source)||s.has(i.target)){let d=this.layoutEdges.get(n);d&&(d.waypoints=[])}}for(let n of e)this.renderer.nodeEls.get(n)?.classList.add("fg-node--dragging");this._emit("dragstart",{id:t,ids:[...e]})}_dragMove(t,e,s){let o=this.positions.get(t),n=this._dragGroup?.find(c=>c.id===t);if(!o||!n)return;let i=e-n.x,d=s-n.y,a=this.options.nodeMargin;for(let c of this._dragGroup){let h=this.positions.get(c.id);h.x=c.x+i,h.y=c.y+d;let p=this.model.nodeById.get(c.id);p.constraints.pinned&&(p.constraints.x=h.x,p.constraints.y=h.y);let g={x:h.x-a,y:h.y-a,width:h.width+2*a,height:h.height+2*a};if(this.routing)for(let[f,l]of this.routing.paths){if(this._affected.has(f))continue;let u=l.points;for(let m=0;m<u.length-1;m++)if(ht(u[m],u[m+1],g,1)){this._affected.add(f);break}}}this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:e,y:s,ids:this._dragGroup.map(c=>c.id)})}_dragEnd(t){let e=this.positions.get(t),s=(this._dragGroup||[{id:t}]).map(o=>o.id);this._dragGroup=null,this._recDepth++;try{for(let o of s)this.renderer.nodeEls.get(o)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(o,!0)}finally{this._recDepth--}this._dragSnap&&(this._push(this._dragSnap),this._dragSnap=null),this._emit("dragend",{id:t,x:e.x,y:e.y,ids:s}),this._emit("change",this.exportState())}_boxSelect(t,e){let s=[];for(let[o,n]of this.positions)o.startsWith(W)||n.x<t.x+t.width&&t.x<n.x+n.width&&n.y<t.y+t.height&&t.y<n.y+n.height&&s.push({kind:"node",id:o});this.select([...e,...s])}_click(t,e){let s=this.options.multiSelect&&!!(e.ctrlKey||e.metaKey||e.shiftKey);if(!(t.kind==="node"&&this._ex&&!s&&this._exploreClick(t.id)))if(t.kind==="node"){if(t.id.startsWith(W))return;this.select({kind:"node",id:t.id},{toggle:s});let o=this.model.nodeById.get(t.id),n=this.getConnections(t.id);this.options.onNodeClick?.(o.data,e,n),this._emit("nodeclick",{node:o.data,event:e,previous:n.previous,next:n.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id},{toggle:s});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,e),this._emit("edgeclick",{edge:o.data,event:e})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:e}):(s||this.select(null),this.options.onBackgroundClick?.(e))}_exploreClick(t){if(t.startsWith(W)){let e=t.slice(W.length),s=this._explore.shown;return s.set(e,Math.max(this.options.exploreLimit,s.get(e)||0)+this.options.exploreLimit),this._relayoutKeeping(t),!0}return!this._exIndex.children.has(t)&&!this._explore.path.includes(t)||this.setExplorePath(Xe(this._explore.path,t,this._ex.parentOf)),!1}_escape(){if(this._sel.size>1||!(this._ex&&this._explore.path.length)){this.select(null);return}this.select(null),this.exploreBack()}_nodeExists(t){return this._exIndex&&this.options.explore?this._exIndex.nodeById.has(t):!!this.model?.nodeById.has(t)||(this.data.nodes||[]).some(e=>String(e.id)===t)}_pruneSelection(){let t=s=>s.kind==="edge"?(this.data.edges||[]).some((o,n)=>String(o.id??"e"+n)===s.id):this._nodeExists(s.id),e=[...this._sel].filter(([,s])=>!t(s));if(e.length){for(let[s]of e)this._sel.delete(s);this.select([...this._sel.values()])}else this._sel.size&&(this._paintSelection(),this._applyHighlight())}_canRecord(){return!!this.options.history&&!this._recDepth&&!this._restoring&&!!this.model}_record(t,e){if(!this._canRecord())return e();let s=this._capture(t);this._recDepth++;let o;try{o=e()}finally{this._recDepth--}return this._push(s),o}_push(t){this._undo.push(t);let e=Math.max(1,this.options.historyLimit|0);this._undo.length>e&&this._undo.splice(0,this._undo.length-e),this._redo=[],this._historyChanged("record",t.label)}_capture(t){let e={};if(this.routing)for(let[s,o]of this.routing.paths)e[s]=o.points.map(n=>[n.x,n.y]);return{label:t,data:this.data,opts:Object.fromEntries(te.map(s=>[s,this.options[s]])),positions:new Map([...this.positions].map(([s,o])=>[s,{...o}])),pins:new Map([...this.pins].map(([s,o])=>[s,{...o}])),expanded:[...this.renderer.expanded],layoutEdges:new Map([...this.layoutEdges].map(([s,o])=>[s,{...o,waypoints:(o.waypoints||[]).map(n=>({...n}))}])),edges:e}}async _step(t,e,s){await this._lastBuild;let o=t.pop();if(!o)return!1;e.push(this._capture(o.label)),this._restoring=!0;try{await this._restore(o)}finally{this._restoring=!1}return this._historyChanged(s,o.label),this._emit("change",this.exportState()),!0}async _restore(t){let e=this._snapshot();this.data=t.data;let s=te.filter(i=>this.options[i]!==t.opts[i]);for(let i of s)this.userOptions[i]=t.opts[i];s.length&&(this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options),this.renderer.expanded=new Set(t.expanded);let o=new Set((this.data.nodes||[]).map(i=>String(i.id))),n=this._explore.path.findIndex(i=>!o.has(i));n>=0&&(this._explore.path=this._explore.path.slice(0,n)),this.pins=new Map([...t.pins].map(([i,d])=>[i,{...d}])),this.positions=new Map([...t.positions].map(([i,d])=>[i,{...d}])),this.layoutEdges=new Map([...t.layoutEdges].map(([i,d])=>[i,{...d,waypoints:d.waypoints.map(a=>({...a}))}])),this._refreshView(),this._exploreChrome(),this.model=this._prepareModel(),this.model.nodes.some(i=>!this.positions.has(i.id))?await this._build({mode:"stable",animate:this.options.animate}):(this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),Zt(this.model,this.routing,this.positions,t.edges),this.renderer.renderPorts(this.model),this._present(e,this.options.animate)),this._pruneSelection(),n>=0&&this._emit("explore",{path:[...this._explore.path]})}_historyChanged(t,e){let s=this._historyButtons;s&&(s.undo.disabled=!this._undo.length,s.redo.disabled=!this._redo.length),this._emit("history",{action:t,label:e,canUndo:this._undo.length>0,canRedo:this._redo.length>0,data:this.data})}_paintSelection(){let t=this.renderer;for(let e of t.viewport.querySelectorAll(".fg-selected"))e.classList.remove("fg-selected");for(let e of this._sel.values())(e.kind==="edge"?t.edgeEls:t.nodeEls).get(e.id)?.classList.add("fg-selected");t.world.classList.toggle("fg-multi",this._sel.size>1)}_selectionPayload(){let t=[],e=[];for(let s of this._sel.values())if(s.kind==="node"){let o=this.model?.nodeById.get(s.id)?.data??this._exIndex?.nodeById.get(s.id)??(this.data.nodes||[]).find(n=>String(n.id)===s.id);o&&t.push(o)}else{let o=this.model?.edgeById.get(s.id)?.data;o&&e.push(o)}return{items:this.getSelectedItems(),nodes:t,edges:e}}_contextMenu(t,e){let s=this.options,o,n;if(t.kind==="node"&&this.model?.nodeById.has(t.id)){let i=this.model.nodeById.get(t.id).data,d=this.getConnections(t.id);o={kind:"node",id:t.id,node:i,previous:d.previous,next:d.next,event:e},n=s.onNodeContextMenu&&(()=>s.onNodeContextMenu(i,e,d))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;o={kind:"edge",id:t.id,edge:i,event:e},n=s.onEdgeContextMenu&&(()=>s.onEdgeContextMenu(i,e))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;o={kind:"group",id:t.id,group:i,event:e},n=s.onGroupContextMenu&&(()=>s.onGroupContextMenu(i,e))}else o={kind:"background",event:e},n=s.onBackgroundContextMenu&&(()=>s.onBackgroundContextMenu(e));o.selection=this.getSelectedItems(),(n||this._listeners.get("contextmenu")?.size)&&e.preventDefault(),n?.(),this._emit("contextmenu",o)}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let n of this._hl)n.classList.remove("fg-hl");this._hl=[];let t=this.renderer,e=n=>!!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id),s=null;if(this._hovered&&e(this._hovered)?s=Et(this.model.edges,this._hovered,this.options.hoverHighlight):this.options.highlightSelection&&this._sel.size>1?s=Wn(this.model.edges,[...this._sel.values()].filter(e)):this.options.highlightSelection&&this.selected&&e(this.selected)&&(s=Et(this.model.edges,this.selected,this.options.hoverHighlight)),t.world.classList.toggle("fg-hovering",!!s),!s)return;let o=n=>{n&&(n.classList.add("fg-hl"),this._hl.push(n))};for(let n of s.nodes)o(t.nodeEls.get(n));for(let n of s.edges)o(t.edgeEls.get(n)),o(t.labelEls.get(n))}_controls(){let t=document.createElement("div");t.className="fg-controls";let e=(s,o,n)=>{let i=document.createElement("button");return i.type="button",i.textContent=s,i.title=o,i.setAttribute("aria-label",o),i.addEventListener("click",d=>{d.stopPropagation(),n()}),t.appendChild(i),i};if(e("+","Zoom in",()=>this.zoomBy(1.25)),e("\u2212","Zoom out",()=>this.zoomBy(.8)),e("\u2922","Fit to screen",()=>this.fit()),this.options.history){let s=e("\u21B6","Undo (Ctrl+Z)",()=>this.undo()),o=e("\u21B7","Redo (Ctrl+Shift+Z)",()=>this.redo());s.disabled=o.disabled=!0,s.classList.add("fg-controls__undo"),this._historyButtons={undo:s,redo:o}}this.renderer.viewport.appendChild(t)}},Qt=(r,t,e)=>Math.max(t,Math.min(e,r)),te=["direction","edgeRouting"],Zn=r=>r==null?null:typeof r=="string"||typeof r=="number"?{kind:"node",id:String(r)}:r.id!=null?{kind:r.kind==="edge"?"edge":"node",id:String(r.id)}:null,Ue=r=>r.map(t=>t.kind+":"+t.id).join("|");function Wn(r,t){let e=new Set,s=new Set;for(let n of t)if(n.kind==="node")e.add(n.id);else{let i=r.find(d=>d.id===n.id);i&&(s.add(i.id),e.add(i.source),e.add(i.target))}let o=new Set(t.filter(n=>n.kind==="node").map(n=>n.id));for(let n of r)o.has(n.source)&&o.has(n.target)&&s.add(n.id);return{nodes:e,edges:s}}var Ke=r=>Math.round(r*10)/10,Ye=r=>Math.round(r*100)/100;function Vn(r){let t=r.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}export{Rt as DEFAULT_OPTIONS,gt as GraphValidationError,ee as GraphView,Xn as VERSION,kt as computeLayout,$s as createGraph,Te as edgePath,Rs as layoutGraph,Ge as metrics,$t as normalizeGraph,it as routeEdges,Wn as selectionHighlight};
1
+ /*! FlexGraph v1.3.0 | MIT License | (c) 2026 Alexander Pettersen (kazant) | https://github.com/kazant/flexgraph */
2
+ var ts=Object.defineProperty;var es=(a,t)=>{for(var e in t)ts(a,e,{get:t[e],enumerable:!0})};var ss=["top","right","bottom","left"],ns=["TB","LR","BT","RL"],os=["orthogonal","straight","curved"],$t=Object.freeze({direction:"TB",nodeSpacing:40,rankSpacing:80,edgeSpacing:10,edgeRouting:"orthogonal",cornerRadius:6,lineHops:!0,hopRadius:4,animate:!0,animationDuration:300,nodeMargin:14,groupPadding:20,groupLabelHeight:22,componentSpacing:80,maxIterations:24,bendPenalty:24,crossingPenalty:120,bundleFanOut:5,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!0,multiSelect:!0,history:!0,historyLimit:100,expandText:"Details",collapseText:"Hide",explore:!1,exploreUnfocused:"dim",exploreLimit:25,exploreBreadcrumb:!0,exploreStartText:"Start",exploreMoreText:void 0,edgeTypes:{default:{markerEnd:"arrow"},"has-many":{markerStart:"one",markerEnd:"many"},"has-one":{markerStart:"one",markerEnd:"onlyOne"},"belongs-to":{markerStart:"many",markerEnd:"one"},"many-to-many":{markerStart:"many",markerEnd:"many"},association:{markerEnd:"open"},composition:{markerStart:"diamond"},dependency:{markerEnd:"open"}}}),gt=class extends Error{constructor(t,e=[]){super(t),this.name="GraphValidationError",this.details=e}},tt=a=>typeof a=="number"&&Number.isFinite(a);function yt(...a){let t={...$t,edgeTypes:{...$t.edgeTypes}};for(let e of a)if(e)for(let[n,o]of Object.entries(e))o!==void 0&&(n==="edgeTypes"?Object.assign(t.edgeTypes,o):t[n]=o);return ns.includes(t.direction)||(t.direction="TB"),os.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function zt(a,t,e){if(!a||typeof a!="object")throw new gt("Graph must be an object");let n=yt(a.options,t),o=[],s=[],i=[],d=new Map;for(let p of a.groups||[]){if(!p||p.id==null){o.push("Group without id");continue}let l=String(p.id);if(d.has(l)){o.push(`Duplicate group id "${l}"`);continue}let f={id:l,label:p.label??l,className:p.className||"",data:p};i.push(f),d.set(l,f)}let r=[],c=new Map;(a.nodes||[]).forEach((p,l)=>{if(!p||p.id==null){o.push(`Node at index ${l} has no id`);return}let f=String(p.id);if(c.has(f)){o.push(`Duplicate node id "${f}"`);return}let m=e&&e.get(f),y=tt(p.width)?p.width:m?m.width:n.defaultNodeWidth,k=tt(p.height)?p.height:m?m.height:n.defaultNodeHeight,_=p.group!=null?String(p.group):null;if(_&&!d.has(_)){let v={id:_,label:_,className:"",data:{id:_}};i.push(v),d.set(_,v)}let w=[],x=new Set;for(let v of p.ports||[]){if(!v||v.id==null){s.push(`Node "${f}": port without id ignored`);continue}let I=String(v.id);if(x.has(I)){s.push(`Node "${f}": duplicate port "${I}" ignored`);continue}let N=ss.includes(v.side)?v.side:null;N||s.push(`Node "${f}": port "${I}" has invalid side "${v.side}", using auto side`),x.add(I),w.push({id:I,side:N,offset:tt(v.offset)?Math.min(1,Math.max(0,v.offset)):null,label:v.label,data:v})}let b=p.constraints||{},M={pinned:!!b.pinned,x:tt(b.x)?b.x:tt(p.x)&&b.pinned?p.x:null,y:tt(b.y)?b.y:tt(p.y)&&b.pinned?p.y:null,rank:Number.isInteger(b.rank)&&b.rank>=0?b.rank:null};M.pinned&&(M.x==null||M.y==null)&&(s.push(`Node "${f}" is pinned but has no x/y; pin ignored until it has a position`),M.pinned=!1);let E={id:f,index:l,label:p.label??f,width:y,height:k,group:_,ports:w,portById:new Map(w.map(v=>[v.id,v])),constraints:M,className:p.className||"",type:p.type||null,data:p};r.push(E),c.set(f,E)});let h=[],u=new Map;(a.edges||[]).forEach((p,l)=>{if(!p)return;let f=p.id!=null?String(p.id):`e${l}`;if(u.has(f)){o.push(`Duplicate edge id "${f}"`);return}let m=String(p.source),y=String(p.target);if(!c.has(m)){o.push(`Edge "${f}": unknown source node "${m}"`);return}if(!c.has(y)){o.push(`Edge "${f}": unknown target node "${y}"`);return}let k=p.sourcePort!=null?String(p.sourcePort):null,_=p.targetPort!=null?String(p.targetPort):null;k&&!c.get(m).portById.has(k)&&(s.push(`Edge "${f}": node "${m}" has no port "${k}"`),k=null),_&&!c.get(y).portById.has(_)&&(s.push(`Edge "${f}": node "${y}" has no port "${_}"`),_=null);let w=n.edgeTypes[p.type]||n.edgeTypes.default||{},x={id:f,index:l,source:m,target:y,sourcePort:k,targetPort:_,type:p.type||"default",label:p.label??null,minLen:Number.isInteger(p.minLen)&&p.minLen>=0?p.minLen:1,weight:tt(p.weight)?p.weight:1,markerStart:p.markerStart!==void 0?p.markerStart:w.markerStart||null,markerEnd:p.markerEnd!==void 0?p.markerEnd:w.markerEnd||null,className:p.className||"",data:p};h.push(x),u.set(f,x)});let g=[];for(let p of a.constraints||[])if(!(!p||!p.type))if(p.type==="leftOf"||p.type==="before"){let l=String(p.a),f=String(p.b);if(!c.has(l)||!c.has(f)){s.push("leftOf constraint references unknown node");continue}g.push({type:"leftOf",a:l,b:f})}else if(p.type==="sameRank"){let l=(p.nodes||[]).map(String).filter(f=>c.has(f));l.length>=2?g.push({type:"sameRank",nodes:l}):s.push("sameRank constraint needs at least two known nodes")}else if(p.type==="rank"){let l=String(p.node);c.has(l)&&Number.isInteger(p.rank)&&(c.get(l).constraints.rank=p.rank)}else s.push(`Unknown constraint type "${p.type}"`);if(o.length)throw new gt(o[0],o);return{options:n,nodes:r,nodeById:c,edges:h,edgeById:u,groups:i,groupById:d,constraints:g,warnings:s}}function is(a,t){let e=new Map(a.map(d=>[d,[]])),n=new Map(a.map(d=>[d,0]));for(let d of t)e.get(d.v).push(d),n.set(d.w,n.get(d.w)+1);let o=new Map,s=new Set,i=[...a.filter(d=>n.get(d)===0),...a];for(let d of i){if(o.has(d))continue;let r=[[d,0]];for(o.set(d,1);r.length;){let c=r[r.length-1],[h,u]=c,g=e.get(h);if(u>=g.length){o.set(h,2),r.pop();continue}c[1]++;let p=g[u],l=o.get(p.w);l===1?s.add(p.id):l||(o.set(p.w,1),r.push([p.w,0]))}}return s}var Tt=class{constructor(t){this.p=new Map(t.map(e=>[e,e]))}find(t){let e=t;for(;this.p.get(e)!==e;)e=this.p.get(e);for(;this.p.get(t)!==e;){let n=this.p.get(t);this.p.set(t,e),t=n}return e}union(t,e){let n=this.find(t),o=this.find(e);n!==o&&this.p.set(o,n)}};function ge(a,t,e={}){let n=[],o=new Tt(a);for(let w of e.sameRank||[])for(let x=1;x<w.length;x++)o.union(w[0],w[x]);let s=[...new Set(a.map(w=>o.find(w)))],i=new Set,d=new Set,r=[];for(let w of t){if(w.source===w.target){i.add(w.id);continue}let x=o.find(w.source),b=o.find(w.target);if(x===b){d.add(w.id);continue}r.push({id:w.id,v:x,w:b,minLen:w.minLen??1})}let c=is(s,r),h=r.map(w=>c.has(w.id)?{...w,v:w.w,w:w.v}:w),u=new Map;if(e.fixedRank)for(let[w,x]of e.fixedRank){if(!o.p.has(w))continue;let b=o.find(w);u.has(b)&&u.get(b)!==x&&n.push(`Conflicting fixed ranks in sameRank set of "${w}"`),u.set(b,Math.max(u.get(b)??0,x))}let g=new Map(s.map(w=>[w,[]])),p=new Map(s.map(w=>[w,[]]));for(let w of h)g.get(w.v).push(w),p.get(w.w).push(w);let l=new Map(s.map(w=>[w,p.get(w).length])),f=s.filter(w=>l.get(w)===0),m=[];for(;f.length;){let w=f.shift();m.push(w);for(let x of g.get(w))l.set(x.w,l.get(x.w)-1),l.get(x.w)===0&&f.push(x.w)}let y=new Map;for(let w of m){let x=u.get(w)??0;for(let b of p.get(w))x=Math.max(x,y.get(b.v)+b.minLen);u.has(w)&&x!==u.get(w)&&n.push(`Fixed rank ${u.get(w)} for "${w}" cannot be satisfied; using ${x}`),y.set(w,x)}for(let w=m.length-1;w>=0;w--){let x=m[w];if(u.has(x))continue;let b=g.get(x);if(!b.length||p.get(x).length>=b.length)continue;let E=1/0;for(let v of b)E=Math.min(E,y.get(v.w)-v.minLen);E>y.get(x)&&y.set(x,E)}let k=1/0;for(let w of y.values())k=Math.min(k,w);if(!u.size&&k>0)for(let[w,x]of y)y.set(w,x-k);let _=new Map;for(let w of a)_.set(w,y.get(o.find(w))??0);return{rank:_,reversed:c,flat:d,selfLoops:i,warnings:n}}function xe(a,t,e=0){let n=[],o=new Map;for(let c of a)o.set(c.id,n.length),n.push({id:c.id,real:!0,rank:c.rank,width:c.width,height:c.height??0,group:c.group??null,pinX:c.pinX??null,inputIndex:n.length,up:[],down:[]});let s=new Map,i=[],d=(c,h,u,g,p,l)=>{let f={a:c,b:h,aOff:u,bOff:g,w:p,edgeId:l};i.push(f),n[c].down.push({n:h,off:g,own:u,w:p}),n[h].up.push({n:c,off:u,own:g,w:p})};for(let c of t){let h=o.get(c.v),u=o.get(c.w),g=n[h].rank,p=n[u].rank;if(p<=g)continue;let l=n[h].group&&n[h].group===n[u].group?n[h].group:null,f=[],m=h,y=c.vOff||0;for(let k=g+1;k<p;k++){let _=n.length;n.push({id:`__d_${c.id}_${k}`,real:!1,rank:k,width:e,height:0,group:l,pinX:null,edgeId:c.id,inputIndex:_,up:[],down:[]}),d(m,_,y,0,c.weight??1,c.id),f.push(_),m=_,y=0}d(m,u,y,c.wOff||0,c.weight??1,c.id),s.set(c.id,f)}let r=0;for(let c of n)r=Math.max(r,c.rank);return{v:n,index:o,segs:i,chains:s,maxRank:r}}function Dt(a){let t=Array.from({length:a.maxRank+1},()=>[]),e=new Uint8Array(a.v.length),n=a.v.map((o,s)=>s).filter(o=>a.v[o].real).sort((o,s)=>a.v[o].rank-a.v[s].rank||a.v[o].inputIndex-a.v[s].inputIndex);for(let o of n){if(e[o])continue;let s=[o];for(;s.length;){let i=s.pop();if(e[i])continue;e[i]=1,t[a.v[i].rank].push(i);let d=a.v[i].down.map(r=>r.n);for(let r=d.length-1;r>=0;r--)e[d[r]]||s.push(d[r])}}for(let o=0;o<a.v.length;o++)e[o]||t[a.v[o].rank].push(o);return t}function rs(a){let t=a.length;if(t<2)return 0;let e=a.slice(),n=new Array(t),o=0;for(let s=1;s<t;s*=2){for(let i=0;i<t;i+=2*s){let d=Math.min(i+s,t),r=Math.min(i+2*s,t),c=i,h=d,u=i;for(;c<d&&h<r;)e[c]<=e[h]?n[u++]=e[c++]:(o+=d-c,n[u++]=e[h++]);for(;c<d;)n[u++]=e[c++];for(;h<r;)n[u++]=e[h++]}[e,n]=[n,e]}return o}function as(a,t,e,n){let o=[];for(let s of t)for(let i of a.v[s].down)o.push([n[s]+i.own*.999,n[i.n]+i.off*.999]);return o.sort((s,i)=>s[0]-i[0]||s[1]-i[1]),rs(o.map(s=>s[1]))}function Ht(a,t){let e=_t(a,t),n=0;for(let o=0;o<t.length-1;o++)n+=as(a,t[o],t[o+1],e);return n}function _t(a,t){let e=new Float64Array(a.v.length);for(let n of t)n.forEach((o,s)=>{e[o]=s});return e}function me(a,t={}){let e=t.maxIterations??24,n=(t.leftOf||[]).map(([c,h])=>[a.index.get(c),a.index.get(h)]).filter(([c,h])=>c!=null&&h!=null&&a.v[c].rank===a.v[h].rank),o=new Set(n.map(([c,h])=>c+":"+h)),s=[];t.initial&&s.push(t.initial.map(c=>c.slice()));let i=Dt(a);s.push(i),!t.initial&&e>4&&(s.push(i.map(c=>c.slice().reverse())),s.push(i.map(c=>c.slice().sort((h,u)=>a.v[h].inputIndex-a.v[u].inputIndex))));let d=null,r=1/0;for(let c of s){let h=cs(a,c,n,o,e);if(h.crossings<r&&(d=h.layers,r=h.crossings),r===0)break}return{layers:d,crossings:r}}function cs(a,t,e,n,o){let s=t.map(c=>we(a,c,e)),i=s.map(c=>c.slice()),d=Ht(a,s),r=0;for(let c=0;c<o&&d>0;c++){let h=c%2===0;hs(a,s,h,e,c%4>=2),ls(a,s,n);let u=Ht(a,s);if(u<d)d=u,i=s.map(g=>g.slice()),r=0;else if(++r>=6)break}if(d>0&&o>4){s=i.map(c=>c.slice());for(let c=0;c<2;c++){ds(a,s,n);let h=Ht(a,s);if(h<d)d=h,i=s.map(u=>u.slice());else break}}return{layers:i,crossings:d}}function ds(a,t,e){let n=_t(a,t);for(let o of t)if(!(o.length<3||o.length>120))for(let s of o.slice()){let i=a.v[s];if(i.pinX!=null||i.group)continue;let d=o.indexOf(s),r=0,c=d,h=0;for(let u=d-1;u>=0;u--){let g=o[u];if(e.has(g+":"+s)||a.v[g].group)break;h+=ct(a,s,g,n)-ct(a,g,s,n),h<r&&(r=h,c=u)}h=0;for(let u=d+1;u<o.length;u++){let g=o[u];if(e.has(s+":"+g)||a.v[g].group)break;h+=ct(a,g,s,n)-ct(a,s,g,n),h<r&&(r=h,c=u)}c!==d&&(o.splice(d,1),o.splice(c,0,s),o.forEach((u,g)=>{n[u]=g}))}}function hs(a,t,e,n,o){let s=_t(a,t),i=t.length,d=e?ye(1,i):ye(i-2,-1,-1);for(let r of d){let c=t[r],h=new Map;c.forEach((l,f)=>{let m=e?a.v[l].up:a.v[l].down;if(!m.length){h.set(l,f);return}if(o){let _=m.map(x=>s[x.n]+x.off-x.own).sort((x,b)=>x-b),w=_.length>>1;h.set(l,_.length%2?_[w]:(_[w-1]+_[w])/2);return}let y=0,k=0;for(let _ of m)y+=(s[_.n]+_.off-_.own)*_.w,k+=_.w;h.set(l,y/k)});let u=new Map;for(let l of c){let f=a.v[l].group;if(!f)continue;let m=u.get(f)||[0,0];m[0]+=h.get(l),m[1]++,u.set(f,m)}let g=l=>{let f=a.v[l].group;return f?u.get(f)[0]/u.get(f)[1]:h.get(l)},p=new Map(c.map((l,f)=>[l,f]));c.sort((l,f)=>g(l)-g(f)||(a.v[l].group||"").localeCompare(a.v[f].group||"")||h.get(l)-h.get(f)||p.get(l)-p.get(f)),t[r]=we(a,c,n),t[r].forEach((l,f)=>{s[l]=f})}}function we(a,t,e){let n=t.slice(),o=[],s=[];if(n.forEach((i,d)=>{a.v[i].pinX!=null&&(o.push(d),s.push(i))}),s.length>1&&(s.sort((i,d)=>a.v[i].pinX-a.v[d].pinX),o.forEach((i,d)=>{n[i]=s[d]})),e.length)for(let i=0;i<e.length+1;i++){let d=!1;for(let[r,c]of e){let h=n.indexOf(r),u=n.indexOf(c);h<0||u<0||h<u||(n.splice(h,1),n.splice(n.indexOf(c),0,r),d=!0)}if(!d)break}return n}function ct(a,t,e,n){let o=0;for(let s of["up","down"]){let i=a.v[t][s],d=a.v[e][s];for(let r of i)for(let c of d)n[r.n]+r.off>n[c.n]+c.off&&(o+=r.w*c.w)}return o}function ls(a,t,e){let n=_t(a,t),o=!0,s=0;for(;o&&s++<8;){o=!1;for(let i of t)for(let d=0;d<i.length-1;d++){let r=i[d],c=i[d+1],h=a.v[r],u=a.v[c];if((h.group||null)!==(u.group||null)||h.pinX!=null&&u.pinX!=null||e.has(r+":"+c))continue;let g=ct(a,r,c,n);ct(a,c,r,n)<g&&(i[d]=c,i[d+1]=r,n[c]=d,n[r]=d+1,o=!0)}}}function ye(a,t,e=1){let n=[];if(e>0)for(let o=a;o<t;o+=e)n.push(o);else for(let o=a;o>t;o+=e)n.push(o);return n}function fs(a,t,e){let n=a.length,o=new Float64Array(n);for(let h=1;h<n;h++)o[h]=o[h-1]+e[h];let s=[],i=[],d=[],r=[];for(let h=0;h<n;h++)for(s.push(a[h]-o[h]),i.push(t[h]),d.push(h),r.push(h);s.length>1&&s[s.length-2]>s[s.length-1];){let u=s.length-1,g=u-1,p=i[g]+i[u];s[g]=(s[g]*i[g]+s[u]*i[u])/p,i[g]=p,r[g]=r[u],s.pop(),i.pop(),d.pop(),r.pop()}let c=new Float64Array(n);for(let h=0;h<s.length;h++)for(let u=d[h];u<=r[h];u++)c[u]=s[h]+o[u];return c}function ke(a,t,e){let n=a.v.length,o=new Float64Array(n),s=new Float64Array(n),i=e.groupPadding??20,d=e.groupLabelHeight??0,r=(_,w)=>{let x=a.v[_],b=a.v[w],M;return!x.real&&!b.real?M=e.edgeSpacing:!x.real||!b.real?M=(e.nodeSpacing+e.edgeSpacing)/2:M=e.nodeSpacing,x.group!==b.group&&(x.group&&(M+=i),b.group&&(M+=i+(e.labelOnOrderAxis?d:0))),(x.width+b.width)/2+M},c=t.map(_=>_.map((w,x)=>x===0?0:r(_[x-1],w)));t.forEach((_,w)=>{let x=0;_.forEach((M,E)=>{x+=c[w][E],o[M]=x});let b=x/2;_.forEach(M=>{o[M]-=b})});let h=_=>a.v[_].real?1:4,u=(_,w,x)=>{let b=t[_];if(!b.length)return;let M=new Array(b.length),E=new Array(b.length);b.forEach((I,N)=>{let O=a.v[I];if(O.pinX!=null){M[N]=O.pinX,E[N]=1e6;return}let S=0,C=0,z=U=>{for(let q of U){let st=q.w*(a.v[q.n].real?1:2)*h(I);S+=(o[q.n]+q.off*a.v[q.n].width-q.own*O.width)*st,C+=st}};w&&z(O.up),x&&z(O.down),C===0?(M[N]=o[I],E[N]=.05):(M[N]=S/C,E[N]=C)});let v=fs(M,E,c[_]);b.forEach((I,N)=>{o[I]=v[N]})},g=t.length,p=e.iterations??8;for(let _=0;_<p;_++){for(let w=1;w<g;w++)u(w,!0,!1);for(let w=g-2;w>=0;w--)u(w,!1,!0)}for(let _=0;_<2;_++){for(let w=0;w<g;w++)u(w,!0,!0);for(let w=g-1;w>=0;w--)u(w,!0,!0)}let l=t.map(_=>_.reduce((w,x)=>Math.max(w,a.v[x].height||0),0)),f=new Map;for(let _ of a.v){if(!_.real||!_.group)continue;let w=f.get(_.group)||[1/0,-1/0];w[0]=Math.min(w[0],_.rank),w[1]=Math.max(w[1],_.rank),f.set(_.group,w)}let m=new Float64Array(g);for(let[_,w]of f.values()){let x=e.labelOnOrderAxis||e.labelAtRankEnd?0:d,b=e.labelAtRankEnd&&!e.labelOnOrderAxis?d:0;_>0&&(m[_]=Math.max(m[_],i+x)),w<g-1&&(m[w+1]=Math.max(m[w+1],i+b))}let y=[],k=0;for(let _=0;_<g;_++)_>0?k+=l[_-1]/2+e.rankSpacing+m[_]+l[_]/2:k=l[0]/2,y.push(k);for(let _=0;_<n;_++)s[_]=y[a.v[_].rank];return{x:o,y:s,rankY:y,rankHeight:l}}var K={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function bt(a){switch(a){case"LR":return{x:1,y:0,exit:"right",entry:"left"};case"RL":return{x:-1,y:0,exit:"left",entry:"right"};case"BT":return{x:0,y:-1,exit:"top",entry:"bottom"};default:return{x:0,y:1,exit:"bottom",entry:"top"}}}function dt(a){let t=new Map,e={top:[],right:[],bottom:[],left:[]};for(let n of a.ports)n.side&&e[n.side].push(n);for(let n of Object.keys(e)){let o=e[n];o.forEach((s,i)=>{let d=s.offset!=null?s.offset:(i+1)/(o.length+1);t.set(s.id,{side:n,t:d,...us(n,d)})})}return t}function us(a,t){switch(a){case"top":return{px:t,py:0};case"bottom":return{px:t,py:1};case"left":return{px:0,py:t};default:return{px:1,py:t}}}var et=a=>({x:a.x+a.width/2,y:a.y+a.height/2});function _e(a,t){return{x:a.x-t,y:a.y-t,width:a.width+2*t,height:a.height+2*t}}function be(a,t,e,n=.5){return t>a.x+n&&t<a.x+a.width-n&&e>a.y+n&&e<a.y+a.height-n}function ht(a,t,e,n=.5){let o=e.x+n,s=e.x+e.width-n,i=e.y+n,d=e.y+e.height-n;if(s<=o||d<=i)return!1;let r=0,c=1,h=t.x-a.x,u=t.y-a.y,g=(p,l)=>{if(p===0)return l>0;let f=l/p;if(p<0){if(f>c)return!1;f>r&&(r=f)}else{if(f<r)return!1;f<c&&(c=f)}return!0};return!g(-h,a.x-o)||!g(h,s-a.x)||!g(-u,a.y-i)||!g(u,d-a.y)?!1:c-r>1e-9}function Ft(a,t){let e=et(a),n=t.x-e.x,o=t.y-e.y;if(n===0&&o===0)return{...e,side:"bottom"};let s=n!==0?a.width/2/Math.abs(n):1/0,i=o!==0?a.height/2/Math.abs(o):1/0,d=Math.min(s,i),r=s<i?n>0?"right":"left":o>0?"bottom":"top";return{x:e.x+n*d,y:e.y+o*d,side:r}}function Mt(a){let t=[];for(let e of a){let n=t[t.length-1];n&&Math.abs(n.x-e.x)<.01&&Math.abs(n.y-e.y)<.01||t.push({x:e.x,y:e.y})}for(let e=t.length-2;e>=1;e--){let n=t[e-1],o=t[e],s=t[e+1],i=(o.x-n.x)*(s.y-o.y)-(o.y-n.y)*(s.x-o.x),d=(o.x-n.x)*(s.x-o.x)+(o.y-n.y)*(s.y-o.y);Math.abs(i)<.01&&d>=0&&t.splice(e,1)}return t}function ps(a){let t=0;for(let e=1;e<a.length;e++)t+=Math.hypot(a[e].x-a[e-1].x,a[e].y-a[e-1].y);return t}function Xt(a,t){if(a.length===0)return[];if(a.length===1)return Array.from({length:t},()=>({...a[0]}));let e=ps(a)||1,n=[],o=0,s=0;for(let i=0;i<t;i++){let d=e*i/(t-1);for(;o<a.length-2;){let g=Math.hypot(a[o+1].x-a[o].x,a[o+1].y-a[o].y);if(s+g>=d)break;s+=g,o++}let r=a[o],c=a[o+1],h=Math.hypot(c.x-r.x,c.y-r.y)||1,u=Math.min(1,Math.max(0,(d-s)/h));n.push({x:r.x+(c.x-r.x)*u,y:r.y+(c.y-r.y)*u})}return n}var Me=(a,t,e)=>{switch(a){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:-e,y:t};default:return{x:t,y:e}}},Gt=(a,t,e)=>{switch(a){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:e,y:-t};default:return{x:t,y:e}}};function St(a,t={}){return a.nodes.some(e=>e.group)?gs(a,t):jt(a,t)}function Se(a,t,e){let n=new Set(t.map(s=>s.id)),o=t.map(s=>({...s,group:null,constraints:e?s.constraints:{...s.constraints,pinned:!1}}));return{options:a.options,nodes:o,nodeById:new Map(o.map(s=>[s.id,s])),edges:a.edges.filter(s=>n.has(s.source)&&n.has(s.target)),groups:[],groupById:new Map,constraints:a.constraints.filter(s=>s.type==="sameRank"?s.nodes.every(i=>n.has(i)):n.has(s.a)&&n.has(s.b)),warnings:[]}}function gs(a,t){let e=ve(a,t.hints||null,t.hints||null),n=new Map,o=i=>({x:i.x+i.width/2,y:i.y+i.height/2});for(let i of a.nodes){let d=e.nodes.get(i.id);if(!i.group){n.set(i.id,o(d));continue}let r=0,c=0,h=0;for(let u of a.edges){let g=u.source===i.id?u.target:u.target===i.id?u.source:null;if(g==null||a.nodeById.get(g).group===i.group)continue;let p=o(e.nodes.get(g));r+=p.x,c+=p.y,h++}n.set(i.id,h?{x:r/h,y:c/h}:o(d))}let s=ve(a,n,t.hints||n);return s.crossingsRouted<=e.crossingsRouted?s:e}function ve(a,t,e){let n=a.options,o=n.groupPadding,s=n.groupLabelHeight,i=new Map;for(let l of a.nodes)l.group&&(i.has(l.group)||i.set(l.group,[]),i.get(l.group).push(l));let d=new Map,r=[];for(let[l,f]of i){let m=jt(Se(a,f,!1),{hints:t}),y=m.bounds,k="\0group:"+l;d.set(l,{sub:m,b:y,blockId:k}),r.push({id:k,index:-1,label:l,width:y.width+2*o,height:y.height+2*o+s,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let c=l=>{let f=a.nodeById.get(l);return f.group?d.get(f.group).blockId:l},h=Se(a,a.nodes.filter(l=>!l.group),!0);h.nodes.push(...r);for(let l of r)h.nodeById.set(l.id,l);h.edges=[];for(let l of a.edges){let f=c(l.source),m=c(l.target);f===m&&(l.source!==l.target||f!==l.source)||h.edges.push({...l,source:f,target:m,sourcePort:f===l.source?l.sourcePort:null,targetPort:m===l.target?l.targetPort:null})}let u=null;if(e){u=new Map(e);for(let[l,f]of i){let m=0,y=0,k=0;for(let _ of f){let w=e.get(_.id);w&&(m+=w.x,y+=w.y,k++)}k&&u.set(d.get(l).blockId,{x:m/k,y:y/k})}}let g=jt(h,{hints:u}),p={nodes:new Map,edges:new Map,groups:new Map,crossings:g.crossings,warnings:g.warnings};for(let l of a.nodes)l.group||p.nodes.set(l.id,g.nodes.get(l.id));for(let[,{sub:l,b:f,blockId:m}]of d){let y=g.nodes.get(m),k=y.x+o-f.x,_=y.y+o+s-f.y;for(let[w,x]of l.nodes)p.nodes.set(w,{...x,x:x.x+k,y:x.y+_});for(let[w,x]of l.edges)p.edges.set(w,{...x,waypoints:x.waypoints.map(b=>({x:b.x+k,y:b.y+_}))});p.crossings+=l.crossings}for(let l of a.edges){if(p.edges.has(l.id))continue;let f=g.edges.get(l.id),m=c(l.source)!==l.source||c(l.target)!==l.target;p.edges.set(l.id,f?{...f,waypoints:m?[]:f.waypoints}:{waypoints:[],reversed:!1,selfLoop:l.source===l.target,flat:!1})}for(let l of a.nodes)if(l.group&&l.constraints.pinned){let f=p.nodes.get(l.id);f.x=l.constraints.x,f.y=l.constraints.y}if(mt(a,p),!a.nodes.some(l=>l.constraints.pinned)){let l=xt(p);Ee(p,-l.x,-l.y);for(let f of p.groups.values())f.x-=l.x,f.y-=l.y}return p.bounds=xt(p),p.crossingsRouted=ys(a,p),p}function ys(a,t){let e=[];for(let s of a.edges){if(s.source===s.target)continue;let i=t.nodes.get(s.source),d=t.nodes.get(s.target);e.push([s.source,s.target,i.x+i.width/2,i.y+i.height/2,d.x+d.width/2,d.y+d.height/2])}let n=0,o=(s,i,d,r,c,h)=>(d-s)*(h-i)-(r-i)*(c-s);for(let s=0;s<e.length;s++)for(let i=s+1;i<e.length;i++){let d=e[s],r=e[i];if(d[0]===r[0]||d[0]===r[1]||d[1]===r[0]||d[1]===r[1])continue;let c=o(r[2],r[3],r[4],r[5],d[2],d[3]),h=o(r[2],r[3],r[4],r[5],d[4],d[5]),u=o(d[2],d[3],d[4],d[5],r[2],r[3]),g=o(d[2],d[3],d[4],d[5],r[4],r[5]);c*h<0&&u*g<0&&n++}return n}function jt(a,t={}){let e=a.options,n=e.direction,o=n==="LR"||n==="RL",s=[],i=new Map;for(let g of a.nodes){let p=dt(g),l=new Map;for(let[y,k]of p)l.set(y,(o?k.py:k.px)-.5);let f=null,m=null;if(g.constraints.pinned){let y=Gt(n,g.constraints.x+g.width/2,g.constraints.y+g.height/2);f=y.x,m=y.y}i.set(g.id,{iw:o?g.height:g.width,ih:o?g.width:g.height,frac:l,pinX:f,pinY:m})}let d=ms(a),r={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:s},c=[];for(let g of d){let p=g.nodes,l=new Set(p),f=a.edges.filter(S=>l.has(S.source)),m=new Map;for(let S of p){let C=a.nodeById.get(S).constraints.rank;C!=null&&m.set(S,C)}let y=a.constraints.filter(S=>S.type==="sameRank").map(S=>S.nodes.filter(C=>l.has(C))).filter(S=>S.length>1),k=ge(p,f,{fixedRank:m,sameRank:y});s.push(...k.warnings);let _=p.map(S=>{let C=a.nodeById.get(S),z=i.get(S);return{id:S,rank:k.rank.get(S),width:z.iw,height:z.ih,group:C.group,pinX:z.pinX}}),w=[];for(let S of f){if(k.selfLoops.has(S.id)||k.flat.has(S.id))continue;let C=k.reversed.has(S.id),z=S.sourcePort?i.get(S.source).frac.get(S.sourcePort)??0:0,U=S.targetPort?i.get(S.target).frac.get(S.targetPort)??0:0;w.push(C?{id:S.id,v:S.target,w:S.source,vOff:U,wOff:z,weight:S.weight}:{id:S.id,v:S.source,w:S.target,vOff:z,wOff:U,weight:S.weight})}let x=xe(_,w,0),b;t.hints&&t.hints.size&&(b=xs(x,t.hints,n));let M=a.constraints.filter(S=>S.type==="leftOf"&&l.has(S.a)&&l.has(S.b)).map(S=>[S.a,S.b]),E=me(x,{maxIterations:e.maxIterations,leftOf:M,initial:b});r.crossings+=E.crossings;let v=ke(x,E.layers,{nodeSpacing:e.nodeSpacing,edgeSpacing:e.edgeSpacing,rankSpacing:e.rankSpacing,groupPadding:e.groupPadding,groupLabelHeight:e.groupLabelHeight,labelOnOrderAxis:o,labelAtRankEnd:n==="BT"||n==="RL"?!o:!1}),I=p.filter(S=>i.get(S).pinY!=null);if(I.length){let S=0;for(let C of I)S+=i.get(C).pinY-v.y[x.index.get(C)];S/=I.length;for(let C=0;C<v.y.length;C++)v.y[C]+=S;for(let C of I){let z=x.index.get(C);v.x[z]=i.get(C).pinX,v.y[z]=i.get(C).pinY}}let N=1/0,O=-1/0;for(let S=0;S<x.v.length;S++){let C=x.v[S].width/2;N=Math.min(N,v.x[S]-C),O=Math.max(O,v.x[S]+C)}c.push({comp:g,g:x,co:v,rk:k,layers:E.layers,minX:N,maxX:O,pinned:I.length>0})}if(t.hints&&t.hints.size){let g=l=>{let f=0,m=0;for(let y of l.comp.nodes){let k=t.hints.get(y);k&&(f+=Gt(n,k.x,k.y).x,m++)}return m?f/m:1/0},p=new Map(c.map(l=>[l,g(l)]));c.sort((l,f)=>p.get(l)-p.get(f))}let h=-1/0;for(let g of c)g.pinned&&(h=Math.max(h,g.maxX+e.componentSpacing));h===-1/0&&(h=0);for(let g of c){if(g.pinned)continue;let p=h-g.minX;for(let l=0;l<g.co.x.length;l++)g.co.x[l]+=p;h+=g.maxX-g.minX+e.componentSpacing}for(let g of c){let{g:p,co:l,rk:f}=g;g.layers.forEach((m,y)=>m.forEach((k,_)=>{let w=p.v[k];if(!w.real)return;let x=a.nodeById.get(w.id),b=Me(n,l.x[k],l.y[k]);r.nodes.set(w.id,{x:b.x-x.width/2,y:b.y-x.height/2,width:x.width,height:x.height,rank:y,order:_})}));for(let m of a.edges){if(!g.comp.set.has(m.source))continue;let k=(p.chains.get(m.id)||[]).map(w=>Me(n,l.x[w],l.y[w])),_=f.reversed.has(m.id);_&&(k=k.reverse()),r.edges.set(m.id,{waypoints:k,reversed:_,selfLoop:f.selfLoops.has(m.id),flat:f.flat.has(m.id)})}}if(!c.some(g=>g.pinned)){let g=1/0,p=1/0;for(let f of r.nodes.values())g=Math.min(g,f.x),p=Math.min(p,f.y);let l=a.groups.length?e.groupPadding+e.groupLabelHeight:0;Number.isFinite(g)&&Ee(r,-g+l,-p+l)}return mt(a,r),r.bounds=xt(r),r}function Ee(a,t,e){for(let n of a.nodes.values())n.x+=t,n.y+=e;for(let n of a.edges.values())for(let o of n.waypoints)o.x+=t,o.y+=e}function mt(a,t){let e=a.options;t.groups=new Map;for(let n of a.groups){let o=1/0,s=1/0,i=-1/0,d=-1/0;for(let c of a.nodes){if(c.group!==n.id)continue;let h=t.nodes.get(c.id);h&&(o=Math.min(o,h.x),s=Math.min(s,h.y),i=Math.max(i,h.x+h.width),d=Math.max(d,h.y+h.height))}if(!Number.isFinite(o))continue;let r=e.groupPadding;t.groups.set(n.id,{x:o-r,y:s-r-e.groupLabelHeight,width:i-o+2*r,height:d-s+2*r+e.groupLabelHeight})}return t.groups}function xt(a){let t=1/0,e=1/0,n=-1/0,o=-1/0,s=i=>{t=Math.min(t,i.x),e=Math.min(e,i.y),n=Math.max(n,i.x+i.width),o=Math.max(o,i.y+i.height)};for(let i of a.nodes.values())s(i);for(let i of a.groups.values())s(i);return Number.isFinite(t)?{x:t,y:e,width:n-t,height:o-e}:{x:0,y:0,width:0,height:0}}function xs(a,t,e){let n=Dt(a),o=new Float64Array(a.v.length).fill(NaN);a.v.forEach((s,i)=>{if(s.real&&t.has(s.id)){let d=t.get(s.id);o[i]=Gt(e,d.x,d.y).x}});for(let[,s]of a.chains){if(!s.length)continue;let i=a.v[s[0]].up[0]?.n,d=a.v[s[s.length-1]].down[0]?.n;i==null||d==null||Number.isNaN(o[i])||Number.isNaN(o[d])||s.forEach((r,c)=>{o[r]=o[i]+(o[d]-o[i])*(c+1)/(s.length+1)})}return n.map(s=>{let i=new Map(s.map((d,r)=>[d,r]));return s.slice().sort((d,r)=>{let c=o[d],h=o[r];return Number.isNaN(c)&&Number.isNaN(h)?i.get(d)-i.get(r):Number.isNaN(c)?1:Number.isNaN(h)?-1:c-h})})}function ms(a){let t=new Map(a.nodes.map(i=>[i.id,i.id])),e=i=>{for(;t.get(i)!==i;)t.set(i,t.get(t.get(i))),i=t.get(i);return i},n=(i,d)=>{let r=e(i),c=e(d);r!==c&&t.set(c,r)};for(let i of a.edges)n(i.source,i.target);let o=new Map;for(let i of a.nodes)i.group&&(o.has(i.group)?n(o.get(i.group),i.id):o.set(i.group,i.id));for(let i of a.constraints)if(i.type==="leftOf"&&n(i.a,i.b),i.type==="sameRank")for(let d of i.nodes)n(i.nodes[0],d);let s=new Map;for(let i of a.nodes){let d=e(i.id);s.has(d)||s.set(d,[]),s.get(d).push(i.id)}return[...s.values()].map(i=>({nodes:i,set:new Set(i)}))}function Le(a,t,e,n){let o=n==="LR"||n==="RL",s=[...a.nodes.entries()],i=(d,r)=>d.x<r.x+r.width+e&&r.x<d.x+d.width+e&&d.y<r.y+r.height+e&&r.y<d.y+d.height+e;for(let[d,r]of s)if(!t.has(d))for(let c=0;c<200;c++){let h=s.find(([g,p])=>g!==d&&i(r,p));if(!h)break;let u=h[1];o?r.y=u.y+u.height+e:r.x=u.x+u.width+e}}function ws(a,t,e){let n=bt(e),o=et(a),s=et(t),i=s.x-o.x,d=s.y-o.y,r=Math.abs(i)-(a.width+t.width)/2,c=Math.abs(d)-(a.height+t.height)/2,h=n.x!==0?i*n.x:d*n.y,u=n.x!==0?r:c;return h>0&&u>4?[n.exit,n.entry]:r>=c?i>=0?["right","left"]:["left","right"]:d>=0?["bottom","top"]:["top","bottom"]}function Ae(a,t){let e=a.options.direction,n=new Map,o=new Map;for(let r of a.nodes){let c=t.get(r.id);if(!c)continue;let h=dt(r),u=new Map;for(let[g,p]of h)u.set(g,{x:c.x+p.px*c.width,y:c.y+p.py*c.height,side:p.side,t:p.t});o.set(r.id,u)}let s=new Map,i=new Map;for(let r of a.edges){let c=t.get(r.source),h=t.get(r.target);if(!c||!h)continue;if(r.source===r.target){let f=o.get(r.source),m=r.sourcePort&&f.get(r.sourcePort),y=r.targetPort&&f.get(r.targetPort),k=Math.min(20,c.width/4,c.height/4);n.set(r.id,{source:m&&m.side?{x:m.x,y:m.y,side:m.side}:{x:c.x+c.width-k,y:c.y,side:"top"},target:y&&y.side?{x:y.x,y:y.y,side:y.side}:{x:c.x+c.width,y:c.y+k,side:"right"}});continue}let[u,g]=ws(c,h,e),p=r.sourcePort&&o.get(r.source).get(r.sourcePort),l=r.targetPort&&o.get(r.target).get(r.targetPort);p&&p.side&&(u=p.side),l&&l.side&&(g=l.side),i.set(r.id,[u,g]),p||Ie(s,r.source+"|"+u,{edgeId:r.id,end:"source",other:r.target}),l||Ie(s,r.target+"|"+g,{edgeId:r.id,end:"target",other:r.source}),n.set(r.id,{source:p?{x:p.x,y:p.y,side:p.side}:null,target:l?{x:l.x,y:l.y,side:l.side}:null})}for(let r=0;r<2;r++)for(let[c,h]of s){let[u,g]=c.split("|"),p=t.get(u),l=g==="top"||g==="bottom",f=y=>{let k=n.get(y.edgeId),_=y.end==="source"?k.target:k.source;if(r>0&&_)return l?_.x:_.y;let w=et(t.get(y.other));return l?w.x:w.y};h.sort((y,k)=>f(y)-f(k)||(y.edgeId<k.edgeId?-1:1));let m=[...o.get(u)?.values()||[]].filter(y=>y.side===g).map(y=>y.t);h.forEach((y,k)=>{let _=(k+1)/(h.length+1);for(let x of m)Math.abs(x-_)<.06&&(_=Math.min(.95,_+.1));let w=l?{x:p.x+_*p.width,y:g==="top"?p.y:p.y+p.height,side:g}:{x:g==="left"?p.x:p.x+p.width,y:p.y+_*p.height,side:g};n.get(y.edgeId)[y.end]=w})}let d=r=>{r&&(r.x=Math.round(r.x*100)/100,r.y=Math.round(r.y*100)/100)};for(let r of n.values())d(r.source),d(r.target);return{ends:n,ports:o,sides:i}}function Ie(a,t,e){a.has(t)||a.set(t,[]),a.get(t).push(e)}function Pe(a,t,e){let n=e.spacing,o={h:new Map,v:new Map},s=new Map;for(let[u,g]of a)s.set(u,g.points.map(p=>({x:p.x,y:p.y})));for(let[u,g]of a){if(g.kind!=="orthogonal"||g.bundle)continue;let p=g.points;for(let l=0;l<p.length-1;l++){if(e.fixedEnds!==!1&&(l===0||l===p.length-2))continue;let f=p[l],m=p[l+1],y=Math.abs(f.x-m.x)<.01,k=Math.abs(f.y-m.y)<.01;if(!y&&!k)continue;let _=y?f.x:f.y,w=y?Math.min(f.y,m.y):Math.min(f.x,m.x),x=y?Math.max(f.y,m.y):Math.max(f.x,m.x);if(x-w<.5)continue;let b=y?f.y<=m.y:f.x<=m.x,M=p[l-1],E=p[l+2],v=(z,U)=>z?Math.sign(y?z.x-U.x:z.y-U.y):0,I=v(M,f),N=v(E,m),O={id:u,i:l,c:_,lo:w,hi:x,vertical:y,loIsA:b,pts:s.get(u),dirLo:b?I:N,dirHi:b?N:I},S=Math.round(_*100),C=y?o.v:o.h;C.has(S)||C.set(S,[]),C.get(S).push(O)}}let i=[...o.v.values()].flat(),d=[...o.h.values()].flat(),r=[];for(let u of[!0,!1])for(let g of(u?o.v:o.h).values()){if(g.length<2)continue;g.sort((m,y)=>m.lo-y.lo);let p=[g[0]],l=g[0].hi,f=()=>{p.length>1&&c(p,u)};for(let m=1;m<g.length;m++){let y=g[m];y.lo<l-.5?(p.push(y),l=Math.max(l,y.hi)):(f(),p=[y],l=y.hi)}f()}function c(u,g){if(new Set(u.map(b=>b.id)).size<2)return;let p=[];for(let b of u){let M=p.length;for(;M>0&&bs(b,p[M-1])<0;)M--;p.splice(M,0,b)}let l=u[0].c,f=Math.min(...u.map(b=>b.lo)),m=Math.max(...u.map(b=>b.hi)),y=1/0,k=1/0;for(let b of t.values()){let M=g?b.y:b.x;if((g?b.y+b.height:b.x+b.width)<=f||M>=m)continue;let v=g?b.x:b.y,I=g?b.x+b.width:b.y+b.height;I<=l+.01?y=Math.min(y,l-I):v>=l-.01&&(k=Math.min(k,v-l))}for(let b of g?i:d){if(b.c===l||b.hi<=f||b.lo>=m)continue;let M=Math.abs(b.c-l)/2;b.c<l?y=Math.min(y,M+4):k=Math.min(k,M+4)}let _=p.length,w=Math.max(0,Math.min(y,k)-4),x=Math.min(n,_>1?2*w/(_-1):n);p.forEach((b,M)=>{let E=(M-(_-1)/2)*x;Math.abs(E)>.01&&r.push([b.id,b.i,g,E])})}let h=new Map;for(let[u,g,p,l]of r)h.has(u)||h.set(u,new Map),h.get(u).set(g,p?{x:l,y:0}:{x:0,y:l});for(let[u,g]of h){let p=a.get(u),l=p.points,f=[],m={x:0,y:0};for(let y=0;y<l.length;y++){let k=y>0&&g.get(y-1)||m,_=y<l.length-1&&g.get(y)||m,w=y>0&&y<l.length-1&&ks(l[y-1],l[y],l[y+1]);w&&(k.x!==_.x||k.y!==_.y)?(f.push({x:l[y].x+k.x,y:l[y].y+k.y}),f.push({x:l[y].x+_.x,y:l[y].y+_.y})):f.push({x:l[y].x+k.x+(w?0:_.x),y:l[y].y+k.y+(w?0:_.y)})}p.points=_s(f)}}function ks(a,t,e){return Math.abs(a.x-t.x)<.01&&Math.abs(t.x-e.x)<.01||Math.abs(a.y-t.y)<.01&&Math.abs(t.y-e.y)<.01}function _s(a){let t=[];for(let e of a){let n=t[t.length-1];n&&Math.abs(n.x-e.x)<.01&&Math.abs(n.y-e.y)<.01||t.push(e)}return t}function bs(a,t){return Ce(a,t,!0)||Ce(a,t,!1)||Ss(a,t)}function Ne(a,t){let{pts:e,i:n,loIsA:o}=a,s=[];if(t?!o:o)for(let d=n+1;d<e.length;d++)s.push(e[d]);else for(let d=n;d>=0;d--)s.push(e[d]);return s}var Ms=(a,t)=>a.x*t.y-a.y*t.x,Oe=(a,t)=>{let e=t.x-a.x,n=t.y-a.y,o=Math.hypot(e,n)||1;return{x:e/o,y:n/o}};function Ce(a,t,e){let n=a.vertical,o=Ne(a,e),s=Ne(t,e),i=e?Math.max(a.lo,t.lo):Math.min(a.hi,t.hi),d=n?{x:a.c,y:i}:{x:i,y:a.c},r=n?{x:0,y:e?-1:1}:{x:e?-1:1,y:0},c=r,h=0,u=0,g=(l,f)=>{if(l===f)return 0;let m={x:r.y,y:-r.x},y=n?m.x:m.y;return(l<f?y<0:y>0)?-1:1},p=(l,f)=>f+1<l.length?Math.sign(Math.round(Ms(c,Oe(l[f],l[f+1]))*1e3)):null;for(let l=0;l<64;l++){let f=h<o.length?(o[h].x-d.x)*c.x+(o[h].y-d.y)*c.y:1/0,m=u<s.length?(s[u].x-d.x)*c.x+(s[u].y-d.y)*c.y:1/0;if(f===1/0&&m===1/0)return 0;if(Math.abs(f-m)<.5){let k=p(o,h),_=p(s,u);if(k===null||_===null)return k===null&&_===null?0:g(k??0,_??0);if(k!==_)return g(k,_);d=o[h],c=Oe(o[h],o[h+1]),h++,u++;continue}if(f<m){let k=p(o,h);return k?g(k,0):0}let y=p(s,u);return y?g(0,y):0}return 0}var Ss=(a,t)=>a.id<t.id?-1:a.id>t.id?1:a.i-t.i;function Kt(a,t,e=4){let n=[],o=new Map(t.map((r,c)=>[r,c]));for(let r of t){let c=a.get(r).points;for(let h=0;h<c.length-1;h++){let u=c[h],g=c[h+1];Math.abs(u.x-g.x)<.01&&Math.abs(u.y-g.y)>.01&&n.push([o.get(r),u.x,Math.min(u.y,g.y),Math.max(u.y,g.y)])}}let s=64,i=new Map;for(let r of n){let c=Math.floor(r[1]/s);i.has(c)||i.set(c,[]),i.get(c).push(r)}let d=new Map;for(let r of t){let c=o.get(r),h=a.get(r).points,u=[];for(let g=0;g<h.length-1;g++){let p=h[g],l=h[g+1];if(Math.abs(p.y-l.y)>.01)continue;let f=Math.min(p.x,l.x)+e*2,m=Math.max(p.x,l.x)-e*2;if(!(m<=f))for(let y=Math.floor(f/s);y<=Math.floor(m/s);y++)for(let k of i.get(y)||[])k[0]>=c||k[1]<=f||k[1]>=m||p.y<=k[2]+e||p.y>=k[3]-e||u.push({seg:g,x:k[1],y:p.y})}u.length&&d.set(r,u)}return d}var Ut=1,vs=[1,-1,0,0],Es=[0,0,1,-1],Yt=[1,0,3,2],Be=a=>a.x>0?0:a.x<0?1:a.y>0?2:3;function it(a,t,e={}){let n=a.options,o=t.nodes,s=n.edgeRouting,{ends:i,ports:d}=Ae(a,o),r=new Map,c=new Map,h=e.only||null,u=e.prev||null;if(s==="orthogonal")Ls(a,o,i,n,h,u,r,c),Pe(r,o,{spacing:n.edgeSpacing,fixedEnds:!0});else for(let l of a.edges){let f=o.get(l.source),m=o.get(l.target);if(!f||!m)continue;if(l.source===l.target){r.set(l.id,Re(f,n,i.get(l.id)));continue}let y=t.edges.get(l.id),k=y&&y.waypoints||[],_=i.get(l.id),w,x;s==="curved"||l.sourcePort?w=_.source:w=Ft(f,k[0]||et(m)),s==="curved"||l.targetPort?x=_.target:x=Ft(m,k[k.length-1]||et(f)),r.set(l.id,{points:[w,...k.map(b=>({...b})),x],kind:s,sourceSide:w.side,targetSide:x.side})}let g=a.edges.map(l=>l.id).filter(l=>r.has(l)),p=n.lineHops&&s==="orthogonal"?Kt(r,g,n.hopRadius):new Map;for(let[l,f]of r)f.hops=p.get(l)||[];return{paths:r,raw:c,ports:d,mode:s}}function Re(a,t,e){let n=Math.max(t.nodeMargin*1.5,16),o=e.source,s=e.target,i=K[o.side],d=K[s.side],r={x:o.x+i.x*n,y:o.y+i.y*n},c={x:s.x+d.x*n,y:s.y+d.y*n},h;if(o.side===s.side)h=o.side==="left"||o.side==="right"?[r,{x:r.x,y:c.y}]:[r,{x:c.x,y:r.y}];else if((o.side==="top"||o.side==="bottom")!=(s.side==="top"||s.side==="bottom"))h=o.side==="top"||o.side==="bottom"?[r,{x:c.x,y:r.y}]:[r,{x:r.x,y:c.y}];else{let u=o.side==="top"||o.side==="bottom",g=u?a.x+a.width+n:a.y+a.height+n;h=u?[r,{x:g,y:r.y},{x:g,y:c.y}]:[r,{x:r.x,y:g},{x:c.x,y:g}]}return{points:Mt([o,...h,c,s]),kind:"orthogonal",sourceSide:o.side,targetSide:s.side,selfLoop:!0}}function Ls(a,t,e,n,o,s,i,d){let r=n.nodeMargin,c=[];for(let[l,f]of t)c.push({id:l,..._e(f,r)});let h=new Map;for(let l of a.edges){let f=e.get(l.id);if(!f||!f.source||!f.target)continue;let m=K[f.source.side],y=K[f.target.side];h.set(l.id,{s:{x:f.source.x+m.x*r,y:f.source.y+m.y*r},t:{x:f.target.x+y.x*r,y:f.target.y+y.y*r},sDir:Be(m),tNeed:Yt[Be(y)]})}let u=Os(c,h,r);for(let l of a.edges)if(o&&!o.has(l.id)&&s&&s.raw.has(l.id)){let f=s.raw.get(l.id);d.set(l.id,f),u.markPath(f);let m=s.paths.get(l.id);m&&i.set(l.id,{...m,points:f.map(y=>({...y}))})}let g=a.edges.filter(l=>!i.has(l.id)&&t.has(l.source)&&t.has(l.target)),p=l=>{let f=h.get(l.id);return f?Math.abs(f.s.x-f.t.x)+Math.abs(f.s.y-f.t.y):0};g.sort((l,f)=>p(l)-p(f)),As(a,t,e,n,c,g,u,i,d);for(let l of g){if(i.has(l.id))continue;if(l.source===l.target){let _=Re(t.get(l.source),n,e.get(l.id));i.set(l.id,_),d.set(l.id,_.points);continue}let f=e.get(l.id),m=h.get(l.id),y=u.astar(m.s,m.sDir,m.t,m.tNeed,n);y||(y=Ns(m.s,m.t,f.source.side,f.target.side));let k=[f.source,...Mt(y),f.target];u.markPath(k),d.set(l.id,k),i.set(l.id,{points:k.map(_=>({..._})),kind:"orthogonal",sourceSide:f.source.side,targetSide:f.target.side})}}var Is={top:"bottom",bottom:"top",left:"right",right:"left"};function As(a,t,e,n,o,s,i,d,r){let c=n.bundleFanOut;if(!c)return;let h=new Map;for(let u of s){if(u.source===u.target||u.sourcePort||u.markerStart)continue;let g=e.get(u.id);if(!g||!g.source||!g.target||g.target.side!==Is[g.source.side])continue;let p=u.source+"|"+g.source.side;h.has(p)||h.set(p,[]),h.get(p).push(u)}for(let[u,g]of h){if(g.length<c)continue;let p=g[0].source,l=e.get(g[0].id).source.side,f=t.get(p),m=K[l],y=m.y!==0,k=y?m.y:m.x,_=l==="bottom"?f.y+f.height:l==="top"?f.y:l==="right"?f.x+f.width:f.x,w=1/0;for(let v of g){let I=e.get(v.id).target;w=Math.min(w,((y?I.y:I.x)-_)*k)}if(w<2*n.nodeMargin+4)continue;let x=_+k*w/2,b=y?{x:f.x+f.width/2,y:_}:{x:_,y:f.y+f.height/2},M=[],E=!0;for(let v of g){let I=e.get(v.id).target,N=Mt(y?[b,{x:b.x,y:x},{x:I.x,y:x},I]:[b,{x,y:b.y},{x,y:I.y},I]);for(let O=0;E&&O<N.length-1;O++)for(let S of o)if(S.id!==p&&S.id!==v.target&&ht(N[O],N[O+1],S,1)){E=!1;break}if(!E)break;M.push([v,N,I.side])}if(E)for(let[v,I,N]of M)i.markPath(I),r.set(v.id,I),d.set(v.id,{points:I.map(O=>({...O})),kind:"orthogonal",sourceSide:l,targetSide:N,bundle:u})}}function Ns(a,t,e,n){let o=e==="top"||e==="bottom",s=n==="top"||n==="bottom";if(o&&s){let i=(a.y+t.y)/2;return[a,{x:a.x,y:i},{x:t.x,y:i},t]}if(!o&&!s){let i=(a.x+t.x)/2;return[a,{x:i,y:a.y},{x:i,y:t.y},t]}return o?[a,{x:a.x,y:t.y},t]:[a,{x:t.x,y:a.y},t]}function Os(a,t,e){let n=new Set,o=new Set,s=L=>Math.round(L*100)/100,i=1/0,d=1/0,r=-1/0,c=-1/0;for(let L of a)n.add(s(L.x)),n.add(s(L.x+L.width)),o.add(s(L.y)),o.add(s(L.y+L.height)),i=Math.min(i,L.x),d=Math.min(d,L.y),r=Math.max(r,L.x+L.width),c=Math.max(c,L.y+L.height);for(let L of t.values())for(let A of[L.s,L.t])n.add(s(A.x)),o.add(s(A.y)),i=Math.min(i,A.x),d=Math.min(d,A.y),r=Math.max(r,A.x),c=Math.max(c,A.y);n.add(s(i-2*e)),n.add(s(r+2*e)),o.add(s(d-2*e)),o.add(s(c+2*e));let h=L=>{let A=[...L].sort((R,Y)=>R-Y),B=[];for(let R=0;R<A.length;R++)B.push(A[R]),R+1<A.length&&A[R+1]-A[R]>4&&B.push(s((A[R]+A[R+1])/2));return B},u=h(n),g=h(o),p=u.length,l=g.length,f=p*l,m=new Map(u.map((L,A)=>[L,A])),y=new Map(g.map((L,A)=>[L,A])),k=120,_=new Map,w=(L,A)=>L*73856093^A*19349663;for(let L of a)for(let A=Math.floor(L.x/k);A<=Math.floor((L.x+L.width)/k);A++)for(let B=Math.floor(L.y/k);B<=Math.floor((L.y+L.height)/k);B++){let R=w(A,B);_.has(R)||_.set(R,[]),_.get(R).push(L)}let x=(L,A)=>{let B=_.get(w(Math.floor(L/k),Math.floor(A/k)));if(!B)return!1;for(let R of B)if(be(R,L,A,.01))return!0;return!1},b=f<=4e6?new Uint8Array(f):null,M=b?null:new Map,E=L=>{if(b){let B=b[L];return B||(B=x(u[L%p],g[L/p|0])?2:1,b[L]=B),B===2}let A=M.get(L);return A===void 0&&(A=x(u[L%p],g[L/p|0]),M.set(L,A)),A},v=new Uint8Array(f),I=new Uint8Array(f),N=(L,A)=>{let B=A?v:I,R=B[L];if(!R){let Y=L%p,Z=L/p|0,T=A?(u[Y]+u[Y+1])/2:u[Y],X=A?g[Z]:(g[Z]+g[Z+1])/2;R=x(T,X)?2:1,B[L]=R}return R===2},O=new Uint16Array(f),S=new Uint16Array(f),C=new Uint16Array(f),z=new Uint16Array(f),U=L=>{let A=m.get(s(L.x)),B=y.get(s(L.y));return A==null||B==null?-1:B*p+A};function q(L){for(let A=0;A<L.length-1;A++){let B=L[A],R=L[A+1],Y=Math.abs(B.y-R.y)<.01,Z=Math.abs(B.x-R.x)<.01;if(Y){let T=y.get(s(B.y)),X=m.get(s(B.x)),j=m.get(s(R.x));if(T==null||X==null||j==null)continue;let nt=Math.min(X,j),ot=Math.max(X,j);for(let F=nt;F<=ot;F++)O[T*p+F]++,F<ot&&C[T*p+F]++}else if(Z){let T=m.get(s(B.x)),X=y.get(s(B.y)),j=y.get(s(R.y));if(T==null||X==null||j==null)continue;let nt=Math.min(X,j),ot=Math.max(X,j);for(let F=nt;F<=ot;F++)S[F*p+T]++,F<ot&&z[F*p+T]++}}}let st=f*4,J=st<=16e6,oe=J?new Float64Array(st):null,ie=J?new Int32Array(st):null,re=J?new Uint32Array(st):null,It=0;function Ve(L,A,B,R,Y){let Z=U(L),T=U(B);if(Z<0||T<0)return null;let X=u[T%p],j=g[T/p|0],nt=Y.bendPenalty,ot=Y.crossingPenalty;It++;let F=J?null:new Map,ae=J?null:new Map,ce=J?$=>re[$]===It?oe[$]:void 0:$=>F.get($),de=J?($,G,Q)=>{re[$]=It,oe[$]=G,ie[$]=Q}:($,G,Q)=>{F.set($,G),ae.set($,Q)},qe=J?$=>ie[$]:$=>ae.get($),lt=new Zt,he=Z*4+A;de(he,0,-1),lt.push(he,Ut*(Math.abs(u[Z%p]-X)+Math.abs(g[Z/p|0]-j)));let At=1/0,Nt=-1,Je=0,Qe=4e5;for(;lt.size;){let $=lt.peekKey(),G=lt.pop();if($>=At)break;let Q=ce(G),at=G>>2,wt=G&3,Ct=at%p,Pt=at/p|0;if(!($>Q+Ut*(Math.abs(u[Ct]-X)+Math.abs(g[Pt]-j))+1e-6)){if(++Je>Qe)break;if(at===T){let D=wt===R?0:wt===Yt[R]?2*nt:nt;Q+D<At&&(At=Q+D,Nt=G);continue}for(let D=0;D<4;D++){if(D===Yt[wt])continue;let ft=Ct+vs[D],ut=Pt+Es[D];if(ft<0||ut<0||ft>=p||ut>=l)continue;let V=ut*p+ft;if(V!==T&&E(V))continue;let pt=D<2;if(N(pt?D===0?at:V:D===2?at:V,pt))continue;let le=Math.abs(pt?u[ft]-u[Ct]:g[ut]-g[Pt]),kt=le;D!==wt&&(kt+=nt);let fe=D===0||D===2?at:V,ue=pt?C[fe]:z[fe];ue&&(kt+=le*.25*ue),V!==T&&(pt?S[V]:O[V])&&(kt+=ot);let Bt=V*4+D,Rt=Q+kt,pe=ce(Bt);(pe===void 0||Rt<pe-1e-9)&&(de(Bt,Rt,G),lt.push(Bt,Rt+Ut*(Math.abs(u[ft]-X)+Math.abs(g[ut]-j))))}}}if(Nt<0)return null;let Ot=[];for(let $=Nt;$!==-1&&$!==void 0;$=qe($)){let G=$>>2;Ot.push({x:u[G%p],y:g[G/p|0]})}return Ot.reverse(),Ot}return{astar:Ve,markPath:q,xs:u,ys:g,N:f}}var Zt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,e){let n=this.k,o=this.v,s=n.length;for(n.push(e),o.push(t);s>0;){let i=s-1>>1;if(n[i]<=e)break;n[s]=n[i],o[s]=o[i],s=i}n[s]=e,o[s]=t}peekKey(){return this.k[0]}pop(){let t=this.k,e=this.v,n=e[0],o=t.pop(),s=e.pop();if(t.length){let i=0,d=t.length;for(;;){let r=2*i+1;if(r>=d||(r+1<d&&t[r+1]<t[r]&&r++,t[r]>=o))break;t[i]=t[r],e[i]=e[r],i=r}t[i]=o,e[i]=s}return n}};function Wt(a,t,e,n){if(!n)return 0;let o=a.options,s=(r,c)=>c.x>=r.x-1&&c.x<=r.x+r.width+1&&c.y>=r.y-1&&c.y<=r.y+r.height+1&&Math.min(Math.abs(c.x-r.x),Math.abs(c.x-r.x-r.width),Math.abs(c.y-r.y),Math.abs(c.y-r.y-r.height))<=1,i=(r,c)=>{let h={left:Math.abs(c.x-r.x),right:Math.abs(c.x-r.x-r.width),top:Math.abs(c.y-r.y),bottom:Math.abs(c.y-r.y-r.height)};return Object.keys(h).reduce((u,g)=>h[g]<h[u]?g:u)},d=0;for(let r of a.edges){let c=n[r.id],h=t.paths.get(r.id),u=e.get(r.source),g=e.get(r.target);if(!Array.isArray(c)||c.length<2||!h||!u||!g)continue;let p=c.map(f=>({x:+f[0],y:+f[1]}));if(p.some(f=>!Number.isFinite(f.x)||!Number.isFinite(f.y))||!s(u,p[0])||!s(g,p[p.length-1]))continue;let l=!0;for(let f=0;l&&f<p.length-1;f++){let m=p[f],y=p[f+1];t.mode==="orthogonal"&&Math.abs(m.x-y.x)>.5&&Math.abs(m.y-y.y)>.5&&(l=!1)}l&&(h.points=p,h.sourceSide=i(u,p[0]),h.targetSide=i(g,p[p.length-1]),t.raw&&t.raw.set(r.id,p.map(f=>({...f}))),d++)}if(d){let r=a.edges.map(h=>h.id).filter(h=>t.paths.has(h)),c=o.lineHops&&t.mode==="orthogonal"?Kt(t.paths,r,o.hopRadius):new Map;for(let[h,u]of t.paths)u.hops=c.get(h)||[]}return d}var Cs=[.5,.3,.7,.15,.85],vt=3;function ze(a,{nodes:t=[],edges:e=[]}={}){let n=[...t],o=[];for(let[r,c]of e)for(let h=0;h<c.length-1;h++)o.push({id:r,i:h,a:c[h],b:c[h+1],box:Ps(c[h],c[h+1])});let s=[],i=new Map,d=[...a].sort((r,c)=>$e(r.points)-$e(c.points));for(let r of d){let c=r.points;if(!c||!c.length)continue;let h=r.width,u=r.height,g=[];for(let f=0;f<c.length-1;f++)g.push(Math.hypot(c[f+1].x-c[f].x,c[f+1].y-c[f].y));let p=Math.max(1,...g),l=null;for(let f=0;f<g.length;f++){let m=c[f],y=c[f+1],k=g[f];if(k<1)continue;let _=Math.abs(y.y-m.y)<Math.abs(y.x-m.x),w=_?h:u;for(let x of Cs){if(x!==.5&&k<w*2.2)continue;let b={x:m.x+(y.x-m.x)*x,y:m.y+(y.y-m.y)*x},M=_?[[0,0],[0,-(u/2+vt)],[0,u/2+vt]]:[[0,0],[h/2+vt,0],[-(h/2+vt),0]];for(let E=0;E<M.length;E++){let v=b.x+M[E][0],I=b.y+M[E][1],N={x:v-h/2,y:I-u/2,width:h,height:u},O=(1-k/p)*20+Math.abs(x-.5)*40+(E?12:0);if(!E&&k<w+8&&(O+=25),!(l&&O>=l.cost)){for(let S of s)Vt(N,S,2)&&(O+=1e3+Bs(N,S));if(!(l&&O>=l.cost)){for(let S of n)Vt(N,S,2)&&(O+=800);if(!(l&&O>=l.cost)){for(let S of o)S.id===r.id&&S.i===f||Vt(N,S.box,0)&&Rs(S.a,S.b,N)&&(O+=S.id===r.id?60:150);(!l||O<l.cost)&&(l={cost:O,x:v,y:I,r:N})}}}}}}if(!l){let f=c[0];l={x:f.x,y:f.y,r:{x:f.x-h/2,y:f.y-u/2,width:h,height:u}}}s.push(l.r),i.set(r.id,{x:l.x,y:l.y})}return i}function $e(a){let t=0;for(let e=0;e<(a?.length||0)-1;e++)t+=Math.hypot(a[e+1].x-a[e].x,a[e+1].y-a[e].y);return t}function Ps(a,t){let e=Math.min(a.x,t.x),n=Math.min(a.y,t.y);return{x:e,y:n,width:Math.abs(a.x-t.x),height:Math.abs(a.y-t.y)}}function Vt(a,t,e){return a.x<t.x+t.width+e&&t.x<a.x+a.width+e&&a.y<t.y+t.height+e&&t.y<a.y+a.height+e}function Bs(a,t){let e=Math.min(a.x+a.width,t.x+t.width)-Math.max(a.x,t.x),n=Math.min(a.y+a.height,t.y+t.height)-Math.max(a.y,t.y);return e>0&&n>0?e*n:0}function Rs(a,t,e){let n=0,o=1,s=t.x-a.x,i=t.y-a.y,d=(r,c)=>{if(Math.abs(r)<1e-9)return c>=0;let h=c/r;if(r<0){if(h>o)return!1;h>n&&(n=h)}else{if(h<n)return!1;h<o&&(o=h)}return!0};return d(-s,a.x-e.x)&&d(s,e.x+e.width-a.x)&&d(-i,a.y-e.y)&&d(i,e.y+e.height-a.y)}var rt="http://www.w3.org/2000/svg",$s=0,qt={arrow:'<path class="fg-marker-fill" d="M0,-5 L12,0 L0,5 Z"/>',open:'<path class="fg-marker-stroke" d="M1,-5 L12,0 L1,5"/>',many:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',one:'<path class="fg-marker-stroke" d="M6,-6 L6,6 M0,0 L12,0"/>',onlyOne:'<path class="fg-marker-stroke" d="M3,-6 L3,6 M8,-6 L8,6 M0,0 L12,0"/>',oneOrMany:'<path class="fg-marker-stroke" d="M-3,-6 L-3,6 M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',zeroOrMany:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/><circle class="fg-marker-hollow" cx="-5" cy="0" r="3.5"/>',zeroOrOne:'<path class="fg-marker-stroke" d="M8,-6 L8,6 M0,0 L12,0"/><circle class="fg-marker-hollow" cx="0" cy="0" r="3.5"/>',diamond:'<path class="fg-marker-fill" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',hollowDiamond:'<path class="fg-marker-hollow" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',circle:'<circle class="fg-marker-fill" cx="8" cy="0" r="4"/>'};var Et=class{constructor(t,e){this.id="fg"+ ++$s,this.options=e,this.container=t,t.classList.add("fg-container");let n=this.viewport=H("div","fg-viewport");n.tabIndex=0,this.world=H("div","fg-world"),this.groupsLayer=H("div","fg-groups"),this.svg=document.createElementNS(rt,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(rt,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(rt,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=H("div","fg-labels"),this.nodesLayer=H("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),n.appendChild(this.world),n.addEventListener("scroll",()=>{(n.scrollTop||n.scrollLeft)&&(n.scrollTop=0,n.scrollLeft=0)}),t.appendChild(n),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.expanded=new Set,this.transform={x:0,y:0,k:1}}destroy(){clearTimeout(this._settle),this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let e=this.options,n=new Set,o=new Map,s=[];for(let i of t){let d=String(i.id);n.add(d);let r=this.nodeEls.get(d),c=Jt(i,e),h=c&&this.expanded.has(d),u=Ts(i)+(c?h?"+":"-":"");if(r||(r=H("div","fg-node"),r.dataset.id=d,this.nodesLayer.appendChild(r),this.nodeEls.set(d,r)),r._sig!==u){r._sig=u,r.className="fg-node"+(i.className?" "+i.className:"")+(i.type?" fg-node--"+i.type:"")+(c?" fg-node--expandable":"")+(h?" fg-node--expanded":""),r.innerHTML="";let l=c?H("div","fg-node__body"):r;c&&r.appendChild(l);let f=e.renderNode?e.renderNode(i,l):void 0;if(typeof f=="string")l.innerHTML=f;else if(f instanceof Node)l.appendChild(f);else if(f===void 0)if(i.html!=null)l.innerHTML=i.html;else{let m=H("div","fg-node__label");m.textContent=i.label??d,l.appendChild(m)}if(c){if(h){let m=H("div","fg-node__details"),y=e.renderDetails?e.renderDetails(i,m):i.details;typeof y=="string"?m.innerHTML=y:y instanceof Node&&m.appendChild(y),r.appendChild(m)}r.appendChild(Ds(h,e))}r._measured=null}let g=typeof i.width=="number",p=typeof i.height=="number"&&!h;r.style.width=g?i.width+"px":"",r.style.height=p?i.height+"px":"",(!g||!p)&&s.push([d,r,g?i.width:null,p?i.height:null])}for(let[i,d]of this.nodeEls)n.has(i)||(d.remove(),this.nodeEls.delete(i));for(let[,i,d]of s)i.classList.add(d==null?"fg-node--measuring":"fg-node--measuring-h");for(let[i,d,r,c]of s){if(!d._measured){let h=d.getBoundingClientRect(),u=this.transform.k||1;d._measured={width:Math.ceil(h.width/u-.01)||this.options.defaultNodeWidth,height:Math.ceil(h.height/u-.01)||this.options.defaultNodeHeight}}o.set(i,{width:r??d._measured.width,height:c??d._measured.height})}for(let[,i]of s)i.classList.remove("fg-node--measuring","fg-node--measuring-h");return o}renderBadges(t){for(let[e,n]of this.nodeEls){let o=t&&t.get(e),s=n.querySelector(":scope > .fg-node__badge");if(!o){s?.remove();continue}s||(s=H("div","fg-node__badge"),n.appendChild(s)),s.textContent!==o.text&&(s.textContent=o.text),s.classList.toggle("fg-node__badge--open",!!o.open),s.title=o.title||""}}renderStacks(t,e){let n=bt(t.options.direction);for(let o of t.nodes){let s=this.nodeEls.get(o.id);if(!s)continue;s.querySelectorAll(":scope > .fg-stack-toggle, :scope > .fg-stack").forEach(l=>l.remove());let i=o.data.stackable,d=e.stacked.get(o.id)||(i?i==="upstream"?"upstream":"downstream":null),r=e.counts.get(o.id)||0,c=e.stacked.has(o.id)&&r>0;if(s.classList.toggle("fg-node--stacked",c),s.classList.toggle("fg-node--stacked-upstream",c&&d==="upstream"),c){let l=H("div","fg-stack fg-stack--"+(r>1?"many":"one"));l.setAttribute("aria-hidden","true"),s.appendChild(l)}if(!d||!i&&!e.stacked.has(o.id))continue;let h=d==="upstream"?n.entry:n.exit,u=document.createElement("button");u.type="button",u.className="fg-stack-toggle fg-stack-toggle--"+h+(c?" fg-stack-toggle--stacked":""),u.dataset.fgStack=o.id,u.setAttribute("aria-expanded",String(!c));let g=d==="upstream"?"previous":"following",p=c?`Unstack ${r} ${g} node${r===1?"":"s"}`:`Stack the ${g} nodes`;u.setAttribute("aria-label",p),u.title=p,u.textContent=c?"+"+r:"\u2212",s.appendChild(u)}}renderPorts(t){for(let e of t.nodes){let n=this.nodeEls.get(e.id);if(!n)continue;let o=this.options.showPorts?JSON.stringify(e.ports.map(s=>[s.id,s.side,s.offset])):"";if(n._portSig!==o&&(n._portSig=o,n.querySelectorAll(":scope > .fg-port").forEach(s=>s.remove()),!!o))for(let[s,i]of dt(e)){let d=H("div","fg-port fg-port--"+i.side);d.dataset.port=s,d.style.left=i.px*100+"%",d.style.top=i.py*100+"%",n.appendChild(d)}}}placeNodes(t,e){for(let n of t.nodes){let o=this.nodeEls.get(n.id),s=e.get(n.id);!o||!s||(o.style.width=s.width+"px",o.style.height=s.height+"px",o.style.transform=`translate(${s.x}px, ${s.y}px)`,o.classList.toggle("fg-node--pinned",!!n.constraints.pinned))}}renderGroups(t,e){let n=new Set;for(let o of t.groups){let s=e.get(o.id);if(!s)continue;n.add(o.id);let i=this.groupEls.get(o.id);if(!i){i=H("div","fg-group"),i.dataset.id=o.id;let d=H("div","fg-group__label");i.appendChild(d),this.groupsLayer.appendChild(i),this.groupEls.set(o.id,i)}i.className="fg-group"+(o.className?" "+o.className:""),i.firstChild.textContent=o.label,i.firstChild.style.height=this.options.groupLabelHeight+"px",i.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(i.style,{transform:`translate(${s.x}px, ${s.y}px)`,width:s.width+"px",height:s.height+"px"})}for(let[o,s]of this.groupEls)n.has(o)||(s.remove(),this.groupEls.delete(o))}ensureMarker(t){if(!t||!qt[t]||this.markersUsed.has(t))return;let e=document.createElementNS(rt,"marker");e.setAttribute("id",`${this.id}-m-${t}`),e.setAttribute("viewBox","-10 -8 24 16"),e.setAttribute("refX","12"),e.setAttribute("refY","0"),e.setAttribute("markerWidth","24"),e.setAttribute("markerHeight","16"),e.setAttribute("markerUnits","userSpaceOnUse"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("class","fg-marker fg-marker--"+t),e.innerHTML=qt[t],this.defs.appendChild(e),this.markersUsed.add(t)}renderEdges(t,e,n,o){let s=this.options,i=new Set,d=[];for(let r of t.edges){let c=e.paths.get(r.id);if(!c)continue;i.add(r.id);let h=this.edgeEls.get(r.id);if(!h){h=document.createElementNS(rt,"g"),h.dataset.id=r.id;let f=document.createElementNS(rt,"path");f.setAttribute("class","fg-edge__hit");let m=document.createElementNS(rt,"path");m.setAttribute("class","fg-edge__line"),h.append(f,m),this.edgesGroup.appendChild(h),this.edgeEls.set(r.id,h)}h.setAttribute("class",`fg-edge fg-edge--${zs(r.type)}${r.className?" "+r.className:""}`);let u=n?n.get(r.id):null,g=u?Fs(u):Te(c,s.cornerRadius,s.lineHops?c.hops:[],s.hopRadius),[p,l]=h.childNodes;p.setAttribute("d",g),l.setAttribute("d",g);for(let[f,m]of[["marker-start",r.markerStart],["marker-end",r.markerEnd]])m&&qt[m]?(this.ensureMarker(m),l.setAttribute(f,`url(#${this.id}-m-${m})`)):l.removeAttribute(f);this.renderLabel(r,!n)&&!n&&d.push([r.id,c])}for(let[r,c]of this.edgeEls)i.has(r)||(c.remove(),this.edgeEls.delete(r),this.renderLabel({id:r,label:null},!1));d.length&&this.placeLabels(d,e,o);for(let r of t.edges){let c=this.edgeEls.get(r.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,e){let n=this.labelEls.get(t.id);return t.label==null||t.label===""?(n&&(n.remove(),this.labelEls.delete(t.id)),!1):(n||(n=H("div","fg-edge-label"),n.dataset.id=t.id,this.labelsLayer.appendChild(n),this.labelEls.set(t.id,n)),n.textContent!==String(t.label)&&(n.textContent=t.label,n._size=null),n.style.visibility=e?"":"hidden",!0)}placeLabels(t,e,n){let o=[];for(let[d,r]of t){let c=this.labelEls.get(d);c._size||(c._size={width:c.offsetWidth,height:c.offsetHeight}),o.push({id:d,points:r.points,width:c._size.width,height:c._size.height})}let s=[...e.paths].map(([d,r])=>[d,r.points]),i=ze(o,{nodes:n?n.values():[],edges:s});for(let[d,r]of i){let c=this.labelEls.get(d),h=c._size;c.style.transform=`translate(${P(r.x-h.width/2)}px, ${P(r.y-h.height/2)}px)`}}setTransform(t){this.transform=t,this.world.style.transform=`translate(${Math.round(t.x)}px, ${Math.round(t.y)}px) scale(${t.k})`,this._k!==t.k&&(this._k=t.k,this.world.style.setProperty("--fg-zoom",t.k)),this.world.classList.add("fg-moving"),clearTimeout(this._settle),this._settle=setTimeout(()=>this.world.classList.remove("fg-moving"),150)}};function H(a,t){let e=document.createElement(a);return t&&(e.className=t),e}function zs(a){return String(a).replace(/[^a-zA-Z0-9_-]/g,"_")}function Ts(a){return JSON.stringify([a.label,a.html,a.className,a.type,a.columns,a.data,a.details])}function Jt(a,t){return a.expandable!=null?!!a.expandable:a.details!=null||!!t.renderDetails}var Hs='<svg viewBox="0 0 12 12" width="12" height="12" aria-hidden="true"><path d="M3 4.5 6 7.5 9 4.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>';function Ds(a,t){let e=H("button","fg-node__toggle");return e.type="button",e.setAttribute("aria-expanded",String(a)),e.innerHTML=`<span></span>${Hs}`,e.firstChild.textContent=a?t.collapseText:t.expandText,e}var P=a=>Math.round(a*100)/100;function Fs(a){return a.map((t,e)=>(e?"L":"M")+P(t.x)+","+P(t.y)).join(" ")}function Te(a,t=6,e=[],n=4){let o=a.points;if(!o||o.length<2)return"";if(a.kind==="curved")return Xs(a);let s=`M${P(o[0].x)},${P(o[0].y)}`,i=o.length,d=new Array(i).fill(0);for(let c=1;c<i-1;c++){let h=Math.hypot(o[c].x-o[c-1].x,o[c].y-o[c-1].y),u=Math.hypot(o[c+1].x-o[c].x,o[c+1].y-o[c].y);d[c]=Math.max(0,Math.min(t,h/2,u/2))}let r=new Map;for(let c of e||[])r.has(c.seg)||r.set(c.seg,[]),r.get(c.seg).push(c);for(let c=0;c<i-1;c++){let h=o[c],u=o[c+1],g=Math.hypot(u.x-h.x,u.y-h.y)||1,p=(u.x-h.x)/g,l=(u.y-h.y)/g,f=d[c+1],m=u.x-p*f,y=u.y-l*f,k=r.get(c);if(k&&Math.abs(l)<1e-6){let _=Math.sign(p),w=h.x+p*d[c];k.sort((x,b)=>(x.x-b.x)*_);for(let x of k)(x.x-w)*_<n+1||(m-x.x)*_<n+1||(s+=` L${P(x.x-_*n)},${P(h.y)} A${n},${n} 0 0 ${_>0?1:0} ${P(x.x+_*n)},${P(h.y)}`)}if(s+=` L${P(m)},${P(y)}`,c+1<i-1&&f>0){let _=o[c+2],w=Math.hypot(_.x-u.x,_.y-u.y)||1;s+=` Q${P(u.x)},${P(u.y)} ${P(u.x+(_.x-u.x)/w*f)},${P(u.y+(_.y-u.y)/w*f)}`}}return s}function Xs(a){let t=a.points,e=t[0],n=t[t.length-1],o=Math.hypot(n.x-e.x,n.y-e.y),s=Math.max(30,Math.min(160,o*.4));if(t.length===2){let g=K[a.sourceSide]||{x:0,y:0},p=K[a.targetSide]||{x:0,y:0};return`M${P(e.x)},${P(e.y)} C${P(e.x+g.x*s)},${P(e.y+g.y*s)} ${P(n.x+p.x*s)},${P(n.y+p.y*s)} ${P(n.x)},${P(n.y)}`}let i=K[a.sourceSide],d=K[a.targetSide],r=i?{x:e.x-i.x*40,y:e.y-i.y*40}:e,c=d?{x:n.x-d.x*40,y:n.y-d.y*40}:n,h=[r,...t,c],u=`M${P(e.x)},${P(e.y)}`;for(let g=1;g<h.length-2;g++){let p=h[g-1],l=h[g],f=h[g+1],m=h[g+2],y={x:l.x+(f.x-p.x)/6,y:l.y+(f.y-p.y)/6},k={x:f.x-(m.x-l.x)/6,y:f.y-(m.y-l.y)/6};u+=` C${P(y.x)},${P(y.y)} ${P(k.x)},${P(k.y)} ${P(f.x)},${P(f.y)}`}return u}function He(a,t,e,n=28,o=null){let s=new Map;for(let[i,d]of t){let r=a&&a.get(i),c=Xt(d.points,n),h=r?r.points:o?o(i):null;if(!h){s.set(i,c);continue}let u=Xt(h,n);s.set(i,c.map((g,p)=>({x:u[p].x+(g.x-u[p].x)*e,y:u[p].y+(g.y-u[p].y)*e})))}return s}function De(a){let t=a.renderer,e=t.viewport,n=()=>a.options,o=new Map,s=null,i=0,d=null,r=(x,b)=>{let M=e.getBoundingClientRect(),E=t.transform;return{x:(x-M.left-E.x)/E.k,y:(b-M.top-E.y)/E.k}},c=x=>{let b=x.target.closest&&x.target.closest(".fg-node");if(b&&t.nodesLayer.contains(b))return{kind:"node",id:b.dataset.id,el:b};let M=x.target.closest&&x.target.closest(".fg-edge");if(M)return{kind:"edge",id:M.dataset.id,el:M};let E=x.target.closest&&x.target.closest(".fg-edge-label");if(E)return{kind:"edge",id:E.dataset.id,el:E};let v=x.target.closest&&x.target.closest(".fg-group");return v?{kind:"group",id:v.dataset.id,el:v}:{kind:"background"}};function h(x){if(a._stopZoom(),x.button!==void 0&&x.button!==0&&x.pointerType==="mouse"||x.target.closest&&x.target.closest(".fg-controls")||x.target.closest&&x.target.closest("input, textarea, select, button, a, [data-fg-nodrag]"))return;if(o.set(x.pointerId,{x:x.clientX,y:x.clientY}),e.setPointerCapture?.(x.pointerId),o.size===2&&n().zoomable){let[E,v]=[...o.values()];s={type:"pinch",dist:Math.hypot(E.x-v.x,E.y-v.y),k:t.transform.k,mid:{x:(E.x+v.x)/2,y:(E.y+v.y)/2}};return}let b=c(x),M={x:x.clientX,y:x.clientY};if((b.kind==="background"||b.kind==="group")&&x.shiftKey&&n().multiSelect)s={type:"box",target:b,start:M,moved:!1,base:a.getSelectedItems()};else if(b.kind==="node"&&n().draggable){let E=a.positions.get(b.id),v=r(x.clientX,x.clientY);s={type:"drag",id:b.id,target:b,start:M,moved:!1,dx:v.x-E.x,dy:v.y-E.y}}else n().pannable?s={type:"pan",target:b,start:M,moved:!1,tx:t.transform.x,ty:t.transform.y}:s={type:"click",target:b,start:M,moved:!1}}function u(x){if(o.has(x.pointerId)&&o.set(x.pointerId,{x:x.clientX,y:x.clientY}),!s)return;if(s.type==="pinch"){if(o.size<2)return;let[M,E]=[...o.values()],v=Math.hypot(M.x-E.x,M.y-E.y);a.zoomAt(s.k*(v/s.dist),s.mid.x,s.mid.y,!0);return}let b=Math.hypot(x.clientX-s.start.x,x.clientY-s.start.y);if(!(!s.moved&&b<4)){if(s.moved||(s.moved=!0,s.type==="drag"&&(a._dragStart(s.id),e.classList.add("fg-dragging")),s.type==="pan"&&e.classList.add("fg-panning"),s.type==="box"&&(s.el=document.createElement("div"),s.el.className="fg-selection-box",e.appendChild(s.el))),s.type==="box"){let M=e.getBoundingClientRect(),E=Math.min(s.start.x,x.clientX),v=Math.min(s.start.y,x.clientY),I=Math.abs(x.clientX-s.start.x),N=Math.abs(x.clientY-s.start.y);Object.assign(s.el.style,{left:E-M.left+"px",top:v-M.top+"px",width:I+"px",height:N+"px"});let O=r(E,v),S=r(E+I,v+N);d={box:{x:O.x,y:O.y,width:S.x-O.x,height:S.y-O.y},base:s.base},i||(i=requestAnimationFrame(g));return}if(s.type==="pan")a.setTransform({x:s.tx+x.clientX-s.start.x,y:s.ty+x.clientY-s.start.y,k:t.transform.k});else if(s.type==="drag"){let M=r(x.clientX,x.clientY);d={id:s.id,x:M.x-s.dx,y:M.y-s.dy},i||(i=requestAnimationFrame(g))}}}function g(){if(i=0,d){let x=d;d=null,x.box?a._boxSelect(x.box,x.base):a._dragMove(x.id,x.x,x.y)}}function p(x){if(o.delete(x.pointerId),!s)return;let b=s;if(b.type==="pinch"){o.size===0&&(s=null);return}if(s=null,e.classList.remove("fg-dragging","fg-panning"),b.type==="box"&&b.moved){i&&(cancelAnimationFrame(i),i=0,g()),b.el.remove();return}if(b.type==="drag"&&b.moved){i&&(cancelAnimationFrame(i),i=0,g()),a._dragEnd(b.id);return}!b.moved&&x.type==="pointerup"&&a._click(b.target,x)}function l(x){if(a._stopZoom(),!n().zoomable)return;x.preventDefault();let b=t.transform.k*Math.exp(-x.deltaY*(x.ctrlKey?.01:.0015));a.zoomAt(b,x.clientX,x.clientY,!0)}let f=null;function m(x){if(s&&s.moved)return;let b=c(x),M=b.kind==="node"||b.kind==="edge"?b.kind+":"+b.id:null;M!==f&&(f=M,a._hover(M?b:null))}function y(x){x.target.closest&&x.target.closest(".fg-controls, input, textarea, select, a")||a._contextMenu(c(x),x)}function k(x){let b=x.target.closest&&x.target.closest(".fg-node__toggle");if(!b)return;let M=b.closest(".fg-node");M&&t.nodesLayer.contains(M)&&(x.stopPropagation(),a.toggleExpand(M.dataset.id))}function _(){f&&(f=null,a._hover(null))}function w(x){x.key==="Escape"?a._escape():(x.key==="z"||x.key==="Z")&&(x.ctrlKey||x.metaKey)&&n().history?(x.preventDefault(),x.shiftKey?a.redo():a.undo()):(x.key==="y"||x.key==="Y")&&(x.ctrlKey||x.metaKey)&&n().history?(x.preventDefault(),a.redo()):(x.key==="a"||x.key==="A")&&(x.ctrlKey||x.metaKey)&&n().multiSelect?(x.preventDefault(),a.selectAll()):(x.key==="+"||x.key==="=")&&n().zoomable?a.zoomBy(1.2):x.key==="-"&&n().zoomable?a.zoomBy(1/1.2):x.key==="0"&&a.fit()}return e.addEventListener("pointerdown",h),e.addEventListener("pointermove",u),e.addEventListener("pointerup",p),e.addEventListener("pointercancel",p),e.addEventListener("wheel",l,{passive:!1}),e.addEventListener("pointerover",m),e.addEventListener("contextmenu",y),e.addEventListener("click",k),e.addEventListener("pointerleave",_),e.addEventListener("keydown",w),()=>{e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",u),e.removeEventListener("pointerup",p),e.removeEventListener("pointercancel",p),e.removeEventListener("wheel",l),e.removeEventListener("pointerover",m),e.removeEventListener("contextmenu",y),e.removeEventListener("click",k),e.removeEventListener("pointerleave",_),e.removeEventListener("keydown",w),i&&cancelAnimationFrame(i)}}function Lt(a,t,e="chain"){let n=new Set,o=new Set,s=[],i=[];if(t.kind==="node")n.add(t.id),s=[t.id],i=[t.id];else{let h=a.find(u=>u.id===t.id);if(!h)return{nodes:n,edges:o};o.add(h.id),n.add(h.source),n.add(h.target),s=[h.source],i=[h.target]}let d=new Map,r=new Map;for(let h of a)d.has(h.target)||d.set(h.target,[]),r.has(h.source)||r.set(h.source,[]),d.get(h.target).push(h),r.get(h.source).push(h);let c=(h,u,g)=>{let p=new Set(h),l=[...h];for(;l.length;){let f=l.shift();for(let m of u.get(f)||[]){let y=g(m);o.add(m.id),n.add(y),e==="chain"&&!p.has(y)&&(p.add(y),l.push(y))}}};return(t.kind==="node"||e==="chain")&&(c(s,d,h=>h.source),c(i,r,h=>h.target)),{nodes:n,edges:o}}var W="__fg_more:";function Fe(a){let t=new Map;for(let s of a.nodes||[])s&&s.id!=null&&t.set(String(s.id),s);let e=new Map,n=new Set;for(let s of a.edges||[]){if(!s)continue;let i=String(s.source),d=String(s.target);if(i===d||!t.has(i)||!t.has(d))continue;e.has(i)||e.set(i,[]);let r=e.get(i);r.includes(d)||r.push(d),n.add(d)}let o=[...t.keys()].filter(s=>!n.has(s)&&e.has(s));return!o.length&&t.size&&(o=[t.keys().next().value]),{children:e,roots:o,nodeById:t}}function Xe(a,t,{path:e=[],shown:n=new Map,limit:o=50,hide:s=!1,moreLabel:i}={}){i=i||(w=>`+${w.toLocaleString("en-US")} more`);let{children:d,roots:r,nodeById:c}=t,h=new Set,u=new Set,g=new Map,p=[],l=(w,x)=>{let b=Math.max(o,n.get(w??"")||0);for(let M of x.slice(0,b))h.add(M),w!=null&&!g.has(M)&&g.set(M,w);x.length>b&&p.push({parent:w,count:x.length-b})},f=e.length-1;if((!s||!e.length)&&l(null,r),e.forEach((w,x)=>{h.add(w),u.add(w),(!s||x===f)&&l(w,d.get(w)||[])}),e.length)for(let w of d.get(e[f])||[])h.has(w)&&u.add(w);else for(let w of h)u.add(w);let m=[],y=[];for(let w of h)m.push(c.get(w));for(let w of a.edges||[])w&&h.has(String(w.source))&&h.has(String(w.target))&&y.push(w);for(let w of p){let x=W+(w.parent??"");m.push({id:x,label:i(w.count),className:"fg-node--more",expandable:!1,_more:w}),w.parent!=null&&y.push({id:x+":edge",source:w.parent,target:x,className:"fg-edge--more"}),(w.parent==null||w.parent===e[f])&&u.add(x)}let k=new Map;for(let w of h){let x=d.get(w);x&&k.set(w,x.length)}let _=(a.constraints||[]).filter(w=>[w.a,w.b,w.node,...w.nodes||[]].every(x=>x==null||h.has(String(x))));return{data:{...a,nodes:m,edges:y,constraints:_},focus:u,parentOf:g,childCount:k}}function Ge(a,t,e){let n=a.indexOf(t);if(n>=0)return a.slice(0,n===a.length-1?n:n+1);let o=e.get(t),s=o!=null?a.indexOf(o):-1;return s>=0?[...a.slice(0,s+1),t]:[t]}var Gs="1.3.0";function Qt(a,t){return t==="upstream"||t==="downstream"?t:a&&a.stackable==="upstream"?"upstream":"downstream"}function js(a,t,e,n){let o=t==="upstream"?n:e,s=t==="upstream"?e:n,i=new Set,d=[...o.get(a)||[]];for(;d.length;){let c=d.pop();if(!(c===a||i.has(c))){i.add(c);for(let h of o.get(c)||[])d.push(h)}}let r=!0;for(;r;){r=!1;for(let c of i)for(let h of s.get(c)||[])if(h!==a&&!i.has(h)){i.delete(c),r=!0;break}}return i}function je(a,t){let e=a.nodes||[],n=a.edges||[],o=new Set(e.map(y=>String(y.id))),s=new Map,i=new Map;for(let y of n){let k=String(y.source),_=String(y.target);!o.has(k)||!o.has(_)||k===_||(s.has(k)||s.set(k,[]),i.has(_)||i.set(_,[]),s.get(k).push(_),i.get(_).push(k))}let d=new Map,r=new Map;for(let[y,k]of t){if(!o.has(y))continue;let _=js(y,k,s,i);d.set(y,_);for(let w of _)r.has(w)||r.set(w,y)}let c=y=>{let k=y,_=0;for(;r.has(k)&&_++<o.size+1;)k=r.get(k);return k},h=new Map;for(let y of r.keys()){let k=c(y);k!==y&&!r.has(k)&&h.set(y,k)}let u=new Set([...o].filter(y=>!h.has(y))),g=new Map;for(let y of h.values())g.set(y,(g.get(y)||0)+1);let p=[],l=new Set;for(let y of n){let k=String(y.source),_=String(y.target);u.has(k)&&u.has(_)&&(p.push(y),l.add(k+"\0"+_))}let f=new Map;for(let y of n){let k=String(y.source),_=String(y.target);if(u.has(k)&&u.has(_))continue;let w=h.get(k)||k,x=h.get(_)||_;if(!u.has(w)||!u.has(x)||w===x)continue;let b=w+"\0"+x;l.has(b)||f.has(b)||f.set(b,{id:`~proxy~${w}~${x}`,source:w,target:x,sourcePort:w===k?y.sourcePort:void 0,targetPort:x===_?y.targetPort:void 0,type:y.type,markerStart:y.markerStart,markerEnd:y.markerEnd,className:((y.className||"")+" fg-edge--proxy").trim(),proxy:!0})}let m=(a.constraints||[]).filter(y=>y.type==="sameRank"?(y.nodes||[]).every(k=>u.has(String(k))):y.type==="leftOf"||y.type==="before"?u.has(String(y.a))&&u.has(String(y.b)):y.type==="rank"?u.has(String(y.node)):!0);return{data:{...a,nodes:e.filter(y=>u.has(String(y.id))),edges:[...p,...f.values()],constraints:m},visible:u,owner:h,counts:g,hiddenBy:d}}var Ke={};es(Ke,{countCrossings:()=>Us,countNodeOverlaps:()=>Ys,countOverlappingSegments:()=>Zs});function Ks(a,t,e,n){let o=(c,h,u)=>(h.x-c.x)*(u.y-c.y)-(h.y-c.y)*(u.x-c.x),s=o(e,n,a),i=o(e,n,t),d=o(a,t,e),r=o(a,t,n);return(s>1e-9&&i<-1e-9||s<-1e-9&&i>1e-9)&&(d>1e-9&&r<-1e-9||d<-1e-9&&r>1e-9)}function Us(a){let t=[...a.entries()].map(([n,o])=>[n,Array.isArray(o)?o:o.points]),e=0;for(let n=0;n<t.length;n++)for(let o=n+1;o<t.length;o++){let s=t[n][1],i=t[o][1];for(let d=0;d<s.length-1;d++)for(let r=0;r<i.length-1;r++)Ks(s[d],s[d+1],i[r],i[r+1])&&e++}return e}function Ys(a,t,e){let n=0;for(let[o,s]of a){let i=Array.isArray(s)?s:s.points,d=e.get(o);for(let[r,c]of t)if(!(d&&(r===d.source||r===d.target))){for(let h=0;h<i.length-1;h++)if(ht(i[h],i[h+1],c,1)){n++;break}}}return n}function Zs(a){let t=[];for(let[o,s]of a){let i=Array.isArray(s)?s:s.points;for(let d=0;d<i.length-1;d++)t.push([o,i[d],i[d+1],d===0?i[0]:d===i.length-2?i[i.length-1]:null])}let e=(o,s)=>o&&s&&Math.abs(o.x-s.x)<.01&&Math.abs(o.y-s.y)<.01,n=0;for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let[i,d,r,c]=t[o],[h,u,g,p]=t[s];if(i===h||e(c,p))continue;let l=Math.abs(d.y-r.y)<.01,f=Math.abs(u.y-g.y)<.01,m=Math.abs(d.x-r.x)<.01,y=Math.abs(u.x-g.x)<.01;if(l&&f&&Math.abs(d.y-u.y)<.5){let k=Math.max(Math.min(d.x,r.x),Math.min(u.x,g.x));Math.min(Math.max(d.x,r.x),Math.max(u.x,g.x))-k>1&&n++}else if(m&&y&&Math.abs(d.x-u.x)<.5){let k=Math.max(Math.min(d.y,r.y),Math.min(u.y,g.y));Math.min(Math.max(d.y,r.y),Math.max(u.y,g.y))-k>1&&n++}}return n}function Dn(a,t){let e=zt(a,t),n=St(e),o=it(e,n);return{model:e,layout:n,routing:o}}function Fn(a,t,e={}){return new ne(a,t,e)}var Ws=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],te=a=>{let t={};for(let e of Ws)a[e]!==void 0&&(t[e]=a[e]);return t},Ue=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,ne=class{constructor(t,e,n={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=e||{nodes:[],edges:[]},this.userOptions={...n},this.options=yt(this.data.options,this.userOptions),this.renderer=new Et(t,this.options),this.positions=new Map,this.pins=new Map,this.layoutEdges=new Map,this.routing=null,this.model=null,this.selected=null,this._sel=new Map,this._listeners=new Map,this._anim=0,this._hl=[],this._explore={path:[],shown:new Map},this._undo=[],this._redo=[],this._recDepth=0;for(let o of this.data.nodes||[])o&&o.expanded&&this.renderer.expanded.add(String(o.id));this._stacked=new Map,this._stackInfo=null,this._seenStackFlag=new Set,this._readStackFlags(),this.options.controls&&this._controls(),this._onStackClick=o=>{let s=o.target.closest&&o.target.closest(".fg-stack-toggle");!s||!this.renderer.nodesLayer.contains(s)||(o.stopPropagation(),this.toggleStack(s.dataset.fgStack))},this.renderer.viewport.addEventListener("click",this._onStackClick),this._detach=De(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:e=!1}={}){return this._record("relayout",()=>this._build({mode:"relayout",animate:t,fresh:e}))}updateGraph(t,e={}){return this._record("update",()=>this._updateGraph(t,e))}_updateGraph(t,{mode:e="stable",animate:n=this.options.animate,from:o=null,to:s=null}={}){this.data=t;let i=new Set((t.nodes||[]).map(r=>String(r.id)));for(let r of[...this.pins.keys()])i.has(r)||this.pins.delete(r);for(let r of[...this.positions.keys()])i.has(r)||this.positions.delete(r);for(let r of[...this.renderer.expanded])i.has(r)||this.renderer.expanded.delete(r);for(let r of[...this._stacked.keys()])i.has(r)||this._stacked.delete(r);this._readStackFlags();let d=this._explore.path.findIndex(r=>!i.has(r));return d>=0&&(this._explore.path=this._explore.path.slice(0,d)),this._build({mode:e,animate:n,enterFrom:o,exitTo:s})}stack(t,{direction:e,animate:n=this.options.animate}={}){t=String(t);let o=(this.data.nodes||[]).find(i=>String(i.id)===t);if(!o)return Promise.resolve(!1);let s=Qt(o,e);return this._stacked.get(t)===s?Promise.resolve(!0):this._record("stack",()=>(this._stacked.delete(t),this._stacked.set(t,s),this._relayoutKeeping(t,{animate:n}).then(()=>(this._emit("stack",{id:t,direction:s,stacked:this.getStacked(t)}),!0))))}unstack(t,{animate:e=this.options.animate}={}){return t=String(t),this._stacked.has(t)?this._record("unstack",()=>(this._stacked.delete(t),this._relayoutKeeping(t,{animate:e}).then(()=>(this._emit("unstack",{id:t}),!0)))):Promise.resolve(!1)}toggleStack(t,e){return this.isStacked(t)?this.unstack(t,e):this.stack(t,e)}isStacked(t){return this._stacked.has(String(t))}unstackAll({animate:t=this.options.animate}={}){return this._stacked.size?this._record("unstack",()=>(this._stacked.clear(),this._build({mode:"relayout",animate:t}))):Promise.resolve(this)}getStacked(t){return this._stackInfo?[...this._stackInfo.owner].filter(([,e])=>t==null||e===String(t)).map(([e])=>e):[]}addNodes({nodes:t=[],edges:e=[],groups:n=[]}={},{from:o=null,animate:s=this.options.animate,mode:i="stable"}={}){let d={...this.data,nodes:[...this.data.nodes||[],...t],edges:[...this.data.edges||[],...e],groups:[...this.data.groups||[],...n]};return this._record("add",()=>this._updateGraph(d,{mode:i,animate:s,from:o}))}removeNodes(t,{to:e=null,animate:n=this.options.animate,mode:o="stable"}={}){let s=new Set([].concat(t).map(String)),i=new Map;for(let r of s){let c=e!=null?String(e):null;if(!c)for(let h of this.data.edges||[]){let u=String(h.source),g=String(h.target);if(u===r&&!s.has(g)){c=g;break}if(g===r&&!s.has(u)){c=u;break}}c&&i.set(r,c)}let d={...this.data,nodes:(this.data.nodes||[]).filter(r=>!s.has(String(r.id))),edges:(this.data.edges||[]).filter(r=>!s.has(String(r.source))&&!s.has(String(r.target)))};return this._record("remove",()=>this._updateGraph(d,{mode:o,animate:n,to:i}))}setOptions(t,e){return se.some(o=>o in t&&t[o]!==this.options[o])?this._record("options",()=>this._setOptions(t,e)):this._setOptions(t,e)}_setOptions(t,{relayout:e=!0}={}){Object.assign(this.userOptions,t),this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options;let n="explore"in t||"exploreUnfocused"in t||"exploreLimit"in t;return"explore"in t&&(this._explore={path:[],shown:new Map}),n&&(e=!0),e?this.relayout({fresh:"direction"in t||"explore"in t}):this._reroute()}exportState(){let t={};for(let[n,o]of this.positions)t[n]={x:Ze(o.x),y:Ze(o.y),pinned:!!this.pins.get(n)};let e={};if(this.routing)for(let[n,o]of this.routing.paths)e[n]=o.points.map(s=>[We(s.x),We(s.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:e,stacked:[...this._stacked],transform:{...this.renderer.transform}}}importState(t,e){return!t||!t.nodes?Promise.resolve(this):this._record("import",()=>this._importState(t,e))}_importState(t,{animate:e=this.options.animate,transform:n=!0}={}){if(Array.isArray(t.stacked)&&JSON.stringify(t.stacked)!==JSON.stringify([...this._stacked]))return this._stacked=new Map(t.stacked.map(([s,i])=>[String(s),i==="upstream"?"upstream":"downstream"])),this._build({mode:"relayout",animate:!1}).then(()=>this._importState({...t,stacked:void 0},{animate:e,transform:n}));let o=this._snapshot();for(let[s,i]of Object.entries(t.nodes)){let d=this.positions.get(s);d&&(d.x=i.x,d.y=i.y,i.pinned?this.pins.set(s,{x:i.x,y:i.y}):this.pins.delete(s))}this.model=this._prepareModel();for(let s of this.layoutEdges.values())s.waypoints=[];return this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&Wt(this.model,this.routing,this.positions,t.edges),this._present(o,e),n&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,e=!0){let n=this.positions.get(t);if(!n)return;let o=this.pins.get(t);(e?o&&o.x===n.x&&o.y===n.y:!o)||this._record(e?"pin":"unpin",()=>this._pin(t,n,e))}_pin(t,e,n){n?this.pins.set(t,{x:e.x,y:e.y}):this.pins.delete(t);let o=this.model.nodeById.get(t);o&&Object.assign(o.constraints,{pinned:n,x:n?e.x:null,y:n?e.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:n})}unpin(t){this.pin(t,!1)}unpinAll(){this.pins.size&&this.batch("unpin",()=>{for(let t of[...this.pins.keys()])this.pin(t,!1)})}async undo(){return this._step(this._undo,this._redo,"undo")}async redo(){return this._step(this._redo,this._undo,"redo")}canUndo(){return this._undo.length>0}canRedo(){return this._redo.length>0}getHistory(){return{undo:this._undo.map(t=>t.label),redo:this._redo.map(t=>t.label)}}clearHistory(){this._undo=[],this._redo=[],this._historyChanged("clear")}batch(t,e){return this._record(t,e)}select(t,{add:e=!1,toggle:n=!1}={}){let o=(t==null?[]:Array.isArray(t)?t:[t]).map(Vs).filter(Boolean),s=Ye([...this._sel.values()]);!e&&!n&&this._sel.clear();for(let i of o){let d=i.kind+":"+i.id,r=this._sel.delete(d);n&&r||this._sel.set(d,i)}this.selected=[...this._sel.values()].pop()||null,this._paintSelection(),this._applyHighlight(),this._emit("select",this.selected),Ye([...this._sel.values()])!==s&&this._emit("selectionchange",this._selectionPayload())}getSelection(){return this.selected}getSelectedItems(){return[...this._sel.values()].map(t=>({...t}))}getSelectedNodes(){return this._selectionPayload().nodes}getSelectedEdges(){return this._selectionPayload().edges}selectAll(){this.model&&this.select(this.model.nodes.filter(t=>!t.id.startsWith(W)).map(t=>t.id))}clearSelection(){this.select(null)}getConnections(t,{chain:e=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let n=this._ex?this.model.edges.filter(i=>!i.target.startsWith(W)):this.model.edges,o=i=>{let d=new Set([t]),r=[],c=[t];for(;c.length;){let h=c.shift();for(let u of n){let g=i==="next"?u.source:u.target,p=i==="next"?u.target:u.source;g!==h||d.has(p)||(d.add(p),r.push(p),e&&c.push(p))}}return r.map(h=>this.model.nodeById.get(h).data)},s=i=>i.data;return{previous:o("previous"),next:o("next"),incoming:n.filter(i=>i.target===t).map(s),outgoing:n.filter(i=>i.source===t).map(s)}}expand(t,e=!0){t=String(t);let n=this.model?.nodeById.get(t);return!n||!Jt(n.data,this.options)?Promise.resolve(!1):this.renderer.expanded.has(t)===!!e?Promise.resolve(!0):this._record(e?"expand":"collapse",()=>(e?this.renderer.expanded.add(t):this.renderer.expanded.delete(t),this.options.onNodeExpand?.(n.data,!!e),this._emit("expand",{id:t,expanded:!!e,node:n.data}),this._relayoutKeeping(t).then(()=>!0)))}collapse(t){return this.expand(t,!1)}toggleExpand(t){return this.expand(t,!this.isExpanded(t))}isExpanded(t){return this.renderer.expanded.has(String(t))}getExplorePath(){return[...this._explore.path]}setExplorePath(t,{animate:e=this.options.animate}={}){let n=(t||[]).map(String),o=this._explore.path;if(this._explore.path=n,this._emit("explore",{path:[...n]}),!this.options.explore)return Promise.resolve(this);let s=n.length>o.length?n[n.length-1]:o[n.length]??n[n.length-1];return this._relayoutKeeping(s,{animate:e,reveal:n[n.length-1]})}exploreBack(){let t=this._explore.path;return t.length?this.setExplorePath(t.slice(0,-1)):Promise.resolve(this)}fit({padding:t=40,maxZoom:e=1}={}){let n=this.renderer.viewport,o=xt({nodes:this.positions,groups:this._groups||new Map});if(!o.width&&!o.height)return;let s=n.clientWidth||800,i=n.clientHeight||600,d=Math.min((s-2*t)/(o.width||1),(i-2*t)/(o.height||1),e);d=ee(d,this.options.minZoom,this.options.maxZoom),this.setTransform({k:d,x:(s-o.width*d)/2-o.x*d,y:(i-o.height*d)/2-o.y*d})}fitNodes(t,{padding:e=40,maxZoom:n=this.options.maxZoom,animate:o=this.options.animate,edges:s}={}){let i=this._fitTransform(t,{padding:e,maxZoom:n,edges:s});return i?(this._animateTransform(i,o),!0):!1}_fitTransform(t,{padding:e=40,maxZoom:n=this.options.maxZoom,edges:o}={}){let s=new Set([...t].map(String).filter(k=>this.positions.has(k)));if(!s.size)return null;let i=1/0,d=1/0,r=-1/0,c=-1/0,h=(k,_)=>{i=Math.min(i,k),d=Math.min(d,_),r=Math.max(r,k),c=Math.max(c,_)};for(let k of s){let _=this.positions.get(k);h(_.x,_.y),h(_.x+_.width,_.y+_.height)}let u=o||this.model.edges.filter(k=>s.has(k.source)&&s.has(k.target)).map(k=>k.id);for(let k of u)for(let _ of this.routing?.paths.get(k)?.points||[])h(_.x,_.y);let g=this.renderer.viewport,p=g.clientWidth||800,l=g.clientHeight||600,f=r-i,m=c-d,y=Math.min((p-2*e)/(f||1),(l-2*e)/(m||1),n);return y=ee(y,this.options.minZoom,this.options.maxZoom),{k:y,x:(p-f*y)/2-i*y,y:(l-m*y)/2-d*y}}fitFlow(t=this.selected,{mode:e="chain",...n}={}){if(t==null)return!1;if(t===this.selected&&this._sel.size>1){let d=[...this._sel.values()].flatMap(r=>{if(r.kind==="node")return[r.id];let c=this.model?.edgeById.get(r.id);return c?[c.source,c.target]:[]});return this.fitNodes(d,n)}let o;if(typeof t=="string")o={kind:"node",id:t};else if(t.kind)o={kind:t.kind,id:String(t.id)};else{let d=this.model?.edges.find(r=>r.data===t);if(!d)return!1;o={kind:"edge",id:d.id}}if(!(o.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(o.id))return!1;let i=Lt(this.model.edges,o,e);return this.fitNodes(i.nodes,{...n,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,e,n=this.options.animationDuration){this._stopZoom();let o=this.getTransform();if(!e||Ue()||typeof requestAnimationFrame>"u"){this.setTransform(t);return}let s=performance.now(),i=r=>r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2,d=r=>{let c=Math.min(1,(r-s)/n),h=i(c),u=o.k*Math.pow(t.k/o.k,h),g=t.k-o.k?(u-o.k)/(t.k-o.k):h;this.setTransform({k:u,x:o.x+(t.x-o.x)*g,y:o.y+(t.y-o.y)*g}),c<1&&(this._zoomAnim=requestAnimationFrame(d))};this._zoomAnim=requestAnimationFrame(d)}zoomAt(t,e,n){let o=this.renderer.transform;t=ee(t,this.options.minZoom,this.options.maxZoom);let s=this.renderer.viewport.getBoundingClientRect(),i=e-s.left,d=n-s.top;this.setTransform({k:t,x:i-(i-o.x)*t/o.k,y:d-(d-o.y)*t/o.k})}zoomBy(t){let e=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,e.left+e.width/2,e.top+e.height/2)}zoomTo(t){this.zoomAt(t,...Js(this.renderer.viewport))}setTransform(t){this.renderer.setTransform(t),this._emit("viewport",{...t})}getTransform(){return{...this.renderer.transform}}getLayout(){let t=new Map([...this.positions].map(([n,o])=>[n,{...o}])),e=new Map;if(this.routing)for(let[n,o]of this.routing.paths)e.set(n,o.points.map(s=>({...s})));return{nodes:t,edges:e,groups:new Map(this._groups||[])}}on(t,e){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(e),()=>this._listeners.get(t).delete(e)}destroy(){cancelAnimationFrame(this._anim),this._animCleanup&&this._animCleanup(),this.renderer.viewport.removeEventListener("click",this._onStackClick),this.container.classList.remove("fg-explore","fg-explore--blur"),delete this.container.dataset.fgDirection,this._stopZoom(),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,e){for(let n of this._listeners.get(t)||[])try{n(e)}catch(o){console.error(o)}}_refreshView(){this._refreshExplore(),this._stackInfo=this._stacked?.size?je(this._viewData,this._stacked):null,this._stackInfo&&(this._viewData=this._stackInfo.data)}_readStackFlags(){for(let t of this.data.nodes||[]){if(!t||!t.stacked)continue;let e=String(t.id);this._seenStackFlag.has(e)||this._stacked.set(e,Qt(t)),this._seenStackFlag.add(e)}}_refreshExplore(){if(!this.options.explore){this._ex=null,this._viewData=this.data;return}this._exIndexFor!==this.data&&(this._exIndex=Fe(this.data),this._exIndexFor=this.data);let t=this.options;this._ex=Xe(this.data,this._exIndex,{path:this._explore.path,shown:this._explore.shown,limit:t.exploreLimit,hide:t.exploreUnfocused==="hide",moreLabel:t.exploreMoreText}),this._viewData=this._ex.data}async _relayoutKeeping(t,{animate:e=this.options.animate,reveal:n,...o}={}){let s=this.getTransform(),i=this.positions.get(t);await this._build({mode:"relayout",animate:e,...o});let d=this.positions.get(t),r=s;if(i&&d&&(r={k:s.k,x:s.x-(d.x-i.x)*s.k,y:s.y-(d.y-i.y)*s.k}),n&&this.positions.has(n)){let c=[n,...this.model.edges.filter(u=>u.source===n).map(u=>u.target)],h=this._fitTransform(c,{maxZoom:s.k});h&&h.k>=s.k*.6&&!this._inView(c,r)&&(r=h)}return this._animateTransform(r,e&&!!i,this._presentDur),this}_inView(t,e,n=20){let o=this.renderer.viewport,s=o.clientWidth||800,i=o.clientHeight||600;return t.every(d=>{let r=this.positions.get(d);if(!r)return!0;let c=r.x*e.k+e.x,h=r.y*e.k+e.y;return c>=n&&h>=n&&c+r.width*e.k<=s-n&&h+r.height*e.k<=i-n})}_prepareModel(t){let e=this._viewData||this.data,n=this.renderer.syncNodes(e.nodes||[]),o=(e.nodes||[]).map(i=>{let d=String(i.id),r=t&&t.get(d)||this.pins.get(d);return r?{...i,constraints:{...i.constraints||{},pinned:!0,x:r.x,y:r.y}}:i}),s=zt({...e,nodes:o},this.userOptions,n);for(let i of s.warnings)console.warn("[FlexGraph] "+i);return this.options=s.options,this.renderer.options=s.options,s}_snapshot(){return{positions:new Map([...this.positions].map(([t,e])=>[t,{...e}])),routing:this.routing,groups:this._groups}}_build(t){let e=this._buildNow(t);return this._lastBuild=e.catch(()=>{}),e}async _buildNow({mode:t,animate:e,fresh:n,enterFrom:o=null,exitTo:s=null}){let i=this._snapshot();this._animCleanup&&this._animCleanup();let d=new Set(this.positions.keys()),r=this._stackInfo?this._stackInfo.owner:new Map,c=this._ex?this._ex.parentOf:null;this._refreshView(),this._exploreChrome();let h=new Set((this._viewData.nodes||[]).map(m=>String(m.id)));for(let m of[...this.positions.keys()])h.has(m)||this.positions.delete(m);let u=new Map;for(let m of d){if(h.has(m))continue;let y=this.renderer.nodeEls.get(m);if(!y)continue;this.renderer.nodeEls.delete(m);let k=(s instanceof Map?s.get(m):s)??this._stackInfo?.owner.get(m)??c?.get(m)??null;u.set(m,{el:y,owner:k!=null?String(k):null})}let g=new Map;if(d.size){let m=this._viewData.edges||[];for(let y of h){if(d.has(y))continue;let k=(o instanceof Map?o.get(y):o)??r.get(y)??this._ex?.parentOf.get(y)??(y.startsWith(W)?y.slice(W.length):null);if(k==null){for(let _ of m)if(String(_.target)===y&&d.has(String(_.source))){k=_.source;break}}if(k==null){for(let _ of m)if(String(_.source)===y&&d.has(String(_.target))){k=_.target;break}}g.set(y,k!=null&&d.has(String(k))?String(k):null)}}let p=this._prepareModel(),l,f=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")l=await this._layoutInWorker(p,t,n);else if(t==="stable"&&f){let m=new Map;for(let k of p.nodes){let _=this.positions.get(k.id);_&&m.set(k.id,{x:_.x,y:_.y})}let y=this._prepareModel(m);l=St(y),Le(l,new Set(m.keys()),this.options.nodeSpacing/2,this.options.direction);for(let k of l.edges.values())k.waypoints=[];p=this._prepareModel()}else{let m=n||!f?null:new Map([...this.positions].map(([y,k])=>[y,{x:k.x+k.width/2,y:k.y+k.height/2}]));if(m)for(let[y,k]of g){let _=k&&this.positions.get(k);_&&m.set(y,{x:_.x+_.width/2,y:_.y+_.height/2})}l=St(p,{hints:m})}return this.model=p,this.positions=new Map([...l.nodes].map(([m,y])=>[m,{x:y.x,y:y.y,width:y.width,height:y.height}])),this.layoutEdges=l.edges,this.routing=l.routing||it(p,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(p),this._renderStacks(),this._present(f||u.size?i:null,e,{enters:g,exits:u}),this._pruneSelection(),this._emit("layout",{crossings:l.crossings}),this}_layoutInWorker(t,e,n){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=r=>{let c=this._wpending.get(r.data.seq);c&&(this._wpending.delete(r.data.seq),r.data.error?c.reject(new Error(r.data.error)):c.resolve(r.data))});let o={options:this.data.options,nodes:t.nodes.map(r=>({...te(r.data),id:r.id,width:r.width,height:r.height,constraints:r.constraints})),edges:t.edges.map(r=>te(r.data)),groups:t.groups.map(r=>({id:r.id,label:r.label})),constraints:(this._viewData?.constraints||[]).map(te)},s={};for(let[r,c]of Object.entries(this.userOptions))typeof c!="function"&&r!=="worker"&&(s[r]=c);let i=n||e!=="relayout"?null:new Map([...this.positions].map(([r,c])=>[r,{x:c.x+c.width/2,y:c.y+c.height/2}])),d=++this._wseq;return new Promise((r,c)=>{this._wpending.set(d,{resolve:r,reject:c}),this._worker.postMessage({seq:d,data:o,options:s,hints:i})}).then(r=>({nodes:r.nodes,edges:r.edges,crossings:r.crossings,routing:r.routing}))}_reroute(){return this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let e=this.renderer;e.placeNodes(this.model,this.positions),this._groups=mt(this.model,{nodes:this.positions}),e.renderGroups(this.model,this._groups),e.renderEdges(this.model,this.routing,t,t?null:this.positions);for(let n of this._sel.values())n.kind==="edge"&&e.edgeEls.get(n.id)?.classList.add("fg-selected");if(this._hl.length)for(let n of this._hl)n.classList.add("fg-hl");this._exploreFocus()}_exploreFocus(){let t=this.renderer,e=this._ex,n=new Map;if(e){let o=new Set(this._explore.path);for(let[s,i]of e.childCount)n.set(s,{text:o.has(s)?"\u2212":String(i),open:o.has(s),title:`${i} ${i===1?"child":"children"}`})}for(let[o,s]of t.nodeEls)s.classList.toggle("fg-unfocused",!!e&&!e.focus.has(o));for(let o of this.model.edges)t.edgeEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target))),t.labelEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target)));t.renderBadges(n)}_exploreChrome(){let t=this.options,e=this.renderer.viewport;this.container.classList.toggle("fg-explore",!!t.explore),this.container.classList.toggle("fg-explore--blur",!!t.explore&&t.exploreUnfocused==="blur"),this.container.dataset.fgDirection=t.direction;let n=e.querySelector(":scope > .fg-breadcrumb");if(!t.explore||!t.exploreBreadcrumb){n?.remove();return}n||(n=document.createElement("nav"),n.className="fg-breadcrumb",n.setAttribute("aria-label","Explore path"),e.appendChild(n)),n.innerHTML="";let o=this._explore.path,s=(i,d,r)=>{let c=document.createElement("button");c.type="button",c.textContent=i,r&&c.setAttribute("aria-current","step"),c.addEventListener("click",h=>{h.stopPropagation(),this.setExplorePath(d)}),n.appendChild(c)};s(t.exploreStartText,[],!o.length),o.forEach((i,d)=>{let r=document.createElement("span");r.className="fg-breadcrumb__sep",r.textContent="\u203A",r.setAttribute("aria-hidden","true"),n.appendChild(r);let c=this._exIndex?.nodeById.get(i);s(String(c?.label??i),o.slice(0,d+1),d===o.length-1)})}_renderStacks(){this.renderer.renderStacks(this.model,{stacked:this._stacked,counts:this._stackInfo?this._stackInfo.counts:new Map})}_present(t,e,{enters:n=new Map,exits:o=new Map}={}){cancelAnimationFrame(this._anim);let s=new Set,i=()=>{this._animCleanup=null;for(let{el:f}of o.values())f.remove();for(let f of s)f.style.opacity="",f.style.scale="",f.style.zIndex="",f.style.pointerEvents=""};if(this._animCleanup=i,this._presentDur=this.options.animationDuration,!t||!e||Ue()||!t.routing){i(),this._render();return}let d=this.positions,r=this.renderer.nodeEls,c=this.options.animationDuration*(n.size||o.size?1.5:1);this._presentDur=c;let h=performance.now(),u=f=>f<.5?4*f*f*f:1-Math.pow(-2*f+2,3)/2,g=f=>({x:f.x+f.width/2,y:f.y+f.height/2}),p=new Set([...n.values(),...[...o.values()].map(f=>f.owner)].filter(Boolean));for(let f of p){let m=r.get(f);m&&(m.style.zIndex="3",s.add(m))}for(let f of n.keys()){let m=r.get(f);m&&(m.style.zIndex="1",m.style.pointerEvents="none",s.add(m))}for(let{el:f}of o.values())f.style.zIndex="1",f.style.pointerEvents="none",f.classList.remove("fg-hl","fg-selected");let l=f=>{let m=Math.min(1,(f-h)/c);if(m>=1){i(),this._render(),this._emit("animationend");return}let y=u(m),k=new Map;for(let[w,x]of d){if(n.has(w))continue;let b=t.positions.get(w)||x;k.set(w,{x:b.x+(x.x-b.x)*y,y:b.y+(x.y-b.y)*y,width:x.width,height:x.height})}for(let[w,x]of n){let b=d.get(w);if(!b)continue;let M=x&&(k.get(x)||t.positions.get(x)),E=g(M||b),v=E.x-b.width/2,I=E.y-b.height/2;k.set(w,{x:v+(b.x-v)*y,y:I+(b.y-I)*y,width:b.width,height:b.height});let N=r.get(w);N&&(N.style.opacity=String(Math.min(1,y*1.6)),N.style.scale=String(.7+.3*y))}this.renderer.placeNodes(this.model,k);for(let[w,{el:x,owner:b}]of o){let M=t.positions.get(w);if(!M)continue;let E=b&&k.get(b),v=g(E||M),I=v.x-M.width/2,N=v.y-M.height/2;x.style.transform=`translate(${M.x+(I-M.x)*y}px, ${M.y+(N-M.y)*y}px)`,x.style.opacity=String(E?Math.max(0,1-y*1.2):1-y),x.style.scale=String(1-.3*y)}this._groups=mt(this.model,{nodes:k}),this.renderer.renderGroups(this.model,this._groups);let _=w=>{let x=this.model.edgeById.get(w),b=x&&k.get(x.source),M=x&&k.get(x.target);return b&&M?[g(b),g(M)]:null};this.renderer.renderEdges(this.model,this.routing,He(t.routing.paths,this.routing.paths,y,28,_)),this._anim=requestAnimationFrame(l)};this._anim=requestAnimationFrame(l)}_dragStart(t){cancelAnimationFrame(this._anim),this._dragSnap=this._canRecord()?this._capture("move"):null;let e=this._sel.has("node:"+t)?[...this._sel.values()].filter(s=>s.kind==="node"&&this.positions.has(s.id)).map(s=>s.id):[t],n=new Set(e);this._dragGroup=e.map(s=>{let i=this.positions.get(s);return{id:s,x:i.x,y:i.y}});let o=new Set(n);for(let s of this.model.edges)n.has(s.source)&&o.add(s.target),n.has(s.target)&&o.add(s.source);this._affected=new Set(this.model.edges.filter(s=>o.has(s.source)||o.has(s.target)).map(s=>s.id));for(let s of this._affected){let i=this.model.edgeById.get(s);if(n.has(i.source)||n.has(i.target)){let d=this.layoutEdges.get(s);d&&(d.waypoints=[])}}for(let s of e)this.renderer.nodeEls.get(s)?.classList.add("fg-node--dragging");this._emit("dragstart",{id:t,ids:[...e]})}_dragMove(t,e,n){let o=this.positions.get(t),s=this._dragGroup?.find(c=>c.id===t);if(!o||!s)return;let i=e-s.x,d=n-s.y,r=this.options.nodeMargin;for(let c of this._dragGroup){let h=this.positions.get(c.id);h.x=c.x+i,h.y=c.y+d;let u=this.model.nodeById.get(c.id);u.constraints.pinned&&(u.constraints.x=h.x,u.constraints.y=h.y);let g={x:h.x-r,y:h.y-r,width:h.width+2*r,height:h.height+2*r};if(this.routing)for(let[p,l]of this.routing.paths){if(this._affected.has(p))continue;let f=l.points;for(let m=0;m<f.length-1;m++)if(ht(f[m],f[m+1],g,1)){this._affected.add(p);break}}}this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:e,y:n,ids:this._dragGroup.map(c=>c.id)})}_dragEnd(t){let e=this.positions.get(t),n=(this._dragGroup||[{id:t}]).map(o=>o.id);this._dragGroup=null,this._recDepth++;try{for(let o of n)this.renderer.nodeEls.get(o)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(o,!0)}finally{this._recDepth--}this._dragSnap&&(this._push(this._dragSnap),this._dragSnap=null),this._emit("dragend",{id:t,x:e.x,y:e.y,ids:n}),this._emit("change",this.exportState())}_boxSelect(t,e){let n=[];for(let[o,s]of this.positions)o.startsWith(W)||s.x<t.x+t.width&&t.x<s.x+s.width&&s.y<t.y+t.height&&t.y<s.y+s.height&&n.push({kind:"node",id:o});this.select([...e,...n])}_click(t,e){let n=this.options.multiSelect&&!!(e.ctrlKey||e.metaKey||e.shiftKey);if(!(t.kind==="node"&&this._ex&&!n&&this._exploreClick(t.id)))if(t.kind==="node"){if(t.id.startsWith(W))return;this.select({kind:"node",id:t.id},{toggle:n});let o=this.model.nodeById.get(t.id),s=this.getConnections(t.id);this.options.onNodeClick?.(o.data,e,s),this._emit("nodeclick",{node:o.data,event:e,previous:s.previous,next:s.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id},{toggle:n});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,e),this._emit("edgeclick",{edge:o.data,event:e})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:e}):(n||this.select(null),this.options.onBackgroundClick?.(e))}_exploreClick(t){if(t.startsWith(W)){let e=t.slice(W.length),n=this._explore.shown;return n.set(e,Math.max(this.options.exploreLimit,n.get(e)||0)+this.options.exploreLimit),this._relayoutKeeping(t),!0}return!this._exIndex.children.has(t)&&!this._explore.path.includes(t)||this.setExplorePath(Ge(this._explore.path,t,this._ex.parentOf)),!1}_escape(){if(this._sel.size>1||!(this._ex&&this._explore.path.length)){this.select(null);return}this.select(null),this.exploreBack()}_nodeExists(t){return this._exIndex&&this.options.explore?this._exIndex.nodeById.has(t):!!this.model?.nodeById.has(t)||(this.data.nodes||[]).some(e=>String(e.id)===t)}_pruneSelection(){let t=n=>n.kind==="edge"?(this.data.edges||[]).some((o,s)=>String(o.id??"e"+s)===n.id):this._nodeExists(n.id),e=[...this._sel].filter(([,n])=>!t(n));if(e.length){for(let[n]of e)this._sel.delete(n);this.select([...this._sel.values()])}else this._sel.size&&(this._paintSelection(),this._applyHighlight())}_canRecord(){return!!this.options.history&&!this._recDepth&&!this._restoring&&!!this.model}_record(t,e){if(!this._canRecord())return e();let n=this._capture(t);this._recDepth++;let o;try{o=e()}finally{this._recDepth--}return this._push(n),o}_push(t){this._undo.push(t);let e=Math.max(1,this.options.historyLimit|0);this._undo.length>e&&this._undo.splice(0,this._undo.length-e),this._redo=[],this._historyChanged("record",t.label)}_capture(t){let e={};if(this.routing)for(let[n,o]of this.routing.paths)e[n]=o.points.map(s=>[s.x,s.y]);return{label:t,data:this.data,opts:Object.fromEntries(se.map(n=>[n,this.options[n]])),positions:new Map([...this.positions].map(([n,o])=>[n,{...o}])),pins:new Map([...this.pins].map(([n,o])=>[n,{...o}])),expanded:[...this.renderer.expanded],stacked:[...this._stacked||[]],layoutEdges:new Map([...this.layoutEdges].map(([n,o])=>[n,{...o,waypoints:(o.waypoints||[]).map(s=>({...s}))}])),edges:e}}async _step(t,e,n){await this._lastBuild;let o=t.pop();if(!o)return!1;e.push(this._capture(o.label)),this._restoring=!0;try{await this._restore(o)}finally{this._restoring=!1}return this._historyChanged(n,o.label),this._emit("change",this.exportState()),!0}async _restore(t){let e=this._snapshot();this.data=t.data;let n=se.filter(i=>this.options[i]!==t.opts[i]);for(let i of n)this.userOptions[i]=t.opts[i];n.length&&(this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options),this.renderer.expanded=new Set(t.expanded),this._stacked=new Map(t.stacked||[]);let o=new Set((this.data.nodes||[]).map(i=>String(i.id))),s=this._explore.path.findIndex(i=>!o.has(i));s>=0&&(this._explore.path=this._explore.path.slice(0,s)),this.pins=new Map([...t.pins].map(([i,d])=>[i,{...d}])),this.positions=new Map([...t.positions].map(([i,d])=>[i,{...d}])),this.layoutEdges=new Map([...t.layoutEdges].map(([i,d])=>[i,{...d,waypoints:d.waypoints.map(r=>({...r}))}])),this._refreshView(),this._exploreChrome(),this.model=this._prepareModel(),this.model.nodes.some(i=>!this.positions.has(i.id))?await this._build({mode:"stable",animate:this.options.animate}):(this.routing=it(this.model,{nodes:this.positions,edges:this.layoutEdges}),Wt(this.model,this.routing,this.positions,t.edges),this.renderer.renderPorts(this.model),this._renderStacks(),this._present(e,this.options.animate)),this._pruneSelection(),s>=0&&this._emit("explore",{path:[...this._explore.path]})}_historyChanged(t,e){let n=this._historyButtons;n&&(n.undo.disabled=!this._undo.length,n.redo.disabled=!this._redo.length),this._emit("history",{action:t,label:e,canUndo:this._undo.length>0,canRedo:this._redo.length>0,data:this.data})}_paintSelection(){let t=this.renderer;for(let e of t.viewport.querySelectorAll(".fg-selected"))e.classList.remove("fg-selected");for(let e of this._sel.values())(e.kind==="edge"?t.edgeEls:t.nodeEls).get(e.id)?.classList.add("fg-selected");t.world.classList.toggle("fg-multi",this._sel.size>1)}_selectionPayload(){let t=[],e=[];for(let n of this._sel.values())if(n.kind==="node"){let o=this.model?.nodeById.get(n.id)?.data??this._exIndex?.nodeById.get(n.id)??(this.data.nodes||[]).find(s=>String(s.id)===n.id);o&&t.push(o)}else{let o=this.model?.edgeById.get(n.id)?.data;o&&e.push(o)}return{items:this.getSelectedItems(),nodes:t,edges:e}}_contextMenu(t,e){let n=this.options,o,s;if(t.kind==="node"&&this.model?.nodeById.has(t.id)){let i=this.model.nodeById.get(t.id).data,d=this.getConnections(t.id);o={kind:"node",id:t.id,node:i,previous:d.previous,next:d.next,event:e},s=n.onNodeContextMenu&&(()=>n.onNodeContextMenu(i,e,d))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;o={kind:"edge",id:t.id,edge:i,event:e},s=n.onEdgeContextMenu&&(()=>n.onEdgeContextMenu(i,e))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;o={kind:"group",id:t.id,group:i,event:e},s=n.onGroupContextMenu&&(()=>n.onGroupContextMenu(i,e))}else o={kind:"background",event:e},s=n.onBackgroundContextMenu&&(()=>n.onBackgroundContextMenu(e));o.selection=this.getSelectedItems(),(s||this._listeners.get("contextmenu")?.size)&&e.preventDefault(),s?.(),this._emit("contextmenu",o)}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let s of this._hl)s.classList.remove("fg-hl");this._hl=[];let t=this.renderer,e=s=>!!(s.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(s.id),n=null;if(this._hovered&&e(this._hovered)?n=Lt(this.model.edges,this._hovered,this.options.hoverHighlight):this.options.highlightSelection&&this._sel.size>1?n=qs(this.model.edges,[...this._sel.values()].filter(e)):this.options.highlightSelection&&this.selected&&e(this.selected)&&(n=Lt(this.model.edges,this.selected,this.options.hoverHighlight)),t.world.classList.toggle("fg-hovering",!!n),!n)return;let o=s=>{s&&(s.classList.add("fg-hl"),this._hl.push(s))};for(let s of n.nodes)o(t.nodeEls.get(s));for(let s of n.edges)o(t.edgeEls.get(s)),o(t.labelEls.get(s))}_controls(){let t=document.createElement("div");t.className="fg-controls";let e=(n,o,s)=>{let i=document.createElement("button");return i.type="button",i.textContent=n,i.title=o,i.setAttribute("aria-label",o),i.addEventListener("click",d=>{d.stopPropagation(),s()}),t.appendChild(i),i};if(e("+","Zoom in",()=>this.zoomBy(1.25)),e("\u2212","Zoom out",()=>this.zoomBy(.8)),e("\u2922","Fit to screen",()=>this.fit()),this.options.history){let n=e("\u21B6","Undo (Ctrl+Z)",()=>this.undo()),o=e("\u21B7","Redo (Ctrl+Shift+Z)",()=>this.redo());n.disabled=o.disabled=!0,n.classList.add("fg-controls__undo"),this._historyButtons={undo:n,redo:o}}this.renderer.viewport.appendChild(t)}},ee=(a,t,e)=>Math.max(t,Math.min(e,a)),se=["direction","edgeRouting"],Vs=a=>a==null?null:typeof a=="string"||typeof a=="number"?{kind:"node",id:String(a)}:a.id!=null?{kind:a.kind==="edge"?"edge":"node",id:String(a.id)}:null,Ye=a=>a.map(t=>t.kind+":"+t.id).join("|");function qs(a,t){let e=new Set,n=new Set;for(let s of t)if(s.kind==="node")e.add(s.id);else{let i=a.find(d=>d.id===s.id);i&&(n.add(i.id),e.add(i.source),e.add(i.target))}let o=new Set(t.filter(s=>s.kind==="node").map(s=>s.id));for(let s of a)o.has(s.source)&&o.has(s.target)&&n.add(s.id);return{nodes:e,edges:n}}var Ze=a=>Math.round(a*10)/10,We=a=>Math.round(a*100)/100;function Js(a){let t=a.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}export{$t as DEFAULT_OPTIONS,gt as GraphValidationError,ne as GraphView,Gs as VERSION,St as computeLayout,Fn as createGraph,Te as edgePath,Dn as layoutGraph,Ke as metrics,zt as normalizeGraph,it as routeEdges,qs as selectionHighlight,je as stackView};