@kazant/flexgraph 1.1.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.
- package/CHANGELOG.md +48 -0
- package/README.md +100 -4
- package/css/graph.css +165 -4
- package/dist/flexgraph.esm.js +2 -2
- package/dist/flexgraph.umd.cjs +2 -2
- package/dist/flexgraph.umd.js +2 -2
- package/dist/flexgraph.worker.js +2 -2
- package/package.json +1 -1
- package/types/index.d.ts +116 -11
package/dist/flexgraph.umd.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/*! FlexGraph v1.
|
|
1
|
+
/*! FlexGraph v1.3.0 | MIT License | (c) 2026 Alexander Pettersen (kazant) | https://github.com/kazant/flexgraph */
|
|
2
2
|
(function (root, factory) {
|
|
3
3
|
if (typeof define === 'function' && define.amd) define([], factory);
|
|
4
4
|
else if (typeof module === 'object' && module.exports) module.exports = factory();
|
|
5
5
|
else root.FlexGraph = factory();
|
|
6
6
|
})(typeof self !== 'undefined' ? self : this, function () {
|
|
7
7
|
var module = { exports: {} }, exports = module.exports;
|
|
8
|
-
var Rt=Object.defineProperty;var De=Object.getOwnPropertyDescriptor;var Ye=Object.getOwnPropertyNames;var Ze=Object.prototype.hasOwnProperty;var he=(r,t)=>{for(var n in t)Rt(r,n,{get:t[n],enumerable:!0})},Ue=(r,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ye(t))!Ze.call(r,s)&&s!==n&&Rt(r,s,{get:()=>t[s],enumerable:!(o=De(t,s))||o.enumerable});return r};var We=r=>Ue(Rt({},"__esModule",{value:!0}),r);var Tn={};he(Tn,{DEFAULT_OPTIONS:()=>wt,GraphValidationError:()=>at,GraphView:()=>Lt,VERSION:()=>Ce,computeLayout:()=>gt,createGraph:()=>Bn,edgePath:()=>Wt,layoutGraph:()=>Rn,metrics:()=>Kt,normalizeGraph:()=>bt,routeEdges:()=>ot});module.exports=We(Tn);var qe=["top","right","bottom","left"],Ke=["TB","LR","BT","RL"],Ve=["orthogonal","straight","curved"],wt=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,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!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"}}}),at=class extends Error{constructor(t,n=[]){super(t),this.name="GraphValidationError",this.details=n}},Q=r=>typeof r=="number"&&Number.isFinite(r);function Mt(...r){let t={...wt,edgeTypes:{...wt.edgeTypes}};for(let n of r)if(n)for(let[o,s]of Object.entries(n))s!==void 0&&(o==="edgeTypes"?Object.assign(t.edgeTypes,s):t[o]=s);return Ke.includes(t.direction)||(t.direction="TB"),Ve.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function bt(r,t,n){if(!r||typeof r!="object")throw new at("Graph must be an object");let o=Mt(r.options,t),s=[],e=[],i=[],c=new Map;for(let f of r.groups||[]){if(!f||f.id==null){s.push("Group without id");continue}let h=String(f.id);if(c.has(h)){s.push(`Duplicate group id "${h}"`);continue}let g={id:h,label:f.label??h,className:f.className||"",data:f};i.push(g),c.set(h,g)}let a=[],d=new Map;(r.nodes||[]).forEach((f,h)=>{if(!f||f.id==null){s.push(`Node at index ${h} has no id`);return}let g=String(f.id);if(d.has(g)){s.push(`Duplicate node id "${g}"`);return}let w=n&&n.get(g),x=Q(f.width)?f.width:w?w.width:o.defaultNodeWidth,M=Q(f.height)?f.height:w?w.height:o.defaultNodeHeight,m=f.group!=null?String(f.group):null;if(m&&!c.has(m)){let I={id:m,label:m,className:"",data:{id:m}};i.push(I),c.set(m,I)}let y=[],b=new Set;for(let I of f.ports||[]){if(!I||I.id==null){e.push(`Node "${g}": port without id ignored`);continue}let $=String(I.id);if(b.has($)){e.push(`Node "${g}": duplicate port "${$}" ignored`);continue}let B=qe.includes(I.side)?I.side:null;B||e.push(`Node "${g}": port "${$}" has invalid side "${I.side}", using auto side`),b.add($),y.push({id:$,side:B,offset:Q(I.offset)?Math.min(1,Math.max(0,I.offset)):null,label:I.label,data:I})}let k=f.constraints||{},S={pinned:!!k.pinned,x:Q(k.x)?k.x:Q(f.x)&&k.pinned?f.x:null,y:Q(k.y)?k.y:Q(f.y)&&k.pinned?f.y:null,rank:Number.isInteger(k.rank)&&k.rank>=0?k.rank:null};S.pinned&&(S.x==null||S.y==null)&&(e.push(`Node "${g}" is pinned but has no x/y; pin ignored until it has a position`),S.pinned=!1);let _={id:g,index:h,label:f.label??g,width:x,height:M,group:m,ports:y,portById:new Map(y.map(I=>[I.id,I])),constraints:S,className:f.className||"",type:f.type||null,data:f};a.push(_),d.set(g,_)});let l=[],u=new Map;(r.edges||[]).forEach((f,h)=>{if(!f)return;let g=f.id!=null?String(f.id):`e${h}`;if(u.has(g)){s.push(`Duplicate edge id "${g}"`);return}let w=String(f.source),x=String(f.target);if(!d.has(w)){s.push(`Edge "${g}": unknown source node "${w}"`);return}if(!d.has(x)){s.push(`Edge "${g}": unknown target node "${x}"`);return}let M=f.sourcePort!=null?String(f.sourcePort):null,m=f.targetPort!=null?String(f.targetPort):null;M&&!d.get(w).portById.has(M)&&(e.push(`Edge "${g}": node "${w}" has no port "${M}"`),M=null),m&&!d.get(x).portById.has(m)&&(e.push(`Edge "${g}": node "${x}" has no port "${m}"`),m=null);let y=o.edgeTypes[f.type]||o.edgeTypes.default||{},b={id:g,index:h,source:w,target:x,sourcePort:M,targetPort:m,type:f.type||"default",label:f.label??null,minLen:Number.isInteger(f.minLen)&&f.minLen>=0?f.minLen:1,weight:Q(f.weight)?f.weight:1,markerStart:f.markerStart!==void 0?f.markerStart:y.markerStart||null,markerEnd:f.markerEnd!==void 0?f.markerEnd:y.markerEnd||null,className:f.className||"",data:f};l.push(b),u.set(g,b)});let p=[];for(let f of r.constraints||[])if(!(!f||!f.type))if(f.type==="leftOf"||f.type==="before"){let h=String(f.a),g=String(f.b);if(!d.has(h)||!d.has(g)){e.push("leftOf constraint references unknown node");continue}p.push({type:"leftOf",a:h,b:g})}else if(f.type==="sameRank"){let h=(f.nodes||[]).map(String).filter(g=>d.has(g));h.length>=2?p.push({type:"sameRank",nodes:h}):e.push("sameRank constraint needs at least two known nodes")}else if(f.type==="rank"){let h=String(f.node);d.has(h)&&Number.isInteger(f.rank)&&(d.get(h).constraints.rank=f.rank)}else e.push(`Unknown constraint type "${f.type}"`);if(s.length)throw new at(s[0],s);return{options:o,nodes:a,nodeById:d,edges:l,edgeById:u,groups:i,groupById:c,constraints:p,warnings:e}}function Je(r,t){let n=new Map(r.map(c=>[c,[]])),o=new Map(r.map(c=>[c,0]));for(let c of t)n.get(c.v).push(c),o.set(c.w,o.get(c.w)+1);let s=new Map,e=new Set,i=[...r.filter(c=>o.get(c)===0),...r];for(let c of i){if(s.has(c))continue;let a=[[c,0]];for(s.set(c,1);a.length;){let d=a[a.length-1],[l,u]=d,p=n.get(l);if(u>=p.length){s.set(l,2),a.pop();continue}d[1]++;let f=p[u],h=s.get(f.w);h===1?e.add(f.id):h||(s.set(f.w,1),a.push([f.w,0]))}}return e}var Bt=class{constructor(t){this.p=new Map(t.map(n=>[n,n]))}find(t){let n=t;for(;this.p.get(n)!==n;)n=this.p.get(n);for(;this.p.get(t)!==n;){let o=this.p.get(t);this.p.set(t,n),t=o}return n}union(t,n){let o=this.find(t),s=this.find(n);o!==s&&this.p.set(s,o)}};function le(r,t,n={}){let o=[],s=new Bt(r);for(let y of n.sameRank||[])for(let b=1;b<y.length;b++)s.union(y[0],y[b]);let e=[...new Set(r.map(y=>s.find(y)))],i=new Set,c=new Set,a=[];for(let y of t){if(y.source===y.target){i.add(y.id);continue}let b=s.find(y.source),k=s.find(y.target);if(b===k){c.add(y.id);continue}a.push({id:y.id,v:b,w:k,minLen:y.minLen??1})}let d=Je(e,a),l=a.map(y=>d.has(y.id)?{...y,v:y.w,w:y.v}:y),u=new Map;if(n.fixedRank)for(let[y,b]of n.fixedRank){if(!s.p.has(y))continue;let k=s.find(y);u.has(k)&&u.get(k)!==b&&o.push(`Conflicting fixed ranks in sameRank set of "${y}"`),u.set(k,Math.max(u.get(k)??0,b))}let p=new Map(e.map(y=>[y,[]])),f=new Map(e.map(y=>[y,[]]));for(let y of l)p.get(y.v).push(y),f.get(y.w).push(y);let h=new Map(e.map(y=>[y,f.get(y).length])),g=e.filter(y=>h.get(y)===0),w=[];for(;g.length;){let y=g.shift();w.push(y);for(let b of p.get(y))h.set(b.w,h.get(b.w)-1),h.get(b.w)===0&&g.push(b.w)}let x=new Map;for(let y of w){let b=u.get(y)??0;for(let k of f.get(y))b=Math.max(b,x.get(k.v)+k.minLen);u.has(y)&&b!==u.get(y)&&o.push(`Fixed rank ${u.get(y)} for "${y}" cannot be satisfied; using ${b}`),x.set(y,b)}for(let y=w.length-1;y>=0;y--){let b=w[y];if(u.has(b))continue;let k=p.get(b);if(!k.length||f.get(b).length>=k.length)continue;let _=1/0;for(let I of k)_=Math.min(_,x.get(I.w)-I.minLen);_>x.get(b)&&x.set(b,_)}let M=1/0;for(let y of x.values())M=Math.min(M,y);if(!u.size&&M>0)for(let[y,b]of x)x.set(y,b-M);let m=new Map;for(let y of r)m.set(y,x.get(s.find(y))??0);return{rank:m,reversed:d,flat:c,selfLoops:i,warnings:o}}function ue(r,t,n=0){let o=[],s=new Map;for(let d of r)s.set(d.id,o.length),o.push({id:d.id,real:!0,rank:d.rank,width:d.width,height:d.height??0,group:d.group??null,pinX:d.pinX??null,inputIndex:o.length,up:[],down:[]});let e=new Map,i=[],c=(d,l,u,p,f,h)=>{let g={a:d,b:l,aOff:u,bOff:p,w:f,edgeId:h};i.push(g),o[d].down.push({n:l,off:p,own:u,w:f}),o[l].up.push({n:d,off:u,own:p,w:f})};for(let d of t){let l=s.get(d.v),u=s.get(d.w),p=o[l].rank,f=o[u].rank;if(f<=p)continue;let h=o[l].group&&o[l].group===o[u].group?o[l].group:null,g=[],w=l,x=d.vOff||0;for(let M=p+1;M<f;M++){let m=o.length;o.push({id:`__d_${d.id}_${M}`,real:!1,rank:M,width:n,height:0,group:h,pinX:null,edgeId:d.id,inputIndex:m,up:[],down:[]}),c(w,m,x,0,d.weight??1,d.id),g.push(m),w=m,x=0}c(w,u,x,d.wOff||0,d.weight??1,d.id),e.set(d.id,g)}let a=0;for(let d of o)a=Math.max(a,d.rank);return{v:o,index:s,segs:i,chains:e,maxRank:a}}function zt(r){let t=Array.from({length:r.maxRank+1},()=>[]),n=new Uint8Array(r.v.length),o=r.v.map((s,e)=>e).filter(s=>r.v[s].real).sort((s,e)=>r.v[s].rank-r.v[e].rank||r.v[s].inputIndex-r.v[e].inputIndex);for(let s of o){if(n[s])continue;let e=[s];for(;e.length;){let i=e.pop();if(n[i])continue;n[i]=1,t[r.v[i].rank].push(i);let c=r.v[i].down.map(a=>a.n);for(let a=c.length-1;a>=0;a--)n[c[a]]||e.push(c[a])}}for(let s=0;s<r.v.length;s++)n[s]||t[r.v[s].rank].push(s);return t}function Qe(r){let t=r.length;if(t<2)return 0;let n=r.slice(),o=new Array(t),s=0;for(let e=1;e<t;e*=2){for(let i=0;i<t;i+=2*e){let c=Math.min(i+e,t),a=Math.min(i+2*e,t),d=i,l=c,u=i;for(;d<c&&l<a;)n[d]<=n[l]?o[u++]=n[d++]:(s+=c-d,o[u++]=n[l++]);for(;d<c;)o[u++]=n[d++];for(;l<a;)o[u++]=n[l++]}[n,o]=[o,n]}return s}function tn(r,t,n,o){let s=[];for(let e of t)for(let i of r.v[e].down)s.push([o[e]+i.own*.999,o[i.n]+i.off*.999]);return s.sort((e,i)=>e[0]-i[0]||e[1]-i[1]),Qe(s.map(e=>e[1]))}function Ct(r,t){let n=kt(r,t),o=0;for(let s=0;s<t.length-1;s++)o+=tn(r,t[s],t[s+1],n);return o}function kt(r,t){let n=new Float64Array(r.v.length);for(let o of t)o.forEach((s,e)=>{n[s]=e});return n}function pe(r,t={}){let n=t.maxIterations??24,o=(t.leftOf||[]).map(([d,l])=>[r.index.get(d),r.index.get(l)]).filter(([d,l])=>d!=null&&l!=null&&r.v[d].rank===r.v[l].rank),s=new Set(o.map(([d,l])=>d+":"+l)),e=[];t.initial&&e.push(t.initial.map(d=>d.slice()));let i=zt(r);e.push(i),!t.initial&&n>4&&(e.push(i.map(d=>d.slice().reverse())),e.push(i.map(d=>d.slice().sort((l,u)=>r.v[l].inputIndex-r.v[u].inputIndex))));let c=null,a=1/0;for(let d of e){let l=en(r,d,o,s,n);if(l.crossings<a&&(c=l.layers,a=l.crossings),a===0)break}return{layers:c,crossings:a}}function en(r,t,n,o,s){let e=t.map(d=>ge(r,d,n)),i=e.map(d=>d.slice()),c=Ct(r,e),a=0;for(let d=0;d<s&&c>0;d++){let l=d%2===0;sn(r,e,l,n,d%4>=2),on(r,e,o);let u=Ct(r,e);if(u<c)c=u,i=e.map(p=>p.slice()),a=0;else if(++a>=6)break}if(c>0&&s>4){e=i.map(d=>d.slice());for(let d=0;d<2;d++){nn(r,e,o);let l=Ct(r,e);if(l<c)c=l,i=e.map(u=>u.slice());else break}}return{layers:i,crossings:c}}function nn(r,t,n){let o=kt(r,t);for(let s of t)if(!(s.length<3||s.length>120))for(let e of s.slice()){let i=r.v[e];if(i.pinX!=null||i.group)continue;let c=s.indexOf(e),a=0,d=c,l=0;for(let u=c-1;u>=0;u--){let p=s[u];if(n.has(p+":"+e)||r.v[p].group)break;l+=ct(r,e,p,o)-ct(r,p,e,o),l<a&&(a=l,d=u)}l=0;for(let u=c+1;u<s.length;u++){let p=s[u];if(n.has(e+":"+p)||r.v[p].group)break;l+=ct(r,p,e,o)-ct(r,e,p,o),l<a&&(a=l,d=u)}d!==c&&(s.splice(c,1),s.splice(d,0,e),s.forEach((u,p)=>{o[u]=p}))}}function sn(r,t,n,o,s){let e=kt(r,t),i=t.length,c=n?fe(1,i):fe(i-2,-1,-1);for(let a of c){let d=t[a],l=new Map;d.forEach((h,g)=>{let w=n?r.v[h].up:r.v[h].down;if(!w.length){l.set(h,g);return}if(s){let m=w.map(b=>e[b.n]+b.off-b.own).sort((b,k)=>b-k),y=m.length>>1;l.set(h,m.length%2?m[y]:(m[y-1]+m[y])/2);return}let x=0,M=0;for(let m of w)x+=(e[m.n]+m.off-m.own)*m.w,M+=m.w;l.set(h,x/M)});let u=new Map;for(let h of d){let g=r.v[h].group;if(!g)continue;let w=u.get(g)||[0,0];w[0]+=l.get(h),w[1]++,u.set(g,w)}let p=h=>{let g=r.v[h].group;return g?u.get(g)[0]/u.get(g)[1]:l.get(h)},f=new Map(d.map((h,g)=>[h,g]));d.sort((h,g)=>p(h)-p(g)||(r.v[h].group||"").localeCompare(r.v[g].group||"")||l.get(h)-l.get(g)||f.get(h)-f.get(g)),t[a]=ge(r,d,o),t[a].forEach((h,g)=>{e[h]=g})}}function ge(r,t,n){let o=t.slice(),s=[],e=[];if(o.forEach((i,c)=>{r.v[i].pinX!=null&&(s.push(c),e.push(i))}),e.length>1&&(e.sort((i,c)=>r.v[i].pinX-r.v[c].pinX),s.forEach((i,c)=>{o[i]=e[c]})),n.length)for(let i=0;i<n.length+1;i++){let c=!1;for(let[a,d]of n){let l=o.indexOf(a),u=o.indexOf(d);l<0||u<0||l<u||(o.splice(l,1),o.splice(o.indexOf(d),0,a),c=!0)}if(!c)break}return o}function ct(r,t,n,o){let s=0;for(let e of["up","down"]){let i=r.v[t][e],c=r.v[n][e];for(let a of i)for(let d of c)o[a.n]+a.off>o[d.n]+d.off&&(s+=a.w*d.w)}return s}function on(r,t,n){let o=kt(r,t),s=!0,e=0;for(;s&&e++<8;){s=!1;for(let i of t)for(let c=0;c<i.length-1;c++){let a=i[c],d=i[c+1],l=r.v[a],u=r.v[d];if((l.group||null)!==(u.group||null)||l.pinX!=null&&u.pinX!=null||n.has(a+":"+d))continue;let p=ct(r,a,d,o);ct(r,d,a,o)<p&&(i[c]=d,i[c+1]=a,o[d]=c,o[a]=c+1,s=!0)}}}function fe(r,t,n=1){let o=[];if(n>0)for(let s=r;s<t;s+=n)o.push(s);else for(let s=r;s>t;s+=n)o.push(s);return o}function rn(r,t,n){let o=r.length,s=new Float64Array(o);for(let l=1;l<o;l++)s[l]=s[l-1]+n[l];let e=[],i=[],c=[],a=[];for(let l=0;l<o;l++)for(e.push(r[l]-s[l]),i.push(t[l]),c.push(l),a.push(l);e.length>1&&e[e.length-2]>e[e.length-1];){let u=e.length-1,p=u-1,f=i[p]+i[u];e[p]=(e[p]*i[p]+e[u]*i[u])/f,i[p]=f,a[p]=a[u],e.pop(),i.pop(),c.pop(),a.pop()}let d=new Float64Array(o);for(let l=0;l<e.length;l++)for(let u=c[l];u<=a[l];u++)d[u]=e[l]+s[u];return d}function ye(r,t,n){let o=r.v.length,s=new Float64Array(o),e=new Float64Array(o),i=n.groupPadding??20,c=n.groupLabelHeight??0,a=(m,y)=>{let b=r.v[m],k=r.v[y],S;return!b.real&&!k.real?S=n.edgeSpacing:!b.real||!k.real?S=(n.nodeSpacing+n.edgeSpacing)/2:S=n.nodeSpacing,b.group!==k.group&&(b.group&&(S+=i),k.group&&(S+=i+(n.labelOnOrderAxis?c:0))),(b.width+k.width)/2+S},d=t.map(m=>m.map((y,b)=>b===0?0:a(m[b-1],y)));t.forEach((m,y)=>{let b=0;m.forEach((S,_)=>{b+=d[y][_],s[S]=b});let k=b/2;m.forEach(S=>{s[S]-=k})});let l=m=>r.v[m].real?1:4,u=(m,y,b)=>{let k=t[m];if(!k.length)return;let S=new Array(k.length),_=new Array(k.length);k.forEach(($,B)=>{let H=r.v[$];if(H.pinX!=null){S[B]=H.pinX,_[B]=1e6;return}let v=0,A=0,C=Y=>{for(let K of Y){let et=K.w*(r.v[K.n].real?1:2)*l($);v+=(s[K.n]+K.off*r.v[K.n].width-K.own*H.width)*et,A+=et}};y&&C(H.up),b&&C(H.down),A===0?(S[B]=s[$],_[B]=.05):(S[B]=v/A,_[B]=A)});let I=rn(S,_,d[m]);k.forEach(($,B)=>{s[$]=I[B]})},p=t.length,f=n.iterations??8;for(let m=0;m<f;m++){for(let y=1;y<p;y++)u(y,!0,!1);for(let y=p-2;y>=0;y--)u(y,!1,!0)}for(let m=0;m<2;m++){for(let y=0;y<p;y++)u(y,!0,!0);for(let y=p-1;y>=0;y--)u(y,!0,!0)}let h=t.map(m=>m.reduce((y,b)=>Math.max(y,r.v[b].height||0),0)),g=new Map;for(let m of r.v){if(!m.real||!m.group)continue;let y=g.get(m.group)||[1/0,-1/0];y[0]=Math.min(y[0],m.rank),y[1]=Math.max(y[1],m.rank),g.set(m.group,y)}let w=new Float64Array(p);for(let[m,y]of g.values()){let b=n.labelOnOrderAxis||n.labelAtRankEnd?0:c,k=n.labelAtRankEnd&&!n.labelOnOrderAxis?c:0;m>0&&(w[m]=Math.max(w[m],i+b)),y<p-1&&(w[y+1]=Math.max(w[y+1],i+k))}let x=[],M=0;for(let m=0;m<p;m++)m>0?M+=h[m-1]/2+n.rankSpacing+w[m]+h[m]/2:M=h[0]/2,x.push(M);for(let m=0;m<o;m++)e[m]=x[r.v[m].rank];return{x:s,y:e,rankY:x,rankHeight:h}}var W={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function me(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,n={top:[],right:[],bottom:[],left:[]};for(let o of r.ports)o.side&&n[o.side].push(o);for(let o of Object.keys(n)){let s=n[o];s.forEach((e,i)=>{let c=e.offset!=null?e.offset:(i+1)/(s.length+1);t.set(e.id,{side:o,t:c,...an(o,c)})})}return t}function an(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 tt=r=>({x:r.x+r.width/2,y:r.y+r.height/2});function xe(r,t){return{x:r.x-t,y:r.y-t,width:r.width+2*t,height:r.height+2*t}}function we(r,t,n,o=.5){return t>r.x+o&&t<r.x+r.width-o&&n>r.y+o&&n<r.y+r.height-o}function vt(r,t,n,o=.5){let s=n.x+o,e=n.x+n.width-o,i=n.y+o,c=n.y+n.height-o;if(e<=s||c<=i)return!1;let a=0,d=1,l=t.x-r.x,u=t.y-r.y,p=(f,h)=>{if(f===0)return h>0;let g=h/f;if(f<0){if(g>d)return!1;g>a&&(a=g)}else{if(g<a)return!1;g<d&&(d=g)}return!0};return!p(-l,r.x-s)||!p(l,e-r.x)||!p(-u,r.y-i)||!p(u,c-r.y)?!1:d-a>1e-9}function Tt(r,t){let n=tt(r),o=t.x-n.x,s=t.y-n.y;if(o===0&&s===0)return{...n,side:"bottom"};let e=o!==0?r.width/2/Math.abs(o):1/0,i=s!==0?r.height/2/Math.abs(s):1/0,c=Math.min(e,i),a=e<i?o>0?"right":"left":s>0?"bottom":"top";return{x:n.x+o*c,y:n.y+s*c,side:a}}function Ht(r){let t=[];for(let n of r){let o=t[t.length-1];o&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01||t.push({x:n.x,y:n.y})}for(let n=t.length-2;n>=1;n--){let o=t[n-1],s=t[n],e=t[n+1],i=(s.x-o.x)*(e.y-s.y)-(s.y-o.y)*(e.x-s.x),c=(s.x-o.x)*(e.x-s.x)+(s.y-o.y)*(e.y-s.y);Math.abs(i)<.01&&c>=0&&t.splice(n,1)}return t}function cn(r){let t=0;for(let n=1;n<r.length;n++)t+=Math.hypot(r[n].x-r[n-1].x,r[n].y-r[n-1].y);return t}function Xt(r,t){if(r.length===0)return[];if(r.length===1)return Array.from({length:t},()=>({...r[0]}));let n=cn(r)||1,o=[],s=0,e=0;for(let i=0;i<t;i++){let c=n*i/(t-1);for(;s<r.length-2;){let p=Math.hypot(r[s+1].x-r[s].x,r[s+1].y-r[s].y);if(e+p>=c)break;e+=p,s++}let a=r[s],d=r[s+1],l=Math.hypot(d.x-a.x,d.y-a.y)||1,u=Math.min(1,Math.max(0,(c-e)/l));o.push({x:a.x+(d.x-a.x)*u,y:a.y+(d.y-a.y)*u})}return o}var Me=(r,t,n)=>{switch(r){case"BT":return{x:t,y:-n};case"LR":return{x:n,y:t};case"RL":return{x:-n,y:t};default:return{x:t,y:n}}},Ft=(r,t,n)=>{switch(r){case"BT":return{x:t,y:-n};case"LR":return{x:n,y:t};case"RL":return{x:n,y:-t};default:return{x:t,y:n}}};function gt(r,t={}){return r.nodes.some(n=>n.group)?dn(r,t):Gt(r,t)}function be(r,t,n){let o=new Set(t.map(e=>e.id)),s=t.map(e=>({...e,group:null,constraints:n?e.constraints:{...e.constraints,pinned:!1}}));return{options:r.options,nodes:s,nodeById:new Map(s.map(e=>[e.id,e])),edges:r.edges.filter(e=>o.has(e.source)&&o.has(e.target)),groups:[],groupById:new Map,constraints:r.constraints.filter(e=>e.type==="sameRank"?e.nodes.every(i=>o.has(i)):o.has(e.a)&&o.has(e.b)),warnings:[]}}function dn(r,t){let n=ke(r,t.hints||null,t.hints||null),o=new Map,s=i=>({x:i.x+i.width/2,y:i.y+i.height/2});for(let i of r.nodes){let c=n.nodes.get(i.id);if(!i.group){o.set(i.id,s(c));continue}let a=0,d=0,l=0;for(let u of r.edges){let p=u.source===i.id?u.target:u.target===i.id?u.source:null;if(p==null||r.nodeById.get(p).group===i.group)continue;let f=s(n.nodes.get(p));a+=f.x,d+=f.y,l++}o.set(i.id,l?{x:a/l,y:d/l}:s(c))}let e=ke(r,o,t.hints||o);return e.crossingsRouted<=n.crossingsRouted?e:n}function ke(r,t,n){let o=r.options,s=o.groupPadding,e=o.groupLabelHeight,i=new Map;for(let h of r.nodes)h.group&&(i.has(h.group)||i.set(h.group,[]),i.get(h.group).push(h));let c=new Map,a=[];for(let[h,g]of i){let w=Gt(be(r,g,!1),{hints:t}),x=w.bounds,M="\0group:"+h;c.set(h,{sub:w,b:x,blockId:M}),a.push({id:M,index:-1,label:h,width:x.width+2*s,height:x.height+2*s+e,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let d=h=>{let g=r.nodeById.get(h);return g.group?c.get(g.group).blockId:h},l=be(r,r.nodes.filter(h=>!h.group),!0);l.nodes.push(...a);for(let h of a)l.nodeById.set(h.id,h);l.edges=[];for(let h of r.edges){let g=d(h.source),w=d(h.target);g===w&&(h.source!==h.target||g!==h.source)||l.edges.push({...h,source:g,target:w,sourcePort:g===h.source?h.sourcePort:null,targetPort:w===h.target?h.targetPort:null})}let u=null;if(n){u=new Map(n);for(let[h,g]of i){let w=0,x=0,M=0;for(let m of g){let y=n.get(m.id);y&&(w+=y.x,x+=y.y,M++)}M&&u.set(c.get(h).blockId,{x:w/M,y:x/M})}}let p=Gt(l,{hints:u}),f={nodes:new Map,edges:new Map,groups:new Map,crossings:p.crossings,warnings:p.warnings};for(let h of r.nodes)h.group||f.nodes.set(h.id,p.nodes.get(h.id));for(let[,{sub:h,b:g,blockId:w}]of c){let x=p.nodes.get(w),M=x.x+s-g.x,m=x.y+s+e-g.y;for(let[y,b]of h.nodes)f.nodes.set(y,{...b,x:b.x+M,y:b.y+m});for(let[y,b]of h.edges)f.edges.set(y,{...b,waypoints:b.waypoints.map(k=>({x:k.x+M,y:k.y+m}))});f.crossings+=h.crossings}for(let h of r.edges){if(f.edges.has(h.id))continue;let g=p.edges.get(h.id),w=d(h.source)!==h.source||d(h.target)!==h.target;f.edges.set(h.id,g?{...g,waypoints:w?[]:g.waypoints}:{waypoints:[],reversed:!1,selfLoop:h.source===h.target,flat:!1})}for(let h of r.nodes)if(h.group&&h.constraints.pinned){let g=f.nodes.get(h.id);g.x=h.constraints.x,g.y=h.constraints.y}if(yt(r,f),!r.nodes.some(h=>h.constraints.pinned)){let h=pt(f);ve(f,-h.x,-h.y);for(let g of f.groups.values())g.x-=h.x,g.y-=h.y}return f.bounds=pt(f),f.crossingsRouted=hn(r,f),f}function hn(r,t){let n=[];for(let e of r.edges){if(e.source===e.target)continue;let i=t.nodes.get(e.source),c=t.nodes.get(e.target);n.push([e.source,e.target,i.x+i.width/2,i.y+i.height/2,c.x+c.width/2,c.y+c.height/2])}let o=0,s=(e,i,c,a,d,l)=>(c-e)*(l-i)-(a-i)*(d-e);for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let c=n[e],a=n[i];if(c[0]===a[0]||c[0]===a[1]||c[1]===a[0]||c[1]===a[1])continue;let d=s(a[2],a[3],a[4],a[5],c[2],c[3]),l=s(a[2],a[3],a[4],a[5],c[4],c[5]),u=s(c[2],c[3],c[4],c[5],a[2],a[3]),p=s(c[2],c[3],c[4],c[5],a[4],a[5]);d*l<0&&u*p<0&&o++}return o}function Gt(r,t={}){let n=r.options,o=n.direction,s=o==="LR"||o==="RL",e=[],i=new Map;for(let p of r.nodes){let f=dt(p),h=new Map;for(let[x,M]of f)h.set(x,(s?M.py:M.px)-.5);let g=null,w=null;if(p.constraints.pinned){let x=Ft(o,p.constraints.x+p.width/2,p.constraints.y+p.height/2);g=x.x,w=x.y}i.set(p.id,{iw:s?p.height:p.width,ih:s?p.width:p.height,frac:h,pinX:g,pinY:w})}let c=fn(r),a={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:e},d=[];for(let p of c){let f=p.nodes,h=new Set(f),g=r.edges.filter(v=>h.has(v.source)),w=new Map;for(let v of f){let A=r.nodeById.get(v).constraints.rank;A!=null&&w.set(v,A)}let x=r.constraints.filter(v=>v.type==="sameRank").map(v=>v.nodes.filter(A=>h.has(A))).filter(v=>v.length>1),M=le(f,g,{fixedRank:w,sameRank:x});e.push(...M.warnings);let m=f.map(v=>{let A=r.nodeById.get(v),C=i.get(v);return{id:v,rank:M.rank.get(v),width:C.iw,height:C.ih,group:A.group,pinX:C.pinX}}),y=[];for(let v of g){if(M.selfLoops.has(v.id)||M.flat.has(v.id))continue;let A=M.reversed.has(v.id),C=v.sourcePort?i.get(v.source).frac.get(v.sourcePort)??0:0,Y=v.targetPort?i.get(v.target).frac.get(v.targetPort)??0:0;y.push(A?{id:v.id,v:v.target,w:v.source,vOff:Y,wOff:C,weight:v.weight}:{id:v.id,v:v.source,w:v.target,vOff:C,wOff:Y,weight:v.weight})}let b=ue(m,y,0),k;t.hints&&t.hints.size&&(k=ln(b,t.hints,o));let S=r.constraints.filter(v=>v.type==="leftOf"&&h.has(v.a)&&h.has(v.b)).map(v=>[v.a,v.b]),_=pe(b,{maxIterations:n.maxIterations,leftOf:S,initial:k});a.crossings+=_.crossings;let I=ye(b,_.layers,{nodeSpacing:n.nodeSpacing,edgeSpacing:n.edgeSpacing,rankSpacing:n.rankSpacing,groupPadding:n.groupPadding,groupLabelHeight:n.groupLabelHeight,labelOnOrderAxis:s,labelAtRankEnd:o==="BT"||o==="RL"?!s:!1}),$=f.filter(v=>i.get(v).pinY!=null);if($.length){let v=0;for(let A of $)v+=i.get(A).pinY-I.y[b.index.get(A)];v/=$.length;for(let A=0;A<I.y.length;A++)I.y[A]+=v;for(let A of $){let C=b.index.get(A);I.x[C]=i.get(A).pinX,I.y[C]=i.get(A).pinY}}let B=1/0,H=-1/0;for(let v=0;v<b.v.length;v++){let A=b.v[v].width/2;B=Math.min(B,I.x[v]-A),H=Math.max(H,I.x[v]+A)}d.push({comp:p,g:b,co:I,rk:M,layers:_.layers,minX:B,maxX:H,pinned:$.length>0})}if(t.hints&&t.hints.size){let p=h=>{let g=0,w=0;for(let x of h.comp.nodes){let M=t.hints.get(x);M&&(g+=Ft(o,M.x,M.y).x,w++)}return w?g/w:1/0},f=new Map(d.map(h=>[h,p(h)]));d.sort((h,g)=>f.get(h)-f.get(g))}let l=-1/0;for(let p of d)p.pinned&&(l=Math.max(l,p.maxX+n.componentSpacing));l===-1/0&&(l=0);for(let p of d){if(p.pinned)continue;let f=l-p.minX;for(let h=0;h<p.co.x.length;h++)p.co.x[h]+=f;l+=p.maxX-p.minX+n.componentSpacing}for(let p of d){let{g:f,co:h,rk:g}=p;p.layers.forEach((w,x)=>w.forEach((M,m)=>{let y=f.v[M];if(!y.real)return;let b=r.nodeById.get(y.id),k=Me(o,h.x[M],h.y[M]);a.nodes.set(y.id,{x:k.x-b.width/2,y:k.y-b.height/2,width:b.width,height:b.height,rank:x,order:m})}));for(let w of r.edges){if(!p.comp.set.has(w.source))continue;let M=(f.chains.get(w.id)||[]).map(y=>Me(o,h.x[y],h.y[y])),m=g.reversed.has(w.id);m&&(M=M.reverse()),a.edges.set(w.id,{waypoints:M,reversed:m,selfLoop:g.selfLoops.has(w.id),flat:g.flat.has(w.id)})}}if(!d.some(p=>p.pinned)){let p=1/0,f=1/0;for(let g of a.nodes.values())p=Math.min(p,g.x),f=Math.min(f,g.y);let h=r.groups.length?n.groupPadding+n.groupLabelHeight:0;Number.isFinite(p)&&ve(a,-p+h,-f+h)}return yt(r,a),a.bounds=pt(a),a}function ve(r,t,n){for(let o of r.nodes.values())o.x+=t,o.y+=n;for(let o of r.edges.values())for(let s of o.waypoints)s.x+=t,s.y+=n}function yt(r,t){let n=r.options;t.groups=new Map;for(let o of r.groups){let s=1/0,e=1/0,i=-1/0,c=-1/0;for(let d of r.nodes){if(d.group!==o.id)continue;let l=t.nodes.get(d.id);l&&(s=Math.min(s,l.x),e=Math.min(e,l.y),i=Math.max(i,l.x+l.width),c=Math.max(c,l.y+l.height))}if(!Number.isFinite(s))continue;let a=n.groupPadding;t.groups.set(o.id,{x:s-a,y:e-a-n.groupLabelHeight,width:i-s+2*a,height:c-e+2*a+n.groupLabelHeight})}return t.groups}function pt(r){let t=1/0,n=1/0,o=-1/0,s=-1/0,e=i=>{t=Math.min(t,i.x),n=Math.min(n,i.y),o=Math.max(o,i.x+i.width),s=Math.max(s,i.y+i.height)};for(let i of r.nodes.values())e(i);for(let i of r.groups.values())e(i);return Number.isFinite(t)?{x:t,y:n,width:o-t,height:s-n}:{x:0,y:0,width:0,height:0}}function ln(r,t,n){let o=zt(r),s=new Float64Array(r.v.length).fill(NaN);r.v.forEach((e,i)=>{if(e.real&&t.has(e.id)){let c=t.get(e.id);s[i]=Ft(n,c.x,c.y).x}});for(let[,e]of r.chains){if(!e.length)continue;let i=r.v[e[0]].up[0]?.n,c=r.v[e[e.length-1]].down[0]?.n;i==null||c==null||Number.isNaN(s[i])||Number.isNaN(s[c])||e.forEach((a,d)=>{s[a]=s[i]+(s[c]-s[i])*(d+1)/(e.length+1)})}return o.map(e=>{let i=new Map(e.map((c,a)=>[c,a]));return e.slice().sort((c,a)=>{let d=s[c],l=s[a];return Number.isNaN(d)&&Number.isNaN(l)?i.get(c)-i.get(a):Number.isNaN(d)?1:Number.isNaN(l)?-1:d-l})})}function fn(r){let t=new Map(r.nodes.map(i=>[i.id,i.id])),n=i=>{for(;t.get(i)!==i;)t.set(i,t.get(t.get(i))),i=t.get(i);return i},o=(i,c)=>{let a=n(i),d=n(c);a!==d&&t.set(d,a)};for(let i of r.edges)o(i.source,i.target);let s=new Map;for(let i of r.nodes)i.group&&(s.has(i.group)?o(s.get(i.group),i.id):s.set(i.group,i.id));for(let i of r.constraints)if(i.type==="leftOf"&&o(i.a,i.b),i.type==="sameRank")for(let c of i.nodes)o(i.nodes[0],c);let e=new Map;for(let i of r.nodes){let c=n(i.id);e.has(c)||e.set(c,[]),e.get(c).push(i.id)}return[...e.values()].map(i=>({nodes:i,set:new Set(i)}))}function Se(r,t,n,o){let s=o==="LR"||o==="RL",e=[...r.nodes.entries()],i=(c,a)=>c.x<a.x+a.width+n&&a.x<c.x+c.width+n&&c.y<a.y+a.height+n&&a.y<c.y+c.height+n;for(let[c,a]of e)if(!t.has(c))for(let d=0;d<200;d++){let l=e.find(([p,f])=>p!==c&&i(a,f));if(!l)break;let u=l[1];s?a.y=u.y+u.height+n:a.x=u.x+u.width+n}}function un(r,t,n){let o=me(n),s=tt(r),e=tt(t),i=e.x-s.x,c=e.y-s.y,a=Math.abs(i)-(r.width+t.width)/2,d=Math.abs(c)-(r.height+t.height)/2,l=o.x!==0?i*o.x:c*o.y,u=o.x!==0?a:d;return l>0&&u>4?[o.exit,o.entry]:a>=d?i>=0?["right","left"]:["left","right"]:c>=0?["bottom","top"]:["top","bottom"]}function Ee(r,t){let n=r.options.direction,o=new Map,s=new Map;for(let a of r.nodes){let d=t.get(a.id);if(!d)continue;let l=dt(a),u=new Map;for(let[p,f]of l)u.set(p,{x:d.x+f.px*d.width,y:d.y+f.py*d.height,side:f.side,t:f.t});s.set(a.id,u)}let e=new Map,i=new Map;for(let a of r.edges){let d=t.get(a.source),l=t.get(a.target);if(!d||!l)continue;if(a.source===a.target){let g=s.get(a.source),w=a.sourcePort&&g.get(a.sourcePort),x=a.targetPort&&g.get(a.targetPort),M=Math.min(20,d.width/4,d.height/4);o.set(a.id,{source:w&&w.side?{x:w.x,y:w.y,side:w.side}:{x:d.x+d.width-M,y:d.y,side:"top"},target:x&&x.side?{x:x.x,y:x.y,side:x.side}:{x:d.x+d.width,y:d.y+M,side:"right"}});continue}let[u,p]=un(d,l,n),f=a.sourcePort&&s.get(a.source).get(a.sourcePort),h=a.targetPort&&s.get(a.target).get(a.targetPort);f&&f.side&&(u=f.side),h&&h.side&&(p=h.side),i.set(a.id,[u,p]),f||Le(e,a.source+"|"+u,{edgeId:a.id,end:"source",other:a.target}),h||Le(e,a.target+"|"+p,{edgeId:a.id,end:"target",other:a.source}),o.set(a.id,{source:f?{x:f.x,y:f.y,side:f.side}:null,target:h?{x:h.x,y:h.y,side:h.side}:null})}for(let a=0;a<2;a++)for(let[d,l]of e){let[u,p]=d.split("|"),f=t.get(u),h=p==="top"||p==="bottom",g=x=>{let M=o.get(x.edgeId),m=x.end==="source"?M.target:M.source;if(a>0&&m)return h?m.x:m.y;let y=tt(t.get(x.other));return h?y.x:y.y};l.sort((x,M)=>g(x)-g(M)||(x.edgeId<M.edgeId?-1:1));let w=[...s.get(u)?.values()||[]].filter(x=>x.side===p).map(x=>x.t);l.forEach((x,M)=>{let m=(M+1)/(l.length+1);for(let b of w)Math.abs(b-m)<.06&&(m=Math.min(.95,m+.1));let y=h?{x:f.x+m*f.width,y:p==="top"?f.y:f.y+f.height,side:p}:{x:p==="left"?f.x:f.x+f.width,y:f.y+m*f.height,side:p};o.get(x.edgeId)[x.end]=y})}let c=a=>{a&&(a.x=Math.round(a.x*100)/100,a.y=Math.round(a.y*100)/100)};for(let a of o.values())c(a.source),c(a.target);return{ends:o,ports:s,sides:i}}function Le(r,t,n){r.has(t)||r.set(t,[]),r.get(t).push(n)}function Ne(r,t,n){let o=n.spacing,s={h:new Map,v:new Map},e=new Map;for(let[u,p]of r)e.set(u,p.points.map(f=>({x:f.x,y:f.y})));for(let[u,p]of r){if(p.kind!=="orthogonal")continue;let f=p.points;for(let h=0;h<f.length-1;h++){if(n.fixedEnds!==!1&&(h===0||h===f.length-2))continue;let g=f[h],w=f[h+1],x=Math.abs(g.x-w.x)<.01,M=Math.abs(g.y-w.y)<.01;if(!x&&!M)continue;let m=x?g.x:g.y,y=x?Math.min(g.y,w.y):Math.min(g.x,w.x),b=x?Math.max(g.y,w.y):Math.max(g.x,w.x);if(b-y<.5)continue;let k=x?g.y<=w.y:g.x<=w.x,S=f[h-1],_=f[h+2],I=(C,Y)=>C?Math.sign(x?C.x-Y.x:C.y-Y.y):0,$=I(S,g),B=I(_,w),H={id:u,i:h,c:m,lo:y,hi:b,vertical:x,loIsA:k,pts:e.get(u),dirLo:k?$:B,dirHi:k?B:$},v=Math.round(m*100),A=x?s.v:s.h;A.has(v)||A.set(v,[]),A.get(v).push(H)}}let i=[...s.v.values()].flat(),c=[...s.h.values()].flat(),a=[];for(let u of[!0,!1])for(let p of(u?s.v:s.h).values()){if(p.length<2)continue;p.sort((w,x)=>w.lo-x.lo);let f=[p[0]],h=p[0].hi,g=()=>{f.length>1&&d(f,u)};for(let w=1;w<p.length;w++){let x=p[w];x.lo<h-.5?(f.push(x),h=Math.max(h,x.hi)):(g(),f=[x],h=x.hi)}g()}function d(u,p){if(new Set(u.map(k=>k.id)).size<2)return;let f=[];for(let k of u){let S=f.length;for(;S>0&&yn(k,f[S-1])<0;)S--;f.splice(S,0,k)}let h=u[0].c,g=Math.min(...u.map(k=>k.lo)),w=Math.max(...u.map(k=>k.hi)),x=1/0,M=1/0;for(let k of t.values()){let S=p?k.y:k.x;if((p?k.y+k.height:k.x+k.width)<=g||S>=w)continue;let I=p?k.x:k.y,$=p?k.x+k.width:k.y+k.height;$<=h+.01?x=Math.min(x,h-$):I>=h-.01&&(M=Math.min(M,I-h))}for(let k of p?i:c){if(k.c===h||k.hi<=g||k.lo>=w)continue;let S=Math.abs(k.c-h)/2;k.c<h?x=Math.min(x,S+4):M=Math.min(M,S+4)}let m=f.length,y=Math.max(0,Math.min(x,M)-4),b=Math.min(o,m>1?2*y/(m-1):o);f.forEach((k,S)=>{let _=(S-(m-1)/2)*b;Math.abs(_)>.01&&a.push([k.id,k.i,p,_])})}let l=new Map;for(let[u,p,f,h]of a)l.has(u)||l.set(u,new Map),l.get(u).set(p,f?{x:h,y:0}:{x:0,y:h});for(let[u,p]of l){let f=r.get(u),h=f.points,g=[],w={x:0,y:0};for(let x=0;x<h.length;x++){let M=x>0&&p.get(x-1)||w,m=x<h.length-1&&p.get(x)||w,y=x>0&&x<h.length-1&&pn(h[x-1],h[x],h[x+1]);y&&(M.x!==m.x||M.y!==m.y)?(g.push({x:h[x].x+M.x,y:h[x].y+M.y}),g.push({x:h[x].x+m.x,y:h[x].y+m.y})):g.push({x:h[x].x+M.x+(y?0:m.x),y:h[x].y+M.y+(y?0:m.y)})}f.points=gn(g)}}function pn(r,t,n){return Math.abs(r.x-t.x)<.01&&Math.abs(t.x-n.x)<.01||Math.abs(r.y-t.y)<.01&&Math.abs(t.y-n.y)<.01}function gn(r){let t=[];for(let n of r){let o=t[t.length-1];o&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01||t.push(n)}return t}function yn(r,t){return Ae(r,t,!0)||Ae(r,t,!1)||xn(r,t)}function _e(r,t){let{pts:n,i:o,loIsA:s}=r,e=[];if(t?!s:s)for(let c=o+1;c<n.length;c++)e.push(n[c]);else for(let c=o;c>=0;c--)e.push(n[c]);return e}var mn=(r,t)=>r.x*t.y-r.y*t.x,Ie=(r,t)=>{let n=t.x-r.x,o=t.y-r.y,s=Math.hypot(n,o)||1;return{x:n/s,y:o/s}};function Ae(r,t,n){let o=r.vertical,s=_e(r,n),e=_e(t,n),i=n?Math.max(r.lo,t.lo):Math.min(r.hi,t.hi),c=o?{x:r.c,y:i}:{x:i,y:r.c},a=o?{x:0,y:n?-1:1}:{x:n?-1:1,y:0},d=a,l=0,u=0,p=(h,g)=>{if(h===g)return 0;let w={x:a.y,y:-a.x},x=o?w.x:w.y;return(h<g?x<0:x>0)?-1:1},f=(h,g)=>g+1<h.length?Math.sign(Math.round(mn(d,Ie(h[g],h[g+1]))*1e3)):null;for(let h=0;h<64;h++){let g=l<s.length?(s[l].x-c.x)*d.x+(s[l].y-c.y)*d.y:1/0,w=u<e.length?(e[u].x-c.x)*d.x+(e[u].y-c.y)*d.y:1/0;if(g===1/0&&w===1/0)return 0;if(Math.abs(g-w)<.5){let M=f(s,l),m=f(e,u);if(M===null||m===null)return M===null&&m===null?0:p(M??0,m??0);if(M!==m)return p(M,m);c=s[l],d=Ie(s[l],s[l+1]),l++,u++;continue}if(g<w){let M=f(s,l);return M?p(M,0):0}let x=f(e,u);return x?p(0,x):0}return 0}var xn=(r,t)=>r.id<t.id?-1:r.id>t.id?1:r.i-t.i;function jt(r,t,n=4){let o=[],s=new Map(t.map((a,d)=>[a,d]));for(let a of t){let d=r.get(a).points;for(let l=0;l<d.length-1;l++){let u=d[l],p=d[l+1];Math.abs(u.x-p.x)<.01&&Math.abs(u.y-p.y)>.01&&o.push([s.get(a),u.x,Math.min(u.y,p.y),Math.max(u.y,p.y)])}}let e=64,i=new Map;for(let a of o){let d=Math.floor(a[1]/e);i.has(d)||i.set(d,[]),i.get(d).push(a)}let c=new Map;for(let a of t){let d=s.get(a),l=r.get(a).points,u=[];for(let p=0;p<l.length-1;p++){let f=l[p],h=l[p+1];if(Math.abs(f.y-h.y)>.01)continue;let g=Math.min(f.x,h.x)+n*2,w=Math.max(f.x,h.x)-n*2;if(!(w<=g))for(let x=Math.floor(g/e);x<=Math.floor(w/e);x++)for(let M of i.get(x)||[])M[0]>=d||M[1]<=g||M[1]>=w||f.y<=M[2]+n||f.y>=M[3]-n||u.push({seg:p,x:M[1],y:f.y})}u.length&&c.set(a,u)}return c}var Dt=1,wn=[1,-1,0,0],Mn=[0,0,1,-1],Yt=[1,0,3,2],Oe=r=>r.x>0?0:r.x<0?1:r.y>0?2:3;function ot(r,t,n={}){let o=r.options,s=t.nodes,e=o.edgeRouting,{ends:i,ports:c}=Ee(r,s),a=new Map,d=new Map,l=n.only||null,u=n.prev||null;if(e==="orthogonal")bn(r,s,i,o,l,u,a,d),Ne(a,s,{spacing:o.edgeSpacing,fixedEnds:!0});else for(let h of r.edges){let g=s.get(h.source),w=s.get(h.target);if(!g||!w)continue;if(h.source===h.target){a.set(h.id,Pe(g,o,i.get(h.id)));continue}let x=t.edges.get(h.id),M=x&&x.waypoints||[],m=i.get(h.id),y,b;e==="curved"||h.sourcePort?y=m.source:y=Tt(g,M[0]||tt(w)),e==="curved"||h.targetPort?b=m.target:b=Tt(w,M[M.length-1]||tt(g)),a.set(h.id,{points:[y,...M.map(k=>({...k})),b],kind:e,sourceSide:y.side,targetSide:b.side})}let p=r.edges.map(h=>h.id).filter(h=>a.has(h)),f=o.lineHops&&e==="orthogonal"?jt(a,p,o.hopRadius):new Map;for(let[h,g]of a)g.hops=f.get(h)||[];return{paths:a,raw:d,ports:c,mode:e}}function Pe(r,t,n){let o=Math.max(t.nodeMargin*1.5,16),s=n.source,e=n.target,i=W[s.side],c=W[e.side],a={x:s.x+i.x*o,y:s.y+i.y*o},d={x:e.x+c.x*o,y:e.y+c.y*o},l;if(s.side===e.side)l=s.side==="left"||s.side==="right"?[a,{x:a.x,y:d.y}]:[a,{x:d.x,y:a.y}];else if((s.side==="top"||s.side==="bottom")!=(e.side==="top"||e.side==="bottom"))l=s.side==="top"||s.side==="bottom"?[a,{x:d.x,y:a.y}]:[a,{x:a.x,y:d.y}];else{let u=s.side==="top"||s.side==="bottom",p=u?r.x+r.width+o:r.y+r.height+o;l=u?[a,{x:p,y:a.y},{x:p,y:d.y}]:[a,{x:a.x,y:p},{x:d.x,y:p}]}return{points:Ht([s,...l,d,e]),kind:"orthogonal",sourceSide:s.side,targetSide:e.side,selfLoop:!0}}function bn(r,t,n,o,s,e,i,c){let a=o.nodeMargin,d=[];for(let[h,g]of t)d.push({id:h,...xe(g,a)});let l=new Map;for(let h of r.edges){let g=n.get(h.id);if(!g||!g.source||!g.target)continue;let w=W[g.source.side],x=W[g.target.side];l.set(h.id,{s:{x:g.source.x+w.x*a,y:g.source.y+w.y*a},t:{x:g.target.x+x.x*a,y:g.target.y+x.y*a},sDir:Oe(w),tNeed:Yt[Oe(x)]})}let u=vn(d,l,a);for(let h of r.edges)if(s&&!s.has(h.id)&&e&&e.raw.has(h.id)){let g=e.raw.get(h.id);c.set(h.id,g),u.markPath(g);let w=e.paths.get(h.id);w&&i.set(h.id,{...w,points:g.map(x=>({...x}))})}let p=r.edges.filter(h=>!i.has(h.id)&&t.has(h.source)&&t.has(h.target)),f=h=>{let g=l.get(h.id);return g?Math.abs(g.s.x-g.t.x)+Math.abs(g.s.y-g.t.y):0};p.sort((h,g)=>f(h)-f(g));for(let h of p){if(h.source===h.target){let m=Pe(t.get(h.source),o,n.get(h.id));i.set(h.id,m),c.set(h.id,m.points);continue}let g=n.get(h.id),w=l.get(h.id),x=u.astar(w.s,w.sDir,w.t,w.tNeed,o);x||(x=kn(w.s,w.t,g.source.side,g.target.side));let M=[g.source,...Ht(x),g.target];u.markPath(M),c.set(h.id,M),i.set(h.id,{points:M.map(m=>({...m})),kind:"orthogonal",sourceSide:g.source.side,targetSide:g.target.side})}}function kn(r,t,n,o){let s=n==="top"||n==="bottom",e=o==="top"||o==="bottom";if(s&&e){let i=(r.y+t.y)/2;return[r,{x:r.x,y:i},{x:t.x,y:i},t]}if(!s&&!e){let i=(r.x+t.x)/2;return[r,{x:i,y:r.y},{x:i,y:t.y},t]}return s?[r,{x:r.x,y:t.y},t]:[r,{x:t.x,y:r.y},t]}function vn(r,t,n){let o=new Set,s=new Set,e=L=>Math.round(L*100)/100,i=1/0,c=1/0,a=-1/0,d=-1/0;for(let L of r)o.add(e(L.x)),o.add(e(L.x+L.width)),s.add(e(L.y)),s.add(e(L.y+L.height)),i=Math.min(i,L.x),c=Math.min(c,L.y),a=Math.max(a,L.x+L.width),d=Math.max(d,L.y+L.height);for(let L of t.values())for(let E of[L.s,L.t])o.add(e(E.x)),s.add(e(E.y)),i=Math.min(i,E.x),c=Math.min(c,E.y),a=Math.max(a,E.x),d=Math.max(d,E.y);o.add(e(i-2*n)),o.add(e(a+2*n)),s.add(e(c-2*n)),s.add(e(d+2*n));let l=L=>{let E=[...L].sort((P,Z)=>P-Z),N=[];for(let P=0;P<E.length;P++)N.push(E[P]),P+1<E.length&&E[P+1]-E[P]>4&&N.push(e((E[P]+E[P+1])/2));return N},u=l(o),p=l(s),f=u.length,h=p.length,g=f*h,w=new Map(u.map((L,E)=>[L,E])),x=new Map(p.map((L,E)=>[L,E])),M=120,m=new Map,y=(L,E)=>L*73856093^E*19349663;for(let L of r)for(let E=Math.floor(L.x/M);E<=Math.floor((L.x+L.width)/M);E++)for(let N=Math.floor(L.y/M);N<=Math.floor((L.y+L.height)/M);N++){let P=y(E,N);m.has(P)||m.set(P,[]),m.get(P).push(L)}let b=(L,E)=>{let N=m.get(y(Math.floor(L/M),Math.floor(E/M)));if(!N)return!1;for(let P of N)if(we(P,L,E,.01))return!0;return!1},k=g<=4e6?new Uint8Array(g):null,S=k?null:new Map,_=L=>{if(k){let N=k[L];return N||(N=b(u[L%f],p[L/f|0])?2:1,k[L]=N),N===2}let E=S.get(L);return E===void 0&&(E=b(u[L%f],p[L/f|0]),S.set(L,E)),E},I=new Uint8Array(g),$=new Uint8Array(g),B=(L,E)=>{let N=E?I:$,P=N[L];if(!P){let Z=L%f,U=L/f|0,z=E?(u[Z]+u[Z+1])/2:u[Z],F=E?p[U]:(p[U]+p[U+1])/2;P=b(z,F)?2:1,N[L]=P}return P===2},H=new Uint16Array(g),v=new Uint16Array(g),A=new Uint16Array(g),C=new Uint16Array(g),Y=L=>{let E=w.get(e(L.x)),N=x.get(e(L.y));return E==null||N==null?-1:N*f+E};function K(L){for(let E=0;E<L.length-1;E++){let N=L[E],P=L[E+1],Z=Math.abs(N.y-P.y)<.01,U=Math.abs(N.x-P.x)<.01;if(Z){let z=x.get(e(N.y)),F=w.get(e(N.x)),j=w.get(e(P.x));if(z==null||F==null||j==null)continue;let nt=Math.min(F,j),st=Math.max(F,j);for(let X=nt;X<=st;X++)H[z*f+X]++,X<st&&A[z*f+X]++}else if(U){let z=w.get(e(N.x)),F=x.get(e(N.y)),j=x.get(e(P.y));if(z==null||F==null||j==null)continue;let nt=Math.min(F,j),st=Math.max(F,j);for(let X=nt;X<=st;X++)v[X*f+z]++,X<st&&C[X*f+z]++}}}let et=g*4,V=et<=16e6,Qt=V?new Float64Array(et):null,te=V?new Int32Array(et):null,ee=V?new Uint32Array(et):null,Et=0;function Xe(L,E,N,P,Z){let U=Y(L),z=Y(N);if(U<0||z<0)return null;let F=u[z%f],j=p[z/f|0],nt=Z.bendPenalty,st=Z.crossingPenalty;Et++;let X=V?null:new Map,ne=V?null:new Map,se=V?R=>ee[R]===Et?Qt[R]:void 0:R=>X.get(R),oe=V?(R,G,J)=>{ee[R]=Et,Qt[R]=G,te[R]=J}:(R,G,J)=>{X.set(R,G),ne.set(R,J)},Fe=V?R=>te[R]:R=>ne.get(R),ht=new Zt,ie=U*4+E;oe(ie,0,-1),ht.push(ie,Dt*(Math.abs(u[U%f]-F)+Math.abs(p[U/f|0]-j)));let _t=1/0,It=-1,Ge=0,je=4e5;for(;ht.size;){let R=ht.peekKey(),G=ht.pop();if(R>=_t)break;let J=se(G),rt=G>>2,mt=G&3,Nt=rt%f,Ot=rt/f|0;if(!(R>J+Dt*(Math.abs(u[Nt]-F)+Math.abs(p[Ot]-j))+1e-6)){if(++Ge>je)break;if(rt===z){let T=mt===P?0:mt===Yt[P]?2*nt:nt;J+T<_t&&(_t=J+T,It=G);continue}for(let T=0;T<4;T++){if(T===Yt[mt])continue;let lt=Nt+wn[T],ft=Ot+Mn[T];if(lt<0||ft<0||lt>=f||ft>=h)continue;let q=ft*f+lt;if(q!==z&&_(q))continue;let ut=T<2;if(B(ut?T===0?rt:q:T===2?rt:q,ut))continue;let re=Math.abs(ut?u[lt]-u[Nt]:p[ft]-p[Ot]),xt=re;T!==mt&&(xt+=nt);let ae=T===0||T===2?rt:q,ce=ut?A[ae]:C[ae];ce&&(xt+=re*.25*ce),q!==z&&(ut?v[q]:H[q])&&(xt+=st);let Pt=q*4+T,$t=J+xt,de=se(Pt);(de===void 0||$t<de-1e-9)&&(oe(Pt,$t,G),ht.push(Pt,$t+Dt*(Math.abs(u[lt]-F)+Math.abs(p[ft]-j))))}}}if(It<0)return null;let At=[];for(let R=It;R!==-1&&R!==void 0;R=Fe(R)){let G=R>>2;At.push({x:u[G%f],y:p[G/f|0]})}return At.reverse(),At}return{astar:Xe,markPath:K,xs:u,ys:p,N:g}}var Zt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,n){let o=this.k,s=this.v,e=o.length;for(o.push(n),s.push(t);e>0;){let i=e-1>>1;if(o[i]<=n)break;o[e]=o[i],s[e]=s[i],e=i}o[e]=n,s[e]=t}peekKey(){return this.k[0]}pop(){let t=this.k,n=this.v,o=n[0],s=t.pop(),e=n.pop();if(t.length){let i=0,c=t.length;for(;;){let a=2*i+1;if(a>=c||(a+1<c&&t[a+1]<t[a]&&a++,t[a]>=s))break;t[i]=t[a],n[i]=n[a],i=a}t[i]=s,n[i]=e}return o}};function $e(r,t,n,o){if(!o)return 0;let s=r.options,e=(a,d)=>d.x>=a.x-1&&d.x<=a.x+a.width+1&&d.y>=a.y-1&&d.y<=a.y+a.height+1&&Math.min(Math.abs(d.x-a.x),Math.abs(d.x-a.x-a.width),Math.abs(d.y-a.y),Math.abs(d.y-a.y-a.height))<=1,i=(a,d)=>{let l={left:Math.abs(d.x-a.x),right:Math.abs(d.x-a.x-a.width),top:Math.abs(d.y-a.y),bottom:Math.abs(d.y-a.y-a.height)};return Object.keys(l).reduce((u,p)=>l[p]<l[u]?p:u)},c=0;for(let a of r.edges){let d=o[a.id],l=t.paths.get(a.id),u=n.get(a.source),p=n.get(a.target);if(!Array.isArray(d)||d.length<2||!l||!u||!p)continue;let f=d.map(g=>({x:+g[0],y:+g[1]}));if(f.some(g=>!Number.isFinite(g.x)||!Number.isFinite(g.y))||!e(u,f[0])||!e(p,f[f.length-1]))continue;let h=!0;for(let g=0;h&&g<f.length-1;g++){let w=f[g],x=f[g+1];t.mode==="orthogonal"&&Math.abs(w.x-x.x)>.5&&Math.abs(w.y-x.y)>.5&&(h=!1)}h&&(l.points=f,l.sourceSide=i(u,f[0]),l.targetSide=i(p,f[f.length-1]),t.raw&&t.raw.set(a.id,f.map(g=>({...g}))),c++)}if(c){let a=r.edges.map(l=>l.id).filter(l=>t.paths.has(l)),d=s.lineHops&&t.mode==="orthogonal"?jt(t.paths,a,s.hopRadius):new Map;for(let[l,u]of t.paths)u.hops=d.get(l)||[]}return c}var it="http://www.w3.org/2000/svg",Sn=0,Ut={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,n){this.id="fg"+ ++Sn,this.options=n,this.container=t,t.classList.add("fg-container");let o=this.viewport=D("div","fg-viewport");o.tabIndex=0,this.world=D("div","fg-world"),this.groupsLayer=D("div","fg-groups"),this.svg=document.createElementNS(it,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(it,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(it,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=D("div","fg-labels"),this.nodesLayer=D("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),o.appendChild(this.world),t.appendChild(o),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.transform={x:0,y:0,k:1}}destroy(){this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let n=new Set,o=new Map,s=[];for(let e of t){let i=String(e.id);n.add(i);let c=this.nodeEls.get(i),a=En(e);if(c||(c=D("div","fg-node"),c.dataset.id=i,this.nodesLayer.appendChild(c),this.nodeEls.set(i,c)),c._sig!==a){c._sig=a,c.className="fg-node"+(e.className?" "+e.className:"")+(e.type?" fg-node--"+e.type:""),c.innerHTML="";let u=this.options.renderNode?this.options.renderNode(e,c):void 0;if(typeof u=="string")c.innerHTML=u;else if(u instanceof Node)c.appendChild(u);else if(u===void 0)if(e.html!=null)c.innerHTML=e.html;else{let p=D("div","fg-node__label");p.textContent=e.label??i,c.appendChild(p)}c._measured=null}let d=typeof e.width=="number",l=typeof e.height=="number";c.style.width=d?e.width+"px":"",c.style.height=l?e.height+"px":"",(!d||!l)&&s.push([i,c,d?e.width:null,l?e.height:null])}for(let[e,i]of this.nodeEls)n.has(e)||(i.remove(),this.nodeEls.delete(e));for(let[,e]of s)e.classList.add("fg-node--measuring");for(let[e,i,c,a]of s)i._measured||(i._measured={width:Math.ceil(i.offsetWidth)||this.options.defaultNodeWidth,height:Math.ceil(i.offsetHeight)||this.options.defaultNodeHeight}),o.set(e,{width:c??i._measured.width,height:a??i._measured.height});for(let[,e]of s)e.classList.remove("fg-node--measuring");return o}renderPorts(t){for(let n of t.nodes){let o=this.nodeEls.get(n.id);if(!o)continue;let s=this.options.showPorts?JSON.stringify(n.ports.map(e=>[e.id,e.side,e.offset])):"";if(o._portSig!==s&&(o._portSig=s,o.querySelectorAll(":scope > .fg-port").forEach(e=>e.remove()),!!s))for(let[e,i]of dt(n)){let c=D("div","fg-port fg-port--"+i.side);c.dataset.port=e,c.style.left=i.px*100+"%",c.style.top=i.py*100+"%",o.appendChild(c)}}}placeNodes(t,n){for(let o of t.nodes){let s=this.nodeEls.get(o.id),e=n.get(o.id);!s||!e||(s.style.width=e.width+"px",s.style.height=e.height+"px",s.style.transform=`translate(${e.x}px, ${e.y}px)`,s.classList.toggle("fg-node--pinned",!!o.constraints.pinned))}}renderGroups(t,n){let o=new Set;for(let s of t.groups){let e=n.get(s.id);if(!e)continue;o.add(s.id);let i=this.groupEls.get(s.id);if(!i){i=D("div","fg-group"),i.dataset.id=s.id;let c=D("div","fg-group__label");i.appendChild(c),this.groupsLayer.appendChild(i),this.groupEls.set(s.id,i)}i.className="fg-group"+(s.className?" "+s.className:""),i.firstChild.textContent=s.label,i.firstChild.style.height=this.options.groupLabelHeight+"px",i.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(i.style,{transform:`translate(${e.x}px, ${e.y}px)`,width:e.width+"px",height:e.height+"px"})}for(let[s,e]of this.groupEls)o.has(s)||(e.remove(),this.groupEls.delete(s))}ensureMarker(t){if(!t||!Ut[t]||this.markersUsed.has(t))return;let n=document.createElementNS(it,"marker");n.setAttribute("id",`${this.id}-m-${t}`),n.setAttribute("viewBox","-10 -8 24 16"),n.setAttribute("refX","12"),n.setAttribute("refY","0"),n.setAttribute("markerWidth","24"),n.setAttribute("markerHeight","16"),n.setAttribute("markerUnits","userSpaceOnUse"),n.setAttribute("orient","auto-start-reverse"),n.setAttribute("class","fg-marker fg-marker--"+t),n.innerHTML=Ut[t],this.defs.appendChild(n),this.markersUsed.add(t)}renderEdges(t,n,o){let s=this.options,e=new Set;for(let i of t.edges){let c=n.paths.get(i.id);if(!c)continue;e.add(i.id);let a=this.edgeEls.get(i.id);if(!a){a=document.createElementNS(it,"g"),a.dataset.id=i.id;let f=document.createElementNS(it,"path");f.setAttribute("class","fg-edge__hit");let h=document.createElementNS(it,"path");h.setAttribute("class","fg-edge__line"),a.append(f,h),this.edgesGroup.appendChild(a),this.edgeEls.set(i.id,a)}a.setAttribute("class",`fg-edge fg-edge--${Ln(i.type)}${i.className?" "+i.className:""}`);let d=o?o.get(i.id):null,l=d?In(d):Wt(c,s.cornerRadius,s.lineHops?c.hops:[],s.hopRadius),[u,p]=a.childNodes;u.setAttribute("d",l),p.setAttribute("d",l);for(let[f,h]of[["marker-start",i.markerStart],["marker-end",i.markerEnd]])h&&Ut[h]?(this.ensureMarker(h),p.setAttribute(f,`url(#${this.id}-m-${h})`)):p.removeAttribute(f);this.renderLabel(i,o?null:c)}for(let[i,c]of this.edgeEls)e.has(i)||(c.remove(),this.edgeEls.delete(i),this.renderLabel({id:i,label:null},null));for(let i of t.edges){let c=this.edgeEls.get(i.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,n){let o=this.labelEls.get(t.id);if(t.label==null||t.label===""){o&&(o.remove(),this.labelEls.delete(t.id));return}if(o||(o=D("div","fg-edge-label"),o.dataset.id=t.id,this.labelsLayer.appendChild(o),this.labelEls.set(t.id,o)),o.textContent=t.label,!n){o.style.visibility="hidden";return}o.style.visibility="";let s=_n(n.points);o.style.transform=`translate(${s.x}px, ${s.y}px) translate(-50%, -50%)`}setTransform(t){this.transform=t,this.world.style.transform=`translate(${t.x}px, ${t.y}px) scale(${t.k})`}};function D(r,t){let n=document.createElement(r);return t&&(n.className=t),n}function Ln(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function En(r){return JSON.stringify([r.label,r.html,r.className,r.type,r.columns,r.data])}function _n(r){let t=0,n=0;for(let e=0;e<r.length-1;e++){let i=Math.hypot(r[e+1].x-r[e].x,r[e+1].y-r[e].y);i>t&&(t=i,n=e)}let o=r[n],s=r[n+1]||o;return{x:(o.x+s.x)/2,y:(o.y+s.y)/2}}var O=r=>Math.round(r*100)/100;function In(r){return r.map((t,n)=>(n?"L":"M")+O(t.x)+","+O(t.y)).join(" ")}function Wt(r,t=6,n=[],o=4){let s=r.points;if(!s||s.length<2)return"";if(r.kind==="curved")return An(r);let e=`M${O(s[0].x)},${O(s[0].y)}`,i=s.length,c=new Array(i).fill(0);for(let d=1;d<i-1;d++){let l=Math.hypot(s[d].x-s[d-1].x,s[d].y-s[d-1].y),u=Math.hypot(s[d+1].x-s[d].x,s[d+1].y-s[d].y);c[d]=Math.max(0,Math.min(t,l/2,u/2))}let a=new Map;for(let d of n||[])a.has(d.seg)||a.set(d.seg,[]),a.get(d.seg).push(d);for(let d=0;d<i-1;d++){let l=s[d],u=s[d+1],p=Math.hypot(u.x-l.x,u.y-l.y)||1,f=(u.x-l.x)/p,h=(u.y-l.y)/p,g=c[d+1],w=u.x-f*g,x=u.y-h*g,M=a.get(d);if(M&&Math.abs(h)<1e-6){let m=Math.sign(f),y=l.x+f*c[d];M.sort((b,k)=>(b.x-k.x)*m);for(let b of M)(b.x-y)*m<o+1||(w-b.x)*m<o+1||(e+=` L${O(b.x-m*o)},${O(l.y)} A${o},${o} 0 0 ${m>0?1:0} ${O(b.x+m*o)},${O(l.y)}`)}if(e+=` L${O(w)},${O(x)}`,d+1<i-1&&g>0){let m=s[d+2],y=Math.hypot(m.x-u.x,m.y-u.y)||1;e+=` Q${O(u.x)},${O(u.y)} ${O(u.x+(m.x-u.x)/y*g)},${O(u.y+(m.y-u.y)/y*g)}`}}return e}function An(r){let t=r.points,n=t[0],o=t[t.length-1],s=Math.hypot(o.x-n.x,o.y-n.y),e=Math.max(30,Math.min(160,s*.4));if(t.length===2){let p=W[r.sourceSide]||{x:0,y:0},f=W[r.targetSide]||{x:0,y:0};return`M${O(n.x)},${O(n.y)} C${O(n.x+p.x*e)},${O(n.y+p.y*e)} ${O(o.x+f.x*e)},${O(o.y+f.y*e)} ${O(o.x)},${O(o.y)}`}let i=W[r.sourceSide],c=W[r.targetSide],a=i?{x:n.x-i.x*40,y:n.y-i.y*40}:n,d=c?{x:o.x-c.x*40,y:o.y-c.y*40}:o,l=[a,...t,d],u=`M${O(n.x)},${O(n.y)}`;for(let p=1;p<l.length-2;p++){let f=l[p-1],h=l[p],g=l[p+1],w=l[p+2],x={x:h.x+(g.x-f.x)/6,y:h.y+(g.y-f.y)/6},M={x:g.x-(w.x-h.x)/6,y:g.y-(w.y-h.y)/6};u+=` C${O(x.x)},${O(x.y)} ${O(M.x)},${O(M.y)} ${O(g.x)},${O(g.y)}`}return u}function Re(r,t,n,o=28){let s=new Map;for(let[e,i]of t){let c=r&&r.get(e),a=Xt(i.points,o);if(!c){s.set(e,a);continue}let d=Xt(c.points,o);s.set(e,a.map((l,u)=>({x:d[u].x+(l.x-d[u].x)*n,y:d[u].y+(l.y-d[u].y)*n})))}return s}function Be(r){let t=r.renderer,n=t.viewport,o=()=>r.options,s=new Map,e=null,i=0,c=null,a=(y,b)=>{let k=n.getBoundingClientRect(),S=t.transform;return{x:(y-k.left-S.x)/S.k,y:(b-k.top-S.y)/S.k}},d=y=>{let b=y.target.closest&&y.target.closest(".fg-node");if(b&&t.nodesLayer.contains(b))return{kind:"node",id:b.dataset.id,el:b};let k=y.target.closest&&y.target.closest(".fg-edge");if(k)return{kind:"edge",id:k.dataset.id,el:k};let S=y.target.closest&&y.target.closest(".fg-edge-label");if(S)return{kind:"edge",id:S.dataset.id,el:S};let _=y.target.closest&&y.target.closest(".fg-group");return _?{kind:"group",id:_.dataset.id,el:_}:{kind:"background"}};function l(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(s.set(y.pointerId,{x:y.clientX,y:y.clientY}),n.setPointerCapture?.(y.pointerId),s.size===2&&o().zoomable){let[S,_]=[...s.values()];e={type:"pinch",dist:Math.hypot(S.x-_.x,S.y-_.y),k:t.transform.k,mid:{x:(S.x+_.x)/2,y:(S.y+_.y)/2}};return}let b=d(y),k={x:y.clientX,y:y.clientY};if(b.kind==="node"&&o().draggable){let S=r.positions.get(b.id),_=a(y.clientX,y.clientY);e={type:"drag",id:b.id,target:b,start:k,moved:!1,dx:_.x-S.x,dy:_.y-S.y}}else o().pannable?e={type:"pan",target:b,start:k,moved:!1,tx:t.transform.x,ty:t.transform.y}:e={type:"click",target:b,start:k,moved:!1}}function u(y){if(s.has(y.pointerId)&&s.set(y.pointerId,{x:y.clientX,y:y.clientY}),!e)return;if(e.type==="pinch"){if(s.size<2)return;let[k,S]=[...s.values()],_=Math.hypot(k.x-S.x,k.y-S.y);r.zoomAt(e.k*(_/e.dist),e.mid.x,e.mid.y,!0);return}let b=Math.hypot(y.clientX-e.start.x,y.clientY-e.start.y);if(!(!e.moved&&b<4)){if(e.moved||(e.moved=!0,e.type==="drag"&&(r._dragStart(e.id),n.classList.add("fg-dragging")),e.type==="pan"&&n.classList.add("fg-panning")),e.type==="pan")r.setTransform({x:e.tx+y.clientX-e.start.x,y:e.ty+y.clientY-e.start.y,k:t.transform.k});else if(e.type==="drag"){let k=a(y.clientX,y.clientY);c={id:e.id,x:k.x-e.dx,y:k.y-e.dy},i||(i=requestAnimationFrame(p))}}}function p(){if(i=0,c){let y=c;c=null,r._dragMove(y.id,y.x,y.y)}}function f(y){if(s.delete(y.pointerId),!e)return;let b=e;if(b.type==="pinch"){s.size===0&&(e=null);return}if(e=null,n.classList.remove("fg-dragging","fg-panning"),b.type==="drag"&&b.moved){i&&(cancelAnimationFrame(i),i=0,p()),r._dragEnd(b.id);return}!b.moved&&y.type==="pointerup"&&r._click(b.target,y)}function h(y){if(r._stopZoom(),!o().zoomable)return;y.preventDefault();let b=t.transform.k*Math.exp(-y.deltaY*(y.ctrlKey?.01:.0015));r.zoomAt(b,y.clientX,y.clientY,!0)}let g=null;function w(y){if(e&&e.moved)return;let b=d(y),k=b.kind==="node"||b.kind==="edge"?b.kind+":"+b.id:null;k!==g&&(g=k,r._hover(k?b:null))}function x(y){y.target.closest&&y.target.closest(".fg-controls, input, textarea, select, a")||r._contextMenu(d(y),y)}function M(){g&&(g=null,r._hover(null))}function m(y){y.key==="Escape"?r.select(null):(y.key==="+"||y.key==="=")&&o().zoomable?r.zoomBy(1.2):y.key==="-"&&o().zoomable?r.zoomBy(1/1.2):y.key==="0"&&r.fit()}return n.addEventListener("pointerdown",l),n.addEventListener("pointermove",u),n.addEventListener("pointerup",f),n.addEventListener("pointercancel",f),n.addEventListener("wheel",h,{passive:!1}),n.addEventListener("pointerover",w),n.addEventListener("contextmenu",x),n.addEventListener("pointerleave",M),n.addEventListener("keydown",m),()=>{n.removeEventListener("pointerdown",l),n.removeEventListener("pointermove",u),n.removeEventListener("pointerup",f),n.removeEventListener("pointercancel",f),n.removeEventListener("wheel",h),n.removeEventListener("pointerover",w),n.removeEventListener("contextmenu",x),n.removeEventListener("pointerleave",M),n.removeEventListener("keydown",m),i&&cancelAnimationFrame(i)}}function qt(r,t,n="chain"){let o=new Set,s=new Set,e=[],i=[];if(t.kind==="node")o.add(t.id),e=[t.id],i=[t.id];else{let l=r.find(u=>u.id===t.id);if(!l)return{nodes:o,edges:s};s.add(l.id),o.add(l.source),o.add(l.target),e=[l.source],i=[l.target]}let c=new Map,a=new Map;for(let l of r)c.has(l.target)||c.set(l.target,[]),a.has(l.source)||a.set(l.source,[]),c.get(l.target).push(l),a.get(l.source).push(l);let d=(l,u,p)=>{let f=new Set(l),h=[...l];for(;h.length;){let g=h.shift();for(let w of u.get(g)||[]){let x=p(w);s.add(w.id),o.add(x),n==="chain"&&!f.has(x)&&(f.add(x),h.push(x))}}};return(t.kind==="node"||n==="chain")&&(d(e,c,l=>l.source),d(i,a,l=>l.target)),{nodes:o,edges:s}}var Ce="1.1.0";var Kt={};he(Kt,{countCrossings:()=>On,countNodeOverlaps:()=>Pn,countOverlappingSegments:()=>$n});function Nn(r,t,n,o){let s=(d,l,u)=>(l.x-d.x)*(u.y-d.y)-(l.y-d.y)*(u.x-d.x),e=s(n,o,r),i=s(n,o,t),c=s(r,t,n),a=s(r,t,o);return(e>1e-9&&i<-1e-9||e<-1e-9&&i>1e-9)&&(c>1e-9&&a<-1e-9||c<-1e-9&&a>1e-9)}function On(r){let t=[...r.entries()].map(([o,s])=>[o,Array.isArray(s)?s:s.points]),n=0;for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let e=t[o][1],i=t[s][1];for(let c=0;c<e.length-1;c++)for(let a=0;a<i.length-1;a++)Nn(e[c],e[c+1],i[a],i[a+1])&&n++}return n}function Pn(r,t,n){let o=0;for(let[s,e]of r){let i=Array.isArray(e)?e:e.points,c=n.get(s);for(let[a,d]of t)if(!(c&&(a===c.source||a===c.target))){for(let l=0;l<i.length-1;l++)if(vt(i[l],i[l+1],d,1)){o++;break}}}return o}function $n(r){let t=[];for(let[s,e]of r){let i=Array.isArray(e)?e:e.points;for(let c=0;c<i.length-1;c++)t.push([s,i[c],i[c+1],c===0?i[0]:c===i.length-2?i[i.length-1]:null])}let n=(s,e)=>s&&e&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01,o=0;for(let s=0;s<t.length;s++)for(let e=s+1;e<t.length;e++){let[i,c,a,d]=t[s],[l,u,p,f]=t[e];if(i===l||n(d,f))continue;let h=Math.abs(c.y-a.y)<.01,g=Math.abs(u.y-p.y)<.01,w=Math.abs(c.x-a.x)<.01,x=Math.abs(u.x-p.x)<.01;if(h&&g&&Math.abs(c.y-u.y)<.5){let M=Math.max(Math.min(c.x,a.x),Math.min(u.x,p.x));Math.min(Math.max(c.x,a.x),Math.max(u.x,p.x))-M>1&&o++}else if(w&&x&&Math.abs(c.x-u.x)<.5){let M=Math.max(Math.min(c.y,a.y),Math.min(u.y,p.y));Math.min(Math.max(c.y,a.y),Math.max(u.y,p.y))-M>1&&o++}}return o}function Rn(r,t){let n=bt(r,t),o=gt(n),s=ot(n,o);return{model:n,layout:o,routing:s}}function Bn(r,t,n={}){return new Lt(r,t,n)}var Cn=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],Vt=r=>{let t={};for(let n of Cn)r[n]!==void 0&&(t[n]=r[n]);return t},ze=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,Lt=class{constructor(t,n,o={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=n||{nodes:[],edges:[]},this.userOptions={...o},this.options=Mt(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._listeners=new Map,this._anim=0,this._hl=[],this.options.controls&&this._controls(),this._detach=Be(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:n=!1}={}){return this._build({mode:"relayout",animate:t,fresh:n})}updateGraph(t,{mode:n="stable",animate:o=this.options.animate}={}){this.data=t;let s=new Set((t.nodes||[]).map(e=>String(e.id)));for(let e of[...this.pins.keys()])s.has(e)||this.pins.delete(e);for(let e of[...this.positions.keys()])s.has(e)||this.positions.delete(e);return this._build({mode:n,animate:o})}setOptions(t,{relayout:n=!0}={}){return Object.assign(this.userOptions,t),this.options=Mt(this.data.options,this.userOptions),this.renderer.options=this.options,n?this.relayout({fresh:"direction"in t}):this._reroute()}exportState(){let t={};for(let[o,s]of this.positions)t[o]={x:Te(s.x),y:Te(s.y),pinned:!!this.pins.get(o)};let n={};if(this.routing)for(let[o,s]of this.routing.paths)n[o]=s.points.map(e=>[He(e.x),He(e.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:n,transform:{...this.renderer.transform}}}importState(t,{animate:n=this.options.animate,transform:o=!0}={}){if(!t||!t.nodes)return Promise.resolve(this);let s=this._snapshot();for(let[e,i]of Object.entries(t.nodes)){let c=this.positions.get(e);c&&(c.x=i.x,c.y=i.y,i.pinned?this.pins.set(e,{x:i.x,y:i.y}):this.pins.delete(e))}this.model=this._prepareModel();for(let e of this.layoutEdges.values())e.waypoints=[];return this.routing=ot(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&$e(this.model,this.routing,this.positions,t.edges),this._present(s,n),o&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,n=!0){let o=this.positions.get(t);if(!o)return;n?this.pins.set(t,{x:o.x,y:o.y}):this.pins.delete(t);let s=this.model.nodeById.get(t);s&&Object.assign(s.constraints,{pinned:n,x:n?o.x:null,y:n?o.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:n})}unpin(t){this.pin(t,!1)}unpinAll(){for(let t of[...this.pins.keys()])this.pin(t,!1)}select(t){typeof t=="string"&&(t={kind:"node",id:t});for(let n of this.renderer.viewport.querySelectorAll(".fg-selected"))n.classList.remove("fg-selected");this.selected=t&&t.id!=null?{kind:t.kind,id:String(t.id)}:null,this.selected&&(this.selected.kind==="edge"?this.renderer.edgeEls:this.renderer.nodeEls).get(this.selected.id)?.classList.add("fg-selected"),this._applyHighlight(),this._emit("select",this.selected)}getSelection(){return this.selected}getConnections(t,{chain:n=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let o=this.model.edges,s=i=>{let c=new Set([t]),a=[],d=[t];for(;d.length;){let l=d.shift();for(let u of o){let p=i==="next"?u.source:u.target,f=i==="next"?u.target:u.source;p!==l||c.has(f)||(c.add(f),a.push(f),n&&d.push(f))}}return a.map(l=>this.model.nodeById.get(l).data)},e=i=>i.data;return{previous:s("previous"),next:s("next"),incoming:o.filter(i=>i.target===t).map(e),outgoing:o.filter(i=>i.source===t).map(e)}}fit({padding:t=40,maxZoom:n=1}={}){let o=this.renderer.viewport,s=pt({nodes:this.positions,groups:this._groups||new Map});if(!s.width&&!s.height)return;let e=o.clientWidth||800,i=o.clientHeight||600,c=Math.min((e-2*t)/(s.width||1),(i-2*t)/(s.height||1),n);c=Jt(c,this.options.minZoom,this.options.maxZoom),this.setTransform({k:c,x:(e-s.width*c)/2-s.x*c,y:(i-s.height*c)/2-s.y*c})}fitNodes(t,{padding:n=40,maxZoom:o=this.options.maxZoom,animate:s=this.options.animate,edges:e}={}){let i=new Set([...t].map(String).filter(m=>this.positions.has(m)));if(!i.size)return!1;let c=1/0,a=1/0,d=-1/0,l=-1/0,u=(m,y)=>{c=Math.min(c,m),a=Math.min(a,y),d=Math.max(d,m),l=Math.max(l,y)};for(let m of i){let y=this.positions.get(m);u(y.x,y.y),u(y.x+y.width,y.y+y.height)}let p=e||this.model.edges.filter(m=>i.has(m.source)&&i.has(m.target)).map(m=>m.id);for(let m of p)for(let y of this.routing?.paths.get(m)?.points||[])u(y.x,y.y);let f=this.renderer.viewport,h=f.clientWidth||800,g=f.clientHeight||600,w=d-c,x=l-a,M=Math.min((h-2*n)/(w||1),(g-2*n)/(x||1),o);return M=Jt(M,this.options.minZoom,this.options.maxZoom),this._animateTransform({k:M,x:(h-w*M)/2-c*M,y:(g-x*M)/2-a*M},s),!0}fitFlow(t=this.selected,{mode:n="chain",...o}={}){if(t==null)return!1;let s;if(typeof t=="string")s={kind:"node",id:t};else if(t.kind)s={kind:t.kind,id:String(t.id)};else{let c=this.model?.edges.find(a=>a.data===t);if(!c)return!1;s={kind:"edge",id:c.id}}if(!(s.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(s.id))return!1;let i=qt(this.model.edges,s,n);return this.fitNodes(i.nodes,{...o,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,n){this._stopZoom();let o=this.getTransform();if(!n||ze()||typeof requestAnimationFrame>"u"){this.setTransform(t);return}let s=this.options.animationDuration,e=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,c=a=>{let d=Math.min(1,(a-e)/s),l=i(d),u=o.k*Math.pow(t.k/o.k,l),p=t.k-o.k?(u-o.k)/(t.k-o.k):l;this.setTransform({k:u,x:o.x+(t.x-o.x)*p,y:o.y+(t.y-o.y)*p}),d<1&&(this._zoomAnim=requestAnimationFrame(c))};this._zoomAnim=requestAnimationFrame(c)}zoomAt(t,n,o){let s=this.renderer.transform;t=Jt(t,this.options.minZoom,this.options.maxZoom);let e=this.renderer.viewport.getBoundingClientRect(),i=n-e.left,c=o-e.top;this.setTransform({k:t,x:i-(i-s.x)*t/s.k,y:c-(c-s.y)*t/s.k})}zoomBy(t){let n=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,n.left+n.width/2,n.top+n.height/2)}zoomTo(t){this.zoomAt(t,...zn(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(([o,s])=>[o,{...s}])),n=new Map;if(this.routing)for(let[o,s]of this.routing.paths)n.set(o,s.points.map(e=>({...e})));return{nodes:t,edges:n,groups:new Map(this._groups||[])}}on(t,n){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(n),()=>this._listeners.get(t).delete(n)}destroy(){cancelAnimationFrame(this._anim),this._stopZoom(),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,n){for(let o of this._listeners.get(t)||[])try{o(n)}catch(s){console.error(s)}}_prepareModel(t){let n=this.renderer.syncNodes(this.data.nodes||[]),o=(this.data.nodes||[]).map(e=>{let i=String(e.id),c=t&&t.get(i)||this.pins.get(i);return c?{...e,constraints:{...e.constraints||{},pinned:!0,x:c.x,y:c.y}}:e}),s=bt({...this.data,nodes:o},this.userOptions,n);for(let e of s.warnings)console.warn("[FlexGraph] "+e);return this.options=s.options,this.renderer.options=s.options,s}_snapshot(){return{positions:new Map([...this.positions].map(([t,n])=>[t,{...n}])),routing:this.routing,groups:this._groups}}async _build({mode:t,animate:n,fresh:o}){let s=this._snapshot(),e=this._prepareModel(),i,c=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")i=await this._layoutInWorker(e,t,o);else if(t==="stable"&&c){let a=new Map;for(let l of e.nodes){let u=this.positions.get(l.id);u&&a.set(l.id,{x:u.x,y:u.y})}let d=this._prepareModel(a);i=gt(d),Se(i,new Set(a.keys()),this.options.nodeSpacing/2,this.options.direction);for(let l of i.edges.values())l.waypoints=[];e=this._prepareModel()}else{let a=o||!c?null:new Map([...this.positions].map(([d,l])=>[d,{x:l.x+l.width/2,y:l.y+l.height/2}]));i=gt(e,{hints:a})}return this.model=e,this.positions=new Map([...i.nodes].map(([a,d])=>[a,{x:d.x,y:d.y,width:d.width,height:d.height}])),this.layoutEdges=i.edges,this.routing=i.routing||ot(e,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(e),this._present(c?s:null,n),this.selected&&this.select(this.selected),this._emit("layout",{crossings:i.crossings}),this}_layoutInWorker(t,n,o){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=a=>{let d=this._wpending.get(a.data.seq);d&&(this._wpending.delete(a.data.seq),a.data.error?d.reject(new Error(a.data.error)):d.resolve(a.data))});let s={options:this.data.options,nodes:t.nodes.map(a=>({...Vt(a.data),id:a.id,width:a.width,height:a.height,constraints:a.constraints})),edges:t.edges.map(a=>Vt(a.data)),groups:t.groups.map(a=>({id:a.id,label:a.label})),constraints:(this.data.constraints||[]).map(Vt)},e={};for(let[a,d]of Object.entries(this.userOptions))typeof d!="function"&&a!=="worker"&&(e[a]=d);let i=o||n!=="relayout"?null:new Map([...this.positions].map(([a,d])=>[a,{x:d.x+d.width/2,y:d.y+d.height/2}])),c=++this._wseq;return new Promise((a,d)=>{this._wpending.set(c,{resolve:a,reject:d}),this._worker.postMessage({seq:c,data:s,options:e,hints:i})}).then(a=>({nodes:a.nodes,edges:a.edges,crossings:a.crossings,routing:a.routing}))}_reroute(){return this.routing=ot(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let n=this.renderer;if(n.placeNodes(this.model,this.positions),this._groups=yt(this.model,{nodes:this.positions}),n.renderGroups(this.model,this._groups),n.renderEdges(this.model,this.routing,t),this.selected?.kind==="edge"&&n.edgeEls.get(this.selected.id)?.classList.add("fg-selected"),this._hl.length)for(let o of this._hl)o.classList.add("fg-hl")}_present(t,n){if(cancelAnimationFrame(this._anim),!t||!n||ze()||!t.routing){this._render();return}let o=this.positions,s=this.options.animationDuration,e=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,c=a=>{let d=Math.min(1,(a-e)/s);if(d>=1){this._render(),this._emit("animationend");return}let l=i(d),u=new Map;for(let[p,f]of o){let h=t.positions.get(p)||f;u.set(p,{x:h.x+(f.x-h.x)*l,y:h.y+(f.y-h.y)*l,width:f.width,height:f.height})}this.renderer.placeNodes(this.model,u),this._groups=yt(this.model,{nodes:u}),this.renderer.renderGroups(this.model,this._groups),this.renderer.renderEdges(this.model,this.routing,Re(t.routing.paths,this.routing.paths,l)),this._anim=requestAnimationFrame(c)};this._anim=requestAnimationFrame(c)}_dragStart(t){cancelAnimationFrame(this._anim);let n=new Set([t]);for(let o of this.model.edges)o.source===t&&n.add(o.target),o.target===t&&n.add(o.source);this._affected=new Set(this.model.edges.filter(o=>n.has(o.source)||n.has(o.target)).map(o=>o.id));for(let o of this._affected){let s=this.model.edgeById.get(o);if(s.source===t||s.target===t){let e=this.layoutEdges.get(o);e&&(e.waypoints=[])}}this.renderer.nodeEls.get(t)?.classList.add("fg-node--dragging"),this._emit("dragstart",{id:t})}_dragMove(t,n,o){let s=this.positions.get(t);if(!s)return;s.x=n,s.y=o;let e=this.model.nodeById.get(t);e.constraints.pinned&&(e.constraints.x=n,e.constraints.y=o);let i=this.options.nodeMargin,c={x:n-i,y:o-i,width:s.width+2*i,height:s.height+2*i};if(this.routing)for(let[a,d]of this.routing.paths){if(this._affected.has(a))continue;let l=d.points;for(let u=0;u<l.length-1;u++)if(vt(l[u],l[u+1],c,1)){this._affected.add(a);break}}this.routing=ot(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:n,y:o})}_dragEnd(t){let n=this.positions.get(t);this.renderer.nodeEls.get(t)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(t,!0),this._emit("dragend",{id:t,x:n.x,y:n.y}),this._emit("change",this.exportState())}_click(t,n){if(t.kind==="node"){this.select({kind:"node",id:t.id});let o=this.model.nodeById.get(t.id),s=this.getConnections(t.id);this.options.onNodeClick?.(o.data,n,s),this._emit("nodeclick",{node:o.data,event:n,previous:s.previous,next:s.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,n),this._emit("edgeclick",{edge:o.data,event:n})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:n}):(this.select(null),this.options.onBackgroundClick?.(n))}_contextMenu(t,n){let o=this.options,s,e;if(t.kind==="node"&&this.model?.nodeById.has(t.id)){let i=this.model.nodeById.get(t.id).data,c=this.getConnections(t.id);s={kind:"node",id:t.id,node:i,previous:c.previous,next:c.next,event:n},e=o.onNodeContextMenu&&(()=>o.onNodeContextMenu(i,n,c))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;s={kind:"edge",id:t.id,edge:i,event:n},e=o.onEdgeContextMenu&&(()=>o.onEdgeContextMenu(i,n))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;s={kind:"group",id:t.id,group:i,event:n},e=o.onGroupContextMenu&&(()=>o.onGroupContextMenu(i,n))}else s={kind:"background",event:n},e=o.onBackgroundContextMenu&&(()=>o.onBackgroundContextMenu(n));(e||this._listeners.get("contextmenu")?.size)&&n.preventDefault(),e?.(),this._emit("contextmenu",s)}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let e of this._hl)e.classList.remove("fg-hl");this._hl=[];let t=this.renderer,n=this._hovered||(this.options.highlightSelection?this.selected:null);if(n&&!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id)&&(n=null),t.world.classList.toggle("fg-hovering",!!n),!n)return;let o=e=>{e&&(e.classList.add("fg-hl"),this._hl.push(e))},s=qt(this.model.edges,n,this.options.hoverHighlight);for(let e of s.nodes)o(t.nodeEls.get(e));for(let e of s.edges)o(t.edgeEls.get(e)),o(t.labelEls.get(e))}_controls(){let t=document.createElement("div");t.className="fg-controls";let n=(o,s,e)=>{let i=document.createElement("button");i.type="button",i.textContent=o,i.title=s,i.setAttribute("aria-label",s),i.addEventListener("click",c=>{c.stopPropagation(),e()}),t.appendChild(i)};n("+","Zoom in",()=>this.zoomBy(1.25)),n("\u2212","Zoom out",()=>this.zoomBy(.8)),n("\u2922","Fit to screen",()=>this.fit()),this.renderer.viewport.appendChild(t)}},Jt=(r,t,n)=>Math.max(t,Math.min(n,r)),Te=r=>Math.round(r*10)/10,He=r=>Math.round(r*100)/100;function zn(r){let t=r.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}
|
|
8
|
+
var Ht=Object.defineProperty;var os=Object.getOwnPropertyDescriptor;var is=Object.getOwnPropertyNames;var rs=Object.prototype.hasOwnProperty;var we=(a,t)=>{for(var e in t)Ht(a,e,{get:t[e],enumerable:!0})},as=(a,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of is(t))!rs.call(a,n)&&n!==e&&Ht(a,n,{get:()=>t[n],enumerable:!(o=os(t,n))||o.enumerable});return a};var cs=a=>as(Ht({},"__esModule",{value:!0}),a);var an={};we(an,{DEFAULT_OPTIONS:()=>bt,GraphValidationError:()=>ct,GraphView:()=>Nt,VERSION:()=>Ze,computeLayout:()=>mt,createGraph:()=>sn,edgePath:()=>ee,layoutGraph:()=>en,metrics:()=>oe,normalizeGraph:()=>Mt,routeEdges:()=>st,selectionHighlight:()=>Qe,stackView:()=>ne});module.exports=cs(an);var ds=["top","right","bottom","left"],hs=["TB","LR","BT","RL"],ls=["orthogonal","straight","curved"],bt=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"}}}),ct=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={...bt,edgeTypes:{...bt.edgeTypes}};for(let e of a)if(e)for(let[o,n]of Object.entries(e))n!==void 0&&(o==="edgeTypes"?Object.assign(t.edgeTypes,n):t[o]=n);return hs.includes(t.direction)||(t.direction="TB"),ls.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function Mt(a,t,e){if(!a||typeof a!="object")throw new ct("Graph must be an object");let o=yt(a.options,t),n=[],s=[],i=[],d=new Map;for(let p of a.groups||[]){if(!p||p.id==null){n.push("Group without id");continue}let l=String(p.id);if(d.has(l)){n.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){n.push(`Node at index ${l} has no id`);return}let f=String(p.id);if(c.has(f)){n.push(`Duplicate node id "${f}"`);return}let m=e&&e.get(f),y=tt(p.width)?p.width:m?m.width:o.defaultNodeWidth,k=tt(p.height)?p.height:m?m.height:o.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=ds.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)){n.push(`Duplicate edge id "${f}"`);return}let m=String(p.source),y=String(p.target);if(!c.has(m)){n.push(`Edge "${f}": unknown source node "${m}"`);return}if(!c.has(y)){n.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=o.edgeTypes[p.type]||o.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(n.length)throw new ct(n[0],n);return{options:o,nodes:r,nodeById:c,edges:h,edgeById:u,groups:i,groupById:d,constraints:g,warnings:s}}function fs(a,t){let e=new Map(a.map(d=>[d,[]])),o=new Map(a.map(d=>[d,0]));for(let d of t)e.get(d.v).push(d),o.set(d.w,o.get(d.w)+1);let n=new Map,s=new Set,i=[...a.filter(d=>o.get(d)===0),...a];for(let d of i){if(n.has(d))continue;let r=[[d,0]];for(n.set(d,1);r.length;){let c=r[r.length-1],[h,u]=c,g=e.get(h);if(u>=g.length){n.set(h,2),r.pop();continue}c[1]++;let p=g[u],l=n.get(p.w);l===1?s.add(p.id):l||(n.set(p.w,1),r.push([p.w,0]))}}return s}var Dt=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 o=this.p.get(t);this.p.set(t,e),t=o}return e}union(t,e){let o=this.find(t),n=this.find(e);o!==n&&this.p.set(n,o)}};function ke(a,t,e={}){let o=[],n=new Dt(a);for(let w of e.sameRank||[])for(let x=1;x<w.length;x++)n.union(w[0],w[x]);let s=[...new Set(a.map(w=>n.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=n.find(w.source),b=n.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=fs(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(!n.p.has(w))continue;let b=n.find(w);u.has(b)&&u.get(b)!==x&&o.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)&&o.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(n.find(w))??0);return{rank:_,reversed:c,flat:d,selfLoops:i,warnings:o}}function be(a,t,e=0){let o=[],n=new Map;for(let c of a)n.set(c.id,o.length),o.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:o.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),o[c].down.push({n:h,off:g,own:u,w:p}),o[h].up.push({n:c,off:u,own:g,w:p})};for(let c of t){let h=n.get(c.v),u=n.get(c.w),g=o[h].rank,p=o[u].rank;if(p<=g)continue;let l=o[h].group&&o[h].group===o[u].group?o[h].group:null,f=[],m=h,y=c.vOff||0;for(let k=g+1;k<p;k++){let _=o.length;o.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 o)r=Math.max(r,c.rank);return{v:o,index:n,segs:i,chains:s,maxRank:r}}function Xt(a){let t=Array.from({length:a.maxRank+1},()=>[]),e=new Uint8Array(a.v.length),o=a.v.map((n,s)=>s).filter(n=>a.v[n].real).sort((n,s)=>a.v[n].rank-a.v[s].rank||a.v[n].inputIndex-a.v[s].inputIndex);for(let n of o){if(e[n])continue;let s=[n];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 n=0;n<a.v.length;n++)e[n]||t[a.v[n].rank].push(n);return t}function us(a){let t=a.length;if(t<2)return 0;let e=a.slice(),o=new Array(t),n=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]?o[u++]=e[c++]:(n+=d-c,o[u++]=e[h++]);for(;c<d;)o[u++]=e[c++];for(;h<r;)o[u++]=e[h++]}[e,o]=[o,e]}return n}function ps(a,t,e,o){let n=[];for(let s of t)for(let i of a.v[s].down)n.push([o[s]+i.own*.999,o[i.n]+i.off*.999]);return n.sort((s,i)=>s[0]-i[0]||s[1]-i[1]),us(n.map(s=>s[1]))}function Ft(a,t){let e=St(a,t),o=0;for(let n=0;n<t.length-1;n++)o+=ps(a,t[n],t[n+1],e);return o}function St(a,t){let e=new Float64Array(a.v.length);for(let o of t)o.forEach((n,s)=>{e[n]=s});return e}function Me(a,t={}){let e=t.maxIterations??24,o=(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),n=new Set(o.map(([c,h])=>c+":"+h)),s=[];t.initial&&s.push(t.initial.map(c=>c.slice()));let i=Xt(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=gs(a,c,o,n,e);if(h.crossings<r&&(d=h.layers,r=h.crossings),r===0)break}return{layers:d,crossings:r}}function gs(a,t,e,o,n){let s=t.map(c=>Se(a,c,e)),i=s.map(c=>c.slice()),d=Ft(a,s),r=0;for(let c=0;c<n&&d>0;c++){let h=c%2===0;xs(a,s,h,e,c%4>=2),ms(a,s,o);let u=Ft(a,s);if(u<d)d=u,i=s.map(g=>g.slice()),r=0;else if(++r>=6)break}if(d>0&&n>4){s=i.map(c=>c.slice());for(let c=0;c<2;c++){ys(a,s,o);let h=Ft(a,s);if(h<d)d=h,i=s.map(u=>u.slice());else break}}return{layers:i,crossings:d}}function ys(a,t,e){let o=St(a,t);for(let n of t)if(!(n.length<3||n.length>120))for(let s of n.slice()){let i=a.v[s];if(i.pinX!=null||i.group)continue;let d=n.indexOf(s),r=0,c=d,h=0;for(let u=d-1;u>=0;u--){let g=n[u];if(e.has(g+":"+s)||a.v[g].group)break;h+=dt(a,s,g,o)-dt(a,g,s,o),h<r&&(r=h,c=u)}h=0;for(let u=d+1;u<n.length;u++){let g=n[u];if(e.has(s+":"+g)||a.v[g].group)break;h+=dt(a,g,s,o)-dt(a,s,g,o),h<r&&(r=h,c=u)}c!==d&&(n.splice(d,1),n.splice(c,0,s),n.forEach((u,g)=>{o[u]=g}))}}function xs(a,t,e,o,n){let s=St(a,t),i=t.length,d=e?_e(1,i):_e(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(n){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]=Se(a,c,o),t[r].forEach((l,f)=>{s[l]=f})}}function Se(a,t,e){let o=t.slice(),n=[],s=[];if(o.forEach((i,d)=>{a.v[i].pinX!=null&&(n.push(d),s.push(i))}),s.length>1&&(s.sort((i,d)=>a.v[i].pinX-a.v[d].pinX),n.forEach((i,d)=>{o[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=o.indexOf(r),u=o.indexOf(c);h<0||u<0||h<u||(o.splice(h,1),o.splice(o.indexOf(c),0,r),d=!0)}if(!d)break}return o}function dt(a,t,e,o){let n=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)o[r.n]+r.off>o[c.n]+c.off&&(n+=r.w*c.w)}return n}function ms(a,t,e){let o=St(a,t),n=!0,s=0;for(;n&&s++<8;){n=!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=dt(a,r,c,o);dt(a,c,r,o)<g&&(i[d]=c,i[d+1]=r,o[c]=d,o[r]=d+1,n=!0)}}}function _e(a,t,e=1){let o=[];if(e>0)for(let n=a;n<t;n+=e)o.push(n);else for(let n=a;n>t;n+=e)o.push(n);return o}function ws(a,t,e){let o=a.length,n=new Float64Array(o);for(let h=1;h<o;h++)n[h]=n[h-1]+e[h];let s=[],i=[],d=[],r=[];for(let h=0;h<o;h++)for(s.push(a[h]-n[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(o);for(let h=0;h<s.length;h++)for(let u=d[h];u<=r[h];u++)c[u]=s[h]+n[u];return c}function ve(a,t,e){let o=a.v.length,n=new Float64Array(o),s=new Float64Array(o),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],n[M]=x});let b=x/2;_.forEach(M=>{n[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 nt=q.w*(a.v[q.n].real?1:2)*h(I);S+=(n[q.n]+q.off*a.v[q.n].width-q.own*O.width)*nt,C+=nt}};w&&z(O.up),x&&z(O.down),C===0?(M[N]=n[I],E[N]=.05):(M[N]=S/C,E[N]=C)});let v=ws(M,E,c[_]);b.forEach((I,N)=>{n[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;_<o;_++)s[_]=y[a.v[_].rank];return{x:n,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 vt(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 ht(a){let t=new Map,e={top:[],right:[],bottom:[],left:[]};for(let o of a.ports)o.side&&e[o.side].push(o);for(let o of Object.keys(e)){let n=e[o];n.forEach((s,i)=>{let d=s.offset!=null?s.offset:(i+1)/(n.length+1);t.set(s.id,{side:o,t:d,...ks(o,d)})})}return t}function ks(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 Ee(a,t){return{x:a.x-t,y:a.y-t,width:a.width+2*t,height:a.height+2*t}}function Le(a,t,e,o=.5){return t>a.x+o&&t<a.x+a.width-o&&e>a.y+o&&e<a.y+a.height-o}function lt(a,t,e,o=.5){let n=e.x+o,s=e.x+e.width-o,i=e.y+o,d=e.y+e.height-o;if(s<=n||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-n)||!g(h,s-a.x)||!g(-u,a.y-i)||!g(u,d-a.y)?!1:c-r>1e-9}function Gt(a,t){let e=et(a),o=t.x-e.x,n=t.y-e.y;if(o===0&&n===0)return{...e,side:"bottom"};let s=o!==0?a.width/2/Math.abs(o):1/0,i=n!==0?a.height/2/Math.abs(n):1/0,d=Math.min(s,i),r=s<i?o>0?"right":"left":n>0?"bottom":"top";return{x:e.x+o*d,y:e.y+n*d,side:r}}function Et(a){let t=[];for(let e of a){let o=t[t.length-1];o&&Math.abs(o.x-e.x)<.01&&Math.abs(o.y-e.y)<.01||t.push({x:e.x,y:e.y})}for(let e=t.length-2;e>=1;e--){let o=t[e-1],n=t[e],s=t[e+1],i=(n.x-o.x)*(s.y-n.y)-(n.y-o.y)*(s.x-n.x),d=(n.x-o.x)*(s.x-n.x)+(n.y-o.y)*(s.y-n.y);Math.abs(i)<.01&&d>=0&&t.splice(e,1)}return t}function _s(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 jt(a,t){if(a.length===0)return[];if(a.length===1)return Array.from({length:t},()=>({...a[0]}));let e=_s(a)||1,o=[],n=0,s=0;for(let i=0;i<t;i++){let d=e*i/(t-1);for(;n<a.length-2;){let g=Math.hypot(a[n+1].x-a[n].x,a[n+1].y-a[n].y);if(s+g>=d)break;s+=g,n++}let r=a[n],c=a[n+1],h=Math.hypot(c.x-r.x,c.y-r.y)||1,u=Math.min(1,Math.max(0,(d-s)/h));o.push({x:r.x+(c.x-r.x)*u,y:r.y+(c.y-r.y)*u})}return o}var Ie=(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}}},Kt=(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 mt(a,t={}){return a.nodes.some(e=>e.group)?bs(a,t):Ut(a,t)}function Ae(a,t,e){let o=new Set(t.map(s=>s.id)),n=t.map(s=>({...s,group:null,constraints:e?s.constraints:{...s.constraints,pinned:!1}}));return{options:a.options,nodes:n,nodeById:new Map(n.map(s=>[s.id,s])),edges:a.edges.filter(s=>o.has(s.source)&&o.has(s.target)),groups:[],groupById:new Map,constraints:a.constraints.filter(s=>s.type==="sameRank"?s.nodes.every(i=>o.has(i)):o.has(s.a)&&o.has(s.b)),warnings:[]}}function bs(a,t){let e=Ne(a,t.hints||null,t.hints||null),o=new Map,n=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){o.set(i.id,n(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=n(e.nodes.get(g));r+=p.x,c+=p.y,h++}o.set(i.id,h?{x:r/h,y:c/h}:n(d))}let s=Ne(a,o,t.hints||o);return s.crossingsRouted<=e.crossingsRouted?s:e}function Ne(a,t,e){let o=a.options,n=o.groupPadding,s=o.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=Ut(Ae(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*n,height:y.height+2*n+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=Ae(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=Ut(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+n-f.x,_=y.y+n+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(wt(a,p),!a.nodes.some(l=>l.constraints.pinned)){let l=xt(p);Oe(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=Ms(a,p),p}function Ms(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 o=0,n=(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=n(r[2],r[3],r[4],r[5],d[2],d[3]),h=n(r[2],r[3],r[4],r[5],d[4],d[5]),u=n(d[2],d[3],d[4],d[5],r[2],r[3]),g=n(d[2],d[3],d[4],d[5],r[4],r[5]);c*h<0&&u*g<0&&o++}return o}function Ut(a,t={}){let e=a.options,o=e.direction,n=o==="LR"||o==="RL",s=[],i=new Map;for(let g of a.nodes){let p=ht(g),l=new Map;for(let[y,k]of p)l.set(y,(n?k.py:k.px)-.5);let f=null,m=null;if(g.constraints.pinned){let y=Kt(o,g.constraints.x+g.width/2,g.constraints.y+g.height/2);f=y.x,m=y.y}i.set(g.id,{iw:n?g.height:g.width,ih:n?g.width:g.height,frac:l,pinX:f,pinY:m})}let d=vs(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=ke(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=be(_,w,0),b;t.hints&&t.hints.size&&(b=Ss(x,t.hints,o));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=ve(x,E.layers,{nodeSpacing:e.nodeSpacing,edgeSpacing:e.edgeSpacing,rankSpacing:e.rankSpacing,groupPadding:e.groupPadding,groupLabelHeight:e.groupLabelHeight,labelOnOrderAxis:n,labelAtRankEnd:o==="BT"||o==="RL"?!n:!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+=Kt(o,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=Ie(o,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=>Ie(o,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)&&Oe(r,-g+l,-p+l)}return wt(a,r),r.bounds=xt(r),r}function Oe(a,t,e){for(let o of a.nodes.values())o.x+=t,o.y+=e;for(let o of a.edges.values())for(let n of o.waypoints)n.x+=t,n.y+=e}function wt(a,t){let e=a.options;t.groups=new Map;for(let o of a.groups){let n=1/0,s=1/0,i=-1/0,d=-1/0;for(let c of a.nodes){if(c.group!==o.id)continue;let h=t.nodes.get(c.id);h&&(n=Math.min(n,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(n))continue;let r=e.groupPadding;t.groups.set(o.id,{x:n-r,y:s-r-e.groupLabelHeight,width:i-n+2*r,height:d-s+2*r+e.groupLabelHeight})}return t.groups}function xt(a){let t=1/0,e=1/0,o=-1/0,n=-1/0,s=i=>{t=Math.min(t,i.x),e=Math.min(e,i.y),o=Math.max(o,i.x+i.width),n=Math.max(n,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:o-t,height:n-e}:{x:0,y:0,width:0,height:0}}function Ss(a,t,e){let o=Xt(a),n=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);n[i]=Kt(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(n[i])||Number.isNaN(n[d])||s.forEach((r,c)=>{n[r]=n[i]+(n[d]-n[i])*(c+1)/(s.length+1)})}return o.map(s=>{let i=new Map(s.map((d,r)=>[d,r]));return s.slice().sort((d,r)=>{let c=n[d],h=n[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 vs(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},o=(i,d)=>{let r=e(i),c=e(d);r!==c&&t.set(c,r)};for(let i of a.edges)o(i.source,i.target);let n=new Map;for(let i of a.nodes)i.group&&(n.has(i.group)?o(n.get(i.group),i.id):n.set(i.group,i.id));for(let i of a.constraints)if(i.type==="leftOf"&&o(i.a,i.b),i.type==="sameRank")for(let d of i.nodes)o(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 Ce(a,t,e,o){let n=o==="LR"||o==="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];n?r.y=u.y+u.height+e:r.x=u.x+u.width+e}}function Es(a,t,e){let o=vt(e),n=et(a),s=et(t),i=s.x-n.x,d=s.y-n.y,r=Math.abs(i)-(a.width+t.width)/2,c=Math.abs(d)-(a.height+t.height)/2,h=o.x!==0?i*o.x:d*o.y,u=o.x!==0?r:c;return h>0&&u>4?[o.exit,o.entry]:r>=c?i>=0?["right","left"]:["left","right"]:d>=0?["bottom","top"]:["top","bottom"]}function Be(a,t){let e=a.options.direction,o=new Map,n=new Map;for(let r of a.nodes){let c=t.get(r.id);if(!c)continue;let h=ht(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});n.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=n.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);o.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]=Es(c,h,e),p=r.sourcePort&&n.get(r.source).get(r.sourcePort),l=r.targetPort&&n.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||Pe(s,r.source+"|"+u,{edgeId:r.id,end:"source",other:r.target}),l||Pe(s,r.target+"|"+g,{edgeId:r.id,end:"target",other:r.source}),o.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=o.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=[...n.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};o.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 o.values())d(r.source),d(r.target);return{ends:o,ports:n,sides:i}}function Pe(a,t,e){a.has(t)||a.set(t,[]),a.get(t).push(e)}function Te(a,t,e){let o=e.spacing,n={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?n.v:n.h;C.has(S)||C.set(S,[]),C.get(S).push(O)}}let i=[...n.v.values()].flat(),d=[...n.h.values()].flat(),r=[];for(let u of[!0,!1])for(let g of(u?n.v:n.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&&As(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(o,_>1?2*w/(_-1):o);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&&Ls(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=Is(f)}}function Ls(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 Is(a){let t=[];for(let e of a){let o=t[t.length-1];o&&Math.abs(o.x-e.x)<.01&&Math.abs(o.y-e.y)<.01||t.push(e)}return t}function As(a,t){return ze(a,t,!0)||ze(a,t,!1)||Os(a,t)}function Re(a,t){let{pts:e,i:o,loIsA:n}=a,s=[];if(t?!n:n)for(let d=o+1;d<e.length;d++)s.push(e[d]);else for(let d=o;d>=0;d--)s.push(e[d]);return s}var Ns=(a,t)=>a.x*t.y-a.y*t.x,$e=(a,t)=>{let e=t.x-a.x,o=t.y-a.y,n=Math.hypot(e,o)||1;return{x:e/n,y:o/n}};function ze(a,t,e){let o=a.vertical,n=Re(a,e),s=Re(t,e),i=e?Math.max(a.lo,t.lo):Math.min(a.hi,t.hi),d=o?{x:a.c,y:i}:{x:i,y:a.c},r=o?{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=o?m.x:m.y;return(l<f?y<0:y>0)?-1:1},p=(l,f)=>f+1<l.length?Math.sign(Math.round(Ns(c,$e(l[f],l[f+1]))*1e3)):null;for(let l=0;l<64;l++){let f=h<n.length?(n[h].x-d.x)*c.x+(n[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(n,h),_=p(s,u);if(k===null||_===null)return k===null&&_===null?0:g(k??0,_??0);if(k!==_)return g(k,_);d=n[h],c=$e(n[h],n[h+1]),h++,u++;continue}if(f<m){let k=p(n,h);return k?g(k,0):0}let y=p(s,u);return y?g(0,y):0}return 0}var Os=(a,t)=>a.id<t.id?-1:a.id>t.id?1:a.i-t.i;function Yt(a,t,e=4){let o=[],n=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&&o.push([n.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 o){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=n.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 Zt=1,Cs=[1,-1,0,0],Ps=[0,0,1,-1],Wt=[1,0,3,2],He=a=>a.x>0?0:a.x<0?1:a.y>0?2:3;function st(a,t,e={}){let o=a.options,n=t.nodes,s=o.edgeRouting,{ends:i,ports:d}=Be(a,n),r=new Map,c=new Map,h=e.only||null,u=e.prev||null;if(s==="orthogonal")Bs(a,n,i,o,h,u,r,c),Te(r,n,{spacing:o.edgeSpacing,fixedEnds:!0});else for(let l of a.edges){let f=n.get(l.source),m=n.get(l.target);if(!f||!m)continue;if(l.source===l.target){r.set(l.id,De(f,o,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=Gt(f,k[0]||et(m)),s==="curved"||l.targetPort?x=_.target:x=Gt(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=o.lineHops&&s==="orthogonal"?Yt(r,g,o.hopRadius):new Map;for(let[l,f]of r)f.hops=p.get(l)||[];return{paths:r,raw:c,ports:d,mode:s}}function De(a,t,e){let o=Math.max(t.nodeMargin*1.5,16),n=e.source,s=e.target,i=K[n.side],d=K[s.side],r={x:n.x+i.x*o,y:n.y+i.y*o},c={x:s.x+d.x*o,y:s.y+d.y*o},h;if(n.side===s.side)h=n.side==="left"||n.side==="right"?[r,{x:r.x,y:c.y}]:[r,{x:c.x,y:r.y}];else if((n.side==="top"||n.side==="bottom")!=(s.side==="top"||s.side==="bottom"))h=n.side==="top"||n.side==="bottom"?[r,{x:c.x,y:r.y}]:[r,{x:r.x,y:c.y}];else{let u=n.side==="top"||n.side==="bottom",g=u?a.x+a.width+o:a.y+a.height+o;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:Et([n,...h,c,s]),kind:"orthogonal",sourceSide:n.side,targetSide:s.side,selfLoop:!0}}function Bs(a,t,e,o,n,s,i,d){let r=o.nodeMargin,c=[];for(let[l,f]of t)c.push({id:l,...Ee(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:He(m),tNeed:Wt[He(y)]})}let u=Ts(c,h,r);for(let l of a.edges)if(n&&!n.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)),$s(a,t,e,o,c,g,u,i,d);for(let l of g){if(i.has(l.id))continue;if(l.source===l.target){let _=De(t.get(l.source),o,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,o);y||(y=zs(m.s,m.t,f.source.side,f.target.side));let k=[f.source,...Et(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 Rs={top:"bottom",bottom:"top",left:"right",right:"left"};function $s(a,t,e,o,n,s,i,d,r){let c=o.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!==Rs[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*o.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=Et(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 n)if(S.id!==p&&S.id!==v.target&<(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 zs(a,t,e,o){let n=e==="top"||e==="bottom",s=o==="top"||o==="bottom";if(n&&s){let i=(a.y+t.y)/2;return[a,{x:a.x,y:i},{x:t.x,y:i},t]}if(!n&&!s){let i=(a.x+t.x)/2;return[a,{x:i,y:a.y},{x:i,y:t.y},t]}return n?[a,{x:a.x,y:t.y},t]:[a,{x:t.x,y:a.y},t]}function Ts(a,t,e){let o=new Set,n=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)o.add(s(L.x)),o.add(s(L.x+L.width)),n.add(s(L.y)),n.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])o.add(s(A.x)),n.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);o.add(s(i-2*e)),o.add(s(r+2*e)),n.add(s(d-2*e)),n.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(o),g=h(n),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(Le(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 ot=Math.min(X,j),it=Math.max(X,j);for(let F=ot;F<=it;F++)O[T*p+F]++,F<it&&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 ot=Math.min(X,j),it=Math.max(X,j);for(let F=ot;F<=it;F++)S[F*p+T]++,F<it&&z[F*p+T]++}}}let nt=f*4,J=nt<=16e6,ce=J?new Float64Array(nt):null,de=J?new Int32Array(nt):null,he=J?new Uint32Array(nt):null,Ot=0;function ts(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],ot=Y.bendPenalty,it=Y.crossingPenalty;Ot++;let F=J?null:new Map,le=J?null:new Map,fe=J?$=>he[$]===Ot?ce[$]:void 0:$=>F.get($),ue=J?($,G,Q)=>{he[$]=Ot,ce[$]=G,de[$]=Q}:($,G,Q)=>{F.set($,G),le.set($,Q)},es=J?$=>de[$]:$=>le.get($),ft=new Vt,pe=Z*4+A;ue(pe,0,-1),ft.push(pe,Zt*(Math.abs(u[Z%p]-X)+Math.abs(g[Z/p|0]-j)));let Ct=1/0,Pt=-1,ss=0,ns=4e5;for(;ft.size;){let $=ft.peekKey(),G=ft.pop();if($>=Ct)break;let Q=fe(G),at=G>>2,kt=G&3,Rt=at%p,$t=at/p|0;if(!($>Q+Zt*(Math.abs(u[Rt]-X)+Math.abs(g[$t]-j))+1e-6)){if(++ss>ns)break;if(at===T){let D=kt===R?0:kt===Wt[R]?2*ot:ot;Q+D<Ct&&(Ct=Q+D,Pt=G);continue}for(let D=0;D<4;D++){if(D===Wt[kt])continue;let ut=Rt+Cs[D],pt=$t+Ps[D];if(ut<0||pt<0||ut>=p||pt>=l)continue;let V=pt*p+ut;if(V!==T&&E(V))continue;let gt=D<2;if(N(gt?D===0?at:V:D===2?at:V,gt))continue;let ge=Math.abs(gt?u[ut]-u[Rt]:g[pt]-g[$t]),_t=ge;D!==kt&&(_t+=ot);let ye=D===0||D===2?at:V,xe=gt?C[ye]:z[ye];xe&&(_t+=ge*.25*xe),V!==T&&(gt?S[V]:O[V])&&(_t+=it);let zt=V*4+D,Tt=Q+_t,me=fe(zt);(me===void 0||Tt<me-1e-9)&&(ue(zt,Tt,G),ft.push(zt,Tt+Zt*(Math.abs(u[ut]-X)+Math.abs(g[pt]-j))))}}}if(Pt<0)return null;let Bt=[];for(let $=Pt;$!==-1&&$!==void 0;$=es($)){let G=$>>2;Bt.push({x:u[G%p],y:g[G/p|0]})}return Bt.reverse(),Bt}return{astar:ts,markPath:q,xs:u,ys:g,N:f}}var Vt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,e){let o=this.k,n=this.v,s=o.length;for(o.push(e),n.push(t);s>0;){let i=s-1>>1;if(o[i]<=e)break;o[s]=o[i],n[s]=n[i],s=i}o[s]=e,n[s]=t}peekKey(){return this.k[0]}pop(){let t=this.k,e=this.v,o=e[0],n=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]>=n))break;t[i]=t[r],e[i]=e[r],i=r}t[i]=n,e[i]=s}return o}};function qt(a,t,e,o){if(!o)return 0;let n=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=o[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=n.lineHops&&t.mode==="orthogonal"?Yt(t.paths,r,n.hopRadius):new Map;for(let[h,u]of t.paths)u.hops=c.get(h)||[]}return d}var Hs=[.5,.3,.7,.15,.85],Lt=3;function Xe(a,{nodes:t=[],edges:e=[]}={}){let o=[...t],n=[];for(let[r,c]of e)for(let h=0;h<c.length-1;h++)n.push({id:r,i:h,a:c[h],b:c[h+1],box:Ds(c[h],c[h+1])});let s=[],i=new Map,d=[...a].sort((r,c)=>Fe(r.points)-Fe(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 Hs){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+Lt)],[0,u/2+Lt]]:[[0,0],[h/2+Lt,0],[-(h/2+Lt),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)Jt(N,S,2)&&(O+=1e3+Fs(N,S));if(!(l&&O>=l.cost)){for(let S of o)Jt(N,S,2)&&(O+=800);if(!(l&&O>=l.cost)){for(let S of n)S.id===r.id&&S.i===f||Jt(N,S.box,0)&&Xs(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 Fe(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 Ds(a,t){let e=Math.min(a.x,t.x),o=Math.min(a.y,t.y);return{x:e,y:o,width:Math.abs(a.x-t.x),height:Math.abs(a.y-t.y)}}function Jt(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 Fs(a,t){let e=Math.min(a.x+a.width,t.x+t.width)-Math.max(a.x,t.x),o=Math.min(a.y+a.height,t.y+t.height)-Math.max(a.y,t.y);return e>0&&o>0?e*o:0}function Xs(a,t,e){let o=0,n=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>n)return!1;h>o&&(o=h)}else{if(h<o)return!1;h<n&&(n=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",Gs=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 It=class{constructor(t,e){this.id="fg"+ ++Gs,this.options=e,this.container=t,t.classList.add("fg-container");let o=this.viewport=H("div","fg-viewport");o.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),o.appendChild(this.world),o.addEventListener("scroll",()=>{(o.scrollTop||o.scrollLeft)&&(o.scrollTop=0,o.scrollLeft=0)}),t.appendChild(o),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,o=new Set,n=new Map,s=[];for(let i of t){let d=String(i.id);o.add(d);let r=this.nodeEls.get(d),c=te(i,e),h=c&&this.expanded.has(d),u=Ks(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(Ys(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)o.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}}n.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 n}renderBadges(t){for(let[e,o]of this.nodeEls){let n=t&&t.get(e),s=o.querySelector(":scope > .fg-node__badge");if(!n){s?.remove();continue}s||(s=H("div","fg-node__badge"),o.appendChild(s)),s.textContent!==n.text&&(s.textContent=n.text),s.classList.toggle("fg-node__badge--open",!!n.open),s.title=n.title||""}}renderStacks(t,e){let o=vt(t.options.direction);for(let n of t.nodes){let s=this.nodeEls.get(n.id);if(!s)continue;s.querySelectorAll(":scope > .fg-stack-toggle, :scope > .fg-stack").forEach(l=>l.remove());let i=n.data.stackable,d=e.stacked.get(n.id)||(i?i==="upstream"?"upstream":"downstream":null),r=e.counts.get(n.id)||0,c=e.stacked.has(n.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(n.id))continue;let h=d==="upstream"?o.entry:o.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=n.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 o=this.nodeEls.get(e.id);if(!o)continue;let n=this.options.showPorts?JSON.stringify(e.ports.map(s=>[s.id,s.side,s.offset])):"";if(o._portSig!==n&&(o._portSig=n,o.querySelectorAll(":scope > .fg-port").forEach(s=>s.remove()),!!n))for(let[s,i]of ht(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+"%",o.appendChild(d)}}}placeNodes(t,e){for(let o of t.nodes){let n=this.nodeEls.get(o.id),s=e.get(o.id);!n||!s||(n.style.width=s.width+"px",n.style.height=s.height+"px",n.style.transform=`translate(${s.x}px, ${s.y}px)`,n.classList.toggle("fg-node--pinned",!!o.constraints.pinned))}}renderGroups(t,e){let o=new Set;for(let n of t.groups){let s=e.get(n.id);if(!s)continue;o.add(n.id);let i=this.groupEls.get(n.id);if(!i){i=H("div","fg-group"),i.dataset.id=n.id;let d=H("div","fg-group__label");i.appendChild(d),this.groupsLayer.appendChild(i),this.groupEls.set(n.id,i)}i.className="fg-group"+(n.className?" "+n.className:""),i.firstChild.textContent=n.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[n,s]of this.groupEls)o.has(n)||(s.remove(),this.groupEls.delete(n))}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,o,n){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--${js(r.type)}${r.className?" "+r.className:""}`);let u=o?o.get(r.id):null,g=u?Zs(u):ee(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,!o)&&!o&&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,n);for(let r of t.edges){let c=this.edgeEls.get(r.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,e){let o=this.labelEls.get(t.id);return t.label==null||t.label===""?(o&&(o.remove(),this.labelEls.delete(t.id)),!1):(o||(o=H("div","fg-edge-label"),o.dataset.id=t.id,this.labelsLayer.appendChild(o),this.labelEls.set(t.id,o)),o.textContent!==String(t.label)&&(o.textContent=t.label,o._size=null),o.style.visibility=e?"":"hidden",!0)}placeLabels(t,e,o){let n=[];for(let[d,r]of t){let c=this.labelEls.get(d);c._size||(c._size={width:c.offsetWidth,height:c.offsetHeight}),n.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=Xe(n,{nodes:o?o.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 js(a){return String(a).replace(/[^a-zA-Z0-9_-]/g,"_")}function Ks(a){return JSON.stringify([a.label,a.html,a.className,a.type,a.columns,a.data,a.details])}function te(a,t){return a.expandable!=null?!!a.expandable:a.details!=null||!!t.renderDetails}var Us='<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 Ys(a,t){let e=H("button","fg-node__toggle");return e.type="button",e.setAttribute("aria-expanded",String(a)),e.innerHTML=`<span></span>${Us}`,e.firstChild.textContent=a?t.collapseText:t.expandText,e}var P=a=>Math.round(a*100)/100;function Zs(a){return a.map((t,e)=>(e?"L":"M")+P(t.x)+","+P(t.y)).join(" ")}function ee(a,t=6,e=[],o=4){let n=a.points;if(!n||n.length<2)return"";if(a.kind==="curved")return Ws(a);let s=`M${P(n[0].x)},${P(n[0].y)}`,i=n.length,d=new Array(i).fill(0);for(let c=1;c<i-1;c++){let h=Math.hypot(n[c].x-n[c-1].x,n[c].y-n[c-1].y),u=Math.hypot(n[c+1].x-n[c].x,n[c+1].y-n[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=n[c],u=n[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)*_<o+1||(m-x.x)*_<o+1||(s+=` L${P(x.x-_*o)},${P(h.y)} A${o},${o} 0 0 ${_>0?1:0} ${P(x.x+_*o)},${P(h.y)}`)}if(s+=` L${P(m)},${P(y)}`,c+1<i-1&&f>0){let _=n[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 Ws(a){let t=a.points,e=t[0],o=t[t.length-1],n=Math.hypot(o.x-e.x,o.y-e.y),s=Math.max(30,Math.min(160,n*.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(o.x+p.x*s)},${P(o.y+p.y*s)} ${P(o.x)},${P(o.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:o.x-d.x*40,y:o.y-d.y*40}:o,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 Ge(a,t,e,o=28,n=null){let s=new Map;for(let[i,d]of t){let r=a&&a.get(i),c=jt(d.points,o),h=r?r.points:n?n(i):null;if(!h){s.set(i,c);continue}let u=jt(h,o);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 je(a){let t=a.renderer,e=t.viewport,o=()=>a.options,n=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(n.set(x.pointerId,{x:x.clientX,y:x.clientY}),e.setPointerCapture?.(x.pointerId),n.size===2&&o().zoomable){let[E,v]=[...n.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&&o().multiSelect)s={type:"box",target:b,start:M,moved:!1,base:a.getSelectedItems()};else if(b.kind==="node"&&o().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 o().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(n.has(x.pointerId)&&n.set(x.pointerId,{x:x.clientX,y:x.clientY}),!s)return;if(s.type==="pinch"){if(n.size<2)return;let[M,E]=[...n.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(n.delete(x.pointerId),!s)return;let b=s;if(b.type==="pinch"){n.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(),!o().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)&&o().history?(x.preventDefault(),x.shiftKey?a.redo():a.undo()):(x.key==="y"||x.key==="Y")&&(x.ctrlKey||x.metaKey)&&o().history?(x.preventDefault(),a.redo()):(x.key==="a"||x.key==="A")&&(x.ctrlKey||x.metaKey)&&o().multiSelect?(x.preventDefault(),a.selectAll()):(x.key==="+"||x.key==="=")&&o().zoomable?a.zoomBy(1.2):x.key==="-"&&o().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 At(a,t,e="chain"){let o=new Set,n=new Set,s=[],i=[];if(t.kind==="node")o.add(t.id),s=[t.id],i=[t.id];else{let h=a.find(u=>u.id===t.id);if(!h)return{nodes:o,edges:n};n.add(h.id),o.add(h.source),o.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);n.add(m.id),o.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:o,edges:n}}var W="__fg_more:";function Ke(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,o=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),o.add(d)}let n=[...t.keys()].filter(s=>!o.has(s)&&e.has(s));return!n.length&&t.size&&(n=[t.keys().next().value]),{children:e,roots:n,nodeById:t}}function Ue(a,t,{path:e=[],shown:o=new Map,limit:n=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(n,o.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 Ye(a,t,e){let o=a.indexOf(t);if(o>=0)return a.slice(0,o===a.length-1?o:o+1);let n=e.get(t),s=n!=null?a.indexOf(n):-1;return s>=0?[...a.slice(0,s+1),t]:[t]}var Ze="1.3.0";function se(a,t){return t==="upstream"||t==="downstream"?t:a&&a.stackable==="upstream"?"upstream":"downstream"}function Vs(a,t,e,o){let n=t==="upstream"?o:e,s=t==="upstream"?e:o,i=new Set,d=[...n.get(a)||[]];for(;d.length;){let c=d.pop();if(!(c===a||i.has(c))){i.add(c);for(let h of n.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 ne(a,t){let e=a.nodes||[],o=a.edges||[],n=new Set(e.map(y=>String(y.id))),s=new Map,i=new Map;for(let y of o){let k=String(y.source),_=String(y.target);!n.has(k)||!n.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(!n.has(y))continue;let _=Vs(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)&&_++<n.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([...n].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 o){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 o){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 oe={};we(oe,{countCrossings:()=>Js,countNodeOverlaps:()=>Qs,countOverlappingSegments:()=>tn});function qs(a,t,e,o){let n=(c,h,u)=>(h.x-c.x)*(u.y-c.y)-(h.y-c.y)*(u.x-c.x),s=n(e,o,a),i=n(e,o,t),d=n(a,t,e),r=n(a,t,o);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 Js(a){let t=[...a.entries()].map(([o,n])=>[o,Array.isArray(n)?n:n.points]),e=0;for(let o=0;o<t.length;o++)for(let n=o+1;n<t.length;n++){let s=t[o][1],i=t[n][1];for(let d=0;d<s.length-1;d++)for(let r=0;r<i.length-1;r++)qs(s[d],s[d+1],i[r],i[r+1])&&e++}return e}function Qs(a,t,e){let o=0;for(let[n,s]of a){let i=Array.isArray(s)?s:s.points,d=e.get(n);for(let[r,c]of t)if(!(d&&(r===d.source||r===d.target))){for(let h=0;h<i.length-1;h++)if(lt(i[h],i[h+1],c,1)){o++;break}}}return o}function tn(a){let t=[];for(let[n,s]of a){let i=Array.isArray(s)?s:s.points;for(let d=0;d<i.length-1;d++)t.push([n,i[d],i[d+1],d===0?i[0]:d===i.length-2?i[i.length-1]:null])}let e=(n,s)=>n&&s&&Math.abs(n.x-s.x)<.01&&Math.abs(n.y-s.y)<.01,o=0;for(let n=0;n<t.length;n++)for(let s=n+1;s<t.length;s++){let[i,d,r,c]=t[n],[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&&o++}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&&o++}}return o}function en(a,t){let e=Mt(a,t),o=mt(e),n=st(e,o);return{model:e,layout:o,routing:n}}function sn(a,t,e={}){return new Nt(a,t,e)}var nn=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],ie=a=>{let t={};for(let e of nn)a[e]!==void 0&&(t[e]=a[e]);return t},We=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,Nt=class{constructor(t,e,o={}){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={...o},this.options=yt(this.data.options,this.userOptions),this.renderer=new It(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 n of this.data.nodes||[])n&&n.expanded&&this.renderer.expanded.add(String(n.id));this._stacked=new Map,this._stackInfo=null,this._seenStackFlag=new Set,this._readStackFlags(),this.options.controls&&this._controls(),this._onStackClick=n=>{let s=n.target.closest&&n.target.closest(".fg-stack-toggle");!s||!this.renderer.nodesLayer.contains(s)||(n.stopPropagation(),this.toggleStack(s.dataset.fgStack))},this.renderer.viewport.addEventListener("click",this._onStackClick),this._detach=je(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:o=this.options.animate,from:n=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:o,enterFrom:n,exitTo:s})}stack(t,{direction:e,animate:o=this.options.animate}={}){t=String(t);let n=(this.data.nodes||[]).find(i=>String(i.id)===t);if(!n)return Promise.resolve(!1);let s=se(n,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:o}).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:o=[]}={},{from:n=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||[],...o]};return this._record("add",()=>this._updateGraph(d,{mode:i,animate:s,from:n}))}removeNodes(t,{to:e=null,animate:o=this.options.animate,mode:n="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:n,animate:o,to:i}))}setOptions(t,e){return ae.some(n=>n in t&&t[n]!==this.options[n])?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 o="explore"in t||"exploreUnfocused"in t||"exploreLimit"in t;return"explore"in t&&(this._explore={path:[],shown:new Map}),o&&(e=!0),e?this.relayout({fresh:"direction"in t||"explore"in t}):this._reroute()}exportState(){let t={};for(let[o,n]of this.positions)t[o]={x:qe(n.x),y:qe(n.y),pinned:!!this.pins.get(o)};let e={};if(this.routing)for(let[o,n]of this.routing.paths)e[o]=n.points.map(s=>[Je(s.x),Je(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:o=!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:o}));let n=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=st(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&qt(this.model,this.routing,this.positions,t.edges),this._present(n,e),o&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,e=!0){let o=this.positions.get(t);if(!o)return;let n=this.pins.get(t);(e?n&&n.x===o.x&&n.y===o.y:!n)||this._record(e?"pin":"unpin",()=>this._pin(t,o,e))}_pin(t,e,o){o?this.pins.set(t,{x:e.x,y:e.y}):this.pins.delete(t);let n=this.model.nodeById.get(t);n&&Object.assign(n.constraints,{pinned:o,x:o?e.x:null,y:o?e.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:o})}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:o=!1}={}){let n=(t==null?[]:Array.isArray(t)?t:[t]).map(on).filter(Boolean),s=Ve([...this._sel.values()]);!e&&!o&&this._sel.clear();for(let i of n){let d=i.kind+":"+i.id,r=this._sel.delete(d);o&&r||this._sel.set(d,i)}this.selected=[...this._sel.values()].pop()||null,this._paintSelection(),this._applyHighlight(),this._emit("select",this.selected),Ve([...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 o=this._ex?this.model.edges.filter(i=>!i.target.startsWith(W)):this.model.edges,n=i=>{let d=new Set([t]),r=[],c=[t];for(;c.length;){let h=c.shift();for(let u of o){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:n("previous"),next:n("next"),incoming:o.filter(i=>i.target===t).map(s),outgoing:o.filter(i=>i.source===t).map(s)}}expand(t,e=!0){t=String(t);let o=this.model?.nodeById.get(t);return!o||!te(o.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?.(o.data,!!e),this._emit("expand",{id:t,expanded:!!e,node:o.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 o=(t||[]).map(String),n=this._explore.path;if(this._explore.path=o,this._emit("explore",{path:[...o]}),!this.options.explore)return Promise.resolve(this);let s=o.length>n.length?o[o.length-1]:n[o.length]??o[o.length-1];return this._relayoutKeeping(s,{animate:e,reveal:o[o.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 o=this.renderer.viewport,n=xt({nodes:this.positions,groups:this._groups||new Map});if(!n.width&&!n.height)return;let s=o.clientWidth||800,i=o.clientHeight||600,d=Math.min((s-2*t)/(n.width||1),(i-2*t)/(n.height||1),e);d=re(d,this.options.minZoom,this.options.maxZoom),this.setTransform({k:d,x:(s-n.width*d)/2-n.x*d,y:(i-n.height*d)/2-n.y*d})}fitNodes(t,{padding:e=40,maxZoom:o=this.options.maxZoom,animate:n=this.options.animate,edges:s}={}){let i=this._fitTransform(t,{padding:e,maxZoom:o,edges:s});return i?(this._animateTransform(i,n),!0):!1}_fitTransform(t,{padding:e=40,maxZoom:o=this.options.maxZoom,edges:n}={}){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=n||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),o);return y=re(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",...o}={}){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,o)}let n;if(typeof t=="string")n={kind:"node",id:t};else if(t.kind)n={kind:t.kind,id:String(t.id)};else{let d=this.model?.edges.find(r=>r.data===t);if(!d)return!1;n={kind:"edge",id:d.id}}if(!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id))return!1;let i=At(this.model.edges,n,e);return this.fitNodes(i.nodes,{...o,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,e,o=this.options.animationDuration){this._stopZoom();let n=this.getTransform();if(!e||We()||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)/o),h=i(c),u=n.k*Math.pow(t.k/n.k,h),g=t.k-n.k?(u-n.k)/(t.k-n.k):h;this.setTransform({k:u,x:n.x+(t.x-n.x)*g,y:n.y+(t.y-n.y)*g}),c<1&&(this._zoomAnim=requestAnimationFrame(d))};this._zoomAnim=requestAnimationFrame(d)}zoomAt(t,e,o){let n=this.renderer.transform;t=re(t,this.options.minZoom,this.options.maxZoom);let s=this.renderer.viewport.getBoundingClientRect(),i=e-s.left,d=o-s.top;this.setTransform({k:t,x:i-(i-n.x)*t/n.k,y:d-(d-n.y)*t/n.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,...rn(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(([o,n])=>[o,{...n}])),e=new Map;if(this.routing)for(let[o,n]of this.routing.paths)e.set(o,n.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 o of this._listeners.get(t)||[])try{o(e)}catch(n){console.error(n)}}_refreshView(){this._refreshExplore(),this._stackInfo=this._stacked?.size?ne(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,se(t)),this._seenStackFlag.add(e)}}_refreshExplore(){if(!this.options.explore){this._ex=null,this._viewData=this.data;return}this._exIndexFor!==this.data&&(this._exIndex=Ke(this.data),this._exIndexFor=this.data);let t=this.options;this._ex=Ue(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:o,...n}={}){let s=this.getTransform(),i=this.positions.get(t);await this._build({mode:"relayout",animate:e,...n});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}),o&&this.positions.has(o)){let c=[o,...this.model.edges.filter(u=>u.source===o).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,o=20){let n=this.renderer.viewport,s=n.clientWidth||800,i=n.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>=o&&h>=o&&c+r.width*e.k<=s-o&&h+r.height*e.k<=i-o})}_prepareModel(t){let e=this._viewData||this.data,o=this.renderer.syncNodes(e.nodes||[]),n=(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=Mt({...e,nodes:n},this.userOptions,o);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:o,enterFrom:n=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=(n instanceof Map?n.get(y):n)??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,o);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=mt(y),Ce(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=o||!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=mt(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||st(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,o){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 n={options:this.data.options,nodes:t.nodes.map(r=>({...ie(r.data),id:r.id,width:r.width,height:r.height,constraints:r.constraints})),edges:t.edges.map(r=>ie(r.data)),groups:t.groups.map(r=>({id:r.id,label:r.label})),constraints:(this._viewData?.constraints||[]).map(ie)},s={};for(let[r,c]of Object.entries(this.userOptions))typeof c!="function"&&r!=="worker"&&(s[r]=c);let i=o||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:n,options:s,hints:i})}).then(r=>({nodes:r.nodes,edges:r.edges,crossings:r.crossings,routing:r.routing}))}_reroute(){return this.routing=st(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=wt(this.model,{nodes:this.positions}),e.renderGroups(this.model,this._groups),e.renderEdges(this.model,this.routing,t,t?null:this.positions);for(let o of this._sel.values())o.kind==="edge"&&e.edgeEls.get(o.id)?.classList.add("fg-selected");if(this._hl.length)for(let o of this._hl)o.classList.add("fg-hl");this._exploreFocus()}_exploreFocus(){let t=this.renderer,e=this._ex,o=new Map;if(e){let n=new Set(this._explore.path);for(let[s,i]of e.childCount)o.set(s,{text:n.has(s)?"\u2212":String(i),open:n.has(s),title:`${i} ${i===1?"child":"children"}`})}for(let[n,s]of t.nodeEls)s.classList.toggle("fg-unfocused",!!e&&!e.focus.has(n));for(let n of this.model.edges)t.edgeEls.get(n.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(n.source)&&e.focus.has(n.target))),t.labelEls.get(n.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(n.source)&&e.focus.has(n.target)));t.renderBadges(o)}_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 o=e.querySelector(":scope > .fg-breadcrumb");if(!t.explore||!t.exploreBreadcrumb){o?.remove();return}o||(o=document.createElement("nav"),o.className="fg-breadcrumb",o.setAttribute("aria-label","Explore path"),e.appendChild(o)),o.innerHTML="";let n=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)}),o.appendChild(c)};s(t.exploreStartText,[],!n.length),n.forEach((i,d)=>{let r=document.createElement("span");r.className="fg-breadcrumb__sep",r.textContent="\u203A",r.setAttribute("aria-hidden","true"),o.appendChild(r);let c=this._exIndex?.nodeById.get(i);s(String(c?.label??i),n.slice(0,d+1),d===n.length-1)})}_renderStacks(){this.renderer.renderStacks(this.model,{stacked:this._stacked,counts:this._stackInfo?this._stackInfo.counts:new Map})}_present(t,e,{enters:o=new Map,exits:n=new Map}={}){cancelAnimationFrame(this._anim);let s=new Set,i=()=>{this._animCleanup=null;for(let{el:f}of n.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||We()||!t.routing){i(),this._render();return}let d=this.positions,r=this.renderer.nodeEls,c=this.options.animationDuration*(o.size||n.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([...o.values(),...[...n.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 o.keys()){let m=r.get(f);m&&(m.style.zIndex="1",m.style.pointerEvents="none",s.add(m))}for(let{el:f}of n.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(o.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 o){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 n){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=wt(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,Ge(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],o=new Set(e);this._dragGroup=e.map(s=>{let i=this.positions.get(s);return{id:s,x:i.x,y:i.y}});let n=new Set(o);for(let s of this.model.edges)o.has(s.source)&&n.add(s.target),o.has(s.target)&&n.add(s.source);this._affected=new Set(this.model.edges.filter(s=>n.has(s.source)||n.has(s.target)).map(s=>s.id));for(let s of this._affected){let i=this.model.edgeById.get(s);if(o.has(i.source)||o.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,o){let n=this.positions.get(t),s=this._dragGroup?.find(c=>c.id===t);if(!n||!s)return;let i=e-s.x,d=o-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(lt(f[m],f[m+1],g,1)){this._affected.add(p);break}}}this.routing=st(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:e,y:o,ids:this._dragGroup.map(c=>c.id)})}_dragEnd(t){let e=this.positions.get(t),o=(this._dragGroup||[{id:t}]).map(n=>n.id);this._dragGroup=null,this._recDepth++;try{for(let n of o)this.renderer.nodeEls.get(n)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(n,!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:o}),this._emit("change",this.exportState())}_boxSelect(t,e){let o=[];for(let[n,s]of this.positions)n.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&&o.push({kind:"node",id:n});this.select([...e,...o])}_click(t,e){let o=this.options.multiSelect&&!!(e.ctrlKey||e.metaKey||e.shiftKey);if(!(t.kind==="node"&&this._ex&&!o&&this._exploreClick(t.id)))if(t.kind==="node"){if(t.id.startsWith(W))return;this.select({kind:"node",id:t.id},{toggle:o});let n=this.model.nodeById.get(t.id),s=this.getConnections(t.id);this.options.onNodeClick?.(n.data,e,s),this._emit("nodeclick",{node:n.data,event:e,previous:s.previous,next:s.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id},{toggle:o});let n=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(n.data,e),this._emit("edgeclick",{edge:n.data,event:e})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:e}):(o||this.select(null),this.options.onBackgroundClick?.(e))}_exploreClick(t){if(t.startsWith(W)){let e=t.slice(W.length),o=this._explore.shown;return o.set(e,Math.max(this.options.exploreLimit,o.get(e)||0)+this.options.exploreLimit),this._relayoutKeeping(t),!0}return!this._exIndex.children.has(t)&&!this._explore.path.includes(t)||this.setExplorePath(Ye(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=o=>o.kind==="edge"?(this.data.edges||[]).some((n,s)=>String(n.id??"e"+s)===o.id):this._nodeExists(o.id),e=[...this._sel].filter(([,o])=>!t(o));if(e.length){for(let[o]of e)this._sel.delete(o);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 o=this._capture(t);this._recDepth++;let n;try{n=e()}finally{this._recDepth--}return this._push(o),n}_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[o,n]of this.routing.paths)e[o]=n.points.map(s=>[s.x,s.y]);return{label:t,data:this.data,opts:Object.fromEntries(ae.map(o=>[o,this.options[o]])),positions:new Map([...this.positions].map(([o,n])=>[o,{...n}])),pins:new Map([...this.pins].map(([o,n])=>[o,{...n}])),expanded:[...this.renderer.expanded],stacked:[...this._stacked||[]],layoutEdges:new Map([...this.layoutEdges].map(([o,n])=>[o,{...n,waypoints:(n.waypoints||[]).map(s=>({...s}))}])),edges:e}}async _step(t,e,o){await this._lastBuild;let n=t.pop();if(!n)return!1;e.push(this._capture(n.label)),this._restoring=!0;try{await this._restore(n)}finally{this._restoring=!1}return this._historyChanged(o,n.label),this._emit("change",this.exportState()),!0}async _restore(t){let e=this._snapshot();this.data=t.data;let o=ae.filter(i=>this.options[i]!==t.opts[i]);for(let i of o)this.userOptions[i]=t.opts[i];o.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 n=new Set((this.data.nodes||[]).map(i=>String(i.id))),s=this._explore.path.findIndex(i=>!n.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=st(this.model,{nodes:this.positions,edges:this.layoutEdges}),qt(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 o=this._historyButtons;o&&(o.undo.disabled=!this._undo.length,o.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 o of this._sel.values())if(o.kind==="node"){let n=this.model?.nodeById.get(o.id)?.data??this._exIndex?.nodeById.get(o.id)??(this.data.nodes||[]).find(s=>String(s.id)===o.id);n&&t.push(n)}else{let n=this.model?.edgeById.get(o.id)?.data;n&&e.push(n)}return{items:this.getSelectedItems(),nodes:t,edges:e}}_contextMenu(t,e){let o=this.options,n,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);n={kind:"node",id:t.id,node:i,previous:d.previous,next:d.next,event:e},s=o.onNodeContextMenu&&(()=>o.onNodeContextMenu(i,e,d))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;n={kind:"edge",id:t.id,edge:i,event:e},s=o.onEdgeContextMenu&&(()=>o.onEdgeContextMenu(i,e))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;n={kind:"group",id:t.id,group:i,event:e},s=o.onGroupContextMenu&&(()=>o.onGroupContextMenu(i,e))}else n={kind:"background",event:e},s=o.onBackgroundContextMenu&&(()=>o.onBackgroundContextMenu(e));n.selection=this.getSelectedItems(),(s||this._listeners.get("contextmenu")?.size)&&e.preventDefault(),s?.(),this._emit("contextmenu",n)}_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),o=null;if(this._hovered&&e(this._hovered)?o=At(this.model.edges,this._hovered,this.options.hoverHighlight):this.options.highlightSelection&&this._sel.size>1?o=Qe(this.model.edges,[...this._sel.values()].filter(e)):this.options.highlightSelection&&this.selected&&e(this.selected)&&(o=At(this.model.edges,this.selected,this.options.hoverHighlight)),t.world.classList.toggle("fg-hovering",!!o),!o)return;let n=s=>{s&&(s.classList.add("fg-hl"),this._hl.push(s))};for(let s of o.nodes)n(t.nodeEls.get(s));for(let s of o.edges)n(t.edgeEls.get(s)),n(t.labelEls.get(s))}_controls(){let t=document.createElement("div");t.className="fg-controls";let e=(o,n,s)=>{let i=document.createElement("button");return i.type="button",i.textContent=o,i.title=n,i.setAttribute("aria-label",n),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 o=e("\u21B6","Undo (Ctrl+Z)",()=>this.undo()),n=e("\u21B7","Redo (Ctrl+Shift+Z)",()=>this.redo());o.disabled=n.disabled=!0,o.classList.add("fg-controls__undo"),this._historyButtons={undo:o,redo:n}}this.renderer.viewport.appendChild(t)}},re=(a,t,e)=>Math.max(t,Math.min(e,a)),ae=["direction","edgeRouting"],on=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,Ve=a=>a.map(t=>t.kind+":"+t.id).join("|");function Qe(a,t){let e=new Set,o=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&&(o.add(i.id),e.add(i.source),e.add(i.target))}let n=new Set(t.filter(s=>s.kind==="node").map(s=>s.id));for(let s of a)n.has(s.source)&&n.has(s.target)&&o.add(s.id);return{nodes:e,edges:o}}var qe=a=>Math.round(a*10)/10,Je=a=>Math.round(a*100)/100;function rn(a){let t=a.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}
|
|
9
9
|
|
|
10
10
|
return module.exports;
|
|
11
11
|
});
|