cc-viewer 1.6.259 → 1.6.261
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/App-Co-5BI9q.js +1 -0
- package/dist/assets/{MdxEditorPanel-CWT3SFgC.js → MdxEditorPanel-DFNyQW6b.js} +1 -1
- package/dist/assets/Mobile-DwYIskc6.js +1 -0
- package/dist/assets/{_baseUniq-DXjKWfhk.js → _baseUniq-DGKwdzTD.js} +1 -1
- package/dist/assets/{arc-DsQxkW5T.js → arc-nTLBi2ib.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-D24v83bq.js → architectureDiagram-Q4EWVU46-pWWvthzV.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-D5ezdfnY.js → blockDiagram-DXYQGD6D-CpU6v2gv.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-g5VhpI4X.js → c4Diagram-AHTNJAMY-zdTsx1jJ.js} +1 -1
- package/dist/assets/{channel-Bohj9Wcp.js → channel-Cq1UANGu.js} +1 -1
- package/dist/assets/{chunk-4BX2VUAB-5LFKrDPS.js → chunk-4BX2VUAB-D6w9m5kB.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-B7I8vecx.js → chunk-4TB4RGXK-DjZZc11c.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-BBIiUctL.js → chunk-55IACEB6-Cw2U09Tu.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-BYpcDSKa.js → chunk-EDXVE4YY-Cv-G70H7.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-Dpw6TUJP.js → chunk-FMBD7UC4-Dykxux6b.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-1R1GcGjy.js → chunk-OYMX7WX6-Cn9oAaEC.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-B43hQ2vS.js → chunk-QZHKN3VN-CA1IccbG.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-1IZth8n2.js → chunk-YZCP3GAM-CbReBNg5.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-PgwmelQQ.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-PgwmelQQ.js +1 -0
- package/dist/assets/clone-Dnu1HdEX.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-D05nug0R.js → cose-bilkent-S5V4N54A-TwxpCIwM.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-DZ9d_ZUE.js → dagre-KV5264BT-CxuHKd9a.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-DdyX_gXl.js → diagram-5BDNPKRD-BzR9Peib.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-cjq8tNSZ.js → diagram-G4DWMVQ6-PWFXrQqF.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-NiKFms6e.js → diagram-MMDJMWI5-CqnrwtNB.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-Dpig5X9-.js → diagram-TYMM5635-Do2MhBCf.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-D2sWo3Zv.js → erDiagram-SMLLAGMA-CklZI6kO.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-D85Dj_yq.js → flowDiagram-DWJPFMVM-C_SKJN0d.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-DxAjpfgn.js → ganttDiagram-T4ZO3ILL-ChhhqFiR.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-BO9g8cL0.js → gitGraphDiagram-UUTBAWPF-HarEJVSI.js} +1 -1
- package/dist/assets/{graph-BfcDIvNk.js → graph-BTcI3kpi.js} +1 -1
- package/dist/assets/{index-PkTBRWSU.js → index-B0NtFDg2.js} +1 -1
- package/dist/assets/{index-Bxmjxqf5.js → index-B7-pqPyp.js} +1 -1
- package/dist/assets/{index-CGqcaIdp.js → index-BG6Hzhck.js} +1 -1
- package/dist/assets/{index-BEpSzlsR.js → index-Bzp41aRh.js} +1 -1
- package/dist/assets/index-C6MrFmhs.js +2 -0
- package/dist/assets/{index-BJjKgolB.js → index-CF0YP7s8.js} +1 -1
- package/dist/assets/{index-9sv7BDJr.js → index-CQ579eP2.js} +1 -1
- package/dist/assets/{index-sVTuiL15.css → index-Dzkxj8m_.css} +1 -1
- package/dist/assets/{index-7d_JTozZ.js → index-NNx0667m.js} +1 -1
- package/dist/assets/{infoDiagram-42DDH7IO-BnOW3PpN.js → infoDiagram-42DDH7IO-DOcCtSEj.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-BdRWHTx5.js → ishikawaDiagram-UXIWVN3A-Crb_pmG4.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-6-pOxb-c.js → journeyDiagram-VCZTEJTY-BUv2Exj_.js} +1 -1
- package/dist/assets/{jszip.min-DKP-m-LG.js → jszip.min-BuZCDHia.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-BBX4NlcN.js → kanban-definition-6JOO6SKY-DwSHz9oV.js} +1 -1
- package/dist/assets/{layout-DtQNOuH0.js → layout-Dp3N3WRT.js} +1 -1
- package/dist/assets/{linear-6Y3OZ7u2.js → linear-JU5ltHCp.js} +1 -1
- package/dist/assets/{mermaid.core-CAsnLdlL.js → mermaid.core-f1mZHh7u.js} +2 -2
- package/dist/assets/{min-BRPZJLHh.js → min-CDzial6q.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-BkmfcnFE.js → mindmap-definition-QFDTVHPH-DnhPHplB.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-D4a_1EvH.js → pieDiagram-DEJITSTG-dMhPj5wG.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-kKniISLU.js → quadrantDiagram-34T5L4WZ-GCi1_zHo.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-DPikXO53.js → requirementDiagram-MS252O5E-WeErs64x.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6--rY8uDK7.js → sankeyDiagram-XADWPNL6-BKpP6-8Q.js} +1 -1
- package/dist/assets/seqResourceLoaders-80G7f5Kr.js +2 -0
- package/dist/assets/seqResourceLoaders-B8CyM6Ul.css +41 -0
- package/dist/assets/{sequenceDiagram-FGHM5R23-C57z6bd_.js → sequenceDiagram-FGHM5R23-CAC5BKbx.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-D7q_cBTL.js → stateDiagram-FHFEXIEX-Cxrg604Z.js} +1 -1
- package/dist/assets/{stateDiagram-v2-QKLJ7IA2-Co3EU6Nf.js → stateDiagram-v2-QKLJ7IA2-DaUpf340.js} +1 -1
- package/dist/assets/{timeline-definition-GMOUNBTQ-DBV-lv69.js → timeline-definition-GMOUNBTQ-DbvXGDTU.js} +1 -1
- package/dist/assets/{vendor-antd-BeN8xqGk.js → vendor-antd-jGWxgt_-.js} +1 -1
- package/dist/assets/{vendor-codemirror-2nbmPewy.js → vendor-codemirror-9gysGjWj.js} +1 -1
- package/dist/assets/{vendor-mdxeditor-C7DYEBoH.js → vendor-mdxeditor-BFiCaYAL.js} +2 -2
- package/dist/assets/{vendor-qrcode-BFV_3WPO.js → vendor-qrcode-DjZ-VpGR.js} +1 -1
- package/dist/assets/{vendor-virtuoso-COKXGpsa.js → vendor-virtuoso-DB1J9xKG.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-ngWDn_ip.js → vennDiagram-DHZGUBPP-BoIw-nWl.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-BhMXVlU_.js → wardley-RL74JXVD-4PjirsHP.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-lpdygHK-.js → wardleyDiagram-NUSXRM2D-C8RzJmfU.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-DVafENtB.js → xychartDiagram-5P7HB3ND-Ct6fDXwq.js} +1 -1
- package/dist/index.html +5 -5
- package/package.json +1 -1
- package/dist/assets/App-eBSb5fy2.js +0 -1
- package/dist/assets/Mobile-DdB1mwp_.js +0 -1
- package/dist/assets/ProxyModal-DGzTxXqd.js +0 -2
- package/dist/assets/ProxyModal-DzTu4uGE.css +0 -41
- package/dist/assets/classDiagram-6PBFFD2Q-BBoAxatM.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-BBoAxatM.js +0 -1
- package/dist/assets/clone-Cc7ofJ6W.js +0 -1
- package/dist/assets/index-BGEXf37A.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aC as adjustChannel,s as setAccDescription,g as getAccDescription,q as getDiagramTitle,p as setDiagramTitle,a as getAccTitle,b as setAccTitle,_ as __name,C as getConfig,H as selectSvgElement,d as select,ar as at,U as isDark,V as lighten,W as darken,e as configureSvgSize,y as clear,E as cleanAndMerge,F as defaultConfig_default}from"./mermaid.core-CAsnLdlL.js";import"./vendor-mdxeditor-C7DYEBoH.js";import"./vendor-antd-BeN8xqGk.js";import"./vendor-codemirror-2nbmPewy.js";import"./vendor-markdown-BFrYfpb0.js";const transparentize=(color,amount)=>adjustChannel(color,"a",-amount);function intersectionArea(circles,stats){const intersectionPoints=function(circles){const ret=[];for(let i=0;i<circles.length;++i)for(let j=i+1;j<circles.length;++j){const intersect=circleCircleIntersection(circles[i],circles[j]);for(const p of intersect)p.parentIndex=[i,j],ret.push(p)}return ret}(circles),innerPoints=intersectionPoints.filter(p=>function(point,circles){return circles.every(circle=>distance(point,circle)<circle.radius+1e-10)}(p,circles));let arcArea=0,polygonArea=0;const arcs=[];if(innerPoints.length>1){const center=getCenter(innerPoints);for(let i=0;i<innerPoints.length;++i){const p=innerPoints[i];p.angle=Math.atan2(p.x-center.x,p.y-center.y)}innerPoints.sort((a,b)=>b.angle-a.angle);let p2=innerPoints[innerPoints.length-1];for(let i=0;i<innerPoints.length;++i){const p1=innerPoints[i];polygonArea+=(p2.x+p1.x)*(p1.y-p2.y);const midPoint={x:(p1.x+p2.x)/2,y:(p1.y+p2.y)/2};let arc=null;for(let j=0;j<p1.parentIndex.length;++j)if(p2.parentIndex.includes(p1.parentIndex[j])){const circle=circles[p1.parentIndex[j]],a1=Math.atan2(p1.x-circle.x,p1.y-circle.y),a2=Math.atan2(p2.x-circle.x,p2.y-circle.y);let angleDiff=a2-a1;angleDiff<0&&(angleDiff+=2*Math.PI);const a=a2-angleDiff/2;let width=distance(midPoint,{x:circle.x+circle.radius*Math.sin(a),y:circle.y+circle.radius*Math.cos(a)});width>2*circle.radius&&(width=2*circle.radius),(null==arc||arc.width>width)&&(arc={circle:circle,width:width,p1:p1,p2:p2,large:width>circle.radius,sweep:!0})}null!=arc&&(arcs.push(arc),arcArea+=circleArea(arc.circle.radius,arc.width),p2=p1)}}else{let smallest=circles[0];for(let i=1;i<circles.length;++i)circles[i].radius<smallest.radius&&(smallest=circles[i]);let disjoint=!1;for(let i=0;i<circles.length;++i)if(distance(circles[i],smallest)>Math.abs(smallest.radius-circles[i].radius)){disjoint=!0;break}disjoint?arcArea=polygonArea=0:(arcArea=smallest.radius*smallest.radius*Math.PI,arcs.push({circle:smallest,p1:{x:smallest.x,y:smallest.y+smallest.radius},p2:{x:smallest.x-1e-10,y:smallest.y+smallest.radius},width:2*smallest.radius,large:!0,sweep:!0}))}return polygonArea/=2,stats&&(stats.area=arcArea+polygonArea,stats.arcArea=arcArea,stats.polygonArea=polygonArea,stats.arcs=arcs,stats.innerPoints=innerPoints,stats.intersectionPoints=intersectionPoints),arcArea+polygonArea}function circleArea(r,width){return r*r*Math.acos(1-width/r)-(r-width)*Math.sqrt(width*(2*r-width))}function distance(p1,p2){return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))}function circleOverlap(r1,r2,d){if(d>=r1+r2)return 0;if(d<=Math.abs(r1-r2))return Math.PI*Math.min(r1,r2)*Math.min(r1,r2);const w2=r2-(d*d-r1*r1+r2*r2)/(2*d);return circleArea(r1,r1-(d*d-r2*r2+r1*r1)/(2*d))+circleArea(r2,w2)}function circleCircleIntersection(p1,p2){const d=distance(p1,p2),r1=p1.radius,r2=p2.radius;if(d>=r1+r2||d<=Math.abs(r1-r2))return[];const a=(r1*r1-r2*r2+d*d)/(2*d),h=Math.sqrt(r1*r1-a*a),x0=p1.x+a*(p2.x-p1.x)/d,y0=p1.y+a*(p2.y-p1.y)/d,rx=-(p2.y-p1.y)*(h/d),ry=-(p2.x-p1.x)*(h/d);return[{x:x0+rx,y:y0-ry},{x:x0-rx,y:y0+ry}]}function getCenter(points){const center={x:0,y:0};for(const point of points)center.x+=point.x,center.y+=point.y;return center.x/=points.length,center.y/=points.length,center}function zeros(x){const r=new Array(x);for(let i=0;i<x;++i)r[i]=0;return r}function zerosM(x,y){return zeros(x).map(()=>zeros(y))}function dot(a,b){let ret=0;for(let i=0;i<a.length;++i)ret+=a[i]*b[i];return ret}function norm2(a){return Math.sqrt(dot(a,a))}function scale(ret,value,c){for(let i=0;i<value.length;++i)ret[i]=value[i]*c}function weightedSum(ret,w1,v1,w2,v2){for(let j=0;j<ret.length;++j)ret[j]=w1*v1[j]+w2*v2[j]}function nelderMead(f,x0,parameters){const maxIterations=(parameters=parameters||{}).maxIterations||200*x0.length,nonZeroDelta=parameters.nonZeroDelta||1.05,zeroDelta=parameters.zeroDelta||.001,minErrorDelta=parameters.minErrorDelta||1e-6,minTolerance=parameters.minErrorDelta||1e-5,rho=void 0!==parameters.rho?parameters.rho:1,chi=void 0!==parameters.chi?parameters.chi:2,psi=void 0!==parameters.psi?parameters.psi:-.5,sigma=void 0!==parameters.sigma?parameters.sigma:.5;let maxDiff;const N=x0.length,simplex=new Array(N+1);simplex[0]=x0,simplex[0].fx=f(x0),simplex[0].id=0;for(let i=0;i<N;++i){const point=x0.slice();point[i]=point[i]?point[i]*nonZeroDelta:zeroDelta,simplex[i+1]=point,simplex[i+1].fx=f(point),simplex[i+1].id=i+1}function updateSimplex(value){for(let i=0;i<value.length;i++)simplex[N][i]=value[i];simplex[N].fx=value.fx}const sortOrder=(a,b)=>a.fx-b.fx,centroid=x0.slice(),reflected=x0.slice(),contracted=x0.slice(),expanded=x0.slice();for(let iteration=0;iteration<maxIterations;++iteration){if(simplex.sort(sortOrder),parameters.history){const sortedSimplex=simplex.map(x=>{const state=x.slice();return state.fx=x.fx,state.id=x.id,state});sortedSimplex.sort((a,b)=>a.id-b.id),parameters.history.push({x:simplex[0].slice(),fx:simplex[0].fx,simplex:sortedSimplex})}maxDiff=0;for(let i=0;i<N;++i)maxDiff=Math.max(maxDiff,Math.abs(simplex[0][i]-simplex[1][i]));if(Math.abs(simplex[0].fx-simplex[N].fx)<minErrorDelta&&maxDiff<minTolerance)break;for(let i=0;i<N;++i){centroid[i]=0;for(let j=0;j<N;++j)centroid[i]+=simplex[j][i];centroid[i]/=N}const worst=simplex[N];if(weightedSum(reflected,1+rho,centroid,-rho,worst),reflected.fx=f(reflected),reflected.fx<simplex[0].fx)weightedSum(expanded,1+chi,centroid,-chi,worst),expanded.fx=f(expanded),expanded.fx<reflected.fx?updateSimplex(expanded):updateSimplex(reflected);else if(reflected.fx>=simplex[N-1].fx){let shouldReduce=!1;if(reflected.fx>worst.fx?(weightedSum(contracted,1+psi,centroid,-psi,worst),contracted.fx=f(contracted),contracted.fx<worst.fx?updateSimplex(contracted):shouldReduce=!0):(weightedSum(contracted,1-psi*rho,centroid,psi*rho,worst),contracted.fx=f(contracted),contracted.fx<reflected.fx?updateSimplex(contracted):shouldReduce=!0),shouldReduce){if(sigma>=1)break;for(let i=1;i<simplex.length;++i)weightedSum(simplex[i],1-sigma,simplex[0],sigma,simplex[i]),simplex[i].fx=f(simplex[i])}}else updateSimplex(reflected)}return simplex.sort(sortOrder),{fx:simplex[0].fx,x:simplex[0]}}function wolfeLineSearch(f,pk,current,next,a,c1,c2){const phi0=current.fx,phiPrime0=dot(current.fxprime,pk);let phi=phi0,phi_old=phi0,phiPrime=phiPrime0,a0=0;function zoom(a_lo,a_high,phi_lo){for(let iteration=0;iteration<16;++iteration)if(a=(a_lo+a_high)/2,weightedSum(next.x,1,current.x,a,pk),phi=next.fx=f(next.x,next.fxprime),phiPrime=dot(next.fxprime,pk),phi>phi0+c1*a*phiPrime0||phi>=phi_lo)a_high=a;else{if(Math.abs(phiPrime)<=-c2*phiPrime0)return a;phiPrime*(a_high-a_lo)>=0&&(a_high=a_lo),a_lo=a,phi_lo=phi}return 0}a=a||1,c1=c1||1e-6,c2=c2||.1;for(let iteration=0;iteration<10;++iteration){if(weightedSum(next.x,1,current.x,a,pk),phi=next.fx=f(next.x,next.fxprime),phiPrime=dot(next.fxprime,pk),phi>phi0+c1*a*phiPrime0||iteration&&phi>=phi_old)return zoom(a0,a,phi_old);if(Math.abs(phiPrime)<=-c2*phiPrime0)return a;if(phiPrime>=0)return zoom(a,a0,phi);phi_old=phi,a0=a,a*=2}return a}function conjugateGradient(f,initial,params){let current={x:initial.slice(),fx:0,fxprime:initial.slice()},next={x:initial.slice(),fx:0,fxprime:initial.slice()};const yk=initial.slice();let pk,temp,maxIterations,a=1;maxIterations=(params=params||{}).maxIterations||20*initial.length,current.fx=f(current.x,current.fxprime),pk=current.fxprime.slice(),scale(pk,current.fxprime,-1);for(let i=0;i<maxIterations;++i){if(a=wolfeLineSearch(f,pk,current,next,a),params.history&¶ms.history.push({x:current.x.slice(),fx:current.fx,fxprime:current.fxprime.slice(),alpha:a}),a){weightedSum(yk,1,next.fxprime,-1,current.fxprime);const delta_k=dot(current.fxprime,current.fxprime);weightedSum(pk,Math.max(0,dot(yk,next.fxprime)/delta_k),pk,-1,next.fxprime),temp=current,current=next,next=temp}else scale(pk,current.fxprime,-1);if(norm2(current.fxprime)<=1e-5)break}return params.history&¶ms.history.push({x:current.x.slice(),fx:current.fx,fxprime:current.fxprime.slice(),alpha:a}),current}function venn(sets,parameters={}){parameters.maxIterations=parameters.maxIterations||500;const initialLayout=parameters.initialLayout||bestInitialLayout,loss=parameters.lossFunction||lossFunction,areas=function(areas,parameters={}){const distinct=parameters.distinct,r=areas.map(s=>Object.assign({},s));function toKey(arr){return arr.join(";")}if(distinct){const count=new Map;for(const area of r)for(let i=0;i<area.sets.length;i++){const si=String(area.sets[i]);count.set(si,area.size+(count.get(si)||0));for(let j=i+1;j<area.sets.length;j++){const sj=String(area.sets[j]),k1=`${si};${sj}`,k2=`${sj};${si}`;count.set(k1,area.size+(count.get(k1)||0)),count.set(k2,area.size+(count.get(k2)||0))}}for(const area of r)area.sets.length<3&&(area.size=count.get(toKey(area.sets)))}const ids=[],pairs=new Set;for(const area of r)if(1===area.sets.length)ids.push(area.sets[0]);else if(2===area.sets.length){const a=area.sets[0],b=area.sets[1];pairs.add(toKey(area.sets)),pairs.add(toKey([b,a]))}ids.sort((a,b)=>a===b?0:a<b?-1:1);for(let i=0;i<ids.length;++i){const a=ids[i];for(let j=i+1;j<ids.length;++j){const b=ids[j];pairs.has(toKey([a,b]))||r.push({sets:[a,b],size:0})}}return r}(sets,parameters),circles=initialLayout(areas,parameters),setids=Object.keys(circles),initial=[];for(const setid of setids)initial.push(circles[setid].x),initial.push(circles[setid].y);const positions=nelderMead(values=>{const current={};for(let i=0;i<setids.length;++i){const setid=setids[i];current[setid]={x:values[2*i],y:values[2*i+1],radius:circles[setid].radius}}return loss(current,areas)},initial,parameters).x;for(let i=0;i<setids.length;++i){const setid=setids[i];circles[setid].x=positions[2*i],circles[setid].y=positions[2*i+1]}return circles}const SMALL=1e-10;function distanceFromIntersectArea(r1,r2,overlap){return Math.min(r1,r2)*Math.min(r1,r2)*Math.PI<=overlap+SMALL?Math.abs(r1-r2):function(f,a,b,parameters){const maxIterations=(parameters=parameters||{}).maxIterations||100,tolerance=parameters.tolerance||1e-10,fA=f(a),fB=f(b);let delta=b-a;if(fA*fB>0)throw"Initial bisect points must have opposite signs";if(0===fA)return a;if(0===fB)return b;for(let i=0;i<maxIterations;++i){delta/=2;const mid=a+delta,fMid=f(mid);if(fMid*fA>=0&&(a=mid),Math.abs(delta)<tolerance||0===fMid)return mid}return a+delta}(distance2=>circleOverlap(r1,r2,distance2)-overlap,0,r1+r2)}function bestInitialLayout(areas,params={}){let initial=function(areas,params){const loss=params&¶ms.lossFunction?params.lossFunction:lossFunction,circles={},setOverlaps={};for(const area of areas)if(1===area.sets.length){const set=area.sets[0];circles[set]={x:1e10,y:1e10,rowid:circles.length,size:area.size,radius:Math.sqrt(area.size/Math.PI)},setOverlaps[set]=[]}areas=areas.filter(a=>2===a.sets.length);for(const current of areas){let weight=null!=current.weight?current.weight:1;const left=current.sets[0],right=current.sets[1];current.size+SMALL>=Math.min(circles[left].size,circles[right].size)&&(weight=0),setOverlaps[left].push({set:right,size:current.size,weight:weight}),setOverlaps[right].push({set:left,size:current.size,weight:weight})}const mostOverlapped=[];function sortOrder(a,b){return b.size-a.size}Object.keys(setOverlaps).forEach(set=>{let size=0;for(let i=0;i<setOverlaps[set].length;++i)size+=setOverlaps[set][i].size*setOverlaps[set][i].weight;mostOverlapped.push({set:set,size:size})}),mostOverlapped.sort(sortOrder);const positioned={};function isPositioned(element){return element.set in positioned}function positionSet(point,index){circles[index].x=point.x,circles[index].y=point.y,positioned[index]=!0}positionSet({x:0,y:0},mostOverlapped[0].set);for(let i=1;i<mostOverlapped.length;++i){const setIndex=mostOverlapped[i].set,overlap=setOverlaps[setIndex].filter(isPositioned),set=circles[setIndex];if(overlap.sort(sortOrder),0===overlap.length)throw"ERROR: missing pairwise overlap information";const points=[];for(var j=0;j<overlap.length;++j){const p1=circles[overlap[j].set],d1=distanceFromIntersectArea(set.radius,p1.radius,overlap[j].size);points.push({x:p1.x+d1,y:p1.y}),points.push({x:p1.x-d1,y:p1.y}),points.push({y:p1.y+d1,x:p1.x}),points.push({y:p1.y-d1,x:p1.x});for(let k=j+1;k<overlap.length;++k){const p2=circles[overlap[k].set],d2=distanceFromIntersectArea(set.radius,p2.radius,overlap[k].size),extraPoints=circleCircleIntersection({x:p1.x,y:p1.y,radius:d1},{x:p2.x,y:p2.y,radius:d2});points.push(...extraPoints)}}let bestLoss=1e50,bestPoint=points[0];for(const point of points){circles[setIndex].x=point.x,circles[setIndex].y=point.y;const localLoss=loss(circles,areas);localLoss<bestLoss&&(bestLoss=localLoss,bestPoint=point)}positionSet(bestPoint,setIndex)}return circles}(areas,params);const loss=params.lossFunction||lossFunction;if(areas.length>=8){const constrained=function(areas,params={}){const restarts=params.restarts||10,sets=[],setids={};for(const area of areas)1===area.sets.length&&(setids[area.sets[0]]=sets.length,sets.push(area));let{distances:distances,constraints:constraints}=function(areas,sets,setids){const distances=zerosM(sets.length,sets.length),constraints=zerosM(sets.length,sets.length);return areas.filter(x=>2===x.sets.length).forEach(current=>{const left=setids[current.sets[0]],right=setids[current.sets[1]],distance2=distanceFromIntersectArea(Math.sqrt(sets[left].size/Math.PI),Math.sqrt(sets[right].size/Math.PI),current.size);distances[left][right]=distances[right][left]=distance2;let c=0;current.size+1e-10>=Math.min(sets[left].size,sets[right].size)?c=1:current.size<=1e-10&&(c=-1),constraints[left][right]=constraints[right][left]=c}),{distances:distances,constraints:constraints}}(areas,sets,setids);const norm=norm2(distances.map(norm2))/distances.length;distances=distances.map(row=>row.map(value=>value/norm));const obj=(x,fxprime)=>function(x,fxprime,distances,constraints){for(let i=0;i<fxprime.length;++i)fxprime[i]=0;let loss=0;for(let i=0;i<distances.length;++i){const xi=x[2*i],yi=x[2*i+1];for(let j=i+1;j<distances.length;++j){const xj=x[2*j],yj=x[2*j+1],dij=distances[i][j],constraint=constraints[i][j],squaredDistance=(xj-xi)*(xj-xi)+(yj-yi)*(yj-yi),distance2=Math.sqrt(squaredDistance),delta=squaredDistance-dij*dij;constraint>0&&distance2<=dij||constraint<0&&distance2>=dij||(loss+=2*delta*delta,fxprime[2*i]+=4*delta*(xi-xj),fxprime[2*i+1]+=4*delta*(yi-yj),fxprime[2*j]+=4*delta*(xj-xi),fxprime[2*j+1]+=4*delta*(yj-yi))}}return loss}(x,fxprime,distances,constraints);let best=null;for(let i=0;i<restarts;++i){const current=conjugateGradient(obj,zeros(2*distances.length).map(Math.random),params);(!best||current.fx<best.fx)&&(best=current)}const positions=best.x,circles={};for(let i=0;i<sets.length;++i){const set=sets[i];circles[set.sets[0]]={x:positions[2*i]*norm,y:positions[2*i+1]*norm,radius:Math.sqrt(set.size/Math.PI)}}if(params.history)for(const h of params.history)scale(h.x,norm);return circles}(areas,params);loss(constrained,areas)+1e-8<loss(initial,areas)&&(initial=constrained)}return initial}function lossFunction(circles,overlaps){let output=0;for(const area of overlaps){if(1===area.sets.length)continue;let overlap;if(2===area.sets.length){const left=circles[area.sets[0]],right=circles[area.sets[1]];overlap=circleOverlap(left.radius,right.radius,distance(left,right))}else overlap=intersectionArea(area.sets.map(d=>circles[d]));output+=(null!=area.weight?area.weight:1)*(overlap-area.size)*(overlap-area.size)}return output}function logRatioLossFunction(circles,overlaps){let output=0;for(const area of overlaps){if(1===area.sets.length)continue;let overlap;if(2===area.sets.length){const left=circles[area.sets[0]],right=circles[area.sets[1]];overlap=circleOverlap(left.radius,right.radius,distance(left,right))}else overlap=intersectionArea(area.sets.map(d=>circles[d]));const weight=null!=area.weight?area.weight:1,differenceFromIdeal=Math.log((overlap+1)/(area.size+1));output+=weight*differenceFromIdeal*differenceFromIdeal}return output}function orientateCircles(circles,orientation,orientationOrder){if(null==orientationOrder?circles.sort((a,b)=>b.radius-a.radius):circles.sort(orientationOrder),circles.length>0){const largestX=circles[0].x,largestY=circles[0].y;for(const circle of circles)circle.x-=largestX,circle.y-=largestY}if(2===circles.length){distance(circles[0],circles[1])<Math.abs(circles[1].radius-circles[0].radius)&&(circles[1].x=circles[0].x+circles[0].radius-circles[1].radius-1e-10,circles[1].y=circles[0].y)}if(circles.length>1){const rotation=Math.atan2(circles[1].x,circles[1].y)-orientation,c=Math.cos(rotation),s=Math.sin(rotation);for(const circle of circles){const x=circle.x,y=circle.y;circle.x=c*x-s*y,circle.y=s*x+c*y}}if(circles.length>2){let angle=Math.atan2(circles[2].x,circles[2].y)-orientation;for(;angle<0;)angle+=2*Math.PI;for(;angle>2*Math.PI;)angle-=2*Math.PI;if(angle>Math.PI){const slope=circles[1].y/(1e-10+circles[1].x);for(const circle of circles){var d=(circle.x+slope*circle.y)/(1+slope*slope);circle.x=2*d-circle.x,circle.y=2*d*slope-circle.y}}}}function getBoundingBox(circles){const minMax=d=>({max:circles.reduce((acc,c)=>Math.max(acc,c[d]+c.radius),Number.NEGATIVE_INFINITY),min:circles.reduce((acc,c)=>Math.min(acc,c[d]-c.radius),Number.POSITIVE_INFINITY)});return{xRange:minMax("x"),yRange:minMax("y")}}function normalizeSolution(solution,orientation,orientationOrder){null==orientation&&(orientation=Math.PI/2);let circles=fromObjectNotation(solution).map(d=>Object.assign({},d));const clusters=function(circles){function find(circle){return circle.parent!==circle&&(circle.parent=find(circle.parent)),circle.parent}function union(x,y){const xRoot=find(x),yRoot=find(y);xRoot.parent=yRoot}circles.forEach(circle=>{circle.parent=circle});for(let i=0;i<circles.length;++i)for(let j=i+1;j<circles.length;++j){const maxDistance=circles[i].radius+circles[j].radius;distance(circles[i],circles[j])+1e-10<maxDistance&&union(circles[j],circles[i])}const disjointClusters=new Map;for(let i=0;i<circles.length;++i){const setid=find(circles[i]).parent.setid;disjointClusters.has(setid)||disjointClusters.set(setid,[]),disjointClusters.get(setid).push(circles[i])}return circles.forEach(circle=>{delete circle.parent}),Array.from(disjointClusters.values())}(circles);for(const cluster of clusters){orientateCircles(cluster,orientation,orientationOrder);const bounds=getBoundingBox(cluster);cluster.size=(bounds.xRange.max-bounds.xRange.min)*(bounds.yRange.max-bounds.yRange.min),cluster.bounds=bounds}clusters.sort((a,b)=>b.size-a.size),circles=clusters[0];let returnBounds=circles.bounds;const spacing=(returnBounds.xRange.max-returnBounds.xRange.min)/50;function addCluster(cluster,right,bottom){if(!cluster)return;const bounds=cluster.bounds;let xOffset,yOffset;if(right)xOffset=returnBounds.xRange.max-bounds.xRange.min+spacing;else{xOffset=returnBounds.xRange.max-bounds.xRange.max;const centreing=(bounds.xRange.max-bounds.xRange.min)/2-(returnBounds.xRange.max-returnBounds.xRange.min)/2;centreing<0&&(xOffset+=centreing)}if(bottom)yOffset=returnBounds.yRange.max-bounds.yRange.min+spacing;else{yOffset=returnBounds.yRange.max-bounds.yRange.max;const centreing=(bounds.yRange.max-bounds.yRange.min)/2-(returnBounds.yRange.max-returnBounds.yRange.min)/2;centreing<0&&(yOffset+=centreing)}for(const c of cluster)c.x+=xOffset,c.y+=yOffset,circles.push(c)}let index=1;for(;index<clusters.length;)addCluster(clusters[index],!0,!1),addCluster(clusters[index+1],!1,!0),addCluster(clusters[index+2],!0,!0),index+=3,returnBounds=getBoundingBox(circles);return toObjectNotation(circles)}function scaleSolution(solution,width,height,padding,scaleToFit){const circles=fromObjectNotation(solution);width-=2*padding,height-=2*padding;const{xRange:xRange,yRange:yRange}=getBoundingBox(circles);if(xRange.max===xRange.min||yRange.max===yRange.min)return console.log("not scaling solution: zero size detected"),solution;let xScaling,yScaling;if(scaleToFit){const toScaleDiameter=2*Math.sqrt(scaleToFit/Math.PI);xScaling=width/toScaleDiameter,yScaling=height/toScaleDiameter}else xScaling=width/(xRange.max-xRange.min),yScaling=height/(yRange.max-yRange.min);const scaling=Math.min(yScaling,xScaling),xOffset=(width-(xRange.max-xRange.min)*scaling)/2,yOffset=(height-(yRange.max-yRange.min)*scaling)/2;return toObjectNotation(circles.map(circle=>({radius:scaling*circle.radius,x:padding+xOffset+(circle.x-xRange.min)*scaling,y:padding+yOffset+(circle.y-yRange.min)*scaling,setid:circle.setid})))}function toObjectNotation(circles){const r={};for(const circle of circles)r[circle.setid]=circle;return r}function fromObjectNotation(solution){return Object.keys(solution).map(id=>Object.assign(solution[id],{setid:id}))}function VennDiagram(options={}){let useViewBox=!1,width=600,height=350,padding=15,duration=1e3,orientation=Math.PI/2,normalize=!0,scaleToFit=null,wrap=!0,styled=!0,fontSize=null,orientationOrder=null,distinct=!1,round=null,symmetricalTextCentre=!(!options||!options.symmetricalTextCentre)&&options.symmetricalTextCentre,colourMap={},colourScheme=options&&options.colourScheme?options.colourScheme:options&&options.colorScheme?options.colorScheme:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],colourIndex=0,colours=function(key){if(key in colourMap)return colourMap[key];var ret=colourMap[key]=colourScheme[colourIndex];return colourIndex+=1,colourIndex>=colourScheme.length&&(colourIndex=0),ret},layoutFunction=venn,loss=lossFunction;function chart(selection){let data=selection.datum();const toRemove=new Set;data.forEach(datum=>{0==datum.size&&1==datum.sets.length&&toRemove.add(datum.sets[0])}),data=data.filter(datum=>!datum.sets.some(set=>toRemove.has(set)));let circles={},textCentres={};if(data.length>0){let solution=layoutFunction(data,{lossFunction:loss,distinct:distinct});normalize&&(solution=normalizeSolution(solution,orientation,orientationOrder)),circles=scaleSolution(solution,width,height,padding,scaleToFit),textCentres=computeTextCentres(circles,data,symmetricalTextCentre)}const labels={};function label(d){return d.sets in labels?labels[d.sets]:1==d.sets.length?""+d.sets[0]:void 0}data.forEach(datum=>{datum.label&&(labels[datum.sets]=datum.label)}),selection.selectAll("svg").data([circles]).enter().append("svg");const svg=selection.select("svg");useViewBox?svg.attr("viewBox",`0 0 ${width} ${height}`):svg.attr("width",width).attr("height",height);const previous={};let hasPrevious=!1;function pathTween(d){return t=>intersectionAreaPath(d.sets.map(set=>{let start=previous[set],end=circles[set];return start||(start={x:width/2,y:height/2,radius:1}),end||(end={x:width/2,y:height/2,radius:1}),{x:start.x*(1-t)+end.x*t,y:start.y*(1-t)+end.y*t,radius:start.radius*(1-t)+end.radius*t}}),round)}svg.selectAll(".venn-area path").each(function(d){const path=this.getAttribute("d");1==d.sets.length&&path&&!distinct&&(hasPrevious=!0,previous[d.sets[0]]=function(path){const tokens=path.split(" ");return{x:Number.parseFloat(tokens[1]),y:Number.parseFloat(tokens[2]),radius:-Number.parseFloat(tokens[4])}}(path))});const nodes=svg.selectAll(".venn-area").data(data,d=>d.sets),enter=nodes.enter().append("g").attr("class",d=>`venn-area venn-${1==d.sets.length?"circle":"intersection"}${d.colour||d.color?" venn-coloured":""}`).attr("data-venn-sets",d=>d.sets.join("_")),enterPath=enter.append("path"),enterText=enter.append("text").attr("class","label").text(d=>label(d)).attr("text-anchor","middle").attr("dy",".35em").attr("x",width/2).attr("y",height/2);function asTransition(s){return"function"==typeof s.transition?s.transition("venn").duration(duration):s}styled&&(enterPath.style("fill-opacity","0").filter(d=>1==d.sets.length).style("fill",d=>d.colour?d.colour:d.color?d.color:colours(d.sets)).style("fill-opacity",".25"),enterText.style("fill",d=>d.colour||d.color?"#FFF":options.textFill?options.textFill:1==d.sets.length?colours(d.sets):"#444"));let update=selection;hasPrevious&&"function"==typeof update.transition?(update=asTransition(selection),update.selectAll("path").attrTween("d",pathTween)):update.selectAll("path").attr("d",d=>intersectionAreaPath(d.sets.map(set=>circles[set])),round);const updateText=update.selectAll("text").filter(d=>d.sets in textCentres).text(d=>label(d)).attr("x",d=>Math.floor(textCentres[d.sets].x)).attr("y",d=>Math.floor(textCentres[d.sets].y));wrap&&(hasPrevious?"on"in updateText?updateText.on("end",wrapText(circles,label)):updateText.each("end",wrapText(circles,label)):updateText.each(wrapText(circles,label)));const exit=asTransition(nodes.exit()).remove();"function"==typeof nodes.transition&&exit.selectAll("path").attrTween("d",pathTween);const exitText=exit.selectAll("text").attr("x",width/2).attr("y",height/2);return null!==fontSize&&(enterText.style("font-size","0px"),updateText.style("font-size",fontSize),exitText.style("font-size","0px")),{circles:circles,textCentres:textCentres,nodes:nodes,enter:enter,update:update,exit:exit}}return chart.wrap=function(_){return arguments.length?(wrap=_,chart):wrap},chart.useViewBox=function(){return useViewBox=!0,chart},chart.width=function(_){return arguments.length?(width=_,chart):width},chart.height=function(_){return arguments.length?(height=_,chart):height},chart.padding=function(_){return arguments.length?(padding=_,chart):padding},chart.distinct=function(_){return arguments.length?(distinct=_,chart):distinct},chart.colours=function(_){return arguments.length?(colours=_,chart):colours},chart.colors=function(_){return arguments.length?(colours=_,chart):colours},chart.fontSize=function(_){return arguments.length?(fontSize=_,chart):fontSize},chart.round=function(_){return arguments.length?(round=_,chart):round},chart.duration=function(_){return arguments.length?(duration=_,chart):duration},chart.layoutFunction=function(_){return arguments.length?(layoutFunction=_,chart):layoutFunction},chart.normalize=function(_){return arguments.length?(normalize=_,chart):normalize},chart.scaleToFit=function(_){return arguments.length?(scaleToFit=_,chart):scaleToFit},chart.styled=function(_){return arguments.length?(styled=_,chart):styled},chart.orientation=function(_){return arguments.length?(orientation=_,chart):orientation},chart.orientationOrder=function(_){return arguments.length?(orientationOrder=_,chart):orientationOrder},chart.lossFunction=function(_){return arguments.length?(loss="default"===_?lossFunction:"logRatio"===_?logRatioLossFunction:_,chart):loss},chart}function wrapText(circles,labeller){return function(data){const text=this,width=circles[data.sets[0]].radius||50,label=labeller(data)||"",words=label.split(/\s+/).reverse(),minChars=(label.length+words.length)/3;let word=words.pop(),line=[word],lineNumber=0;text.textContent=null;const tspans=[];function append(word2){const tspan2=text.ownerDocument.createElementNS(text.namespaceURI,"tspan");return tspan2.textContent=word2,tspans.push(tspan2),text.append(tspan2),tspan2}let tspan=append(word);for(;word=words.pop(),word;){line.push(word);const joined=line.join(" ");tspan.textContent=joined,joined.length>minChars&&tspan.getComputedTextLength()>width&&(line.pop(),tspan.textContent=line.join(" "),line=[word],tspan=append(word),lineNumber++)}const initial=.35-1.1*lineNumber/2,x=text.getAttribute("x"),y=text.getAttribute("y");tspans.forEach((t,i)=>{t.setAttribute("x",x),t.setAttribute("y",y),t.setAttribute("dy",`${initial+1.1*i}em`)})}}function circleMargin(current,interior,exterior){let margin=interior[0].radius-distance(interior[0],current);for(let i=1;i<interior.length;++i){const m=interior[i].radius-distance(interior[i],current);m<=margin&&(margin=m)}for(let i=0;i<exterior.length;++i){const m=distance(exterior[i],current)-exterior[i].radius;m<=margin&&(margin=m)}return margin}function computeTextCentre(interior,exterior,symmetricalTextCentre){const points=[];for(const c of interior)points.push({x:c.x,y:c.y}),points.push({x:c.x+c.radius/2,y:c.y}),points.push({x:c.x-c.radius/2,y:c.y}),points.push({x:c.x,y:c.y+c.radius/2}),points.push({x:c.x,y:c.y-c.radius/2});let initial=points[0],margin=circleMargin(points[0],interior,exterior);for(let i=1;i<points.length;++i){const m=circleMargin(points[i],interior,exterior);m>=margin&&(initial=points[i],margin=m)}const solution=nelderMead(p=>-1*circleMargin({x:p[0],y:p[1]},interior,exterior),[initial.x,initial.y],{maxIterations:500,minErrorDelta:1e-10}).x,ret={x:symmetricalTextCentre?0:solution[0],y:solution[1]};let valid=!0;for(const i of interior)if(distance(ret,i)>i.radius){valid=!1;break}for(const e of exterior)if(distance(ret,e)<e.radius){valid=!1;break}if(valid)return ret;if(1==interior.length)return{x:interior[0].x,y:interior[0].y};const areaStats={};return intersectionArea(interior,areaStats),0===areaStats.arcs.length?{x:0,y:-1e3,disjoint:!0}:1==areaStats.arcs.length?{x:areaStats.arcs[0].circle.x,y:areaStats.arcs[0].circle.y}:exterior.length?computeTextCentre(interior,[]):getCenter(areaStats.arcs.map(a=>a.p1))}function computeTextCentres(circles,areas,symmetricalTextCentre){const ret={},overlapped=function(circles){const ret={},circleids=Object.keys(circles);for(const circleid of circleids)ret[circleid]=[];for(let i=0;i<circleids.length;i++){const ci=circleids[i],a=circles[ci];for(let j=i+1;j<circleids.length;++j){const cj=circleids[j],b=circles[cj],d=distance(a,b);d+b.radius<=a.radius+1e-10?ret[cj].push(ci):d+a.radius<=b.radius+1e-10&&ret[ci].push(cj)}}return ret}(circles);for(let i=0;i<areas.length;++i){const area=areas[i].sets,areaids={},exclude={};for(let j=0;j<area.length;++j){areaids[area[j]]=!0;const overlaps=overlapped[area[j]];for(let k=0;k<overlaps.length;++k)exclude[overlaps[k]]=!0}const interior=[],exterior=[];for(let setid in circles)setid in areaids?interior.push(circles[setid]):setid in exclude||exterior.push(circles[setid]);const centre=computeTextCentre(interior,exterior,symmetricalTextCentre);ret[area]=centre,centre.disjoint&&areas[i].size>0&&console.log("WARNING: area "+area+" not represented on screen")}return ret}function intersectionAreaArcs(circles){if(0===circles.length)return[];const stats={};return intersectionArea(circles,stats),stats.arcs}function arcsToPath(arcs,round){if(0===arcs.length)return"M 0 0";const rFactor=Math.pow(10,round||0),r=null!=round?v=>Math.round(v*rFactor)/rFactor:v=>v;if(1==arcs.length){const circle=arcs[0].circle;return function(x,y,r){const ret=[];return ret.push("\nM",x,y),ret.push("\nm",-r,0),ret.push("\na",r,r,0,1,0,2*r,0),ret.push("\na",r,r,0,1,0,2*-r,0),ret.join(" ")}(r(circle.x),r(circle.y),r(circle.radius))}const ret=["\nM",r(arcs[0].p2.x),r(arcs[0].p2.y)];for(const arc of arcs){const radius=r(arc.circle.radius);ret.push("\nA",radius,radius,0,arc.large?1:0,arc.sweep?1:0,r(arc.p1.x),r(arc.p1.y))}return ret.join(" ")}function intersectionAreaPath(circles,round){return arcsToPath(intersectionAreaArcs(circles),round)}var parser=function(){var o=__name(function(k,v,o2,l){for(o2=o2||{},l=k.length;l--;o2[k[l]]=v);return o2},"o"),$V0=[5,8],$V1=[7,8,11,12,17,19,22,24],$V2=[1,17],$V3=[1,18],$V4=[7,8,11,12,14,15,16,17,19,20,21,22,24,27],$V5=[1,31],$V6=[1,39],$V7=[7,8,11,12,17,19,22,24,27],$V8=[1,57],$V9=[1,56],$Va=[1,58],$Vb=[1,59],$Vc=[1,60],$Vd=[7,8,11,12,16,17,19,20,22,24,27,31,32,33],parser2={trace:__name(function(){},"trace"),yy:{},symbols_:{error:2,start:3,optNewlines:4,VENN:5,document:6,EOF:7,NEWLINE:8,line:9,statement:10,TITLE:11,SET:12,identifier:13,BRACKET_LABEL:14,COLON:15,NUMERIC:16,UNION:17,identifierList:18,TEXT:19,IDENTIFIER:20,STRING:21,INDENT_TEXT:22,indentedTextTail:23,STYLE:24,stylesOpt:25,styleField:26,COMMA:27,styleValue:28,valueTokens:29,valueToken:30,HEXCOLOR:31,RGBCOLOR:32,RGBACOLOR:33,$accept:0,$end:1},terminals_:{2:"error",5:"VENN",7:"EOF",8:"NEWLINE",11:"TITLE",12:"SET",14:"BRACKET_LABEL",15:"COLON",16:"NUMERIC",17:"UNION",19:"TEXT",20:"IDENTIFIER",21:"STRING",22:"INDENT_TEXT",24:"STYLE",27:"COMMA",31:"HEXCOLOR",32:"RGBCOLOR",33:"RGBACOLOR"},productions_:[0,[3,4],[4,0],[4,2],[6,0],[6,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,5],[10,2],[10,3],[10,4],[10,5],[10,3],[10,3],[10,3],[10,4],[10,4],[10,2],[10,3],[23,1],[23,1],[23,1],[23,2],[23,2],[25,1],[25,3],[26,3],[28,1],[28,1],[29,1],[29,2],[30,1],[30,1],[30,1],[30,1],[30,1],[18,1],[18,3],[13,1],[13,1]],performAction:__name(function(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return $$[$0-1];case 2:case 3:case 4:case 6:this.$=[];break;case 5:case 35:$$[$0-1].push($$[$0]),this.$=$$[$0-1];break;case 7:case 22:case 32:case 36:case 37:case 38:case 39:case 40:case 43:case 44:this.$=$$[$0];break;case 8:yy.setDiagramTitle($$[$0].substr(6)),this.$=$$[$0].substr(6);break;case 9:yy.addSubsetData([$$[$0]],void 0,void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 10:yy.addSubsetData([$$[$0-1]],$$[$0],void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 11:yy.addSubsetData([$$[$0-2]],void 0,parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 12:yy.addSubsetData([$$[$0-3]],$$[$0-2],parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 13:if($$[$0].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0]),yy.addSubsetData($$[$0],void 0,void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 14:if($$[$0-1].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0-1]),yy.addSubsetData($$[$0-1],$$[$0],void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 15:if($$[$0-2].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0-2]),yy.addSubsetData($$[$0-2],void 0,parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 16:if($$[$0-3].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0-3]),yy.addSubsetData($$[$0-3],$$[$0-2],parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 17:case 18:case 19:yy.addTextData($$[$0-1],$$[$0],void 0);break;case 20:case 21:yy.addTextData($$[$0-2],$$[$0-1],$$[$0]);break;case 23:yy.addStyleData($$[$0-1],$$[$0]);break;case 24:case 25:case 26:if(!(cs=yy.getCurrentSets()))throw new Error("text requires set");yy.addTextData(cs,$$[$0],void 0);break;case 27:case 28:var cs;if(!(cs=yy.getCurrentSets()))throw new Error("text requires set");yy.addTextData(cs,$$[$0-1],$$[$0]);break;case 29:case 41:case 34:this.$=[$$[$0]];break;case 30:case 42:this.$=[...$$[$0-2],$$[$0]];break;case 31:this.$=[$$[$0-2],$$[$0]];break;case 33:this.$=$$[$0].join(" ")}},"anonymous"),table:[o($V0,[2,2],{3:1,4:2}),{1:[3]},{5:[1,3],8:[1,4]},o($V1,[2,4],{6:5}),o($V0,[2,3]),{7:[1,6],8:[1,8],9:7,10:9,11:[1,10],12:[1,11],17:[1,12],19:[1,13],22:[1,14],24:[1,15]},{1:[2,1]},o($V1,[2,5]),o($V1,[2,6]),o($V1,[2,7]),o($V1,[2,8]),{13:16,20:$V2,21:$V3},{13:20,18:19,20:$V2,21:$V3},{13:20,18:21,20:$V2,21:$V3},{16:[1,25],20:[1,23],21:[1,24],23:22},{13:20,18:26,20:$V2,21:$V3},o($V1,[2,9],{14:[1,27],15:[1,28]}),o($V4,[2,43]),o($V4,[2,44]),o($V1,[2,13],{14:[1,29],15:[1,30],27:$V5}),o($V4,[2,41]),{16:[1,34],20:[1,32],21:[1,33],27:$V5},o($V1,[2,22]),o($V1,[2,24],{14:[1,35]}),o($V1,[2,25],{14:[1,36]}),o($V1,[2,26]),{20:$V6,25:37,26:38,27:$V5},o($V1,[2,10],{15:[1,40]}),{16:[1,41]},o($V1,[2,14],{15:[1,42]}),{16:[1,43]},{13:44,20:$V2,21:$V3},o($V1,[2,17],{14:[1,45]}),o($V1,[2,18],{14:[1,46]}),o($V1,[2,19]),o($V1,[2,27]),o($V1,[2,28]),o($V1,[2,23],{27:[1,47]}),o($V7,[2,29]),{15:[1,48]},{16:[1,49]},o($V1,[2,11]),{16:[1,50]},o($V1,[2,15]),o($V4,[2,42]),o($V1,[2,20]),o($V1,[2,21]),{20:$V6,26:51},{16:$V8,20:$V9,21:[1,53],28:52,29:54,30:55,31:$Va,32:$Vb,33:$Vc},o($V1,[2,12]),o($V1,[2,16]),o($V7,[2,30]),o($V7,[2,31]),o($V7,[2,32]),o($V7,[2,33],{30:61,16:$V8,20:$V9,31:$Va,32:$Vb,33:$Vc}),o($Vd,[2,34]),o($Vd,[2,36]),o($Vd,[2,37]),o($Vd,[2,38]),o($Vd,[2,39]),o($Vd,[2,40]),o($Vd,[2,35])],defaultActions:{6:[2,1]},parseError:__name(function(str,hash){if(!hash.recoverable){var error=new Error(str);throw error.hash=hash,error}this.trace(str)},"parseError"),parse:__name(function(input){var self=this,stack=[0],tstack=[],vstack=[null],lstack=[],table=this.table,yytext="",yylineno=0,yyleng=0,args=lstack.slice.call(arguments,1),lexer2=Object.create(this.lexer),sharedState={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(sharedState.yy[k]=this.yy[k]);lexer2.setInput(input,sharedState.yy),sharedState.yy.lexer=lexer2,sharedState.yy.parser=this,void 0===lexer2.yylloc&&(lexer2.yylloc={});var yyloc=lexer2.yylloc;lstack.push(yyloc);var ranges=lexer2.options&&lexer2.options.ranges;function lex(){var token;return"number"!=typeof(token=tstack.pop()||lexer2.lex()||1)&&(token instanceof Array&&(token=(tstack=token).pop()),token=self.symbols_[token]||token),token}"function"==typeof sharedState.yy.parseError?this.parseError=sharedState.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,__name(function(n){stack.length=stack.length-2*n,vstack.length=vstack.length-n,lstack.length=lstack.length-n},"popStack"),__name(lex,"lex");for(var symbol,state,action,r,p,len,newState,expected,yyval={};;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:(null==symbol&&(symbol=lex()),action=table[state]&&table[state][symbol]),void 0===action||!action.length||!action[0]){var errStr="";for(p in expected=[],table[state])this.terminals_[p]&&p>2&&expected.push("'"+this.terminals_[p]+"'");errStr=lexer2.showPosition?"Parse error on line "+(yylineno+1)+":\n"+lexer2.showPosition()+"\nExpecting "+expected.join(", ")+", got '"+(this.terminals_[symbol]||symbol)+"'":"Parse error on line "+(yylineno+1)+": Unexpected "+(1==symbol?"end of input":"'"+(this.terminals_[symbol]||symbol)+"'"),this.parseError(errStr,{text:lexer2.match,token:this.terminals_[symbol]||symbol,line:lexer2.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&action.length>1)throw new Error("Parse Error: multiple actions possible at state: "+state+", token: "+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(lexer2.yytext),lstack.push(lexer2.yylloc),stack.push(action[1]),symbol=null,yyleng=lexer2.yyleng,yytext=lexer2.yytext,yylineno=lexer2.yylineno,yyloc=lexer2.yylloc;break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),void 0!==(r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args))))return r;len&&(stack=stack.slice(0,-1*len*2),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0}}return!0},"parse")},lexer=function(){return{EOF:1,parseError:__name(function(str,hash){if(!this.yy.parser)throw new Error(str);this.yy.parser.parseError(str,hash)},"parseError"),setInput:__name(function(input,yy){return this.yy=yy||this.yy||{},this._input=input,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:__name(function(){var ch=this._input[0];return this.yytext+=ch,this.yyleng++,this.offset++,this.match+=ch,this.matched+=ch,ch.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ch},"input"),unput:__name(function(ch){var len=ch.length,lines=ch.split(/(?:\r\n?|\n)/g);this._input=ch+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-len),this.offset-=len;var oldLines=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),lines.length-1&&(this.yylineno-=lines.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:lines?(lines.length===oldLines.length?this.yylloc.first_column:0)+oldLines[oldLines.length-lines.length].length-lines[0].length:this.yylloc.first_column-len},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-len]),this.yyleng=this.yytext.length,this},"unput"),more:__name(function(){return this._more=!0,this},"more"),reject:__name(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:__name(function(n){this.unput(this.match.slice(n))},"less"),pastInput:__name(function(){var past=this.matched.substr(0,this.matched.length-this.match.length);return(past.length>20?"...":"")+past.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:__name(function(){var next=this.match;return next.length<20&&(next+=this._input.substr(0,20-next.length)),(next.substr(0,20)+(next.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:__name(function(){var pre=this.pastInput(),c=new Array(pre.length+1).join("-");return pre+this.upcomingInput()+"\n"+c+"^"},"showPosition"),test_match:__name(function(match,indexed_rule){var token,lines,backup;if(this.options.backtrack_lexer&&(backup={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(backup.yylloc.range=this.yylloc.range.slice(0))),(lines=match[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=lines.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lines?lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+match[0].length},this.yytext+=match[0],this.match+=match[0],this.matches=match,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(match[0].length),this.matched+=match[0],token=this.performAction.call(this,this.yy,this,indexed_rule,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),token)return token;if(this._backtrack){for(var k in backup)this[k]=backup[k];return!1}return!1},"test_match"),next:__name(function(){if(this.done)return this.EOF;var token,match,tempMatch,index;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var rules=this._currentRules(),i=0;i<rules.length;i++)if((tempMatch=this._input.match(this.rules[rules[i]]))&&(!match||tempMatch[0].length>match[0].length)){if(match=tempMatch,index=i,this.options.backtrack_lexer){if(!1!==(token=this.test_match(tempMatch,rules[i])))return token;if(this._backtrack){match=!1;continue}return!1}if(!this.options.flex)break}return match?!1!==(token=this.test_match(match,rules[index]))&&token:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:__name(function(){var r=this.next();return r||this.lex()},"lex"),begin:__name(function(condition){this.conditionStack.push(condition)},"begin"),popState:__name(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:__name(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:__name(function(n){return(n=this.conditionStack.length-1-Math.abs(n||0))>=0?this.conditionStack[n]:"INITIAL"},"topState"),pushState:__name(function(condition){this.begin(condition)},"pushState"),stateStackSize:__name(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:__name(function(yy,yy_,$avoiding_name_collisions,YY_START){switch($avoiding_name_collisions){case 0:case 1:case 2:case 4:case 7:case 8:break;case 3:if(yy.getIndentMode&&yy.getIndentMode())return yy.consumeIndentText=!0,this.begin("INITIAL"),22;break;case 5:yy.setIndentMode&&yy.setIndentMode(!1),this.begin("INITIAL"),this.unput(yy_.yytext);break;case 6:return this.begin("bol"),8;case 9:return 7;case 10:return 11;case 11:return 5;case 12:return 12;case 13:return 17;case 14:if(!yy.consumeIndentText)return 19;yy.consumeIndentText=!1;break;case 15:return 24;case 16:return yy_.yytext=yy_.yytext.slice(2,-2),14;case 17:return yy_.yytext=yy_.yytext.slice(1,-1).trim(),14;case 18:return 16;case 19:return 31;case 20:return 33;case 21:return 32;case 22:return 20;case 23:return 21;case 24:return 27;case 25:return 15}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[ \t]+(?=[\n\r]))/i,/^(?:[ \t]+(?=text\b))/i,/^(?:[ \t]+)/i,/^(?:[^ \t\n\r])/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[ \t]+)/i,/^(?:$)/i,/^(?:title\s[^#\n;]+)/i,/^(?:venn-beta\b)/i,/^(?:set\b)/i,/^(?:union\b)/i,/^(?:text\b)/i,/^(?:style\b)/i,/^(?:\["[^\"]*"\])/i,/^(?:\[[^\]\"]+\])/i,/^(?:[+-]?(\d+(\.\d+)?|\.\d+))/i,/^(?:#[0-9a-fA-F]{3,8})/i,/^(?:rgba\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:rgb\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:"[^\"]*")/i,/^(?:,)/i,/^(?::)/i],conditions:{bol:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0},INITIAL:{rules:[0,1,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0}}}}();function Parser(){this.yy={}}return parser2.lexer=lexer,__name(Parser,"Parser"),Parser.prototype=parser2,parser2.Parser=Parser,new Parser}();parser.parser=parser;var currentSets,venn_default=parser,subsets=[],textNodes=[],styleEntries=[],knownSets=new Set,indentMode=!1,addSubsetData=__name((identifierList,label,size)=>{const sets=normalizeIdentifierList(identifierList).sort(),resolvedSize=size??10/Math.pow(identifierList.length,2);currentSets=sets,1===sets.length&&knownSets.add(sets[0]),subsets.push({sets:sets,size:resolvedSize,label:label?normalizeText(label):void 0})},"addSubsetData"),getSubsetData=__name(()=>subsets,"getSubsetData"),normalizeText=__name(text=>{const trimmed=text.trim();return trimmed.length>=2&&trimmed.startsWith('"')&&trimmed.endsWith('"')?trimmed.slice(1,-1):trimmed},"normalizeText"),normalizeStyleValue=__name(value=>value?normalizeText(value):value,"normalizeStyleValue"),addTextData=__name((identifierList,id,label)=>{const normalizedId=normalizeText(id);textNodes.push({sets:normalizeIdentifierList(identifierList).sort(),id:normalizedId,label:label?normalizeText(label):void 0})},"addTextData"),addStyleData=__name((identifierList,data)=>{const targets=normalizeIdentifierList(identifierList).sort(),styles={};for(const[key,value]of data)styles[key]=normalizeStyleValue(value)??value;styleEntries.push({targets:targets,styles:styles})},"addStyleData"),getStyleData=__name(()=>styleEntries,"getStyleData"),normalizeIdentifierList=__name(identifierList=>identifierList.map(identifier=>normalizeText(identifier)),"normalizeIdentifierList"),validateUnionIdentifiers=__name(identifierList=>{const unknown=normalizeIdentifierList(identifierList).filter(identifier=>!knownSets.has(identifier));if(unknown.length>0)throw new Error(`unknown set identifier: ${unknown.join(", ")}`)},"validateUnionIdentifiers"),getTextData=__name(()=>textNodes,"getTextData"),getCurrentSets=__name(()=>currentSets,"getCurrentSets"),getIndentMode=__name(()=>indentMode,"getIndentMode"),setIndentMode=__name(enabled=>{indentMode=enabled},"setIndentMode"),DEFAULT_VENN_CONFIG=defaultConfig_default.venn;function getConfig2(){return cleanAndMerge(DEFAULT_VENN_CONFIG,getConfig().venn)}__name(getConfig2,"getConfig");var db={getConfig:getConfig2,clear:__name(()=>{clear(),subsets.length=0,textNodes.length=0,styleEntries.length=0,knownSets.clear(),currentSets=void 0,indentMode=!1},"customClear"),setAccTitle:setAccTitle,getAccTitle:getAccTitle,setDiagramTitle:setDiagramTitle,getDiagramTitle:getDiagramTitle,getAccDescription:getAccDescription,setAccDescription:setAccDescription,addSubsetData:addSubsetData,getSubsetData:getSubsetData,addTextData:addTextData,addStyleData:addStyleData,validateUnionIdentifiers:validateUnionIdentifiers,getTextData:getTextData,getStyleData:getStyleData,getCurrentSets:getCurrentSets,getIndentMode:getIndentMode,setIndentMode:setIndentMode},styles_default=__name(options=>`\n .venn-title {\n font-size: 32px;\n fill: ${options.vennTitleTextColor};\n font-family: ${options.fontFamily};\n }\n\n .venn-circle text {\n font-size: 48px;\n font-family: ${options.fontFamily};\n }\n\n .venn-intersection text {\n font-size: 48px;\n fill: ${options.vennSetTextColor};\n font-family: ${options.fontFamily};\n }\n\n .venn-text-node {\n font-family: ${options.fontFamily};\n color: ${options.vennSetTextColor};\n }\n`,"getStyles");function buildStyleByKey(styleData){const map=new Map;for(const entry of styleData){const key=entry.targets.join("|"),existing=map.get(key);existing?Object.assign(existing,entry.styles):map.set(key,{...entry.styles})}return map}__name(buildStyleByKey,"buildStyleByKey");var draw=__name((_text,id,_version,diagObj)=>{var _a,_b,_c;const db2=diagObj.db,config=null==(_a=db2.getConfig)?void 0:_a.call(db2),{themeVariables:themeVariables,look:look,handDrawnSeed:handDrawnSeed}=getConfig(),isHandDrawn="handDrawn"===look,themeColors=[themeVariables.venn1,themeVariables.venn2,themeVariables.venn3,themeVariables.venn4,themeVariables.venn5,themeVariables.venn6,themeVariables.venn7,themeVariables.venn8].filter(Boolean),title=null==(_b=db2.getDiagramTitle)?void 0:_b.call(db2),sets=db2.getSubsetData(),textNodes2=db2.getTextData(),styleByKey=buildStyleByKey(db2.getStyleData()),svgWidth=(null==config?void 0:config.width)??800,svgHeight=(null==config?void 0:config.height)??450,scale2=svgWidth/1600,titleHeight=title?48*scale2:0,defaultTextColor=themeVariables.primaryTextColor??themeVariables.textColor,svg=selectSvgElement(id);svg.attr("viewBox",`0 0 ${svgWidth} ${svgHeight}`),title&&svg.append("text").text(title).attr("class","venn-title").attr("font-size",32*scale2+"px").attr("text-anchor","middle").attr("dominant-baseline","middle").attr("x","50%").attr("y",32*scale2).style("fill",themeVariables.vennTitleTextColor||themeVariables.titleColor);const dummyD3root=select(document.createElement("div")),vennDiagram=VennDiagram().width(svgWidth).height(svgHeight-titleHeight);dummyD3root.datum(sets).call(vennDiagram);const roughSvg=isHandDrawn?at.svg(dummyD3root.select("svg").node()):void 0,layoutAreas=function(data,options={}){const{lossFunction:loss,layoutFunction:layout2=venn,normalize:normalize=!0,orientation:orientation=Math.PI/2,orientationOrder:orientationOrder,width:width=600,height:height=350,padding:padding=15,scaleToFit:scaleToFit=!1,symmetricalTextCentre:symmetricalTextCentre=!1,distinct:distinct,round:round=2}=options;let solution=layout2(data,{lossFunction:"default"!==loss&&loss?"logRatio"===loss?logRatioLossFunction:loss:lossFunction,distinct:distinct});normalize&&(solution=normalizeSolution(solution,orientation,orientationOrder));const circles=scaleSolution(solution,width,height,padding,scaleToFit),textCentres=computeTextCentres(circles,data,symmetricalTextCentre),circleLookup=new Map(Object.keys(circles).map(set=>[set,{set:set,x:circles[set].x,y:circles[set].y,radius:circles[set].radius}])),helpers=data.map(area=>{const circles2=area.sets.map(s=>circleLookup.get(s)),arcs=intersectionAreaArcs(circles2);return{circles:circles2,arcs:arcs,path:arcsToPath(arcs,round),area:area,has:new Set(area.sets)}});function genDistinctPath(sets){let r="";for(const e of helpers)e.has.size>sets.length&&sets.every(s=>e.has.has(s))&&(r+=" "+e.path);return r}return helpers.map(({circles:circles2,arcs:arcs,path:path,area:area})=>({data:area,text:textCentres[area.sets],circles:circles2,arcs:arcs,path:path,distinctPath:path+genDistinctPath(area.sets)}))}(sets,{width:svgWidth,height:svgHeight-titleHeight,padding:(null==config?void 0:config.padding)??15}),layoutByKey=new Map;for(const area of layoutAreas){const key=stableSetsKey([...area.data.sets].sort());layoutByKey.set(key,area)}textNodes2.length>0&&renderTextNodes(config,layoutByKey,dummyD3root,textNodes2,scale2,styleByKey);const themeDark=isDark(themeVariables.background||"#f4f4f4");dummyD3root.selectAll(".venn-circle").each(function(d,i){var _a2;const group=select(this),setsKey=stableSetsKey([...d.sets].sort()),customStyle=styleByKey.get(setsKey),baseColor=(null==customStyle?void 0:customStyle.fill)||themeColors[i%themeColors.length]||themeVariables.primaryColor;group.classed("venn-set-"+i%8,!0);const fillOpacity=(null==customStyle?void 0:customStyle["fill-opacity"])??.1,strokeColor=(null==customStyle?void 0:customStyle.stroke)||baseColor,strokeWidthVal=(null==customStyle?void 0:customStyle["stroke-width"])||""+5*scale2;if(isHandDrawn&&roughSvg){const layoutArea=layoutByKey.get(setsKey);if(layoutArea&&layoutArea.circles.length>0){const c=layoutArea.circles[0],roughNode=roughSvg.circle(c.x,c.y,2*c.radius,{roughness:.7,seed:handDrawnSeed,fill:transparentize(baseColor,.7),fillStyle:"hachure",fillWeight:2,hachureGap:8,hachureAngle:60*i-41,stroke:strokeColor,strokeWidth:parseFloat(String(strokeWidthVal))});group.select("path").remove(),null==(_a2=group.node())||_a2.insertBefore(roughNode,group.select("text").node())}}else group.select("path").style("fill",baseColor).style("fill-opacity",fillOpacity).style("stroke",strokeColor).style("stroke-width",strokeWidthVal).style("stroke-opacity",.95);const textColor=(null==customStyle?void 0:customStyle.color)||(themeDark?lighten(baseColor,30):darken(baseColor,30));group.select("text").style("font-size",48*scale2+"px").style("fill",textColor)}),isHandDrawn&&roughSvg?dummyD3root.selectAll(".venn-intersection").each(function(d){var _a2;const group=select(this),setsKey=stableSetsKey([...d.sets].sort()),customStyle=styleByKey.get(setsKey),customFill=null==customStyle?void 0:customStyle.fill;if(customFill){const pathEl=group.select("path"),pathD=pathEl.attr("d");if(pathD){const roughNode=roughSvg.path(pathD,{roughness:.7,seed:handDrawnSeed,fill:transparentize(customFill,.3),fillStyle:"cross-hatch",fillWeight:2,hachureGap:6,hachureAngle:60,stroke:"none"}),existingPath=pathEl.node();null==(_a2=null==existingPath?void 0:existingPath.parentNode)||_a2.insertBefore(roughNode,existingPath),pathEl.remove()}}else group.select("path").style("fill-opacity",0);group.select("text").style("font-size",48*scale2+"px").style("fill",(null==customStyle?void 0:customStyle.color)??themeVariables.vennSetTextColor??defaultTextColor)}):(dummyD3root.selectAll(".venn-intersection text").style("font-size",48*scale2+"px").style("fill",e=>{var _a2;const setsKey=stableSetsKey([...e.sets].sort());return(null==(_a2=styleByKey.get(setsKey))?void 0:_a2.color)??themeVariables.vennSetTextColor??defaultTextColor}),dummyD3root.selectAll(".venn-intersection path").style("fill-opacity",e=>{var _a2;const setsKey=stableSetsKey([...e.sets].sort());return(null==(_a2=styleByKey.get(setsKey))?void 0:_a2.fill)?1:0}).style("fill",e=>{var _a2;const setsKey=stableSetsKey([...e.sets].sort());return(null==(_a2=styleByKey.get(setsKey))?void 0:_a2.fill)??"transparent"}));const vennGroup=svg.append("g").attr("transform",`translate(0, ${titleHeight})`),dummySvg=dummyD3root.select("svg").node();if(dummySvg&&"childNodes"in dummySvg)for(const child of[...dummySvg.childNodes])null==(_c=vennGroup.node())||_c.appendChild(child);configureSvgSize(svg,svgHeight,svgWidth,(null==config?void 0:config.useMaxWidth)??!0)},"draw");function stableSetsKey(setIds){return setIds.join("|")}function renderTextNodes(config,layoutByKey,dummyD3root,textNodes2,scale2,styleByKey){var _a;const useDebugLayout=(null==config?void 0:config.useDebugLayout)??!1,textGroup=dummyD3root.select("svg").append("g").attr("class","venn-text-nodes"),nodesByArea=new Map;for(const node of textNodes2){const key=stableSetsKey(node.sets),existing=nodesByArea.get(key);existing?existing.push(node):nodesByArea.set(key,[node])}for(const[key,nodes]of nodesByArea.entries()){const area=layoutByKey.get(key);if(!(null==area?void 0:area.text))continue;const centerX=area.text.x,centerY=area.text.y,minCircleRadius=Math.min(...area.circles.map(c=>c.radius)),innerRadiusRaw=Math.min(...area.circles.map(c=>c.radius-Math.hypot(centerX-c.x,centerY-c.y)));let innerRadius=Number.isFinite(innerRadiusRaw)?Math.max(0,innerRadiusRaw):0;0===innerRadius&&Number.isFinite(minCircleRadius)&&(innerRadius=.6*minCircleRadius);const areaGroup=textGroup.append("g").attr("class","venn-text-area").attr("font-size",40*scale2+"px");useDebugLayout&&areaGroup.append("circle").attr("class","venn-text-debug-circle").attr("cx",centerX).attr("cy",centerY).attr("r",innerRadius).attr("fill","none").attr("stroke","purple").attr("stroke-width",1.5*scale2).attr("stroke-dasharray",`${6*scale2} ${4*scale2}`);const innerWidth=Math.max(80*scale2,2*innerRadius*.95),innerHeight=Math.max(60*scale2,2*innerRadius*.95),labelOffset=(area.data.label&&area.data.label.length>0?Math.min(32*scale2,.25*innerRadius):0)+(nodes.length<=2?30*scale2:0),startX=centerX-innerWidth/2,startY=centerY-innerHeight/2+labelOffset,cols=Math.max(1,Math.ceil(Math.sqrt(nodes.length))),cellWidth=innerWidth/cols,cellHeight=innerHeight/Math.max(1,Math.ceil(nodes.length/cols));for(const[i,node]of nodes.entries()){const col=i%cols,row=Math.floor(i/cols),x=startX+cellWidth*(col+.5),y=startY+cellHeight*(row+.5);useDebugLayout&&areaGroup.append("rect").attr("class","venn-text-debug-cell").attr("x",startX+cellWidth*col).attr("y",startY+cellHeight*row).attr("width",cellWidth).attr("height",cellHeight).attr("fill","none").attr("stroke","teal").attr("stroke-width",1*scale2).attr("stroke-dasharray",`${4*scale2} ${3*scale2}`);const boxWidth=.9*cellWidth,boxHeight=.9*cellHeight,container=areaGroup.append("foreignObject").attr("class","venn-text-node-fo").attr("width",boxWidth).attr("height",boxHeight).attr("x",x-boxWidth/2).attr("y",y-boxHeight/2).attr("overflow","visible"),textColor=null==(_a=styleByKey.get(node.id))?void 0:_a.color,text=container.append("xhtml:span").attr("class","venn-text-node").style("display","flex").style("width","100%").style("height","100%").style("white-space","normal").style("align-items","center").style("justify-content","center").style("text-align","center").style("overflow-wrap","normal").style("word-break","normal").text(node.label??node.id);textColor&&text.style("color",textColor)}}}__name(stableSetsKey,"stableSetsKey"),__name(renderTextNodes,"renderTextNodes");var diagram={parser:venn_default,db:db,renderer:{draw:draw},styles:styles_default};export{diagram};
|
|
1
|
+
import{aC as adjustChannel,s as setAccDescription,g as getAccDescription,q as getDiagramTitle,p as setDiagramTitle,a as getAccTitle,b as setAccTitle,_ as __name,C as getConfig,H as selectSvgElement,d as select,ar as at,U as isDark,V as lighten,W as darken,e as configureSvgSize,y as clear,E as cleanAndMerge,F as defaultConfig_default}from"./mermaid.core-f1mZHh7u.js";import"./vendor-mdxeditor-BFiCaYAL.js";import"./vendor-antd-jGWxgt_-.js";import"./vendor-codemirror-9gysGjWj.js";import"./vendor-markdown-BFrYfpb0.js";const transparentize=(color,amount)=>adjustChannel(color,"a",-amount);function intersectionArea(circles,stats){const intersectionPoints=function(circles){const ret=[];for(let i=0;i<circles.length;++i)for(let j=i+1;j<circles.length;++j){const intersect=circleCircleIntersection(circles[i],circles[j]);for(const p of intersect)p.parentIndex=[i,j],ret.push(p)}return ret}(circles),innerPoints=intersectionPoints.filter(p=>function(point,circles){return circles.every(circle=>distance(point,circle)<circle.radius+1e-10)}(p,circles));let arcArea=0,polygonArea=0;const arcs=[];if(innerPoints.length>1){const center=getCenter(innerPoints);for(let i=0;i<innerPoints.length;++i){const p=innerPoints[i];p.angle=Math.atan2(p.x-center.x,p.y-center.y)}innerPoints.sort((a,b)=>b.angle-a.angle);let p2=innerPoints[innerPoints.length-1];for(let i=0;i<innerPoints.length;++i){const p1=innerPoints[i];polygonArea+=(p2.x+p1.x)*(p1.y-p2.y);const midPoint={x:(p1.x+p2.x)/2,y:(p1.y+p2.y)/2};let arc=null;for(let j=0;j<p1.parentIndex.length;++j)if(p2.parentIndex.includes(p1.parentIndex[j])){const circle=circles[p1.parentIndex[j]],a1=Math.atan2(p1.x-circle.x,p1.y-circle.y),a2=Math.atan2(p2.x-circle.x,p2.y-circle.y);let angleDiff=a2-a1;angleDiff<0&&(angleDiff+=2*Math.PI);const a=a2-angleDiff/2;let width=distance(midPoint,{x:circle.x+circle.radius*Math.sin(a),y:circle.y+circle.radius*Math.cos(a)});width>2*circle.radius&&(width=2*circle.radius),(null==arc||arc.width>width)&&(arc={circle:circle,width:width,p1:p1,p2:p2,large:width>circle.radius,sweep:!0})}null!=arc&&(arcs.push(arc),arcArea+=circleArea(arc.circle.radius,arc.width),p2=p1)}}else{let smallest=circles[0];for(let i=1;i<circles.length;++i)circles[i].radius<smallest.radius&&(smallest=circles[i]);let disjoint=!1;for(let i=0;i<circles.length;++i)if(distance(circles[i],smallest)>Math.abs(smallest.radius-circles[i].radius)){disjoint=!0;break}disjoint?arcArea=polygonArea=0:(arcArea=smallest.radius*smallest.radius*Math.PI,arcs.push({circle:smallest,p1:{x:smallest.x,y:smallest.y+smallest.radius},p2:{x:smallest.x-1e-10,y:smallest.y+smallest.radius},width:2*smallest.radius,large:!0,sweep:!0}))}return polygonArea/=2,stats&&(stats.area=arcArea+polygonArea,stats.arcArea=arcArea,stats.polygonArea=polygonArea,stats.arcs=arcs,stats.innerPoints=innerPoints,stats.intersectionPoints=intersectionPoints),arcArea+polygonArea}function circleArea(r,width){return r*r*Math.acos(1-width/r)-(r-width)*Math.sqrt(width*(2*r-width))}function distance(p1,p2){return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))}function circleOverlap(r1,r2,d){if(d>=r1+r2)return 0;if(d<=Math.abs(r1-r2))return Math.PI*Math.min(r1,r2)*Math.min(r1,r2);const w2=r2-(d*d-r1*r1+r2*r2)/(2*d);return circleArea(r1,r1-(d*d-r2*r2+r1*r1)/(2*d))+circleArea(r2,w2)}function circleCircleIntersection(p1,p2){const d=distance(p1,p2),r1=p1.radius,r2=p2.radius;if(d>=r1+r2||d<=Math.abs(r1-r2))return[];const a=(r1*r1-r2*r2+d*d)/(2*d),h=Math.sqrt(r1*r1-a*a),x0=p1.x+a*(p2.x-p1.x)/d,y0=p1.y+a*(p2.y-p1.y)/d,rx=-(p2.y-p1.y)*(h/d),ry=-(p2.x-p1.x)*(h/d);return[{x:x0+rx,y:y0-ry},{x:x0-rx,y:y0+ry}]}function getCenter(points){const center={x:0,y:0};for(const point of points)center.x+=point.x,center.y+=point.y;return center.x/=points.length,center.y/=points.length,center}function zeros(x){const r=new Array(x);for(let i=0;i<x;++i)r[i]=0;return r}function zerosM(x,y){return zeros(x).map(()=>zeros(y))}function dot(a,b){let ret=0;for(let i=0;i<a.length;++i)ret+=a[i]*b[i];return ret}function norm2(a){return Math.sqrt(dot(a,a))}function scale(ret,value,c){for(let i=0;i<value.length;++i)ret[i]=value[i]*c}function weightedSum(ret,w1,v1,w2,v2){for(let j=0;j<ret.length;++j)ret[j]=w1*v1[j]+w2*v2[j]}function nelderMead(f,x0,parameters){const maxIterations=(parameters=parameters||{}).maxIterations||200*x0.length,nonZeroDelta=parameters.nonZeroDelta||1.05,zeroDelta=parameters.zeroDelta||.001,minErrorDelta=parameters.minErrorDelta||1e-6,minTolerance=parameters.minErrorDelta||1e-5,rho=void 0!==parameters.rho?parameters.rho:1,chi=void 0!==parameters.chi?parameters.chi:2,psi=void 0!==parameters.psi?parameters.psi:-.5,sigma=void 0!==parameters.sigma?parameters.sigma:.5;let maxDiff;const N=x0.length,simplex=new Array(N+1);simplex[0]=x0,simplex[0].fx=f(x0),simplex[0].id=0;for(let i=0;i<N;++i){const point=x0.slice();point[i]=point[i]?point[i]*nonZeroDelta:zeroDelta,simplex[i+1]=point,simplex[i+1].fx=f(point),simplex[i+1].id=i+1}function updateSimplex(value){for(let i=0;i<value.length;i++)simplex[N][i]=value[i];simplex[N].fx=value.fx}const sortOrder=(a,b)=>a.fx-b.fx,centroid=x0.slice(),reflected=x0.slice(),contracted=x0.slice(),expanded=x0.slice();for(let iteration=0;iteration<maxIterations;++iteration){if(simplex.sort(sortOrder),parameters.history){const sortedSimplex=simplex.map(x=>{const state=x.slice();return state.fx=x.fx,state.id=x.id,state});sortedSimplex.sort((a,b)=>a.id-b.id),parameters.history.push({x:simplex[0].slice(),fx:simplex[0].fx,simplex:sortedSimplex})}maxDiff=0;for(let i=0;i<N;++i)maxDiff=Math.max(maxDiff,Math.abs(simplex[0][i]-simplex[1][i]));if(Math.abs(simplex[0].fx-simplex[N].fx)<minErrorDelta&&maxDiff<minTolerance)break;for(let i=0;i<N;++i){centroid[i]=0;for(let j=0;j<N;++j)centroid[i]+=simplex[j][i];centroid[i]/=N}const worst=simplex[N];if(weightedSum(reflected,1+rho,centroid,-rho,worst),reflected.fx=f(reflected),reflected.fx<simplex[0].fx)weightedSum(expanded,1+chi,centroid,-chi,worst),expanded.fx=f(expanded),expanded.fx<reflected.fx?updateSimplex(expanded):updateSimplex(reflected);else if(reflected.fx>=simplex[N-1].fx){let shouldReduce=!1;if(reflected.fx>worst.fx?(weightedSum(contracted,1+psi,centroid,-psi,worst),contracted.fx=f(contracted),contracted.fx<worst.fx?updateSimplex(contracted):shouldReduce=!0):(weightedSum(contracted,1-psi*rho,centroid,psi*rho,worst),contracted.fx=f(contracted),contracted.fx<reflected.fx?updateSimplex(contracted):shouldReduce=!0),shouldReduce){if(sigma>=1)break;for(let i=1;i<simplex.length;++i)weightedSum(simplex[i],1-sigma,simplex[0],sigma,simplex[i]),simplex[i].fx=f(simplex[i])}}else updateSimplex(reflected)}return simplex.sort(sortOrder),{fx:simplex[0].fx,x:simplex[0]}}function wolfeLineSearch(f,pk,current,next,a,c1,c2){const phi0=current.fx,phiPrime0=dot(current.fxprime,pk);let phi=phi0,phi_old=phi0,phiPrime=phiPrime0,a0=0;function zoom(a_lo,a_high,phi_lo){for(let iteration=0;iteration<16;++iteration)if(a=(a_lo+a_high)/2,weightedSum(next.x,1,current.x,a,pk),phi=next.fx=f(next.x,next.fxprime),phiPrime=dot(next.fxprime,pk),phi>phi0+c1*a*phiPrime0||phi>=phi_lo)a_high=a;else{if(Math.abs(phiPrime)<=-c2*phiPrime0)return a;phiPrime*(a_high-a_lo)>=0&&(a_high=a_lo),a_lo=a,phi_lo=phi}return 0}a=a||1,c1=c1||1e-6,c2=c2||.1;for(let iteration=0;iteration<10;++iteration){if(weightedSum(next.x,1,current.x,a,pk),phi=next.fx=f(next.x,next.fxprime),phiPrime=dot(next.fxprime,pk),phi>phi0+c1*a*phiPrime0||iteration&&phi>=phi_old)return zoom(a0,a,phi_old);if(Math.abs(phiPrime)<=-c2*phiPrime0)return a;if(phiPrime>=0)return zoom(a,a0,phi);phi_old=phi,a0=a,a*=2}return a}function conjugateGradient(f,initial,params){let current={x:initial.slice(),fx:0,fxprime:initial.slice()},next={x:initial.slice(),fx:0,fxprime:initial.slice()};const yk=initial.slice();let pk,temp,maxIterations,a=1;maxIterations=(params=params||{}).maxIterations||20*initial.length,current.fx=f(current.x,current.fxprime),pk=current.fxprime.slice(),scale(pk,current.fxprime,-1);for(let i=0;i<maxIterations;++i){if(a=wolfeLineSearch(f,pk,current,next,a),params.history&¶ms.history.push({x:current.x.slice(),fx:current.fx,fxprime:current.fxprime.slice(),alpha:a}),a){weightedSum(yk,1,next.fxprime,-1,current.fxprime);const delta_k=dot(current.fxprime,current.fxprime);weightedSum(pk,Math.max(0,dot(yk,next.fxprime)/delta_k),pk,-1,next.fxprime),temp=current,current=next,next=temp}else scale(pk,current.fxprime,-1);if(norm2(current.fxprime)<=1e-5)break}return params.history&¶ms.history.push({x:current.x.slice(),fx:current.fx,fxprime:current.fxprime.slice(),alpha:a}),current}function venn(sets,parameters={}){parameters.maxIterations=parameters.maxIterations||500;const initialLayout=parameters.initialLayout||bestInitialLayout,loss=parameters.lossFunction||lossFunction,areas=function(areas,parameters={}){const distinct=parameters.distinct,r=areas.map(s=>Object.assign({},s));function toKey(arr){return arr.join(";")}if(distinct){const count=new Map;for(const area of r)for(let i=0;i<area.sets.length;i++){const si=String(area.sets[i]);count.set(si,area.size+(count.get(si)||0));for(let j=i+1;j<area.sets.length;j++){const sj=String(area.sets[j]),k1=`${si};${sj}`,k2=`${sj};${si}`;count.set(k1,area.size+(count.get(k1)||0)),count.set(k2,area.size+(count.get(k2)||0))}}for(const area of r)area.sets.length<3&&(area.size=count.get(toKey(area.sets)))}const ids=[],pairs=new Set;for(const area of r)if(1===area.sets.length)ids.push(area.sets[0]);else if(2===area.sets.length){const a=area.sets[0],b=area.sets[1];pairs.add(toKey(area.sets)),pairs.add(toKey([b,a]))}ids.sort((a,b)=>a===b?0:a<b?-1:1);for(let i=0;i<ids.length;++i){const a=ids[i];for(let j=i+1;j<ids.length;++j){const b=ids[j];pairs.has(toKey([a,b]))||r.push({sets:[a,b],size:0})}}return r}(sets,parameters),circles=initialLayout(areas,parameters),setids=Object.keys(circles),initial=[];for(const setid of setids)initial.push(circles[setid].x),initial.push(circles[setid].y);const positions=nelderMead(values=>{const current={};for(let i=0;i<setids.length;++i){const setid=setids[i];current[setid]={x:values[2*i],y:values[2*i+1],radius:circles[setid].radius}}return loss(current,areas)},initial,parameters).x;for(let i=0;i<setids.length;++i){const setid=setids[i];circles[setid].x=positions[2*i],circles[setid].y=positions[2*i+1]}return circles}const SMALL=1e-10;function distanceFromIntersectArea(r1,r2,overlap){return Math.min(r1,r2)*Math.min(r1,r2)*Math.PI<=overlap+SMALL?Math.abs(r1-r2):function(f,a,b,parameters){const maxIterations=(parameters=parameters||{}).maxIterations||100,tolerance=parameters.tolerance||1e-10,fA=f(a),fB=f(b);let delta=b-a;if(fA*fB>0)throw"Initial bisect points must have opposite signs";if(0===fA)return a;if(0===fB)return b;for(let i=0;i<maxIterations;++i){delta/=2;const mid=a+delta,fMid=f(mid);if(fMid*fA>=0&&(a=mid),Math.abs(delta)<tolerance||0===fMid)return mid}return a+delta}(distance2=>circleOverlap(r1,r2,distance2)-overlap,0,r1+r2)}function bestInitialLayout(areas,params={}){let initial=function(areas,params){const loss=params&¶ms.lossFunction?params.lossFunction:lossFunction,circles={},setOverlaps={};for(const area of areas)if(1===area.sets.length){const set=area.sets[0];circles[set]={x:1e10,y:1e10,rowid:circles.length,size:area.size,radius:Math.sqrt(area.size/Math.PI)},setOverlaps[set]=[]}areas=areas.filter(a=>2===a.sets.length);for(const current of areas){let weight=null!=current.weight?current.weight:1;const left=current.sets[0],right=current.sets[1];current.size+SMALL>=Math.min(circles[left].size,circles[right].size)&&(weight=0),setOverlaps[left].push({set:right,size:current.size,weight:weight}),setOverlaps[right].push({set:left,size:current.size,weight:weight})}const mostOverlapped=[];function sortOrder(a,b){return b.size-a.size}Object.keys(setOverlaps).forEach(set=>{let size=0;for(let i=0;i<setOverlaps[set].length;++i)size+=setOverlaps[set][i].size*setOverlaps[set][i].weight;mostOverlapped.push({set:set,size:size})}),mostOverlapped.sort(sortOrder);const positioned={};function isPositioned(element){return element.set in positioned}function positionSet(point,index){circles[index].x=point.x,circles[index].y=point.y,positioned[index]=!0}positionSet({x:0,y:0},mostOverlapped[0].set);for(let i=1;i<mostOverlapped.length;++i){const setIndex=mostOverlapped[i].set,overlap=setOverlaps[setIndex].filter(isPositioned),set=circles[setIndex];if(overlap.sort(sortOrder),0===overlap.length)throw"ERROR: missing pairwise overlap information";const points=[];for(var j=0;j<overlap.length;++j){const p1=circles[overlap[j].set],d1=distanceFromIntersectArea(set.radius,p1.radius,overlap[j].size);points.push({x:p1.x+d1,y:p1.y}),points.push({x:p1.x-d1,y:p1.y}),points.push({y:p1.y+d1,x:p1.x}),points.push({y:p1.y-d1,x:p1.x});for(let k=j+1;k<overlap.length;++k){const p2=circles[overlap[k].set],d2=distanceFromIntersectArea(set.radius,p2.radius,overlap[k].size),extraPoints=circleCircleIntersection({x:p1.x,y:p1.y,radius:d1},{x:p2.x,y:p2.y,radius:d2});points.push(...extraPoints)}}let bestLoss=1e50,bestPoint=points[0];for(const point of points){circles[setIndex].x=point.x,circles[setIndex].y=point.y;const localLoss=loss(circles,areas);localLoss<bestLoss&&(bestLoss=localLoss,bestPoint=point)}positionSet(bestPoint,setIndex)}return circles}(areas,params);const loss=params.lossFunction||lossFunction;if(areas.length>=8){const constrained=function(areas,params={}){const restarts=params.restarts||10,sets=[],setids={};for(const area of areas)1===area.sets.length&&(setids[area.sets[0]]=sets.length,sets.push(area));let{distances:distances,constraints:constraints}=function(areas,sets,setids){const distances=zerosM(sets.length,sets.length),constraints=zerosM(sets.length,sets.length);return areas.filter(x=>2===x.sets.length).forEach(current=>{const left=setids[current.sets[0]],right=setids[current.sets[1]],distance2=distanceFromIntersectArea(Math.sqrt(sets[left].size/Math.PI),Math.sqrt(sets[right].size/Math.PI),current.size);distances[left][right]=distances[right][left]=distance2;let c=0;current.size+1e-10>=Math.min(sets[left].size,sets[right].size)?c=1:current.size<=1e-10&&(c=-1),constraints[left][right]=constraints[right][left]=c}),{distances:distances,constraints:constraints}}(areas,sets,setids);const norm=norm2(distances.map(norm2))/distances.length;distances=distances.map(row=>row.map(value=>value/norm));const obj=(x,fxprime)=>function(x,fxprime,distances,constraints){for(let i=0;i<fxprime.length;++i)fxprime[i]=0;let loss=0;for(let i=0;i<distances.length;++i){const xi=x[2*i],yi=x[2*i+1];for(let j=i+1;j<distances.length;++j){const xj=x[2*j],yj=x[2*j+1],dij=distances[i][j],constraint=constraints[i][j],squaredDistance=(xj-xi)*(xj-xi)+(yj-yi)*(yj-yi),distance2=Math.sqrt(squaredDistance),delta=squaredDistance-dij*dij;constraint>0&&distance2<=dij||constraint<0&&distance2>=dij||(loss+=2*delta*delta,fxprime[2*i]+=4*delta*(xi-xj),fxprime[2*i+1]+=4*delta*(yi-yj),fxprime[2*j]+=4*delta*(xj-xi),fxprime[2*j+1]+=4*delta*(yj-yi))}}return loss}(x,fxprime,distances,constraints);let best=null;for(let i=0;i<restarts;++i){const current=conjugateGradient(obj,zeros(2*distances.length).map(Math.random),params);(!best||current.fx<best.fx)&&(best=current)}const positions=best.x,circles={};for(let i=0;i<sets.length;++i){const set=sets[i];circles[set.sets[0]]={x:positions[2*i]*norm,y:positions[2*i+1]*norm,radius:Math.sqrt(set.size/Math.PI)}}if(params.history)for(const h of params.history)scale(h.x,norm);return circles}(areas,params);loss(constrained,areas)+1e-8<loss(initial,areas)&&(initial=constrained)}return initial}function lossFunction(circles,overlaps){let output=0;for(const area of overlaps){if(1===area.sets.length)continue;let overlap;if(2===area.sets.length){const left=circles[area.sets[0]],right=circles[area.sets[1]];overlap=circleOverlap(left.radius,right.radius,distance(left,right))}else overlap=intersectionArea(area.sets.map(d=>circles[d]));output+=(null!=area.weight?area.weight:1)*(overlap-area.size)*(overlap-area.size)}return output}function logRatioLossFunction(circles,overlaps){let output=0;for(const area of overlaps){if(1===area.sets.length)continue;let overlap;if(2===area.sets.length){const left=circles[area.sets[0]],right=circles[area.sets[1]];overlap=circleOverlap(left.radius,right.radius,distance(left,right))}else overlap=intersectionArea(area.sets.map(d=>circles[d]));const weight=null!=area.weight?area.weight:1,differenceFromIdeal=Math.log((overlap+1)/(area.size+1));output+=weight*differenceFromIdeal*differenceFromIdeal}return output}function orientateCircles(circles,orientation,orientationOrder){if(null==orientationOrder?circles.sort((a,b)=>b.radius-a.radius):circles.sort(orientationOrder),circles.length>0){const largestX=circles[0].x,largestY=circles[0].y;for(const circle of circles)circle.x-=largestX,circle.y-=largestY}if(2===circles.length){distance(circles[0],circles[1])<Math.abs(circles[1].radius-circles[0].radius)&&(circles[1].x=circles[0].x+circles[0].radius-circles[1].radius-1e-10,circles[1].y=circles[0].y)}if(circles.length>1){const rotation=Math.atan2(circles[1].x,circles[1].y)-orientation,c=Math.cos(rotation),s=Math.sin(rotation);for(const circle of circles){const x=circle.x,y=circle.y;circle.x=c*x-s*y,circle.y=s*x+c*y}}if(circles.length>2){let angle=Math.atan2(circles[2].x,circles[2].y)-orientation;for(;angle<0;)angle+=2*Math.PI;for(;angle>2*Math.PI;)angle-=2*Math.PI;if(angle>Math.PI){const slope=circles[1].y/(1e-10+circles[1].x);for(const circle of circles){var d=(circle.x+slope*circle.y)/(1+slope*slope);circle.x=2*d-circle.x,circle.y=2*d*slope-circle.y}}}}function getBoundingBox(circles){const minMax=d=>({max:circles.reduce((acc,c)=>Math.max(acc,c[d]+c.radius),Number.NEGATIVE_INFINITY),min:circles.reduce((acc,c)=>Math.min(acc,c[d]-c.radius),Number.POSITIVE_INFINITY)});return{xRange:minMax("x"),yRange:minMax("y")}}function normalizeSolution(solution,orientation,orientationOrder){null==orientation&&(orientation=Math.PI/2);let circles=fromObjectNotation(solution).map(d=>Object.assign({},d));const clusters=function(circles){function find(circle){return circle.parent!==circle&&(circle.parent=find(circle.parent)),circle.parent}function union(x,y){const xRoot=find(x),yRoot=find(y);xRoot.parent=yRoot}circles.forEach(circle=>{circle.parent=circle});for(let i=0;i<circles.length;++i)for(let j=i+1;j<circles.length;++j){const maxDistance=circles[i].radius+circles[j].radius;distance(circles[i],circles[j])+1e-10<maxDistance&&union(circles[j],circles[i])}const disjointClusters=new Map;for(let i=0;i<circles.length;++i){const setid=find(circles[i]).parent.setid;disjointClusters.has(setid)||disjointClusters.set(setid,[]),disjointClusters.get(setid).push(circles[i])}return circles.forEach(circle=>{delete circle.parent}),Array.from(disjointClusters.values())}(circles);for(const cluster of clusters){orientateCircles(cluster,orientation,orientationOrder);const bounds=getBoundingBox(cluster);cluster.size=(bounds.xRange.max-bounds.xRange.min)*(bounds.yRange.max-bounds.yRange.min),cluster.bounds=bounds}clusters.sort((a,b)=>b.size-a.size),circles=clusters[0];let returnBounds=circles.bounds;const spacing=(returnBounds.xRange.max-returnBounds.xRange.min)/50;function addCluster(cluster,right,bottom){if(!cluster)return;const bounds=cluster.bounds;let xOffset,yOffset;if(right)xOffset=returnBounds.xRange.max-bounds.xRange.min+spacing;else{xOffset=returnBounds.xRange.max-bounds.xRange.max;const centreing=(bounds.xRange.max-bounds.xRange.min)/2-(returnBounds.xRange.max-returnBounds.xRange.min)/2;centreing<0&&(xOffset+=centreing)}if(bottom)yOffset=returnBounds.yRange.max-bounds.yRange.min+spacing;else{yOffset=returnBounds.yRange.max-bounds.yRange.max;const centreing=(bounds.yRange.max-bounds.yRange.min)/2-(returnBounds.yRange.max-returnBounds.yRange.min)/2;centreing<0&&(yOffset+=centreing)}for(const c of cluster)c.x+=xOffset,c.y+=yOffset,circles.push(c)}let index=1;for(;index<clusters.length;)addCluster(clusters[index],!0,!1),addCluster(clusters[index+1],!1,!0),addCluster(clusters[index+2],!0,!0),index+=3,returnBounds=getBoundingBox(circles);return toObjectNotation(circles)}function scaleSolution(solution,width,height,padding,scaleToFit){const circles=fromObjectNotation(solution);width-=2*padding,height-=2*padding;const{xRange:xRange,yRange:yRange}=getBoundingBox(circles);if(xRange.max===xRange.min||yRange.max===yRange.min)return console.log("not scaling solution: zero size detected"),solution;let xScaling,yScaling;if(scaleToFit){const toScaleDiameter=2*Math.sqrt(scaleToFit/Math.PI);xScaling=width/toScaleDiameter,yScaling=height/toScaleDiameter}else xScaling=width/(xRange.max-xRange.min),yScaling=height/(yRange.max-yRange.min);const scaling=Math.min(yScaling,xScaling),xOffset=(width-(xRange.max-xRange.min)*scaling)/2,yOffset=(height-(yRange.max-yRange.min)*scaling)/2;return toObjectNotation(circles.map(circle=>({radius:scaling*circle.radius,x:padding+xOffset+(circle.x-xRange.min)*scaling,y:padding+yOffset+(circle.y-yRange.min)*scaling,setid:circle.setid})))}function toObjectNotation(circles){const r={};for(const circle of circles)r[circle.setid]=circle;return r}function fromObjectNotation(solution){return Object.keys(solution).map(id=>Object.assign(solution[id],{setid:id}))}function VennDiagram(options={}){let useViewBox=!1,width=600,height=350,padding=15,duration=1e3,orientation=Math.PI/2,normalize=!0,scaleToFit=null,wrap=!0,styled=!0,fontSize=null,orientationOrder=null,distinct=!1,round=null,symmetricalTextCentre=!(!options||!options.symmetricalTextCentre)&&options.symmetricalTextCentre,colourMap={},colourScheme=options&&options.colourScheme?options.colourScheme:options&&options.colorScheme?options.colorScheme:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],colourIndex=0,colours=function(key){if(key in colourMap)return colourMap[key];var ret=colourMap[key]=colourScheme[colourIndex];return colourIndex+=1,colourIndex>=colourScheme.length&&(colourIndex=0),ret},layoutFunction=venn,loss=lossFunction;function chart(selection){let data=selection.datum();const toRemove=new Set;data.forEach(datum=>{0==datum.size&&1==datum.sets.length&&toRemove.add(datum.sets[0])}),data=data.filter(datum=>!datum.sets.some(set=>toRemove.has(set)));let circles={},textCentres={};if(data.length>0){let solution=layoutFunction(data,{lossFunction:loss,distinct:distinct});normalize&&(solution=normalizeSolution(solution,orientation,orientationOrder)),circles=scaleSolution(solution,width,height,padding,scaleToFit),textCentres=computeTextCentres(circles,data,symmetricalTextCentre)}const labels={};function label(d){return d.sets in labels?labels[d.sets]:1==d.sets.length?""+d.sets[0]:void 0}data.forEach(datum=>{datum.label&&(labels[datum.sets]=datum.label)}),selection.selectAll("svg").data([circles]).enter().append("svg");const svg=selection.select("svg");useViewBox?svg.attr("viewBox",`0 0 ${width} ${height}`):svg.attr("width",width).attr("height",height);const previous={};let hasPrevious=!1;function pathTween(d){return t=>intersectionAreaPath(d.sets.map(set=>{let start=previous[set],end=circles[set];return start||(start={x:width/2,y:height/2,radius:1}),end||(end={x:width/2,y:height/2,radius:1}),{x:start.x*(1-t)+end.x*t,y:start.y*(1-t)+end.y*t,radius:start.radius*(1-t)+end.radius*t}}),round)}svg.selectAll(".venn-area path").each(function(d){const path=this.getAttribute("d");1==d.sets.length&&path&&!distinct&&(hasPrevious=!0,previous[d.sets[0]]=function(path){const tokens=path.split(" ");return{x:Number.parseFloat(tokens[1]),y:Number.parseFloat(tokens[2]),radius:-Number.parseFloat(tokens[4])}}(path))});const nodes=svg.selectAll(".venn-area").data(data,d=>d.sets),enter=nodes.enter().append("g").attr("class",d=>`venn-area venn-${1==d.sets.length?"circle":"intersection"}${d.colour||d.color?" venn-coloured":""}`).attr("data-venn-sets",d=>d.sets.join("_")),enterPath=enter.append("path"),enterText=enter.append("text").attr("class","label").text(d=>label(d)).attr("text-anchor","middle").attr("dy",".35em").attr("x",width/2).attr("y",height/2);function asTransition(s){return"function"==typeof s.transition?s.transition("venn").duration(duration):s}styled&&(enterPath.style("fill-opacity","0").filter(d=>1==d.sets.length).style("fill",d=>d.colour?d.colour:d.color?d.color:colours(d.sets)).style("fill-opacity",".25"),enterText.style("fill",d=>d.colour||d.color?"#FFF":options.textFill?options.textFill:1==d.sets.length?colours(d.sets):"#444"));let update=selection;hasPrevious&&"function"==typeof update.transition?(update=asTransition(selection),update.selectAll("path").attrTween("d",pathTween)):update.selectAll("path").attr("d",d=>intersectionAreaPath(d.sets.map(set=>circles[set])),round);const updateText=update.selectAll("text").filter(d=>d.sets in textCentres).text(d=>label(d)).attr("x",d=>Math.floor(textCentres[d.sets].x)).attr("y",d=>Math.floor(textCentres[d.sets].y));wrap&&(hasPrevious?"on"in updateText?updateText.on("end",wrapText(circles,label)):updateText.each("end",wrapText(circles,label)):updateText.each(wrapText(circles,label)));const exit=asTransition(nodes.exit()).remove();"function"==typeof nodes.transition&&exit.selectAll("path").attrTween("d",pathTween);const exitText=exit.selectAll("text").attr("x",width/2).attr("y",height/2);return null!==fontSize&&(enterText.style("font-size","0px"),updateText.style("font-size",fontSize),exitText.style("font-size","0px")),{circles:circles,textCentres:textCentres,nodes:nodes,enter:enter,update:update,exit:exit}}return chart.wrap=function(_){return arguments.length?(wrap=_,chart):wrap},chart.useViewBox=function(){return useViewBox=!0,chart},chart.width=function(_){return arguments.length?(width=_,chart):width},chart.height=function(_){return arguments.length?(height=_,chart):height},chart.padding=function(_){return arguments.length?(padding=_,chart):padding},chart.distinct=function(_){return arguments.length?(distinct=_,chart):distinct},chart.colours=function(_){return arguments.length?(colours=_,chart):colours},chart.colors=function(_){return arguments.length?(colours=_,chart):colours},chart.fontSize=function(_){return arguments.length?(fontSize=_,chart):fontSize},chart.round=function(_){return arguments.length?(round=_,chart):round},chart.duration=function(_){return arguments.length?(duration=_,chart):duration},chart.layoutFunction=function(_){return arguments.length?(layoutFunction=_,chart):layoutFunction},chart.normalize=function(_){return arguments.length?(normalize=_,chart):normalize},chart.scaleToFit=function(_){return arguments.length?(scaleToFit=_,chart):scaleToFit},chart.styled=function(_){return arguments.length?(styled=_,chart):styled},chart.orientation=function(_){return arguments.length?(orientation=_,chart):orientation},chart.orientationOrder=function(_){return arguments.length?(orientationOrder=_,chart):orientationOrder},chart.lossFunction=function(_){return arguments.length?(loss="default"===_?lossFunction:"logRatio"===_?logRatioLossFunction:_,chart):loss},chart}function wrapText(circles,labeller){return function(data){const text=this,width=circles[data.sets[0]].radius||50,label=labeller(data)||"",words=label.split(/\s+/).reverse(),minChars=(label.length+words.length)/3;let word=words.pop(),line=[word],lineNumber=0;text.textContent=null;const tspans=[];function append(word2){const tspan2=text.ownerDocument.createElementNS(text.namespaceURI,"tspan");return tspan2.textContent=word2,tspans.push(tspan2),text.append(tspan2),tspan2}let tspan=append(word);for(;word=words.pop(),word;){line.push(word);const joined=line.join(" ");tspan.textContent=joined,joined.length>minChars&&tspan.getComputedTextLength()>width&&(line.pop(),tspan.textContent=line.join(" "),line=[word],tspan=append(word),lineNumber++)}const initial=.35-1.1*lineNumber/2,x=text.getAttribute("x"),y=text.getAttribute("y");tspans.forEach((t,i)=>{t.setAttribute("x",x),t.setAttribute("y",y),t.setAttribute("dy",`${initial+1.1*i}em`)})}}function circleMargin(current,interior,exterior){let margin=interior[0].radius-distance(interior[0],current);for(let i=1;i<interior.length;++i){const m=interior[i].radius-distance(interior[i],current);m<=margin&&(margin=m)}for(let i=0;i<exterior.length;++i){const m=distance(exterior[i],current)-exterior[i].radius;m<=margin&&(margin=m)}return margin}function computeTextCentre(interior,exterior,symmetricalTextCentre){const points=[];for(const c of interior)points.push({x:c.x,y:c.y}),points.push({x:c.x+c.radius/2,y:c.y}),points.push({x:c.x-c.radius/2,y:c.y}),points.push({x:c.x,y:c.y+c.radius/2}),points.push({x:c.x,y:c.y-c.radius/2});let initial=points[0],margin=circleMargin(points[0],interior,exterior);for(let i=1;i<points.length;++i){const m=circleMargin(points[i],interior,exterior);m>=margin&&(initial=points[i],margin=m)}const solution=nelderMead(p=>-1*circleMargin({x:p[0],y:p[1]},interior,exterior),[initial.x,initial.y],{maxIterations:500,minErrorDelta:1e-10}).x,ret={x:symmetricalTextCentre?0:solution[0],y:solution[1]};let valid=!0;for(const i of interior)if(distance(ret,i)>i.radius){valid=!1;break}for(const e of exterior)if(distance(ret,e)<e.radius){valid=!1;break}if(valid)return ret;if(1==interior.length)return{x:interior[0].x,y:interior[0].y};const areaStats={};return intersectionArea(interior,areaStats),0===areaStats.arcs.length?{x:0,y:-1e3,disjoint:!0}:1==areaStats.arcs.length?{x:areaStats.arcs[0].circle.x,y:areaStats.arcs[0].circle.y}:exterior.length?computeTextCentre(interior,[]):getCenter(areaStats.arcs.map(a=>a.p1))}function computeTextCentres(circles,areas,symmetricalTextCentre){const ret={},overlapped=function(circles){const ret={},circleids=Object.keys(circles);for(const circleid of circleids)ret[circleid]=[];for(let i=0;i<circleids.length;i++){const ci=circleids[i],a=circles[ci];for(let j=i+1;j<circleids.length;++j){const cj=circleids[j],b=circles[cj],d=distance(a,b);d+b.radius<=a.radius+1e-10?ret[cj].push(ci):d+a.radius<=b.radius+1e-10&&ret[ci].push(cj)}}return ret}(circles);for(let i=0;i<areas.length;++i){const area=areas[i].sets,areaids={},exclude={};for(let j=0;j<area.length;++j){areaids[area[j]]=!0;const overlaps=overlapped[area[j]];for(let k=0;k<overlaps.length;++k)exclude[overlaps[k]]=!0}const interior=[],exterior=[];for(let setid in circles)setid in areaids?interior.push(circles[setid]):setid in exclude||exterior.push(circles[setid]);const centre=computeTextCentre(interior,exterior,symmetricalTextCentre);ret[area]=centre,centre.disjoint&&areas[i].size>0&&console.log("WARNING: area "+area+" not represented on screen")}return ret}function intersectionAreaArcs(circles){if(0===circles.length)return[];const stats={};return intersectionArea(circles,stats),stats.arcs}function arcsToPath(arcs,round){if(0===arcs.length)return"M 0 0";const rFactor=Math.pow(10,round||0),r=null!=round?v=>Math.round(v*rFactor)/rFactor:v=>v;if(1==arcs.length){const circle=arcs[0].circle;return function(x,y,r){const ret=[];return ret.push("\nM",x,y),ret.push("\nm",-r,0),ret.push("\na",r,r,0,1,0,2*r,0),ret.push("\na",r,r,0,1,0,2*-r,0),ret.join(" ")}(r(circle.x),r(circle.y),r(circle.radius))}const ret=["\nM",r(arcs[0].p2.x),r(arcs[0].p2.y)];for(const arc of arcs){const radius=r(arc.circle.radius);ret.push("\nA",radius,radius,0,arc.large?1:0,arc.sweep?1:0,r(arc.p1.x),r(arc.p1.y))}return ret.join(" ")}function intersectionAreaPath(circles,round){return arcsToPath(intersectionAreaArcs(circles),round)}var parser=function(){var o=__name(function(k,v,o2,l){for(o2=o2||{},l=k.length;l--;o2[k[l]]=v);return o2},"o"),$V0=[5,8],$V1=[7,8,11,12,17,19,22,24],$V2=[1,17],$V3=[1,18],$V4=[7,8,11,12,14,15,16,17,19,20,21,22,24,27],$V5=[1,31],$V6=[1,39],$V7=[7,8,11,12,17,19,22,24,27],$V8=[1,57],$V9=[1,56],$Va=[1,58],$Vb=[1,59],$Vc=[1,60],$Vd=[7,8,11,12,16,17,19,20,22,24,27,31,32,33],parser2={trace:__name(function(){},"trace"),yy:{},symbols_:{error:2,start:3,optNewlines:4,VENN:5,document:6,EOF:7,NEWLINE:8,line:9,statement:10,TITLE:11,SET:12,identifier:13,BRACKET_LABEL:14,COLON:15,NUMERIC:16,UNION:17,identifierList:18,TEXT:19,IDENTIFIER:20,STRING:21,INDENT_TEXT:22,indentedTextTail:23,STYLE:24,stylesOpt:25,styleField:26,COMMA:27,styleValue:28,valueTokens:29,valueToken:30,HEXCOLOR:31,RGBCOLOR:32,RGBACOLOR:33,$accept:0,$end:1},terminals_:{2:"error",5:"VENN",7:"EOF",8:"NEWLINE",11:"TITLE",12:"SET",14:"BRACKET_LABEL",15:"COLON",16:"NUMERIC",17:"UNION",19:"TEXT",20:"IDENTIFIER",21:"STRING",22:"INDENT_TEXT",24:"STYLE",27:"COMMA",31:"HEXCOLOR",32:"RGBCOLOR",33:"RGBACOLOR"},productions_:[0,[3,4],[4,0],[4,2],[6,0],[6,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,5],[10,2],[10,3],[10,4],[10,5],[10,3],[10,3],[10,3],[10,4],[10,4],[10,2],[10,3],[23,1],[23,1],[23,1],[23,2],[23,2],[25,1],[25,3],[26,3],[28,1],[28,1],[29,1],[29,2],[30,1],[30,1],[30,1],[30,1],[30,1],[18,1],[18,3],[13,1],[13,1]],performAction:__name(function(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return $$[$0-1];case 2:case 3:case 4:case 6:this.$=[];break;case 5:case 35:$$[$0-1].push($$[$0]),this.$=$$[$0-1];break;case 7:case 22:case 32:case 36:case 37:case 38:case 39:case 40:case 43:case 44:this.$=$$[$0];break;case 8:yy.setDiagramTitle($$[$0].substr(6)),this.$=$$[$0].substr(6);break;case 9:yy.addSubsetData([$$[$0]],void 0,void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 10:yy.addSubsetData([$$[$0-1]],$$[$0],void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 11:yy.addSubsetData([$$[$0-2]],void 0,parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 12:yy.addSubsetData([$$[$0-3]],$$[$0-2],parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 13:if($$[$0].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0]),yy.addSubsetData($$[$0],void 0,void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 14:if($$[$0-1].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0-1]),yy.addSubsetData($$[$0-1],$$[$0],void 0),yy.setIndentMode&&yy.setIndentMode(!0);break;case 15:if($$[$0-2].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0-2]),yy.addSubsetData($$[$0-2],void 0,parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 16:if($$[$0-3].length<2)throw new Error("union requires multiple identifiers");yy.validateUnionIdentifiers&&yy.validateUnionIdentifiers($$[$0-3]),yy.addSubsetData($$[$0-3],$$[$0-2],parseFloat($$[$0])),yy.setIndentMode&&yy.setIndentMode(!0);break;case 17:case 18:case 19:yy.addTextData($$[$0-1],$$[$0],void 0);break;case 20:case 21:yy.addTextData($$[$0-2],$$[$0-1],$$[$0]);break;case 23:yy.addStyleData($$[$0-1],$$[$0]);break;case 24:case 25:case 26:if(!(cs=yy.getCurrentSets()))throw new Error("text requires set");yy.addTextData(cs,$$[$0],void 0);break;case 27:case 28:var cs;if(!(cs=yy.getCurrentSets()))throw new Error("text requires set");yy.addTextData(cs,$$[$0-1],$$[$0]);break;case 29:case 41:case 34:this.$=[$$[$0]];break;case 30:case 42:this.$=[...$$[$0-2],$$[$0]];break;case 31:this.$=[$$[$0-2],$$[$0]];break;case 33:this.$=$$[$0].join(" ")}},"anonymous"),table:[o($V0,[2,2],{3:1,4:2}),{1:[3]},{5:[1,3],8:[1,4]},o($V1,[2,4],{6:5}),o($V0,[2,3]),{7:[1,6],8:[1,8],9:7,10:9,11:[1,10],12:[1,11],17:[1,12],19:[1,13],22:[1,14],24:[1,15]},{1:[2,1]},o($V1,[2,5]),o($V1,[2,6]),o($V1,[2,7]),o($V1,[2,8]),{13:16,20:$V2,21:$V3},{13:20,18:19,20:$V2,21:$V3},{13:20,18:21,20:$V2,21:$V3},{16:[1,25],20:[1,23],21:[1,24],23:22},{13:20,18:26,20:$V2,21:$V3},o($V1,[2,9],{14:[1,27],15:[1,28]}),o($V4,[2,43]),o($V4,[2,44]),o($V1,[2,13],{14:[1,29],15:[1,30],27:$V5}),o($V4,[2,41]),{16:[1,34],20:[1,32],21:[1,33],27:$V5},o($V1,[2,22]),o($V1,[2,24],{14:[1,35]}),o($V1,[2,25],{14:[1,36]}),o($V1,[2,26]),{20:$V6,25:37,26:38,27:$V5},o($V1,[2,10],{15:[1,40]}),{16:[1,41]},o($V1,[2,14],{15:[1,42]}),{16:[1,43]},{13:44,20:$V2,21:$V3},o($V1,[2,17],{14:[1,45]}),o($V1,[2,18],{14:[1,46]}),o($V1,[2,19]),o($V1,[2,27]),o($V1,[2,28]),o($V1,[2,23],{27:[1,47]}),o($V7,[2,29]),{15:[1,48]},{16:[1,49]},o($V1,[2,11]),{16:[1,50]},o($V1,[2,15]),o($V4,[2,42]),o($V1,[2,20]),o($V1,[2,21]),{20:$V6,26:51},{16:$V8,20:$V9,21:[1,53],28:52,29:54,30:55,31:$Va,32:$Vb,33:$Vc},o($V1,[2,12]),o($V1,[2,16]),o($V7,[2,30]),o($V7,[2,31]),o($V7,[2,32]),o($V7,[2,33],{30:61,16:$V8,20:$V9,31:$Va,32:$Vb,33:$Vc}),o($Vd,[2,34]),o($Vd,[2,36]),o($Vd,[2,37]),o($Vd,[2,38]),o($Vd,[2,39]),o($Vd,[2,40]),o($Vd,[2,35])],defaultActions:{6:[2,1]},parseError:__name(function(str,hash){if(!hash.recoverable){var error=new Error(str);throw error.hash=hash,error}this.trace(str)},"parseError"),parse:__name(function(input){var self=this,stack=[0],tstack=[],vstack=[null],lstack=[],table=this.table,yytext="",yylineno=0,yyleng=0,args=lstack.slice.call(arguments,1),lexer2=Object.create(this.lexer),sharedState={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(sharedState.yy[k]=this.yy[k]);lexer2.setInput(input,sharedState.yy),sharedState.yy.lexer=lexer2,sharedState.yy.parser=this,void 0===lexer2.yylloc&&(lexer2.yylloc={});var yyloc=lexer2.yylloc;lstack.push(yyloc);var ranges=lexer2.options&&lexer2.options.ranges;function lex(){var token;return"number"!=typeof(token=tstack.pop()||lexer2.lex()||1)&&(token instanceof Array&&(token=(tstack=token).pop()),token=self.symbols_[token]||token),token}"function"==typeof sharedState.yy.parseError?this.parseError=sharedState.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,__name(function(n){stack.length=stack.length-2*n,vstack.length=vstack.length-n,lstack.length=lstack.length-n},"popStack"),__name(lex,"lex");for(var symbol,state,action,r,p,len,newState,expected,yyval={};;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:(null==symbol&&(symbol=lex()),action=table[state]&&table[state][symbol]),void 0===action||!action.length||!action[0]){var errStr="";for(p in expected=[],table[state])this.terminals_[p]&&p>2&&expected.push("'"+this.terminals_[p]+"'");errStr=lexer2.showPosition?"Parse error on line "+(yylineno+1)+":\n"+lexer2.showPosition()+"\nExpecting "+expected.join(", ")+", got '"+(this.terminals_[symbol]||symbol)+"'":"Parse error on line "+(yylineno+1)+": Unexpected "+(1==symbol?"end of input":"'"+(this.terminals_[symbol]||symbol)+"'"),this.parseError(errStr,{text:lexer2.match,token:this.terminals_[symbol]||symbol,line:lexer2.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&action.length>1)throw new Error("Parse Error: multiple actions possible at state: "+state+", token: "+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(lexer2.yytext),lstack.push(lexer2.yylloc),stack.push(action[1]),symbol=null,yyleng=lexer2.yyleng,yytext=lexer2.yytext,yylineno=lexer2.yylineno,yyloc=lexer2.yylloc;break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),void 0!==(r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args))))return r;len&&(stack=stack.slice(0,-1*len*2),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0}}return!0},"parse")},lexer=function(){return{EOF:1,parseError:__name(function(str,hash){if(!this.yy.parser)throw new Error(str);this.yy.parser.parseError(str,hash)},"parseError"),setInput:__name(function(input,yy){return this.yy=yy||this.yy||{},this._input=input,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:__name(function(){var ch=this._input[0];return this.yytext+=ch,this.yyleng++,this.offset++,this.match+=ch,this.matched+=ch,ch.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ch},"input"),unput:__name(function(ch){var len=ch.length,lines=ch.split(/(?:\r\n?|\n)/g);this._input=ch+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-len),this.offset-=len;var oldLines=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),lines.length-1&&(this.yylineno-=lines.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:lines?(lines.length===oldLines.length?this.yylloc.first_column:0)+oldLines[oldLines.length-lines.length].length-lines[0].length:this.yylloc.first_column-len},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-len]),this.yyleng=this.yytext.length,this},"unput"),more:__name(function(){return this._more=!0,this},"more"),reject:__name(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:__name(function(n){this.unput(this.match.slice(n))},"less"),pastInput:__name(function(){var past=this.matched.substr(0,this.matched.length-this.match.length);return(past.length>20?"...":"")+past.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:__name(function(){var next=this.match;return next.length<20&&(next+=this._input.substr(0,20-next.length)),(next.substr(0,20)+(next.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:__name(function(){var pre=this.pastInput(),c=new Array(pre.length+1).join("-");return pre+this.upcomingInput()+"\n"+c+"^"},"showPosition"),test_match:__name(function(match,indexed_rule){var token,lines,backup;if(this.options.backtrack_lexer&&(backup={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(backup.yylloc.range=this.yylloc.range.slice(0))),(lines=match[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=lines.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lines?lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+match[0].length},this.yytext+=match[0],this.match+=match[0],this.matches=match,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(match[0].length),this.matched+=match[0],token=this.performAction.call(this,this.yy,this,indexed_rule,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),token)return token;if(this._backtrack){for(var k in backup)this[k]=backup[k];return!1}return!1},"test_match"),next:__name(function(){if(this.done)return this.EOF;var token,match,tempMatch,index;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var rules=this._currentRules(),i=0;i<rules.length;i++)if((tempMatch=this._input.match(this.rules[rules[i]]))&&(!match||tempMatch[0].length>match[0].length)){if(match=tempMatch,index=i,this.options.backtrack_lexer){if(!1!==(token=this.test_match(tempMatch,rules[i])))return token;if(this._backtrack){match=!1;continue}return!1}if(!this.options.flex)break}return match?!1!==(token=this.test_match(match,rules[index]))&&token:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:__name(function(){var r=this.next();return r||this.lex()},"lex"),begin:__name(function(condition){this.conditionStack.push(condition)},"begin"),popState:__name(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:__name(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:__name(function(n){return(n=this.conditionStack.length-1-Math.abs(n||0))>=0?this.conditionStack[n]:"INITIAL"},"topState"),pushState:__name(function(condition){this.begin(condition)},"pushState"),stateStackSize:__name(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:__name(function(yy,yy_,$avoiding_name_collisions,YY_START){switch($avoiding_name_collisions){case 0:case 1:case 2:case 4:case 7:case 8:break;case 3:if(yy.getIndentMode&&yy.getIndentMode())return yy.consumeIndentText=!0,this.begin("INITIAL"),22;break;case 5:yy.setIndentMode&&yy.setIndentMode(!1),this.begin("INITIAL"),this.unput(yy_.yytext);break;case 6:return this.begin("bol"),8;case 9:return 7;case 10:return 11;case 11:return 5;case 12:return 12;case 13:return 17;case 14:if(!yy.consumeIndentText)return 19;yy.consumeIndentText=!1;break;case 15:return 24;case 16:return yy_.yytext=yy_.yytext.slice(2,-2),14;case 17:return yy_.yytext=yy_.yytext.slice(1,-1).trim(),14;case 18:return 16;case 19:return 31;case 20:return 33;case 21:return 32;case 22:return 20;case 23:return 21;case 24:return 27;case 25:return 15}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[ \t]+(?=[\n\r]))/i,/^(?:[ \t]+(?=text\b))/i,/^(?:[ \t]+)/i,/^(?:[^ \t\n\r])/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[ \t]+)/i,/^(?:$)/i,/^(?:title\s[^#\n;]+)/i,/^(?:venn-beta\b)/i,/^(?:set\b)/i,/^(?:union\b)/i,/^(?:text\b)/i,/^(?:style\b)/i,/^(?:\["[^\"]*"\])/i,/^(?:\[[^\]\"]+\])/i,/^(?:[+-]?(\d+(\.\d+)?|\.\d+))/i,/^(?:#[0-9a-fA-F]{3,8})/i,/^(?:rgba\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:rgb\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:"[^\"]*")/i,/^(?:,)/i,/^(?::)/i],conditions:{bol:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0},INITIAL:{rules:[0,1,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0}}}}();function Parser(){this.yy={}}return parser2.lexer=lexer,__name(Parser,"Parser"),Parser.prototype=parser2,parser2.Parser=Parser,new Parser}();parser.parser=parser;var currentSets,venn_default=parser,subsets=[],textNodes=[],styleEntries=[],knownSets=new Set,indentMode=!1,addSubsetData=__name((identifierList,label,size)=>{const sets=normalizeIdentifierList(identifierList).sort(),resolvedSize=size??10/Math.pow(identifierList.length,2);currentSets=sets,1===sets.length&&knownSets.add(sets[0]),subsets.push({sets:sets,size:resolvedSize,label:label?normalizeText(label):void 0})},"addSubsetData"),getSubsetData=__name(()=>subsets,"getSubsetData"),normalizeText=__name(text=>{const trimmed=text.trim();return trimmed.length>=2&&trimmed.startsWith('"')&&trimmed.endsWith('"')?trimmed.slice(1,-1):trimmed},"normalizeText"),normalizeStyleValue=__name(value=>value?normalizeText(value):value,"normalizeStyleValue"),addTextData=__name((identifierList,id,label)=>{const normalizedId=normalizeText(id);textNodes.push({sets:normalizeIdentifierList(identifierList).sort(),id:normalizedId,label:label?normalizeText(label):void 0})},"addTextData"),addStyleData=__name((identifierList,data)=>{const targets=normalizeIdentifierList(identifierList).sort(),styles={};for(const[key,value]of data)styles[key]=normalizeStyleValue(value)??value;styleEntries.push({targets:targets,styles:styles})},"addStyleData"),getStyleData=__name(()=>styleEntries,"getStyleData"),normalizeIdentifierList=__name(identifierList=>identifierList.map(identifier=>normalizeText(identifier)),"normalizeIdentifierList"),validateUnionIdentifiers=__name(identifierList=>{const unknown=normalizeIdentifierList(identifierList).filter(identifier=>!knownSets.has(identifier));if(unknown.length>0)throw new Error(`unknown set identifier: ${unknown.join(", ")}`)},"validateUnionIdentifiers"),getTextData=__name(()=>textNodes,"getTextData"),getCurrentSets=__name(()=>currentSets,"getCurrentSets"),getIndentMode=__name(()=>indentMode,"getIndentMode"),setIndentMode=__name(enabled=>{indentMode=enabled},"setIndentMode"),DEFAULT_VENN_CONFIG=defaultConfig_default.venn;function getConfig2(){return cleanAndMerge(DEFAULT_VENN_CONFIG,getConfig().venn)}__name(getConfig2,"getConfig");var db={getConfig:getConfig2,clear:__name(()=>{clear(),subsets.length=0,textNodes.length=0,styleEntries.length=0,knownSets.clear(),currentSets=void 0,indentMode=!1},"customClear"),setAccTitle:setAccTitle,getAccTitle:getAccTitle,setDiagramTitle:setDiagramTitle,getDiagramTitle:getDiagramTitle,getAccDescription:getAccDescription,setAccDescription:setAccDescription,addSubsetData:addSubsetData,getSubsetData:getSubsetData,addTextData:addTextData,addStyleData:addStyleData,validateUnionIdentifiers:validateUnionIdentifiers,getTextData:getTextData,getStyleData:getStyleData,getCurrentSets:getCurrentSets,getIndentMode:getIndentMode,setIndentMode:setIndentMode},styles_default=__name(options=>`\n .venn-title {\n font-size: 32px;\n fill: ${options.vennTitleTextColor};\n font-family: ${options.fontFamily};\n }\n\n .venn-circle text {\n font-size: 48px;\n font-family: ${options.fontFamily};\n }\n\n .venn-intersection text {\n font-size: 48px;\n fill: ${options.vennSetTextColor};\n font-family: ${options.fontFamily};\n }\n\n .venn-text-node {\n font-family: ${options.fontFamily};\n color: ${options.vennSetTextColor};\n }\n`,"getStyles");function buildStyleByKey(styleData){const map=new Map;for(const entry of styleData){const key=entry.targets.join("|"),existing=map.get(key);existing?Object.assign(existing,entry.styles):map.set(key,{...entry.styles})}return map}__name(buildStyleByKey,"buildStyleByKey");var draw=__name((_text,id,_version,diagObj)=>{var _a,_b,_c;const db2=diagObj.db,config=null==(_a=db2.getConfig)?void 0:_a.call(db2),{themeVariables:themeVariables,look:look,handDrawnSeed:handDrawnSeed}=getConfig(),isHandDrawn="handDrawn"===look,themeColors=[themeVariables.venn1,themeVariables.venn2,themeVariables.venn3,themeVariables.venn4,themeVariables.venn5,themeVariables.venn6,themeVariables.venn7,themeVariables.venn8].filter(Boolean),title=null==(_b=db2.getDiagramTitle)?void 0:_b.call(db2),sets=db2.getSubsetData(),textNodes2=db2.getTextData(),styleByKey=buildStyleByKey(db2.getStyleData()),svgWidth=(null==config?void 0:config.width)??800,svgHeight=(null==config?void 0:config.height)??450,scale2=svgWidth/1600,titleHeight=title?48*scale2:0,defaultTextColor=themeVariables.primaryTextColor??themeVariables.textColor,svg=selectSvgElement(id);svg.attr("viewBox",`0 0 ${svgWidth} ${svgHeight}`),title&&svg.append("text").text(title).attr("class","venn-title").attr("font-size",32*scale2+"px").attr("text-anchor","middle").attr("dominant-baseline","middle").attr("x","50%").attr("y",32*scale2).style("fill",themeVariables.vennTitleTextColor||themeVariables.titleColor);const dummyD3root=select(document.createElement("div")),vennDiagram=VennDiagram().width(svgWidth).height(svgHeight-titleHeight);dummyD3root.datum(sets).call(vennDiagram);const roughSvg=isHandDrawn?at.svg(dummyD3root.select("svg").node()):void 0,layoutAreas=function(data,options={}){const{lossFunction:loss,layoutFunction:layout2=venn,normalize:normalize=!0,orientation:orientation=Math.PI/2,orientationOrder:orientationOrder,width:width=600,height:height=350,padding:padding=15,scaleToFit:scaleToFit=!1,symmetricalTextCentre:symmetricalTextCentre=!1,distinct:distinct,round:round=2}=options;let solution=layout2(data,{lossFunction:"default"!==loss&&loss?"logRatio"===loss?logRatioLossFunction:loss:lossFunction,distinct:distinct});normalize&&(solution=normalizeSolution(solution,orientation,orientationOrder));const circles=scaleSolution(solution,width,height,padding,scaleToFit),textCentres=computeTextCentres(circles,data,symmetricalTextCentre),circleLookup=new Map(Object.keys(circles).map(set=>[set,{set:set,x:circles[set].x,y:circles[set].y,radius:circles[set].radius}])),helpers=data.map(area=>{const circles2=area.sets.map(s=>circleLookup.get(s)),arcs=intersectionAreaArcs(circles2);return{circles:circles2,arcs:arcs,path:arcsToPath(arcs,round),area:area,has:new Set(area.sets)}});function genDistinctPath(sets){let r="";for(const e of helpers)e.has.size>sets.length&&sets.every(s=>e.has.has(s))&&(r+=" "+e.path);return r}return helpers.map(({circles:circles2,arcs:arcs,path:path,area:area})=>({data:area,text:textCentres[area.sets],circles:circles2,arcs:arcs,path:path,distinctPath:path+genDistinctPath(area.sets)}))}(sets,{width:svgWidth,height:svgHeight-titleHeight,padding:(null==config?void 0:config.padding)??15}),layoutByKey=new Map;for(const area of layoutAreas){const key=stableSetsKey([...area.data.sets].sort());layoutByKey.set(key,area)}textNodes2.length>0&&renderTextNodes(config,layoutByKey,dummyD3root,textNodes2,scale2,styleByKey);const themeDark=isDark(themeVariables.background||"#f4f4f4");dummyD3root.selectAll(".venn-circle").each(function(d,i){var _a2;const group=select(this),setsKey=stableSetsKey([...d.sets].sort()),customStyle=styleByKey.get(setsKey),baseColor=(null==customStyle?void 0:customStyle.fill)||themeColors[i%themeColors.length]||themeVariables.primaryColor;group.classed("venn-set-"+i%8,!0);const fillOpacity=(null==customStyle?void 0:customStyle["fill-opacity"])??.1,strokeColor=(null==customStyle?void 0:customStyle.stroke)||baseColor,strokeWidthVal=(null==customStyle?void 0:customStyle["stroke-width"])||""+5*scale2;if(isHandDrawn&&roughSvg){const layoutArea=layoutByKey.get(setsKey);if(layoutArea&&layoutArea.circles.length>0){const c=layoutArea.circles[0],roughNode=roughSvg.circle(c.x,c.y,2*c.radius,{roughness:.7,seed:handDrawnSeed,fill:transparentize(baseColor,.7),fillStyle:"hachure",fillWeight:2,hachureGap:8,hachureAngle:60*i-41,stroke:strokeColor,strokeWidth:parseFloat(String(strokeWidthVal))});group.select("path").remove(),null==(_a2=group.node())||_a2.insertBefore(roughNode,group.select("text").node())}}else group.select("path").style("fill",baseColor).style("fill-opacity",fillOpacity).style("stroke",strokeColor).style("stroke-width",strokeWidthVal).style("stroke-opacity",.95);const textColor=(null==customStyle?void 0:customStyle.color)||(themeDark?lighten(baseColor,30):darken(baseColor,30));group.select("text").style("font-size",48*scale2+"px").style("fill",textColor)}),isHandDrawn&&roughSvg?dummyD3root.selectAll(".venn-intersection").each(function(d){var _a2;const group=select(this),setsKey=stableSetsKey([...d.sets].sort()),customStyle=styleByKey.get(setsKey),customFill=null==customStyle?void 0:customStyle.fill;if(customFill){const pathEl=group.select("path"),pathD=pathEl.attr("d");if(pathD){const roughNode=roughSvg.path(pathD,{roughness:.7,seed:handDrawnSeed,fill:transparentize(customFill,.3),fillStyle:"cross-hatch",fillWeight:2,hachureGap:6,hachureAngle:60,stroke:"none"}),existingPath=pathEl.node();null==(_a2=null==existingPath?void 0:existingPath.parentNode)||_a2.insertBefore(roughNode,existingPath),pathEl.remove()}}else group.select("path").style("fill-opacity",0);group.select("text").style("font-size",48*scale2+"px").style("fill",(null==customStyle?void 0:customStyle.color)??themeVariables.vennSetTextColor??defaultTextColor)}):(dummyD3root.selectAll(".venn-intersection text").style("font-size",48*scale2+"px").style("fill",e=>{var _a2;const setsKey=stableSetsKey([...e.sets].sort());return(null==(_a2=styleByKey.get(setsKey))?void 0:_a2.color)??themeVariables.vennSetTextColor??defaultTextColor}),dummyD3root.selectAll(".venn-intersection path").style("fill-opacity",e=>{var _a2;const setsKey=stableSetsKey([...e.sets].sort());return(null==(_a2=styleByKey.get(setsKey))?void 0:_a2.fill)?1:0}).style("fill",e=>{var _a2;const setsKey=stableSetsKey([...e.sets].sort());return(null==(_a2=styleByKey.get(setsKey))?void 0:_a2.fill)??"transparent"}));const vennGroup=svg.append("g").attr("transform",`translate(0, ${titleHeight})`),dummySvg=dummyD3root.select("svg").node();if(dummySvg&&"childNodes"in dummySvg)for(const child of[...dummySvg.childNodes])null==(_c=vennGroup.node())||_c.appendChild(child);configureSvgSize(svg,svgHeight,svgWidth,(null==config?void 0:config.useMaxWidth)??!0)},"draw");function stableSetsKey(setIds){return setIds.join("|")}function renderTextNodes(config,layoutByKey,dummyD3root,textNodes2,scale2,styleByKey){var _a;const useDebugLayout=(null==config?void 0:config.useDebugLayout)??!1,textGroup=dummyD3root.select("svg").append("g").attr("class","venn-text-nodes"),nodesByArea=new Map;for(const node of textNodes2){const key=stableSetsKey(node.sets),existing=nodesByArea.get(key);existing?existing.push(node):nodesByArea.set(key,[node])}for(const[key,nodes]of nodesByArea.entries()){const area=layoutByKey.get(key);if(!(null==area?void 0:area.text))continue;const centerX=area.text.x,centerY=area.text.y,minCircleRadius=Math.min(...area.circles.map(c=>c.radius)),innerRadiusRaw=Math.min(...area.circles.map(c=>c.radius-Math.hypot(centerX-c.x,centerY-c.y)));let innerRadius=Number.isFinite(innerRadiusRaw)?Math.max(0,innerRadiusRaw):0;0===innerRadius&&Number.isFinite(minCircleRadius)&&(innerRadius=.6*minCircleRadius);const areaGroup=textGroup.append("g").attr("class","venn-text-area").attr("font-size",40*scale2+"px");useDebugLayout&&areaGroup.append("circle").attr("class","venn-text-debug-circle").attr("cx",centerX).attr("cy",centerY).attr("r",innerRadius).attr("fill","none").attr("stroke","purple").attr("stroke-width",1.5*scale2).attr("stroke-dasharray",`${6*scale2} ${4*scale2}`);const innerWidth=Math.max(80*scale2,2*innerRadius*.95),innerHeight=Math.max(60*scale2,2*innerRadius*.95),labelOffset=(area.data.label&&area.data.label.length>0?Math.min(32*scale2,.25*innerRadius):0)+(nodes.length<=2?30*scale2:0),startX=centerX-innerWidth/2,startY=centerY-innerHeight/2+labelOffset,cols=Math.max(1,Math.ceil(Math.sqrt(nodes.length))),cellWidth=innerWidth/cols,cellHeight=innerHeight/Math.max(1,Math.ceil(nodes.length/cols));for(const[i,node]of nodes.entries()){const col=i%cols,row=Math.floor(i/cols),x=startX+cellWidth*(col+.5),y=startY+cellHeight*(row+.5);useDebugLayout&&areaGroup.append("rect").attr("class","venn-text-debug-cell").attr("x",startX+cellWidth*col).attr("y",startY+cellHeight*row).attr("width",cellWidth).attr("height",cellHeight).attr("fill","none").attr("stroke","teal").attr("stroke-width",1*scale2).attr("stroke-dasharray",`${4*scale2} ${3*scale2}`);const boxWidth=.9*cellWidth,boxHeight=.9*cellHeight,container=areaGroup.append("foreignObject").attr("class","venn-text-node-fo").attr("width",boxWidth).attr("height",boxHeight).attr("x",x-boxWidth/2).attr("y",y-boxHeight/2).attr("overflow","visible"),textColor=null==(_a=styleByKey.get(node.id))?void 0:_a.color,text=container.append("xhtml:span").attr("class","venn-text-node").style("display","flex").style("width","100%").style("height","100%").style("white-space","normal").style("align-items","center").style("justify-content","center").style("text-align","center").style("overflow-wrap","normal").style("word-break","normal").text(node.label??node.id);textColor&&text.style("color",textColor)}}}__name(stableSetsKey,"stableSetsKey"),__name(renderTextNodes,"renderTextNodes");var diagram={parser:venn_default,db:db,renderer:{draw:draw},styles:styles_default};export{diagram};
|