varri-js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ (function(wt){"use strict";const St="rri_linear",xt="structure_linear";let L=null,N=null,k=null,q=null;const y={sequence1:"lightblue",sequence2:"#F4BB44",seq1profileColor:"purple",seq2profileColor:"red",mutationColor:"Darkgreen",intermolecularHighlight:"red",backgroundHighlight:"red",subsequenceHighlight:"purple",basepair:"red"},S={items:[],nextId:1,label:"Highlight"},x={items:[],nextId:1,label:"Region highlight"},E={items:[],nextId:1,label:"Mutation"},Nn=S.items,kn=x.items,$n=E.items;function V(e){e.items.length=0,e.nextId=1}function K(e,t){const r=e.items.find(n=>n.id===t);if(!r)throw new Error(e.label+" with id "+t+" not found.");return r}function W(e,t){return e.items.map(t)}function Q(e,t,r){return t.id=e.nextId++,e.items.push(t),r(t)}function J(e,t){const r=e.items.findIndex(n=>n.id===t);return r===-1?!1:(e.items.splice(r,1),!0)}function Z(e){return{id:e.id,sequence:e.sequence,range:e.range.map(([t,r])=>[t,r]),color:e.color,alpha:e.alpha,rangeText:e.rangeText}}function Et(e){const t=String(e);if(t!=="1"&&t!=="2")throw new Error('Highlight sequence must be "1" or "2".');return t}function Rt(e,t){if(typeof e=="string"){const n=v(e,t?t.offset:void 0,t?t.length:void 0,t?t.id:void 0);if(!n||n.length===0)throw new Error("Highlight range must not be empty.");return{range:n,rangeText:e.trim()}}if(!Array.isArray(e)||e.length===0)throw new Error("Highlight range must not be empty.");const r=e.map((n,o)=>{if(!Array.isArray(n)||n.length!==2)throw new Error(`${t.id?t.id+": ":""} Invalid subsequence range ${n} at index ${o}. Expected [start, end].`);const s=Number(n[0]),i=Number(n[1]);if(!Number.isInteger(s)||!Number.isInteger(i))throw new Error(`${t.id?t.id+": ":""}Invalid subsequence range at index ${o}. Range bounds must be integers.`);if(s===0||i===0)throw new Error(`${t.id?t.id+": ":""}Invalid subsequence range at index ${o}. Index 0 is not valid.`);if(s>i)throw new Error(`${t.id?t.id+": ":""}Invalid subsequence range at index ${o}. Start index must be <= end index.`);return[s,i]});return t&&v(r.map(([n,o])=>`${n}-${o}`).join(","),t.offset,t.length,t.id),{range:r,rangeText:r.map(([n,o])=>`${n}-${o}`).join(",")}}function C(e,t={}){const r=Et(e.sequence),n=t[r],o=Rt(e.range,n),s=(e.color||"").trim()||y.subsequenceHighlight,i=e.alpha!==void 0?Number(e.alpha):.3;return{id:Number.isInteger(e.id)?e.id:0,sequence:r,range:o.range,color:s,alpha:i,rangeText:o.rangeText}}function It(e,t={}){return Q(S,C(e,t),Z)}function Lt(e,t,r={}){const n=K(S,e),o=C({id:e,sequence:t.sequence!==void 0?t.sequence:n.sequence,range:t.range!==void 0?t.range:n.range,color:t.color!==void 0?t.color:n.color,alpha:t.alpha!==void 0?t.alpha:n.alpha},r);return Object.assign(n,o),Z(n)}function Nt(e){return J(S,e)}function kt(){V(S)}function $t(){return W(S,Z)}function ee(e){return{id:e.id,sequence1Range:[e.sequence1Range[0],e.sequence1Range[1]],sequence2Range:[e.sequence2Range[0],e.sequence2Range[1]],color:e.color,alpha:e.alpha,rangeText:e.rangeText,generated:!!e.generated}}function pe(e,t={}){if(typeof e=="string"){const s=v(e,t.offset,t.length,t.id);if(!s||s.length===0)throw new Error("Region range must not be empty.");if(s.length>1)throw new Error("Region highlighting supports a single range per sequence.");const[i,c]=s[0];return{range:[i,c],rangeText:e.trim()}}if(!Array.isArray(e)||e.length===0)throw new Error("Region range must not be empty.");const r=e;if(!Array.isArray(r)||r.length!==2)throw new Error("Invalid region range. Expected [start, end].");const n=Number(r[0]),o=Number(r[1]);if(!Number.isInteger(n)||!Number.isInteger(o))throw new Error("Invalid region range. Range bounds must be integers.");if(n===0||o===0)throw new Error("Invalid region range. Index 0 is not valid.");if(n>o)throw new Error("Invalid region range. Start index must be <= end index.");return t&&v(`${n}-${o}`,t.offset,t.length,t.id),{range:[n,o],rangeText:`${n}-${o}`}}function M(e,t={}){const r=t[1],n=t[2],o=pe(e.sequence1Range,r),s=pe(e.sequence2Range,n),i=(e.color||"").trim()||y.backgroundHighlight,c=e.alpha!==void 0?Number(e.alpha):.2;return{id:Number.isInteger(e.id)?e.id:0,sequence1Range:o.range,sequence2Range:s.range,color:i,alpha:c,rangeText:`${o.rangeText}&${s.rangeText}`,generated:!!e.generated}}function me(e,t={}){return Q(x,M(e,t),ee)}function vt(e,t,r={}){const n=K(x,e),o=M({id:e,sequence1Range:t.sequence1Range!==void 0?t.sequence1Range:n.sequence1Range,sequence2Range:t.sequence2Range!==void 0?t.sequence2Range:n.sequence2Range,color:t.color!==void 0?t.color:n.color,alpha:t.alpha!==void 0?t.alpha:n.alpha,generated:t.generated!==void 0?t.generated:n.generated},r);return Object.assign(n,o),ee(n)}function ye(e){return J(x,e)}function Ht(){V(x)}function te(){return W(x,ee)}function ne(e){return{id:e.id,sequence:e.sequence,position:e.position,replacement:e.replacement,reference:e.reference,nodeId:e.nodeId,color:e.color,labelText:e.labelText}}function _t(e){const t=String(e);if(t!=="1"&&t!=="2")throw new Error('Mutation sequence must be "1" or "2".');return t}function be(e){const t={};return!e||!Number.isInteger(e.offset)||typeof e.sequence!="string"||$("s",e.offset,e.sequence.length).forEach(([,r],n)=>{t[r]=e.sequence[n]}),t}function Ae(e,t){if(e==null||e==="")throw new Error("Mutation position must not be empty.");const r=O(String(e));if(t){const n=be(t);if(!(r in n))throw new Error("Mutation position must be a valid sequence index.")}return r}function Tt(e){const t=String(e||"").trim();if(t.length!==1)throw new Error("Mutation replacement must be a single letter.");return t}function B(e,t={}){const r=_t(e.sequence),n=t[r],o=Ae(e.position,n),s=Tt(e.replacement),i=(e.color||"").trim()||y.intermolecularHighlight,u=(n?be(n):{})[o]||"";return{id:Number.isInteger(e.id)?e.id:0,sequence:r,position:o,replacement:s,reference:u,nodeId:0,color:i,labelText:`${u||"?"}${o}${s}`}}function Ct(e,t={}){return Q(E,B(e,t),ne)}function Mt(e,t,r={}){const n=K(E,e),o=B({id:e,sequence:t.sequence!==void 0?t.sequence:n.sequence,position:t.position!==void 0?t.position:n.position,replacement:t.replacement!==void 0?t.replacement:n.replacement,color:t.color!==void 0?t.color:n.color},r);return Object.assign(n,o),ne(n)}function Bt(e){return J(E,e)}function Pt(){V(E)}function Ot(){return W(E,ne)}function re(e,t,r){for(const[n,[o,s]]of Object.entries(w(e)))if(o===`s${t}`&&s===r)return parseInt(n,10);return 0}function Gt(e){Object.assign(y,e)}function jt(){return{...y}}function P(e,t=0){const r=[],n={"(":[],"<":[],"[":[],"{":[]},o=[["(",")"],["[","]"],["{","}"],["<",">"]];for(let s=0;s<e.length;s++){const i=e[s],c=s+1;for(const[u,a]of o){if(i===u){n[u].push([c+t,i]);break}if(i===a){n[u].length>0?n[u].pop():r.push([c+t,i]);break}}}for(const s of Object.values(n))r.push(...s);return r.sort((s,i)=>s[0]-i[0]),r}function R(e){const t=e.indexOf("&");return t===-1?[e,""]:[e.slice(0,t),e.slice(t+1)]}function qe(e){const t={"(":0,"<":0,"[":0,"{":0},r={")":"(",">":"<","]":"[","}":"{"};for(const n of e)if(n in t)t[n]++;else if(n in r){const o=r[n];if(t[o]--,t[o]<0)throw new Error(`The number of brackets does not line up. Too many closing ${n} brackets:
2
+ ${e}`)}for(const[n,o]of Object.entries(t))if(o>0)throw new Error(`The number of brackets does not line up. Too many opening ${n} brackets:
3
+ ${e}`)}function Dt(e){const t=[],r={"(":[],"<":[],"[":[],"{":[]},n={")":"(",">":"<","]":"[","}":"{"};for(let o=0;o<e.length;o++){const s=e[o];if(s in r)r[s].push(o);else if(s in n){const i=n[s];if(r[i].length>0){const c=r[i].pop();t.push([c,o])}}}return t}function we(e){if(e==="")throw new Error("No sequence given");if(/^([aAcCgGtTuUrRyYsSwWkKmMbBdDhHvVnN]+&)?[aAcCgGtTuUrRyYsSwWkKmMbBdDhHvVnN]+$/.test(e))return e;const t=e.replace(/[aAcCgGtTuUrRyYsSwWkKmMbBdDhHvVnN&]/g,"");throw new Error(`The given sequence input has invalid none-IUPAC characters: ${t}`)}function Se(e,t){if(!t)return"-1";if(!/^-?\d+$/.test(t))throw new Error(`The given cropping input is not an integer: ${t}`);if(parseInt(t,10)<0)return-1;if(e){if(!e.match(/[^.&]/))throw new Error("Cropping is not allowed for structures with only unpaired nucleotides.");if(e.includes("&")){const[r,n]=R(e);if(!r.match(/[^.]/)||!n.match(/[^.]/))throw new Error("Cropping is not allowed for structures with only unpaired nucleotides in either molecule.")}}return t}function xe(e,t){if(e==="")throw new Error("No structure given");if(e.includes("&")){const[r,n]=R(e),[o,s]=R(t);for(const[i,c,u]of[[1,r,o],[2,n,s]])if(c.length!==u.length)throw new Error(`Structure length (${c.length}) and Sequence length (${u.length}) of molecule ${i} do not match`)}else if(e.length!==t.length)throw new Error(`Structure length (${e.length}) and Sequence length (${t.length}) do not match`);if(/^([\.()<>\[\]{}]+&)?[\.()<>\[\]{}]+$/.test(e))return qe(e),e;throw new Error(`The given structure input is not valid: ${e}`)}function O(e){if(e==="0")throw new Error("Index 0 is not valid; use a value of -1 or less, or 1 or greater");if(/^-?\d+$/.test(e))return parseInt(e,10);throw new Error(`The given index input is not valid: ${e}`)}function Ee(e){if(["nothing","basepairs","region"].includes(e))return e;throw new Error(`The given highlighting input (${e}) is not accepted [nothing, basepairs, region]`)}function Re(e){if(["nothing","basepairs","region"].includes(e))return e;throw new Error(`The given backgroundhighlighting input (${e}) is not accepted [nothing, basepairs, region]`)}function Ie(e){const[t,r]=R(e),n=r!==""?t+"&..."+r:t,o=r!==""?t+"..."+r:t,s={};for(let i=0;i<o.length;i++)s[String(i+1)]=o[i];return{structure1:t,structure2:r,structure:n,structure_dict:s}}function Le(e){const[t,r]=R(e),n=r!==""?t+"&..."+r:t,o=r!==""?t+"..."+r:t,s={};for(let i=0;i<o.length;i++)s[String(i+1)]=o[i];return{sequence1:t,sequence2:r,sequence:n,sequence_dict:s}}function Ne(e){return e.sequence2!==""?"2":"1"}function $(e,t,r){const n=[];for(let s=t;s<t+r;s++)n.push([e,s]);const o=n.findIndex(([,s])=>s===0);if(o!==-1){n.splice(o,1);const[s,i]=n[n.length-1];n.push([s,i+1])}return n}function w(e){const{offset1:t,offset2:r,sequence1:n,sequence2:o}=e,s=Array.from({length:3},()=>["e",0]),i=[...$("s1",t,n.length),...s,...$("s2",r,o.length)],c={};return i.forEach(([u,a],f)=>{c[f+1]=[u,a]}),c}function Ft(e,t,r,n,o){if(!o||o<0)return{rawSeq:e,validStruc:t,offset1:r,offset2:n};let s=e.split("&"),i=t.split("&"),c=[r,n];for(let u=0;u<s.length;u++){let a=i[u].match(/^\.+/);if(a&&a[0].length>o){s[u]=s[u].slice(a[0].length-o),i[u]=i[u].slice(a[0].length-o);const l=c[u];c[u]+=a[0].length-o,c[u]>=0&&l<0&&(c[u]+=1)}let f=i[u].match(/\.+$/);f&&f[0].length>o&&(s[u]=s[u].slice(0,s[u].length-(f[0].length-o)),i[u]=i[u].slice(0,i[u].length-(f[0].length-o)))}return{rawSeq:s.join("&"),validStruc:i.join("&"),offset1:c[0],offset2:c[1]}}function Ut(e){const t={},r=(e.sequence||"").trim();we(r);const n=(e.structure||"").trim(),o=xe(n,r);t.offset1=O(String(e.startIndex1||"1")),t.offset2=O(String(e.startIndex2||"1"));const s=Se(o,String(e.cropping||"-1")),i=Ft(r,o,t.offset1,t.offset2,s);t.offset1=i.offset1,t.offset2=i.offset2;const c=Le(i.rawSeq);Object.assign(t,c);const u=Ie(i.validStruc);Object.assign(t,u),t.molecules=Ne(t),t.coloring=e.coloring||"strand",t.highlighting=Ee(e.highlighting||"region"),t.backgroundhighlighting=Re(e.backgroundhighlighting||"basepairs"),t.distinctBpTypes=e.distinctBpTypes!==!1,t.labelInterval=parseInt(String(e.labelInterval||"10"),10)||10;const a={1:{offset:t.offset1,length:t.sequence1.length,sequence:t.sequence1},2:{offset:t.offset2,length:t.sequence2.length,sequence:t.sequence2}};if(Array.isArray(e.subsequenceHighlights)?t.subsequenceHighlights=e.subsequenceHighlights.map(f=>C(f,a)):t.subsequenceHighlights=[],Array.isArray(e.regionHighlights)?t.regionHighlights=e.regionHighlights.map(f=>M(f,a)):t.regionHighlights=[],Array.isArray(e.pointMutations)){t.pointMutations=e.pointMutations.map(l=>B(l,a));const f=new Set;t.pointMutations.forEach(l=>{const g=`${l.sequence}:${l.position}`;if(f.has(g))throw new Error(`Duplicate point mutation at ${g}.`);if(f.add(g),l.nodeId=re(t,l.sequence,l.position),!l.nodeId)throw new Error(`Mutation position ${l.position} is not visible in the current rendering.`);l.labelText=`${l.reference||"?"}${l.position}${l.replacement}`})}else t.pointMutations=[];return t}function v(e,t,r,n){if(!e||e.trim()==="")return null;let o=null;return Number.isInteger(t)&&Number.isInteger(r)&&r>=0&&(o=new Set($("s",t,r).map(([,i])=>i))),e.split(",").map(i=>i.trim()).filter(Boolean).map(i=>{const c=i.match(/^(-?\d+)-(-?\d+)$/);if(!c)throw new Error(`${n?n+": ":""}Invalid subsequence range: "${i}". Expected "start-end".`);const u=parseInt(c[1],10),a=parseInt(c[2],10);if(u===0||a===0)throw new Error(`${n?n+": ":""}Invalid subsequence range: "${i}". Index 0 is not valid.`);if(u>a)throw new Error(`${n?n+": ":""}Invalid subsequence range: "${i}". Start index must be <= end index.`);if(o&&(!o.has(u)||!o.has(a)))throw new Error(`${n?n+": ":""}Invalid subsequence range: "${i}". Range endpoints must be valid sequence indices.`);return[u,a]})}function Yt(e,t,r,n){document.querySelectorAll(`[${e}="${t}"]`).forEach(o=>{o.setAttribute(r,n)})}function ke(e,t){return[...Array.from(e,()=>y.sequence1),...Array.from(t,()=>y.sequence2)]}function $e(e){const t=ke(e.sequence1,e.sequence2);if(t.length===0)return;document.querySelectorAll('[r="5"]').forEach((n,o)=>{n.setAttribute("style",`fill: ${t[o]};`)})}function ve(){document.querySelectorAll("line").forEach(e=>{const t=e.children[0]&&e.children[0].textContent;if(!t)return;const r=t.split(":")[1];if(!r)return;const n=r.split("-").filter(o=>!isNaN(parseInt(o,10))&&o!=="");n.length>=2&&(e.setAttribute("start",n[0].trim()),e.setAttribute("end",n[1].trim()))})}function He(){document.querySelectorAll('g[num="n-1"]').forEach((e,t)=>{e.setAttribute("label_gnum",String(t+1)),e.firstChild&&e.firstChild.setAttribute("label_num",String(t+1))})}function _e(e){const t=w(e);for(const[r,[n,o]]of Object.entries(t))document.querySelectorAll(`circle[node_num="${r}"]`).forEach(s=>{s.firstChild&&(s.firstChild.innerHTML=`${n}[${o}]`)})}function oe(e,t,r){for(const n of[e-1,e+1])if(n in t&&t[n]!==0)return 0;return r}function Xt(e){document.querySelectorAll(`[label_num="${e}"]`).forEach(t=>{t.setAttribute("style",`stroke: ${y.intermolecularHighlight};stroke-width: 0.8;`)})}function zt(e,t){const r=e.parentElement;if(!r)return;const n=e.querySelector("title");n&&n.remove();let o=r.querySelector("title");o||(o=document.createElementNS("http://www.w3.org/2000/svg","title"),r.insertBefore(o,r.firstChild)),o.textContent=t}function Vt(e){document.querySelectorAll(`[label_gnum="${e}"]`).forEach(t=>t.remove())}function Kt(e){document.querySelectorAll(`line[start="${e}"]`).forEach(t=>{t.getAttribute("link_type")==="label_link"&&t.remove()})}function Te(e){const{structure1:t,structure2:r,sequence1:n,labelInterval:o,molecules:s,sequence_dict:i}=e,c=n.length,u=Object.keys(i).length,a=w(e),f={};for(const l of Object.keys(a))f[parseInt(l,10)]=0;for(const l of[1,c,c+3+1,u]){if(!(l in a))break;const[,g]=a[l];f[l]=oe(l,f,g)}if(s==="2"){const l=H(t,r);for(const g of l)for(const d of g){if(!(d in a))continue;const[,h]=a[d];f[d]=oe(d,f,h)}}for(const[l,[,g]]of Object.entries(a)){const d=parseInt(l,10);(g%o===0||g===1)&&(f[d]=oe(d,f,g))}return f}function Ce(e){const t=Te(e),r={};(Array.isArray(e.pointMutations)?e.pointMutations:[]).forEach(o=>{o.nodeId&&(r[o.nodeId]=o)}),e.molecules==="2"&&H(e.structure1,e.structure2).flat().forEach(Xt);const n=Object.entries(t);document.querySelectorAll('[label_type="label"]').forEach((o,s)=>{const[i,c]=n[s]||[],u=i?parseInt(i,10):0,a=u&&r[u]?r[u]:null;if(a){o.innerHTML=a.replacement,zt(o,`Mutation: ${a.labelText}`),o.setAttribute("style",`fill: ${a.color}; stroke: ${a.color}; stroke-width: 0.2; font-weight: bolder;`),G([a.nodeId],`stroke: ${a.color}; stroke-width: 2px;`);return}o.removeAttribute("style");const l=o.parentElement?.querySelector("title");l&&l.remove(),o.innerHTML=c!==void 0?c:""});for(const[o,s]of Object.entries(t)){const i=parseInt(o,10);s===0&&!r[i]&&(Vt(i),Kt(i))}}function Me(e){const t={};for(const[r,[,n]]of Object.entries(w(e)))t[String(r)]=String(n);document.querySelectorAll("line").forEach(r=>{const n=r.getAttribute("start"),o=r.getAttribute("end");r.firstChild&&(r.getAttribute("link_type")==="label_link"?r.firstChild.textContent=t[n]||"":r.firstChild.textContent=(t[n]||"")+"-"+(t[o]||""))})}function G(e,t){e.forEach(r=>{document.querySelectorAll(`circle[node_num="${r}"]`).forEach(n=>{n.setAttribute("style",(n.getAttribute("style")||"")+t)})})}function Be(e){const t=[];return document.querySelectorAll(`g[num="n${e}"]`).forEach(r=>{[...(r.getAttribute("transform")||"").matchAll(/-?\d+(?:\.\d+)?/g)].forEach(([s])=>t.push(parseFloat(s)))}),t}function Pe(){const e=document.getElementsByClassName("fornac-plot")[0];return e?Array.from(e.children).find(r=>r.tagName&&r.tagName.toLowerCase()==="g"&&r.getAttribute("data-varri-rotation-layer")==="true")||e:null}function Oe(e,t){const r=document.createElementNS("http://www.w3.org/2000/svg",e);for(const[o,s]of Object.entries(t))r.setAttribute(o,s);const n=Pe();n&&n.insertBefore(r,n.firstChild)}function Ge(e){const t=[];return e.forEach(r=>{document.querySelectorAll(`g[num="n${r}"]`).forEach(n=>{const s=[...(n.getAttribute("transform")||"").matchAll(/-?\d+(?:\.\d+)?/g)];s.length>=2&&t.push([parseFloat(s[0][0]),parseFloat(s[1][0])])})}),t}function je(e){if(!Array.isArray(e)||e.length===0)return[];const t=e.map(([r,n])=>`${r},${n}`);return t.length<2?t:[...t,t[0]]}function De(e,t,r,n){const o=document.createElementNS("http://www.w3.org/2000/svg",e);o.setAttribute("points",t),o.setAttribute("style",r);for(const[i,c]of Object.entries(n))o.setAttribute(i,c);const s=Pe();s&&s.insertBefore(o,s.firstChild)}function se(e,t,r={}){const o=Ge(e).map(([s,i])=>`${s},${i}`).join(" ");De("polyline",o,t,r)}function Wt(e,t,r={}){const n=Ge(e),o=je(n).join(" ");De("polygon",o,t,r)}function H(e,t){const r=[],n=e.length+3;for(const[o,s]of[[e,0],[t,n]]){const i=P(o,s).map(([c])=>c);if(i.length===0)return[];r.push([i[0],i[i.length-1]])}return r}function Fe(e){const t=H(e.structure1,e.structure2),r=[];for(const[n,o]of t)for(let s=n;s<=o;s++)r.push(s);G(r,`stroke: ${y.intermolecularHighlight};`)}function Ue(e){const t=e.sequence1.length+1;for(const r of["basepair","pseudoknot"])document.querySelectorAll(`[link_type="${r}"]`).forEach(n=>{const o=[parseInt(n.getAttribute("start"),10),parseInt(n.getAttribute("end"),10)];o[0]<t&&o[1]>t&&o.forEach(s=>{const i=document.querySelector(`circle[node_num="${s}"]`);i&&i.setAttribute("style",(i.getAttribute("style")||"")+`stroke: ${y.intermolecularHighlight};`)})})}function Ye(){document.querySelectorAll('[link_type="basepair"]').forEach(e=>{const t=parseInt(e.getAttribute("start"),10),r=parseInt(e.getAttribute("end"),10);t>r&&e.remove()})}function Qt(e){document.querySelectorAll(`[num="n${e}"]`).forEach(t=>t.remove())}function Jt(e){document.querySelectorAll(`[num="n${e}"]`).forEach(t=>{t.firstChild&&t.firstChild.remove()})}function Zt(e,t){const r=`${e},${t}`;document.querySelectorAll('[link_type="backbone"]').forEach(n=>{`${n.getAttribute("start")},${n.getAttribute("end")}`===r&&n.remove()})}function Xe(e){for(let t=0;t<e.length;t++)e[t]==="."&&(Zt(t,t+1),Jt(t+1),Qt(t))}function ze(e,t,r,n,o){const i=`offset${t}`,c={};for(const[a,[f,l]]of Object.entries(w(e)))f===`s${t}`&&(c[l]=parseInt(a,10));const u=t==="2"?e.sequence1.length+3:0;for(const[a,f]of r||[]){const l=e[i];if(a===f){const b=c[a],[z,T]=Be(b);Oe("circle",{cx:String(z),cy:String(T),r:`${Math.ceil(14/2)}px`,style:`fill:${n};opacity:${o};`,"data-varri-subseq":"true"});continue}let g=a-l,d=f-a;l<0&&a>0&&(g-=1),a<0&&f>0&&(d-=1);const h=g+1+u,p=g+d+1+u,m=[];for(let b=h;b<=p;b++)m.push(b);se(m,`stroke:${n};stroke-width:14;opacity:${o};fill:None;stroke-linejoin:round;stroke-linecap:round`,{"data-varri-subseq":"true"})}}function ie(){te().filter(e=>e.generated).forEach(e=>{ye(e.id)})}function ce(e,t){const r={1:{offset:e.offset1,length:e.sequence1?e.sequence1.length:0,sequence:e.sequence1},2:{offset:e.offset2,length:e.sequence2?e.sequence2.length:0,sequence:e.sequence2}};return me({sequence1Range:t.sequence1Range,sequence2Range:t.sequence2Range,color:t.color||y.backgroundHighlight,alpha:t.alpha,generated:!0},r)}function j(e,t,r){const n=w(e),o=t.map(s=>n[s]).filter(s=>Array.isArray(s)&&s[0]===`s${r}`).map(([,s])=>s).filter(Number.isFinite);return o.length===0?null:[Math.min(...o),Math.max(...o)]}function Ve(e){const t=H(e.structure1,e.structure2);if(!t||t.length<2)return null;const r=j(e,t[0],"1"),n=j(e,t[1],"2");return!r||!n?null:{sequence1Range:r,sequence2Range:n}}function Ke(e,t){const r=[],n=Array.isArray(t.sequence1Range)?t.sequence1Range:[],o=Array.isArray(t.sequence2Range)?t.sequence2Range:[];for(let s=n[0];s<=n[1];s++){const i=re(e,"1",s);i&&r.push(i)}for(let s=o[0];s<=o[1];s++){const i=re(e,"2",s);i&&r.push(i)}return r}function ae(e){const t=te();(t.length>0?t:Array.isArray(e.regionHighlights)?e.regionHighlights:[]).forEach(n=>{const o=Ke(e,n);o.length>=3?Wt(o,`fill:${n.color||y.backgroundHighlight};opacity:${n.alpha};stroke:${n.color||y.backgroundHighlight};stroke-width:7`,{"data-varri-region":"true"}):o.length===2&&se(o,`stroke:${n.color||y.backgroundHighlight};opacity:${n.alpha};stroke-width:7`,{"data-varri-region":"true"})})}function ue(e){(Array.isArray(e.subsequenceHighlights)?e.subsequenceHighlights:[]).forEach(r=>{ze(e,r.sequence,r.range,r.color||y.subsequenceHighlight,r.alpha)})}function We(e){(Array.isArray(e.pointMutations)?e.pointMutations:[]).forEach(r=>{r.nodeId&&G([r.nodeId],`stroke: ${r.color}; stroke-width: 2px;`)})}function Qe(e){if(document.querySelectorAll('[link_type="basepair"]').forEach(t=>{t.style.stroke=y.basepair}),e.distinctBpTypes){const t=e.sequence1,r=e.sequence2,n=".".repeat(3),o=t+n+r,s={};for(let i=0;i<o.length;i++)s[String(i+1)]=o[i];document.querySelectorAll('[link_type="basepair"], [link_type="pseudoknot"]').forEach(i=>{const c=s[i.getAttribute("start")],u=s[i.getAttribute("end")],a=[c,u].sort().join("-").toLowerCase();a==="g-u"?(i.style.strokeLinecap="butt",i.style.strokeDasharray="1 1"):a==="c-g"||a==="a-u"?(i.style.strokeLinecap="butt",i.style.strokeDasharray=""):(i.style.strokeLinecap="round",i.style.strokeDasharray="0 3")})}else document.querySelectorAll('[link_type="basepair"], [link_type="pseudoknot"]').forEach(t=>{t.style.strokeLinecap="butt",t.style.strokeDasharray=""})}function le(e){const t=[],r={"(":[],"<":[],"[":[],"{":[]},n=[["(",")"],["[","]"],["{","}"],["<",">"]];for(const[o,s]of Object.entries(e)){const i=parseInt(o,10);for(const[c,u]of n){if(s===c){r[c].push(i);break}if(s===u){r[c].length>0&&t.push([r[c].pop(),i]);break}}}return t.sort((o,s)=>o[0]-s[0]),t}function D(e){const t=e.structure_dict,r=e.structure1,n=e.structure2,o=r.length+3,s={};for(const i of Object.keys(t))s[i]=".";for(const[i,c]of[...P(r),...P(n,o)])s[String(i)]=c;return le(s)}function _(e){const t=new Set,r=[];return(Array.isArray(e)?e:[]).forEach(n=>{if(!Array.isArray(n)||n.length<2)return;const o=Number(n[0]),s=Number(n[1]);if(!Number.isInteger(o)||!Number.isInteger(s)||o===s)return;const i=o<s?[o,s]:[s,o],c=i[0]+":"+i[1];t.has(c)||(t.add(c),r.push(i))}),r.sort((n,o)=>n[0]-o[0]||n[1]-o[1])}function fe(e){const t=_(e);return t.map((r,n)=>{const o=[];let s=-1/0;for(let i=n+1;i<t.length;i++){const c=t[i];if(c[0]>=r[1])break;c[1]>=r[1]||(s<=c[1]&&o.push(c),s=Math.max(s,c[1]))}return{outer:r,children:o}})}function F(e,t){return e[0]===t[0]&&e[1]===t[1]}function I(e,t){return e[0]<t[0]&&t[0]<e[1]&&e[1]<t[1]||t[0]<e[0]&&e[0]<t[1]&&t[1]<e[1]}function Je(e,t,r={}){const n=t[0]-e[0]-1,o=e[1]-t[1]-1;return{outer:e.slice(),inner:t.slice(),gaps:[n,o],loopType:n>0&&o>0?"interior":"bulge",...r}}function Ze(e){const t=_(D(e)),r=[];return fe(t).forEach(({outer:n,children:o})=>{o.forEach(s=>{const i=s[0]-n[0]-1,c=n[1]-s[1]-1;if(i===0&&c===0)return;t.some(a=>{if(F(a,n)||F(a,s))return!1;if(I(a,n)||I(a,s))return!0;const f=n[0]<a[0]&&a[0]<s[0],l=s[1]<a[1]&&a[1]<n[1];return f!==l})||r.push(Je(n,s))})}),r}function et(e){const t=e.sequence1.length,r=t+3+1,n=t+3+e.sequence2.length,o={1:[],2:[]};return le(e.structure_dict).forEach(s=>{s[0]>=1&&s[1]<=t?o[1].push(s):s[0]>=r&&s[1]<=n&&o[2].push(s)}),o}function tt(e){const t=[],r=et(e);for(const n of["1","2"]){const o=_(r[n]);fe(o).forEach(({outer:s,children:i})=>{if(i.length!==1)return;const c=i[0],u=c[0]-s[0]-1,a=s[1]-c[1]-1;if(u===0&&a===0)return;o.some(l=>!F(l,s)&&!F(l,c)&&(I(l,s)||I(l,c)))||t.push(Je(s,c,{sequence:n}))})}return t}function nt(e,t){const r=[];return e.forEach((n,o)=>{const s=n.sequence?t+":"+n.sequence+":"+o:t+":"+o,i={kind:t,loopId:s,loopType:n.loopType};r.push({...i,source:n.outer[0],target:n.inner[0],sequence:n.sequence||"1"}),r.push({...i,source:n.inner[1],target:n.outer[1],sequence:n.sequence||"2"})}),r}function rt(e){return nt(Ze(e),"rri")}function ot(e){return nt(tt(e),"structure")}function U(e,t){return!e||!Array.isArray(e.nodes)?null:e.nodes.find(r=>r&&r.nodeType==="nucleotide"&&r.num===t)||null}function Y(e,t){const r=[e?.x,e?.y,t?.x,t?.y];if(!r.every(c=>typeof c=="number"&&Number.isFinite(c)))return null;const[n,o,s,i]=r;return Math.hypot(s-n,i-o)}function A(e){return e[0]+":"+e[1]}function en(e){const t=_(D(e));if(t.length<2)return[];for(let r=0;r<t.length;r++)for(let n=r+1;n<t.length;n++)if(I(t[r],t[n]))return[];for(let r=1;r<t.length;r++)if(t[r-1][1]<=t[r][1])return[];return[{kind:"rri",sequence:null,pairs:t}]}function tn(e){const t=[],r=et(e);for(const n of["1","2"]){const o=_(r[n]),s=new Set;o.forEach((u,a)=>{o.slice(a+1).forEach(f=>{I(u,f)&&(s.add(A(u)),s.add(A(f)))})});const i=new Map,c=new Set;fe(o).forEach(({outer:u,children:a})=>{if(a.length!==1)return;const f=a[0];s.has(A(u))||s.has(A(f))||(i.set(A(u),f),c.add(A(f)))}),o.filter(u=>!s.has(A(u))&&!c.has(A(u))).forEach(u=>{const a=[],f=new Set;let l=u;for(;l&&!f.has(A(l));)a.push(l),f.add(A(l)),l=i.get(A(l));const g=a.slice(1).some((d,h)=>{const p=a[h];return d[0]-p[0]>1||p[1]-d[1]>1});a.length>=2&&g&&t.push({kind:"structure",sequence:n,pairs:a})})}return t}function st(e,t,r){const n=e&&e.graph;if(!n||!Array.isArray(n.nodes))return[];const o=Number(e.options?.linkDistanceMultiplier),s=Number.isFinite(o)&&o>0?o:15,i=new Map;t.forEach(u=>{i.has(u.loopId)||i.set(u.loopId,[]),i.get(u.loopId).push(u)});const c=[];return i.forEach(u=>{if(u.length!==2)return;const a=u.map(g=>({spec:g,source:U(n,g.source),target:U(n,g.target)}));if(a.some(g=>!g.source||!g.target))return;const f=a.map(g=>Y(g.source,g.target));if(f.some(g=>g===null))return;const l=Math.max(...f);!Number.isFinite(l)||l<=0||a.forEach(({spec:g,source:d,target:h})=>{c.push({source:d,target:h,value:l/s,linkType:r,extraLinkType:"constraint",varriLinearHelix:!0,varriLinearHelixKind:g.kind,varriLinearHelixLoop:g.loopId,varriTargetDistance:l})})}),c}function nn(e,t){const r=e&&e.graph;if(!r||!Array.isArray(r.nodes)||!t?.pairs?.length)return null;const n=Number(e.options?.linkDistanceMultiplier),o=Number.isFinite(n)&&n>0?n:15,s=t.pairs.map(d=>({pair:d,first:U(r,d[0]),second:U(r,d[1])}));if(s.some(d=>!d.first||!d.second||d.first.fixed||d.second.fixed||Y(d.first,d.second)===null))return null;const i=[0],c=[];for(let d=1;d<s.length;d++){const h=s[d-1],p=s[d],m=p.pair[0]-h.pair[0]-1,b=h.pair[1]-p.pair[1]-1,z=m>0||b>0,T=Math.max(Y(h.first,p.first),Y(h.second,p.second)),qt=z&&Number.isFinite(T)&&T>0?T:o;c.push({span:qt,isLoop:z,gaps:[m,b]}),i.push(i[i.length-1]+qt)}const u=i.reduce((d,h)=>d+h,0)/i.length,a=[];s.forEach((d,h)=>{const p=i[h]-u;a.push({node:d.first,x:p,y:-o/2}),a.push({node:d.second,x:p,y:o/2})});const f={kind:t.kind,sequence:t.sequence,pairs:t.pairs.map(d=>d.slice()),points:a,intervals:c,railGap:o},l=X(f,"x","y",1),g=X(f,"x","y",-1);return f.reflection=g&&(!l||g.error<l.error)?-1:1,f}function X(e,t,r,n){if(!e||!Array.isArray(e.points)||e.points.length<4)return null;const o=e.points.map(d=>d.node);if(o.some(d=>!d||![d[t],d[r]].every(Number.isFinite)))return null;const s=o.reduce((d,h)=>({x:d.x+h[t],y:d.y+h[r]}),{x:0,y:0});s.x/=o.length,s.y/=o.length;let i=0,c=0;e.points.forEach(d=>{const h=n*d.y,p=d.node[t]-s.x,m=d.node[r]-s.y;i+=d.x*p+h*m,c+=d.x*m-h*p});const u=Math.atan2(c,i),a=Math.cos(u),f=Math.sin(u);let l=0;const g=e.points.map(d=>{const h=n*d.y,p={x:s.x+a*d.x-f*h,y:s.y+f*d.x+a*h},m=d.node[t]-p.x,b=d.node[r]-p.y;return l+=m*m+b*b,p});return{angle:u,center:s,error:l,targets:g}}function rn(e){if(!e||!Array.isArray(e.points)||e.points.map(s=>s.node).some(s=>!s||s.fixed))return!1;const r=e.reflection===-1?-1:1,n=X(e,"x","y",r);if(!n)return!1;const o=X(e,"px","py",r)||n;return e.points.forEach((s,i)=>{s.node.x=n.targets[i].x,s.node.y=n.targets[i].y,s.node.px=o.targets[i].x,s.node.py=o.targets[i].y,s.node.varriLinearHelix=!0,s.node.varriLinearHelixKind=e.kind}),e.angle=n.angle,e.center=n.center,e.previousAngle=o.angle,e.previousCenter=o.center,!0}function de(e){return Math.atan2(Math.sin(e),Math.cos(e))}function it(e,t,r,n,o){if(!n||![n.x,n.y,o].every(Number.isFinite))return!1;const s=Math.cos(o),i=Math.sin(o);return e.forEach(c=>{const u=c[t]-n.x,a=c[r]-n.y;c[t]=n.x+s*u-i*a,c[r]=n.y+i*u+s*a}),!0}function ct(e,t,r,n,o){const s=e?.[t],i=e?.[r];if(!s||![s.x,s.y,i].every(Number.isFinite))return;const c=Math.cos(o),u=Math.sin(o),a=s.x-n.x,f=s.y-n.y;e[t]={x:n.x+c*a-u*f,y:n.y+u*a+c*f},e[r]=de(i+o)}function on(e,t,r){if(!e||!Array.isArray(e.nodes)||!t)return!1;const n=e.nodes.filter(Boolean);if(n.length===0||n.some(a=>a.fixed||![a.x,a.y,a.px,a.py].every(Number.isFinite))||![t.angle,t.previousAngle].every(Number.isFinite)||!t.center||!t.previousCenter)return!1;t.horizontalDirection!==1&&t.horizontalDirection!==-1&&(t.horizontalDirection=Math.cos(t.angle)>=0?1:-1);const o=t.horizontalDirection===1?0:Math.PI,s=de(o-t.angle),i=de(o-t.previousAngle),c={...t.center},u={...t.previousCenter};return it(n,"x","y",c,s),it(n,"px","py",u,i),r.forEach(a=>{ct(a,"center","angle",c,s),ct(a,"previousCenter","previousAngle",u,i)}),t.lastHorizontalRotation=s,!0}function sn(e){const t=new Set(Object.entries(Te(e)).filter(([,r])=>r!==0).map(([r])=>Number(r)));return(Array.isArray(e.pointMutations)?e.pointMutations:[]).forEach(r=>{const n=Number(r.nodeId);Number.isInteger(n)&&t.add(n)}),t}function at(e,t){if(t&&typeof t=="object")return t;const r=Number(t);return Number.isInteger(r)&&e.nodes[r]||null}function cn(e,t,r){const n=e&&e.graph;if(!n||!Array.isArray(n.nodes)||!Array.isArray(n.links))return[];const o=sn(t),s=new Map;r.forEach(f=>{for(let l=0;l+1<f.points.length;l+=2){const g=f.points[l].node,d=f.points[l+1].node;s.set(g,d),s.set(d,g)}});const i=Number(e.options?.linkDistanceMultiplier),c=Number.isFinite(i)&&i>0?i:15,u=new Set,a=[];return n.links.forEach(f=>{if(f?.linkType!=="label_link")return;const l=at(n,f.source),g=at(n,f.target),d=l?.nodeType==="label"?l:g?.nodeType==="label"?g:null,h=l?.nodeType==="nucleotide"?l:g?.nodeType==="nucleotide"?g:null,p=s.get(h);if(!d||!h||!p||u.has(d)||!o.has(Number(h.num)))return;const m=Number(f.value),b=c*(Number.isFinite(m)&&m>0?m:1);u.add(d),a.push({label:d,anchor:h,partner:p,linkDistance:b})}),a}function an(e){let t=0;return e.forEach(r=>{const{label:n,anchor:o,partner:s,linkDistance:i}=r;if(!n||!o||!s||n.fixed||o.fixed||s.fixed||![n.x,n.y,n.px,n.py,o.x,o.y,s.x,s.y,i].every(Number.isFinite))return;const c=o.x-s.x,u=o.y-s.y,a=Math.hypot(c,u);if(!(a>0))return;const f=c/a,l=u/a,g=(n.x-o.x)*f+(n.y-o.y)*l,d=.1*i;if(!(g<d))return;const h=Math.min((d-g)*.2,.05*i),p=h*f,m=h*l;n.x+=p,n.y+=m,n.px+=p,n.py+=m,t+=1}),t}function un(e,t,r=[],n=!1){if(typeof document>"u")return{nodes:[],links:[]};const o=n?new Set(e.nodes):new Set([...t.flatMap(c=>c.points.map(u=>u.node)),...r.map(c=>c.label)]),s=Array.isArray(e.links)?e.links:[],i=n?new Set(s):new Set(s.filter(c=>o.has(c?.source)||o.has(c?.target)));return{nodes:Array.from(document.querySelectorAll("g.gnode")).filter(c=>o.has(c.__data__)),links:Array.from(document.querySelectorAll("line.link")).filter(c=>i.has(c.__data__))}}function ln(e,t){const r=e.querySelector?.("path.fornac-directionArrow"),n=t?.prevNode;if(!r||!n||!t.linked||![t.x,t.y,n.x,n.y,t.radius].every(Number.isFinite))return;let o=n.x-t.x,s=n.y-t.y;const i=Math.hypot(o,s);if(!(i>0))return;o/=i,s/=i;const c=-s,u=o,a=(t.radius+.4)*o,f=(t.radius+.4)*s,l=6,g=.7;r.setAttribute("d",`M${a+l*(o/2+c*g/2)},${f+l*(s/2+u*g/2)}L${a},${f}L${a+l*(o/2-c*g/2)},${f+l*(s/2-u*g/2)}`)}function fn(e){e.nodes.forEach(t=>{const r=t.__data__;!r||![r.x,r.y].every(Number.isFinite)||(t.setAttribute("transform",`translate(${r.x},${r.y})`),ln(t,r))}),e.links.forEach(t=>{const r=t.__data__;!r?.source||!r?.target||(t.setAttribute("x1",String(r.source.x)),t.setAttribute("y1",String(r.source.y)),t.setAttribute("x2",String(r.target.x)),t.setAttribute("y2",String(r.target.y)))})}function ut(e){!!e&&(Object.prototype.hasOwnProperty.call(e,"varriLinearHelixConstraints")||Object.prototype.hasOwnProperty.call(e,"varriLinearHelixTemplates")||Object.prototype.hasOwnProperty.call(e,"varriLinearHelixLabelBiases"))&&e.force&&typeof e.force.on=="function"&&(e.force.on("tick.varriLinearHelix",null),e.force.on("end.varriLinearHelix",null)),delete e?.varriLinearHelixConstraints,delete e?.varriLinearHelixTemplates,delete e?.varriLinearHelixLabelBiases}function lt(e,t,r={}){ut(e);const n=e&&e.graph;if(!n||!Array.isArray(n.nodes)||!Array.isArray(n.links))return 0;const o=[],s=[];r.rri&&t.molecules==="2"&&(o.push(...st(e,rt(t),St)),s.push(...en(t))),r.structure&&(o.push(...st(e,ot(t),xt)),s.push(...tn(t)));const i=s.map(p=>nn(e,p)).filter(Boolean);if(i.length===0)return 0;const c=new Set(i.flatMap(p=>p.points.map(m=>m.node))),u=o.filter(p=>c.has(p.source)&&c.has(p.target));e.varriLinearHelixConstraints=u,e.varriLinearHelixTemplates=i;const a=cn(e,t,i);e.varriLinearHelixLabelBiases=a;const f=r.rri&&i.find(p=>p.kind==="rri")||null,l=un(n,i,a,!!f),g=()=>{i.forEach(rn),f&&on(n,f,i),an(a),fn(l)};let d=!1;const h=()=>{g(),!d&&typeof e.centerView=="function"&&(d=!0,e.centerView())};return g(),e.force&&(typeof e.force.on=="function"&&(e.force.on("tick.varriLinearHelix",()=>g()),e.force.on("end.varriLinearHelix",h)),typeof e.force.start=="function"&&e.force.start()),u.length}function ft(e){const t=D(e);if(t.length===0){ie();return}let r=[t.shift()];const n=[];for(const[s,i]of t){const[c,u]=r[r.length-1];if(s-1===c&&i+1===u){r.push([s,i]);continue}const a=r.flatMap(([f,l])=>[f,l]).sort((f,l)=>f-l);n.push(a),r=[[s,i]]}const o=r.flatMap(([s,i])=>[s,i]).sort((s,i)=>s-i);n.push(o),ie(),n.forEach(s=>{const i=j(e,s,"1"),c=j(e,s,"2");i&&c&&ce(e,{sequence1Range:i,sequence2Range:c,color:y.backgroundHighlight})})}function dt(e){const t=Ve(e);t&&ce(e,{sequence1Range:t.sequence1Range,sequence2Range:t.sequence2Range,color:y.backgroundHighlight})}function dn(e,t,r){document.querySelectorAll(`circle[node_num="${e}"]`).forEach(n=>{const o=n.cloneNode(!0);o.setAttribute("node_num",`o${e}`),o.setAttribute("style",t),o.firstChild&&(o.firstChild.innerHTML+=r),n.after(o)})}function gn(e,t){return t?e:1-e}function gt(e,t,r=null,n=null){const o=r?.sequence1||y.seq1profileColor,s=r?.sequence2||y.seq2profileColor,i=!!n?.sequence1RepresentsOne,c=!!n?.sequence2RepresentsOne;for(const[u,a]of Object.entries(e)){const f=parseInt(u,10),l=f<=t,h=`fill: ${l?o:s};opacity: ${gn(a,l?i:c)}; stroke-width: 0;`,p=`
4
+ `+a.toExponential(2);dn(f,h,p)}}function ht(e,t){if(t&&typeof t=="object")return t;const r=parseInt(String(t),10);if(!Number.isFinite(r))return null;if(Array.isArray(e?.nodes)&&e.nodes[r])return e.nodes[r];if(Array.isArray(e?.nodes)){const n=e.nodes.find(o=>o&&o.num===r);if(n)return n}return null}function hn(e){if(!e||!Array.isArray(e.nodes))return null;const t=e.nodes.filter(c=>c&&c.nodeType==="middle"&&(c.num===-2||c.num===-3)),r=new Set(t.map(c=>c.uid).filter(Boolean)),n=new Set(t.map(c=>e.nodes.indexOf(c)+1)),o=e.nodes.filter(c=>c&&c.nodeType==="middle"&&c.num===-1&&Array.isArray(c.nucs)),s=new Set,i=new Set(r);return o.forEach(c=>{const u=c.nucs.map(l=>e.nodes[l-1]).filter(Boolean),a=c.nucs.some(l=>n.has(l)),f=u.some(l=>l.elemType==="e");!a&&!f||(s.add(c.uid),u.forEach(l=>{l.uid&&i.add(l.uid)}))}),r.size===0&&s.size===0?null:{closureUids:r,hubUids:s,memberUids:i}}function pn(e,t){const r=e&&e.graph,n=hn(r);if(!n)return!1;const o=new Set(n.closureUids);return n.hubUids.forEach(s=>o.add(s)),r.links=r.links.filter(s=>{const i=String(s&&s.linkType);if(i!=="fake"&&i!=="fake_fake")return!0;const c=ht(r,s.source),u=ht(r,s.target),a=c&&c.uid,f=u&&u.uid;return!(a&&o.has(a)||f&&o.has(f)||a&&f&&n.memberUids.has(a)&&n.memberUids.has(f))}),r.nodes=r.nodes.filter(s=>!(s&&s.uid&&o.has(s.uid))),typeof e.update=="function"&&e.update(),e.force&&typeof e.force.resume=="function"?e.force.resume():e.force&&typeof e.force.start=="function"&&e.force.start(),!0}function mn(e,t){!e||!e.linkStrengths||(e.linkStrengths.pseudoknot=t?10:0,e.force&&typeof e.force.start=="function"&&e.force.start())}function pt(){if(L!==null&&(cancelAnimationFrame(L),L=null),N!==null&&(clearTimeout(N),N=null,k)){const e=k;queueMicrotask(()=>e({cancelled:!0})),k=null}q&&ut(q),q?.force&&typeof q.force.stop=="function"&&q.force.stop(),q=null}function yn(e,t,r={}){pt();const{forceLayout:n=!1,forceLayoutLinearRRI:o=!1,forceLayoutLinearStructure:s=!1,freeTrailingEnds:i=!1,pullPseudoknotBasepairs:c=!1,accessData:u=null,accessColors:a=null,accessColorMode:f=null}=r,l=new fornac.FornaContainer(`#${e}`,{animation:n,labelInterval:1});q=l,l.addRNA(t.structure,{structure:t.structure,sequence:t.sequence}),n&&i&&pn(l,t),n&&c&&mn(l,!0),n&&(o||s)&&lt(l,t,{rri:o,structure:s});function g(){if(ve(),He(),Xe(t.sequence),t.molecules==="2"&&Ye(),t.coloring==="strand"&&$e(t),_e(t),Me(t),Ce(t),ie(),t.molecules==="2"&&(t.highlighting==="region"&&Fe(t),t.highlighting==="basepairs"&&Ue(t),t.backgroundhighlighting==="region"&&dt(t),t.backgroundhighlighting==="basepairs"&&ft(t)),Qe(t),ae(t),ue(t),We(t),u&&gt(u,t.sequence1.length,a,f),n&&(o||s)&&typeof l.centerView=="function"&&l.centerView(),n){let d=function(){document.querySelectorAll("[data-varri-region]").forEach(h=>h.remove()),document.querySelectorAll("[data-varri-subseq]").forEach(h=>h.remove()),ae(t),ue(t),L=requestAnimationFrame(d)};L=requestAnimationFrame(d)}}return new Promise((d,h)=>{k=d,N=setTimeout(()=>{N=null,k=null;try{g(),d({cancelled:!1})}catch(p){h(p)}},200)})}function mt(e){if(!Number.isFinite(e))throw new Error("Rotation degrees must be a finite number");let t=e%360;return t>180&&(t-=360),t<-180&&(t+=360),t}function bn(e){return e.querySelector(".fornac-plot")||e}function An(e){let t=Array.from(e.children).find(n=>n.tagName&&n.tagName.toLowerCase()==="g"&&n.getAttribute("data-varri-rotation-layer")==="true");return t||(t=document.createElementNS("http://www.w3.org/2000/svg","g"),t.setAttribute("data-varri-rotation-layer","true"),e.appendChild(t)),Array.from(e.childNodes).filter(n=>!(n===t||e.tagName&&e.tagName.toLowerCase()==="svg"&&n.nodeType===Node.ELEMENT_NODE&&n.tagName&&n.tagName.toLowerCase()==="defs")).forEach(n=>t.appendChild(n)),t}function yt(e){try{const t=e.getBBox();return!Number.isFinite(t.x)||!Number.isFinite(t.y)||!Number.isFinite(t.width)||!Number.isFinite(t.height)?null:{x:t.x+t.width/2,y:t.y+t.height/2}}catch{return null}}function qn(e,t,r={}){const n=document.getElementById(e),o=n&&n.querySelector("svg");if(!o)throw new Error("No SVG found in container");const s=Number(t);if(!Number.isFinite(s))throw new Error("Rotation degrees must be a finite number");const i=r.mode==="absolute"?"absolute":"delta",c=Number(o.getAttribute("data-varri-rotation")||0),u=mt(i==="absolute"?s:c+s),a=bn(o),f=An(a),l=yt(f);return l?(f.setAttribute("transform",`rotate(${u} ${l.x} ${l.y})`),o.setAttribute("data-varri-rotation",String(u)),f.querySelectorAll("text").forEach(g=>{g.hasAttribute("data-varri-base-transform")||g.setAttribute("data-varri-base-transform",g.getAttribute("transform")||"");const d=g.getAttribute("data-varri-base-transform")||"";if(u===0){d?g.setAttribute("transform",d):g.removeAttribute("transform");return}const h=yt(g)||l,p=[];d&&p.push(d),p.push(`rotate(${-u} ${h.x} ${h.y})`),g.setAttribute("transform",p.join(" "))}),u):c}const wn=["fill","fill-opacity","fill-rule","stroke","stroke-width","stroke-opacity","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","font-family","font-size","font-weight","font-style","text-anchor","dominant-baseline","alignment-baseline","opacity","visibility","display","marker-start","marker-end","marker-mid","color"];function bt(e,t){if(!e||e.nodeType!==Node.ELEMENT_NODE)return;const r=(e.tagName||"").toLowerCase();if(r==="style"||r==="defs")return;const n=window.getComputedStyle(e);let o="";for(const c of wn){const u=n.getPropertyValue(c);u&&(o+=`${c}:${u};`)}o&&t.setAttribute("style",o);const s=e.children,i=t.children;for(let c=0;c<s.length;c++)i[c]&&bt(s[c],i[c])}function ge(e){const t=document.getElementById(e),r=t&&t.querySelector("svg");if(!r)throw new Error("No SVG found in container");const n=r.cloneNode(!0);bt(r,n),n.setAttribute("xmlns","http://www.w3.org/2000/svg"),n.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");const o=r.clientWidth||t.clientWidth||800,s=r.clientHeight||t.clientHeight||600;n.setAttribute("width",o),n.setAttribute("height",s),n.getAttribute("viewBox")||n.setAttribute("viewBox",`0 0 ${o} ${s}`);const i=document.createElementNS("http://www.w3.org/2000/svg","rect");return i.setAttribute("width","100%"),i.setAttribute("height","100%"),i.setAttribute("fill","white"),n.insertBefore(i,n.firstChild),new XMLSerializer().serializeToString(n)}function Sn(e,t="vaRRI_output.svg"){const r=ge(e),n=new Blob([r],{type:"image/svg+xml"});he(URL.createObjectURL(n),t)}function xn(e,t="vaRRI_output.png",r=2){const n=ge(e),o=new Blob([n],{type:"image/svg+xml"}),s=URL.createObjectURL(o),i=document.getElementById(e),c=i&&i.querySelector("svg"),u=c&&c.clientWidth||i&&i.clientWidth||800,a=c&&c.clientHeight||i&&i.clientHeight||600;function f(g,d,h){const p=document.createElement("canvas");p.width=d,p.height=h;const m=p.getContext("2d");return m.fillStyle="white",m.fillRect(0,0,d,h),m.drawImage(g,0,0,d,h),p.toDataURL("image/png")}const l=new Image;l.onload=()=>{const g=f(l,u*r,a*r);URL.revokeObjectURL(s),he(g,t)},l.onerror=()=>{URL.revokeObjectURL(s);const g="data:image/svg+xml;charset=utf-8,"+encodeURIComponent(n),d=new Image;d.onload=()=>{he(f(d,u*r,a*r),t)},d.src=g},l.src=s}function he(e,t){const r=document.createElement("a");r.href=e,r.download=t,r.style.display="none",document.body.appendChild(r),r.click(),document.body.removeChild(r)}const At={cancelActiveRender:pt,normaliseRotationDegrees:mt,render:yn,rotateVisualization:qn,validate:Ut,getColors:jt,setColors:Gt,clearPointMutations:Pt,clearRegionHighlights:Ht,clearSubsequenceHighlights:kt,computeBackgroundRegionRanges:Ve,createPointMutation:B,createRegionHighlight:M,createSubsequenceHighlight:C,getPointMutations:Ot,getRegionHighlightNodePath:Ke,getRegionHighlights:te,getSubsequenceHighlights:$t,registerGeneratedRegionHighlight:ce,registerPointMutation:Ct,registerRegionHighlight:me,registerSubsequenceHighlight:It,removePointMutation:Bt,removeRegionHighlight:ye,removeSubsequenceHighlight:Nt,updatePointMutation:Mt,updateRegionHighlight:vt,updateSubsequenceHighlight:Lt,checkStructureInputSimple:qe,findBasePairs:Dt,formatSequence:Le,formatStructure:Ie,getIndexDictionary:w,getMolecules:Ne,getSequenceIndices:$,parseSubsequences:v,splitAtAmpersand:R,validateBackgroundhighlighting:Re,validateCroppingInput:Se,validateHighlighting:Ee,validateOffset:O,normaliseMutationPosition:Ae,validateSequenceInput:we,validateStructureInput:xe,getIntermolBasepairRegion:H,getLinearRriConstraintSpecs:rt,getLinearStructureConstraintSpecs:ot,listBasepairs:le,listIntermolNodes:P,listIntermolPairs:D,listRriLoopBoundaryPairs:Ze,listStructureLoopBoundaryPairs:tt,sequenceColoring:ke,addElement:Oe,addStyleToNodes:G,applyLinearHelixSprings:lt,applyPointMutations:We,applyRegionHighlights:ae,applySubsequenceHighlights:ue,backgroundhighlightBasepairs:ft,backgroundhighlightRegion:dt,changeBackgroundColor:$e,closePolygonPoints:je,getPositionOfNode:Be,highlightBasepairs:Ue,highlightRegion:Fe,highlightSubsequence:ze,polyline:se,removeDummyNodes:Xe,removeSecondLink:Ye,setAttributeForElements:Yt,setIndexLabels:Ce,setLabelsId:He,setLinksId:ve,styleBasepairs:Qe,updateLinkTooltips:Me,updateNodeToolTips:_e,visualiseAccessibility:gt,buildSVGString:ge,downloadPNG:xn,downloadSVG:Sn};wt.vaRRI=At,typeof module<"u"&&module.exports&&(module.exports=At)})(typeof window<"u"?window:this);
5
+ //# sourceMappingURL=vaRRI.min.js.map